[Tutor] Parsing a String
Bryon Adams
bryonadams at openmailbox.org
Fri Nov 25 17:26:55 EST 2016
Hello,
I have written a script that pulls certain bits of information out
of a Cisco router's 'show version' command. The output is given in the
assignment and it does work on several different routers (I tested 3
different models from work). What I did seems a bit messy to me though,
would I be able to get a second opinion here? Code in it's entirety is
below. I did this using Python3.5.2 on Fedora 25.
#!/usr/bin/env python3
################################################################
# November 24, 2016 #
# Take the given string for 'show version' on a Cisco router #
# and return the following information: #
# vendor, model, os_version, uptime, serial number #
# Code should be generic and work on other versions. #
# #
################################################################
sh_ver = '''
Cisco IOS Software, C880 Software (C880DATA-UNIVERSALK9-M), Version
15.0(1)M4, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2010 by Cisco Systems, Inc.
Compiled Fri 29-Oct-10 00:02 by prod_rel_team
ROM: System Bootstrap, Version 12.4(22r)YB5, RELEASE SOFTWARE (fc1)
twb-sf-881 uptime is 7 weeks, 5 days, 19 hours, 23 minutes
System returned to ROM by reload at 15:33:36 PST Fri Feb 28 2014
System restarted at 15:34:09 PST Fri Feb 28 2014
System image file is "flash:c880data-universalk9-mz.150-1.M4.bin"
Last reload type: Normal Reload
Last reload reason: Reload Command
Cisco 881 (MPC8300) processor (revision 1.0) with 236544K/25600K bytes
of memory.
Processor board ID FTX1000038X
5 FastEthernet interfaces
1 Virtual Private Network (VPN) Module
256K bytes of non-volatile configuration memory.
126000K bytes of ATA CompactFlash (Read/Write)
License Info:
License UDI:
-------------------------------------------------
Device# PID SN
-------------------------------------------------
*0 CISCO881-SEC-K9 FTX1000038X
License Information for 'c880-data'
License Level: advipservices Type: Permanent
Next reboot license Level: advipservices
Configuration register is 0x2102
'''
import sys
# New empty dictionary to store information.
router_dict = {}
# Get vendor, although we know it's Cisco anyway.
if 'Cisco' in sh_ver:
router_dict['vendor'] = 'Cisco'
else:
sys.exit('This is not a Cisco device')
# Split sh ver output to a list of lines
lines = sh_ver.split('\n')
# Get the IOS version, this parses for the string 'Cisco IOS Software',
# in every line in 'lines.' It then splits the string stored in position
# 0 and returns position 2 as the os version and strips off the leading
# space.
router_dict['os_ver'] = [i for i in lines if 'Cisco IOS Software' in
i][0].split(',')[2][1:]
# Get the model of router using the same logic as the IOS version. The line
# doesn't have a nice split character so I rebuilt the string using spaces.
router_dict['model'] = ' '.join([i for i in lines if 'bytes of memory'
in i][0].split()[0:3])
# Get uptime using the same logic as 'model'
router_dict['uptime'] = ' '.join([i for i in lines if 'uptime' in
i][0].split()[3:])
# Get serial number using the logic from 'os_ver'
router_dict['serial'] = [i for i in lines if 'Processor board ID' in
i][0].split()[3]
for i in router_dict:
print('{:<10} {}'.format(i, router_dict.get(i)))
Thanks,
Bryon
More information about the Tutor
mailing list