Pexpect, Python, and Managing Devices — Tratto

tratto-logo
A few months ago I decided to write a web application that would essentially run like RANCID, I named it “tratto.”  Since then I decided that it would be better to nail down a basic python framework first, then integrate it into say.. a django application.  In all of my years as an engineer I had never leveraged expect to accomplish simple and repetitive tasks. I am a recent python “convert” and wanted to write a simple app that could be used as a framework for managing and monitoring network connected devices and hosts.  Tratto uses pexpect to connect and parse ssh and telnet sessions.

This framework provides an easy way to connect to remote devices and issue commands and store the output. I also wanted an easy way to “extend” this framework and be able to add ways to connect to any operating system (or at least use default shell behavior as a baseline).  I manage a wide variety of devices and I wanted to support at least the default implementations of Cisco IOS, OpenBSD, Mac OS X, and Aruba OS.  Here is how you would add an operating system’s parameters to Tratto (Systems.py):

class ArubaOS(OperatingSystem):
	'''aruba configs'''
	PROMPTLINE	='#'
	PAGINATES 	=True
	DISABLE_PAGINATION = 'terminal length 0'
	GET_CONFIG	="show run"

There are 3 files included in Tratto right now:

  1. Connectivity.py — This is a class which manages sessions using pexpect
  2. Systems.py — This is the class which manages all the operating parameters
  3. driver.py — This is an example file of how to use Tratto to fetch whatever info you want

Here is an example of how to use the framework to connect to devices and issue commands:

#!/usr/bin/env python

import Connectivity
import Systems

#telnet to a cisco switch
m = Systems.OperatingSystems['IOS']
s = Connectivity.Session("192.168.6.1",23,telnet,m)
s.login("akonkol", "mypass")
s.sendcommand("show ver")
s.sendcommand("show clock")
s.sendcommand("show run")
s.logout()

#ssh to a apple machine
m = Systems.OperatingSystems['OSX']
s = Connectivity.Session("127.0.0.1",22,"ssh",m)
s.login("akonkol", "mypass")
#sendcommand will echo response by default, you can store that
#response in a variable if you wish
result = s.sendcommand("df -h")
print result
s.getversion()
s.logout()

#ssh to openbsd box
m = Systems.OperatingSystems['OBSD']
s = Connectivity.Session("192.168.5.1",22,"ssh",m)
s.login("akonkol", "mypass")
print s.sendcommand("cat /etc/passwd")
print s.sendcommand("arp -a")
s.logout()

The Future

With Tratto you can technically pull information from any networked device and use that data for whatever you please. Current ideas are integrating Tratto into

  • a config repository application with a web frontend (like RANCID)
  • a network mapping application using cdp neighbors
  • monitoring platform which performs different commands based on certain scenarios (”show interfaces” when IP SLA shows latency)

This is my first attempt at releasing python software, so if you think something could be better let me know.
Download Tratto

Continue reading » · Written on: 01-26-10 · 1 Comment »

One Response to “Pexpect, Python, and Managing Devices — Tratto”

  1. Melanie Hertling wrote:

    This is great! Thanks for this post. I am a newbie at python and this will be a big help.

    March 6th, 2010 at 5:24 pm

Leave a Reply