You are on page 1of 25

Python Network Programming - Build 7 Apps

TrendElearning Copyright Material


Mihai Catalin Teodosiu

Python Network Programming - Build 7 Apps

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

Whats 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.

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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!

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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)

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

#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()

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

#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)

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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()

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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)

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

#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"

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

#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)

10

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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,
cmdGen.nextCmd(cmdgen.CommunityData(comm),

varBindNbrTable

cmdgen.UdpTransportTarget((ip,
161)),
'1.3.6.1.2.1.14.10.1.3')

11

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

#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,
cmdGen.nextCmd(cmdgen.CommunityData(comm),

varBindNbrIpTable

cmdgen.UdpTransportTarget((ip,
161)),
'1.3.6.1.2.1.14.10.1.1')
#print varBindNbrIpTable

errorIndication,
errorStatus,
errorIndex,
cmdGen.nextCmd(cmdgen.CommunityData(comm),

varBindHostTable

cmdgen.UdpTransportTarget((ip,
161)), '1.3.6.1.4.1.9.2.1.3')

#print varBindHostTable

errorIndication,
errorStatus,
errorIndex,
cmdGen.nextCmd(cmdgen.CommunityData(comm),

varBindHostIdTable

cmdgen.UdpTransportTarget((ip, 161)),
'1.3.6.1.2.1.14.1.1')
#print varBindHostIdTable

12

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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, its your job now to study,
understand and test the code against a network device, as youve 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 youve 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'): ")

13

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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

14

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

Lets 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

15

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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

16

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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 differencescommand 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, its your job now to study,
understand and test the code against a network device, as youve 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:

17

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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, lets 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. Dont 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. Its
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

18

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

Now, lets 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, lets configure a few things before starting the comparison,
without saving the changes to the startup-config. So, lets 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. Lets 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 lets 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

19

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

+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.

20

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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

21

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

"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

22

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

"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 doesnt 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 Joo 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!

23

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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!

24

Python Network Programming - Build 7 Apps


TrendElearning Copyright Material
Mihai Catalin Teodosiu

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/)

25

You might also like