patg.net

home

switchssh: A simple python library for talking to Switches

14 Mar 2015

switchssh

Recently, I was working on developing Ansible modules for HP Switches– Pro Vision and Comware 5.2. The first type of switch I implemented a driver for was an HP 1910 24G (Comware 5.2). More recently, I implemented a rudimentary Ansible module for an HP 3800 (Pro Vision).

Each of these switch OSs had their own peculiarities and to have a means to talk to each required some technical gymnastics. For instance, specifically the HP 1910 24G, based on Comware, by default doesn’t include the full CLI command-set unless one enters a “developer-mode” (this required digging around the HP networking forums), which requires entering confirmation and a code. There are other Comware-based switches that have the full command-set without this developer-mode.

The Pro Vision OS (on an HP 3800) has a full command set but trying to parse output in its default vt100 terminal settings was a parsing nightmare. Setting Pro Vision to “raw” terminal settings solved that issue. Then of course there is a banner message to dismiss upon logging in.

Both switch OSs required having to disable paging– that being, when a page worth of data is displayed, a prompt of “more” (text varied according to OS) would require subsequent space-bar to to continue, an added complexity that I was glad to discover could be disabled.

While implementing basic modules for both OSs, I was cognizant that I had some duplication that I would need to consolidate and abstract out of both code-bases before I added even more functionality to either driver. That’s where this simple yet useful python module I created– switchssh – came into being.

I pulled out any code that simply pertained to the communication layer of talking to each switch. There were some common things that pertained to both switches, but where it differed, I used polymorphism to handle those differences. The top level class is switchssh, the subclasses pro_vision and comware_hp_1910.

Usage

Using these modules is painfully simple, as this simple script below shows using the comware_hp_1910 subclass:

#!/usr/bin/env python

from switchssh.comware_hp_1910 import ComWareHP1910
import os
import re

import pprint

pp = pprint.PrettyPrinter(indent=2)

# simple script that shows how to use the library with comware
def main():
    conn = ComWareHP1910('192.168.1.x',
                     'admin',
                     'redacted',
                     read_end="<HP>",
                     dismiss_banner=False)

    out = conn.exec_command("display current-configuration\n", read_end='<HP>')
    pp.pprint(out)
    prompt = conn._get_prompt()
    print "prompt: %s\n" % prompt


main()

The output would be (truncated):

[ '                 display current-configuration',
  '#',
  ' version 5.20, Release 1513P62',
  '#',
  ' sysname HP',
  '#',
  ' domain default enable system',
  '#',
  ' ip ttl-expires enable',
  '#',
  ' password-recovery enable',
  '#',
  'vlan 1',
  '#',
  'vlan 5',
  ' name vlan 5',
  '#',
  'domain system',
  ' access-limit disable',
  ' state active',
  ' idle-cut disable',
  ' self-service-url disable',
  '#',
 'interface Vlan-interface1',
  ' ip address dhcp-alloc',
  '#',
  'interface GigabitEthernet1/0/1',
  ' stp edged-port enable',
  '#',
  'interface GigabitEthernet1/0/2',
  ' stp edged-port enable',
  '#',
    'return']
prompt: <HP>
...

For Pro Vision:


#!/usr/bin/env python

from switchssh.pro_vision import ProVision
import os
import re

import pprint

pp = pprint.PrettyPrinter(indent=2)

# simple script to show how to use this library
def main():
    conn = ProVision('192.168.1.x',
                     'operator',
                     'redacted',
                     read_end="tty=none",
                     dismiss_banner=True)

    out = conn.exec_command("show run\n")
    pp.pprint(out)
    out = conn.exec_command("configure\n")
    pp.pprint(out)
    out = conn.exec_command("vlan 88\n")
    pp.pprint(out)
    out = conn.exec_command("name eighty-eight\n")
    pp.pprint(out)
    out = conn.exec_command("exit\n")
    pp.pprint(out)
    out = conn.exec_command("exit\n")
    pp.pprint(out)
    out = conn.exec_command("show run\n")
    pp.pprint(out)
    out = conn.exec_command("configure\n")
    pp.pprint(out)
    out = conn.exec_command("no vlan 88\n")
    pp.pprint(out)
    out = conn.exec_command("show run\n")
    pp.pprint(out)


main()

Part of the output:


[ ' show run',
  '',
  'Running configuration:',
  '',
  '; J9575A Configuration Editor; Created on release #KA.15.03.3015',
  '; Ver #01:00:01',
  '',
  'hostname "HP E3800-24G-2SFP+ Switch" ',
  'module 1 type J9575x ',
  'vlan 1 ',
  '   name "DEFAULT_VLAN" ',
  '   untagged 1,8-26 ',
  '   ip address 192.168.1.200 255.255.255.0 ',
  '   no untagged 2-7 ',
  '   exit ',
  'vlan 66 ',
  '   name "VLAN" ',
  '   ip address 192.168.10.1 255.255.255.0 ',
  '   ip address 192.168.11.2 255.255.255.0 ',
  '   tagged 5-8 ',
  '   exit ',
  'vlan 44 ',
  '   name "VLAN_44" ',
  '   untagged 2-7 ',
  '',
  '   ip address 192.168.3.4 255.255.255.0 ',
  '   ip address 192.168.5.6 255.255.255.0 ',
  '   tagged 20-24 ',
  '   exit ',
  'console terminal none',
  'snmp-server community "public" unrestricted',
  'snmp-server contact "Patrick Galbraith"',
  'oobm',
  '   ip address dhcp-bootp',
  '   exit',
  'no autorun',
  'no dhcp config-file-update',
  'no dhcp image-file-update',
  'password manager',
  'password operator',
  '',
...

There are simple code examples for each type of switch in the ./bin directory of the the module

Summary

This module is just a simple beginning and more work is required to clean up the methods to have a better naming scheme as well as error handling.

It can be found on switchssh repo. The installation instructions are included. My intent it to have this be a PyPI module for easier installation. Also, I will be refactoring both of my Ansible modules to utilize switchssh.

comments powered by Disqus