25
Python Network Programming - Build 7 Apps TrendElearning Copyright Material Mihai Catalin Teodosiu 1 Python Network Programming - Build 7 Apps

Python Network Programming

Embed Size (px)

Citation preview

Page 1: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

1

Python Network Programming - Build 7 Apps

Page 2: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

2

What’s this all about?

Note: This e-book is a comprehensive preview of my bestselling course: “Python

Tutorial: Python Network Programming - Build 7 Apps”. More details on the last page!

Do you want to become a Python Developer without having to spend a lot of money

on books and boring theoretical courses?

Are you a network professional who wants to start automating network tasks?

Or maybe you're seeking a raise or even a career change?

Join thousands of successful students who have decided to learn Python,

upgrade their networking skills and boost their careers using this 100% hands-on

course!

Python (2.7.3) programming course aimed not only at network professionals, but at

anyone having little or no experience in coding or automation and a great desire to start

learning Python from scratch.

Save Time And Money By Writing Your Own Python Programs To Automate Daily

Network Tasks!

During this course you will learn Python concepts which are relevant to your networking

job and build some amazing network tools:

Python App#1: Subnet calculator.

Python App#2: Configuring multiple network devices concurrently via SSH or

Telnet.

Python App#3: DHCP client simulator for testing a DHCP server in the local

network.

Python App#4: Collecting information from routers and storing it in a MySQL

database.

Python App#5: OSPF network discovery via SNMP. Building the OSPF

topology.

Page 3: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

3

Python App#6: Basic network sniffer.

Python App#7: Configuration file comparator.

Sounds unbelievable given your current programming experience? Well, it's true! How?

First, you will learn and practice every Python key concept, which is explained in one or

more video lectures, followed by a short quiz. Each video is filled with relevant

examples, in a learn-by-doing fashion and the quizzes will help you consolidate the

main ideas behind each Python topic.

After laying the foundation (and also exploring some advanced Python topics), you will

dive right into the real-life network scenarios and apply your knowledge to build 7

great network tools.

Equipped with working files, network topologies and Python code samples (in .pdf and

.py formats), you will be able to work alongside me on each lecture and each

application. I will provide a virtual machine with all the Python modules already installed

and also the full code for each application, so you can save time and start coding

and testing on the spot.

We will use emulated routers in GNS3 to test our Python apps in a network

environment, so you can see the actual results of running your code.

I encourage you to learn Python, an amazingly beginner-friendly programming

language and take your (networking) job to a higher level of automation.

IMPORTANT BEFORE YOU CONTINUE!

Next, please find some working code samples from my bestselling course: “Python

Tutorial: Python Network Programming - Build 7 Apps”. All the code samples are

explained, turned into working applications and tested inside the course.

More details about enrolling in the course are provided on the last page of this e-book!

Page 4: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

4

Telnet with Python

#Open telnet connection to devices

def open_telnet_conn(ip):

#Change exception message

try:

#Define telnet parameters

username = 'teopy'

password = 'python'

TELNET_PORT = 23

TELNET_TIMEOUT = 5

READ_TIMEOUT = 5

#Logging into device

connection = telnetlib.Telnet(ip, TELNET_PORT, TELNET_TIMEOUT)

output = connection.read_until("name:", READ_TIMEOUT)

connection.write(username + "\n")

output = connection.read_until("word:", READ_TIMEOUT)

connection.write(password + "\n")

time.sleep(1)

Page 5: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

5

#Setting terminal length for entire output - no pagination

connection.write("terminal length 0\n")

time.sleep(1)

#Entering global config mode

connection.write("\n")

connection.write("configure terminal\n")

time.sleep(1)

#Open user selected file for reading

selected_cmd_file = open(cmd_file, 'r')

#Starting from the beginning of the file

selected_cmd_file.seek(0)

#Writing each line in the file to the device

for each_line in selected_cmd_file.readlines():

connection.write(each_line + '\n')

time.sleep(1)

#Closing the file

selected_cmd_file.close()

Page 6: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

6

#Test for reading command output

#output = connection.read_very_eager()

#print output

#Closing the connection

connection.close()

except IOError:

print "Input parameter error! Please check username, password and file name."

#Calling the Telnet function

open_telnet_conn(ip)

Page 7: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

7

SSH with Python

#Open SSHv2 connection to devices

def open_ssh_conn(ip):

#Change exception message

try:

#Define SSH parameters

selected_user_file = open(user_file, 'r')

#Starting from the beginning of the file

selected_user_file.seek(0)

username = selected_user_file.readlines()[0].split(',')[0]

#Starting from the beginning of the file

selected_user_file.seek(0)

password = selected_user_file.readlines()[0].split(',')[1]

#Logging into device

session = paramiko.SSHClient()

Page 8: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

8

session.set_missing_host_key_policy(

paramiko.AutoAddPolicy())

session.connect(ip, username = username, password = password)

connection = session.invoke_shell()

#Setting terminal length for entire output - no pagination

connection.send("terminal length 0\n")

time.sleep(1)

#Entering global config mode

connection.send("\n")

connection.send("configure terminal\n")

time.sleep(1)

#Open user selected file for reading

selected_cmd_file = open(cmd_file, 'r')

#Starting from the beginning of the file

selected_cmd_file.seek(0)

Page 9: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

9

#Writing each line in the file to the device

for each_line in selected_cmd_file.readlines():

connection.send(each_line + '\n')

time.sleep(2)

#Closing the user file

selected_user_file.close()

#Closing the command file

selected_cmd_file.close()

#Checking command output for IOS syntax errors

output = connection.recv(65535)

if re.search(r"% Invalid input detected at", output):

print "* There was at least one IOS syntax error on device %s" % ip

else:

print "\nDONE for device %s" % ip

#Test for reading command output

#print output + "\n"

Page 10: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

10

#Closing the connection

session.close()

except paramiko.AuthenticationException:

print "* Invalid username or password. \n* Please check the username/password

file or the device configuration!"

print "* Closing program...\n"

#Calling the SSH function

open_ssh_conn(ip)

Page 11: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

11

SNMP with Python

#!/usr/bin/env python

from pysnmp.entity.rfc3413.oneliner import cmdgen

#SNMP function

def snmp_get(ip):

#Creating command generator object

cmdGen = cmdgen.CommandGenerator()

#Performing SNMP GETNEXT operations on the OSPF OIDs

#The basic syntax of nextCmd: nextCmd(authData, transportTarget, *varNames)

#The nextCmd method returns a tuple of (errorIndication, errorStatus, errorIndex,

varBindTable)

errorIndication, errorStatus, errorIndex, varBindNbrTable =

cmdGen.nextCmd(cmdgen.CommunityData(comm),

cmdgen.UdpTransportTarget((ip,

161)),

'1.3.6.1.2.1.14.10.1.3')

Page 12: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

12

#print

cmdGen.nextCmd(cmdgen.CommunityData(comm),cmdgen.UdpTransportTarget((ip,

161)),'1.3.6.1.2.1.14.10.1.3')

#print varBindNbrTable

errorIndication, errorStatus, errorIndex, varBindNbrIpTable =

cmdGen.nextCmd(cmdgen.CommunityData(comm),

cmdgen.UdpTransportTarget((ip,

161)),

'1.3.6.1.2.1.14.10.1.1')

#print varBindNbrIpTable

errorIndication, errorStatus, errorIndex, varBindHostTable =

cmdGen.nextCmd(cmdgen.CommunityData(comm),

cmdgen.UdpTransportTarget((ip,

161)), '1.3.6.1.4.1.9.2.1.3')

#print varBindHostTable

errorIndication, errorStatus, errorIndex, varBindHostIdTable =

cmdGen.nextCmd(cmdgen.CommunityData(comm),

cmdgen.UdpTransportTarget((ip, 161)),

'1.3.6.1.2.1.14.1.1')

#print varBindHostIdTable

Page 13: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

13

Python Application #6: Basic network sniffer

This application is a basic network sniffer, which captures some predefined protocols and saves info about each network packet in an external file. As with the other applications in this course, the full code is available for download. Based on what you have learned so far in the course, it’s your job now to study, understand and test the code against a network device, as you’ve seen me doing with the previous applications. Feel free to alter the code in any way you want, add new protocols to be captured, more data to be exported in the external file and so on. New functionality of any kind is welcome. Just make sure to adapt your code to the contents of the packet in Scapy. Also, please read the first 33 lines in the code carefully, as they are a good introduction to the code that follows. As you’ve probably guessed, I used Scapy to build this sniffer, because this tool allows packet handling, decoding and analysis in a very intuitive way. Also, pay special attention to the recommendations and settings that I made before starting to build the user menu and so on. I am referring to these lines and the ones above them: net_iface = raw_input("* Enter the interface on which to run the sniffer (like 'eth1'): ") subprocess.call(["ifconfig", net_iface, "promisc"], stdout=None, stderr=None, shell=False) Further more, please read the comments before every code block, as they are good guidelines to what functionality is covered by that piece of code. As you can see at line 72, the program asks the user what network interface is the capture process going to be executed on. A good example is entering “eth1”. net_iface = raw_input("* Enter the interface on which to run the sniffer (like 'eth1'): ")

Page 14: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

14

Then, at line 80, the user is asked to enter the number of packets he wishes to be captured by the sniffer: pkt_to_sniff = raw_input("Enter the number of packets to capture (0 is infinity): ") At line 92, the program requires the number of seconds to run the capture: time_to_sniff = raw_input("* Enter the number of seconds to run the capture: ") At line 103, the program asks the user for the protocol to filter the packets by: proto_sniff = raw_input("* Enter the protocol to filter by (arp|bootp|icmp|0 is all): ") Lines 115 and 116 are dedicated to choosing the file name and creating the file, by opening it for writing (“w”): file_name = raw_input("* Please give a name to the log file: ") sniffer_log = open(file_name, "w") At line 124, you can find the function that takes care of the parameter extraction from each packet and logging the packet info to the file: def packet_log(pkt) The program implements a counter for each packet, then records the source MAC address and destination MAC address to the file, on a single row. Finally, the sniffing process is initialized by the sniff() function in Scapy, at line 138, passing the values collected from the user as arguments to this function. pkt = sniff(iface=net_iface, count=int(pkt_to_sniff), timeout=int(time_to_sniff), prn=packet_log) Now, to test the program, first you should have direct connectivity from the Debian VM to the router in GNS3 (R1 - 192.168.2.101 was my test device): root@debian:/home/debian/workingdir# ping 192.168.2.101 PING 192.168.2.101 (192.168.2.101) 56(84) bytes of data. 64 bytes from 192.168.2.101: icmp_req=1 ttl=255 time=429 ms

Page 15: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

15

Let’s choose ICMP packets for capturing purposes and after the capture is started, I am going to ping the VM (192.168.2.100) from R1. Please see the following way to use the program menu as an example: root@debian:/home/debian/workingdir# python Sniffer.py ! Make sure to run this program as ROOT ! * Enter the interface on which to run the sniffer (like 'eth1'): eth1 Interface eth1 was set to PROMISC mode. Enter the number of packets to capture (0 is infinity): 0 The program will capture packets until the timeout expires. * Enter the number of seconds to run the capture: 10 The program will capture packets for 10 seconds. * Enter the protocol to filter by (arp|bootp|icmp|0 is all): icmp The program will capture only ICMP packets. * Please give a name to the log file: udemy.txt * Starting the capture... Waiting for 10 seconds... At this point, the program listens for all the ICMP packets it receives in the next 10 seconds on eth1 (ping from R1 now!). The results will be exported to the udemy.txt file. And these are the results in this case: root@debian:/home/debian/workingdir# cat udemy.txt Packet 1: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 2: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 3: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 4: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00

Page 16: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

16

Packet 5: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 6: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 7: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 8: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 9: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 10: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 11: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 12: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 13: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 14: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 15: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 16: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 17: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 18: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00 Packet 19: SMAC: c0:01:24:c0:00:00 DMAC: 08:00:27:f2:9b:7c Packet 20: SMAC: 08:00:27:f2:9b:7c DMAC: c0:01:24:c0:00:00

Page 17: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

17

Python Application #7: Configuration file comparator

This application connects to a router in the network via Telnet, extracts the output of “show running-config” and “show startup-config”, filters the irrelevant lines and finally compares the configurations. Now, I know this can be accomplished using the “show archive config differences”command in Cisco CLI, but I wanted you to know how can this task be accomplished using Python. As with the other applications in this course, the full code is available for download. Based on what you have learned so far in the course, it’s your job now to study, understand and test the code against a network device, as you’ve seen me doing with the previous applications. Feel free to alter the code in any way you want. New functionality of any kind is welcome, enhancements as well. Just make sure to adapt your code to the command output format. Also, please read the first 13 lines in the code carefully, as they are a good introduction to the code that follows. As you can see, the first thing you should do is configure Telnet access on the router and the username and password: username teopy privilege 15 password 0 python line vty 0 4 privilege level 15 login local transport input telnet ssh At line 27, I have defined the ip_validity() function, which takes care of checking whether the IP address of the router, which the user enters at the prompt, is valid or not. You have already seen this kind of validity check in action in the previous applications, so there is nothing new here. The same comment is valid for the file_validity() function (line 46). Both functions are defined at this point and will be called later in the code. At line 61, the telnet() function is defined, which takes a single parameter:command. The value of this parameter will be passed to theconnection.write() method at line 96. Starting with line 108, I defined the user menu, which will accept 3 options, except e - Exit program:

Page 18: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

18

1 - Compare running-config with startup-config 2 - Compare running-config with local file 3 - Compare startup-config with local file I had treated only the first option, comparing the running-config with the startup-config - lines 115-196, leaving you with the job of coding and testing the other two options, having my code from option 1 as a guideline. Now, let’s look at option 1 for a bit. First, I called the ip_validity() function to get this out of the way. Next, a very important step, I called the telnet()function for each of the two commands I am interested in, and saved the returned output to a separate variable: output_run for the running-config and output_start for the startup-config. Then, I have created (opened for writing) two files, each of them storing the output of the corresponding command. The file names are intuitively chosen. Don’t forget to close the files after writing the contents of those variables, to save the information. Next, I opened the files for reading and used the readlines() method on each file object to store the lines in each file as elements of a list. Of course, then I closed the files. Then, using a for loop, I have filtered the lines in each file which were of no interest to our goal. We are only interested in the lines starting with the one defining the IOS version: “version 12.4” for example. That is actually the first relevant line in each file. Now, after “cleaning” the files, we are left with only the pure router configurations. It’s time to create a new file (file_diff.txt), in which all the config differences are going to be stored. Actually, we are going to compare the two lists obtained with the readlines() method. Finally, using list comprehensions, we are going to find the lines in the running-config which are not present in the startup-config and vice versa. In case there are multiple differences, we use a for loop to iterate over the lists and then print those differences directly into the file_diff.txt file., one per line As stated in the code, the rule is: A "+" sign means the line is present in the RUNNING-CONFIG but not in the STARTUP-CONFIG A "-" sign means the line is present in the STARTUP-CONFIG but not in the RUNNING-CONFIG

Page 19: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

19

Now, let’s make a quick test. If you have just started the router and made no config yet, then the startup-config and running-config are the same. No surprise here. But, to make the test more relevant, let’s configure a few things before starting the comparison, without saving the changes to the startup-config. So, let’s go to router R1: R1(config)#username udemy1 password udemy R1(config)#username udemy2 password udemy R1(config)#username udemy3 password udemy Now, these three configurations are the differences between the startup-config and the running-config. We should see them after running our program, saved in the file_diff.txt file. Let’s test this: root@debian:/home/debian/workingdir# python ConfigFileComp.py Use this tool to: 1 - Compare running-config with startup-config 2 - Compare running-config with local file 3 - Compare startup-config with local file e - Exit program Enter your choice: 1 Enter an IP address: 192.168.2.101 Please wait while the config file is being analyzed... Use this tool to: 1 - Compare running-config with startup-config 2 - Compare running-config with local file 3 - Compare startup-config with local file e - Exit program Enter your choice: e Exiting... See ya... Now let’s check the results. We should see all three commands with a “+”sign, right? root@debian:/home/debian/workingdir# cat file_diff.txt +username udemy1 password 0 udemy

Page 20: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

20

+username udemy2 password 0 udemy +username udemy3 password 0 udemy root@debian:/home/debian/workingdir# ...and success! As expected, the three commands are marked as differences, in the file.

Page 21: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

21

Have a look at what my students say about my course!

"This is a great course for network engineers who would like to start automating

their tasks. Geared towards beginners, this course teaches the fundamentals of

programming and applying those concepts to networking. There is a lot of fluff

about python on the internet, however the instructor managed to put together the

necessary information to start automating the network. A working knowledge of

TCP/IP is needed to get the most out of this course. Should you understand every

lecture, you will be ready to start writing your own scripts according to your

needs. In particular, I loved the use of scapy, an amazing tool which should be in

the arsenal of anyone working with TCP/IP." by Costin-Alin Neacsu

"I've seen the blueprint and some demo videos and I was convinced right away.

Without a doubt, it's one of the best trainings a network engineer can have. It

gives you actual valuable and marketable skills that you can use in your daily job.

Mihai explains the topics really well, with practical examples making it a fun way

to learn. Highly recommended." by Vlad Vlaicu

"There is no major prerequisite and the material is hand-on from the go. Besides

new lectures are being uploaded in response to suggestions and discussions." by

Zafar Iqbal

"I've [been] doing many Python courses, but till now this is the best by far. Very

self paced, Mihai explains each step in a very simple manner that any beginner

could understand. The courses approach for me is the best. Very oriented to real

application development. Very good, would recommend to anyone beginning in

python." by Felipe

Page 22: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

22

"As always for learning programming language I would always recommend going

through a well rated tutorial video lecture series than going through a 1000 page

text. A well designed course can impart knowledge at a much faster rate and with

less effort from the listener. Of course the course has to fantastically designed.

And this course is just that, that lectures are easy to comprehend, the concepts

are thoroughly learnt using simple & effective examples. So I highly recommend

this course." by Musarrat Rahman

"I find this course very useful for beginners in programming or for those who

especially want to learn Python/networking. I think a new language is learned

more practicing, and this course has many practical examples with clear

explanations." by Mihaela Dvornic

"I have been programming since 1978 and wanted to learn python. I have had no

java or OOP experience, and I tried several 'paper' tutorials but got little out of

them. The first part of this course is a steady walk through the Python language

at just the right speed. The instructor seems to touch all the basis in a logical and

methodical way while providing examples and explanations. I can only conclude

the instructor is a professional educator who spent considerable time structuring

and organizing the course. The result is evident. THIS IS A GREAT WAY TO

LEARN PYTHON!" by Larry Laswell

"I've tried learning from the books & multiple videos - most were too basic to

make a practical app. Some books were too thick and made me sleep. But still

none of the materials had the perfect balance like this course where all the basics

were covered, instructions were concise, and Mihai walks you through how to

create 5 practical apps step by step. I've also tried reading some advanced

python book which didn't make sense because it was too advanced. Let me tell

you, this is hands down "that course that takes you up to beyond the basics" to

bridge you to the advance topics. Right now I'm hitting the advanced topics and it

finally makes sense..." by Joon Park

Page 23: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

23

"Usually I'm not doing courses review but this time I will make an exception.

During time I took a lot of trainings but very few provided by Udemy proved as

having the right approach in teaching the audience. I will mark this one as being

one of my personal top three best trainings as content's quality, technical

explanations, and additional learning materials perspective. Long story short this

course is a very simple, straight forward way of learning Python for managing IT

networks." by Johnny Stanescu

“This course typically helped me to begin, and subsequently enhance my Python

Language Programming skills. I have only programmed in Java, until the need for

Python knowledge arose. Mihai is a natural when it comes to teaching, and he

definitely knows his stuffs. Add to the fact that he responds to every question no

matter how minute. I highly recommend this course to every programmer that is

looking to start writing codes in Python Language.” by Kevin Brown

“Great course for beginners. Mihai is very straight forward, he doesn´t beat

around the bush, and the applications that he builds during the course are

priceless if you are a network engineer. Fully recommend it.” by João Paulo

Barcelos

“Mihai is very knowledgeable and a valuable instructor. His lessons are clear,

easy to follow along with, easy to understand, and interesting. The flow of the

course is very good. He spends sufficient time on each subject to teach them

well, but not so much time that you get bored. The additional resources that he

provides, including a pre-built Debian VM image, shows his dedication to helping

students get started and move through the course easily so that the subject of

the class can be the focus.I highly recommend this class and anything else Mihai

is teaching.” by Dennis Werthman

… and many, many other 5* reviews from satisfied students!

Page 24: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

24

Sign up for the FULL course and get:

▪ Python Tutorial - App#1: Subnet calculator – FULL CODE

▪ Python Tutorial - App#2: Configuring multiple network devices concurrently via SSH or

Telnet – FULL CODE

▪ Python Tutorial - App#3: DHCP client simulator for testing a DHCP server in the local

network – FULL CODE

▪ Python Tutorial - App#4: Collecting information from routers and storing it in a MySQL

database – FULL CODE

▪ Python Tutorial - App#5: OSPF network discovery via SNMP. Building the OSPF

topology – FULL CODE

▪ Python Tutorial - App#6: Basic network sniffer – FULL CODE

▪ Python Tutorial - App#7: Configuration file comparator – FULL CODE

▪ High quality video, audio and text lectures and relevant and updated content!

▪ Unlimited, LIFETIME ACCESS to the course!

▪ 30 day money back guarantee, FULL REFUND, no questions asked!

▪ Instant and FREE ACCESS to any course updates!

▪ My FULL SUPPORT regarding any issues or suggestions related to the course!

I encourage you to take your networking job to a higher level of automation, thus

allowing you to save time and take care of complex network issues or improvements.

Enroll NOW and hop on the Python network programming train. Let's get started!

Page 25: Python Network Programming

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material

Mihai Catalin Teodosiu

25

Still not convinced? Check out some free preview videos from the course on my

YouTube channel, before you spend your money on it! Seems fair.

Go to the YouTube channel: https://www.youtube.com/c/MihaiCatalinTeodosiu

Go right to the “Python Tutorial: Python Network Programming - Build 7 Apps” Playlist:

https://www.youtube.com/playlist?list=PLYifE5kLxky4v9ZBbCX9ftGWT8gBSwvi0

*** For the FULL course with LIFETIME ACCESS please use the link below! ***

*** The course also comes with a 95% DISCOUNT! Buy now to SAVE $284! ***

*** Limited Time Offer On My Official Website ***

GET ME TO THE WEBSITE! I WANT THIS COURSE!

(http://trendelearning.com/)