Python | Cisco details in bulk

Run Python Automation Script to fetch Cisco Routers and Switches details in Bulk.

The details includes “hostname, uptime, current version, current image, serial number, device model, device memory”


Pre-Requisite: Netmiko



About Script:

  • The script will login to each IP Address defined in ip_list

  • Create 2 files to save the output of the script (fetch data and write to IOS.csv on successful login and write to login_issues.csv on unsuccessful login with reason)

  • In case of any exception/error, it will not stop the script, it will write the error/exceptions in login_issues.csv and continue to run the script for the remaining IP Address.

  • It will use regex to fetch all the information from router/switch like “uptime, hostname, version, memory, ios, serial, model etc

  • All the data will be appended to devices = []

  • Finally it will write the data from devices = [] to IOS.csv file.


The Script:

from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from netmiko.ssh_exception import SSHException
from netmiko.ssh_exception import AuthenticationException

import re

#here is list of cisco routers ip addresses
ip_list = ['192.168.1.1', '192.168.1.2', '192.168.1.3']

#list where informations will be stored
devices = []

#clearing the old data from the CSV file and writing the headers
f = open("IOS.csv", "w+")
f.write("IP Address, Hostname, Uptime, Current_Version, Current_Image, Serial_Number, Device_Model, Device_Memory")
f.write("\n")
f.close()

#clearing the old data from the CSV file and writing the headers
f = open("login_issues.csv", "w+")
f.write("IP Address, Status")
f.write("\n")
f.close()



#loop all ip addresses in ip_list
for ip in ip_list:
    cisco = {
    'device_type':'cisco_ios',
    'ip':ip,
    'username':'cisco',    
    'password':'cisco',  
    'ssh_strict':False,  
    'fast_cli':False,
    }
    
    #handling exceptions errors
    
    try:
        net_connect = ConnectHandler(**cisco)
    except NetMikoTimeoutException:
        f = open("login_issues.csv", "a")
        f.write(ip + "," + "Device Unreachable/SSH not enabled")
        f.write("\n")
        f.close()
        continue
    except AuthenticationException:
        f = open("login_issues.csv", "a")
        f.write(ip + "," + "Authentication Failure")
        f.write("\n")
        f.close()
        continue
    except SSHException:
        f = open("login_issues.csv", "a")
        f.write(ip + "," + "SSH not enabled")
        f.write("\n")
        f.close()
        continue

    try:
        net_connect.enable()

    #handling exceptions errors        
    except ValueError:
        f = open("login_issues.csv", "a")
        f.write(ip + "," + "Could be SSH Enable Password issue")
        f.write("\n")
        f.close()
        continue
    

    #execute show version on router and save output to output object    
    sh_ver_output = net_connect.send_command('show version')   

    #finding hostname in output using regular expressions
    regex_hostname = re.compile(r'(\S+)\suptime')
    hostname = regex_hostname.findall(sh_ver_output)

    #finding uptime in output using regular expressions
    regex_uptime = re.compile(r'\S+\suptime\sis\s(.+)')
    uptime = regex_uptime.findall(sh_ver_output)
    uptime = str(uptime).replace(',' ,'').replace("'" ,"")
    uptime = str(uptime)[1:-1] 
    
    
    #finding version in output using regular expressions
    regex_version = re.compile(r'Cisco\sIOS\sSoftware.+Version\s([^,]+)')
    version = regex_version.findall(sh_ver_output)

    #finding serial in output using regular expressions
    regex_serial = re.compile(r'Processor\sboard\sID\s(\S+)')
    serial = regex_serial.findall(sh_ver_output)

    #finding ios image in output using regular expressions
    regex_ios = re.compile(r'System\simage\sfile\sis\s"([^ "]+)')
    ios = regex_ios.findall(sh_ver_output)

    #finding model in output using regular expressions
    regex_model = re.compile(r'[Cc]isco\s(\S+).*memory.')
    model = regex_model.findall(sh_ver_output)
    

    #finding the router's memory using regular expressions
    regex_memory = re.search(r'with (.*?) bytes of memory', sh_ver_output).group(1)
    memory = regex_memory
    
    
    
    #append results to table [hostname,uptime,version,serial,ios,model]
    devices.append([ip, hostname[0],uptime,version[0],ios[0], serial[0],model[0], memory])
    


#print all results (for all routers) on screen    
for i in devices:
    i = ", ".join(i)      
    f = open("IOS.csv", "a")
    f.write(i)
    f.write("\n")
    f.close()

IOS.csv:


This script has been tested on Cisco 2901, 7300 and 7600 and 7900 and it works perfectly fine.


gif

38 views0 comments

Recent Posts

See All

How to encrypt and decrypt files in Python When you need to encrypt text, it is important to understand the different options you have. There are different ways to encrypt text, like using a password,

### 👽⚠️ 𝗧𝗵𝗶𝘀 𝘀𝗰𝗿𝗶𝗽𝘁 𝗶𝘀 𝗷𝘂𝘀𝘁 𝘁𝗵𝗲 𝘁𝗼𝗼𝗹 𝗳𝗼𝗿 𝗲𝗱𝘂𝗰𝗮𝘁𝗶𝗼𝗻𝗮𝗹 𝗮𝗻𝗱 𝘁𝗲𝘀𝘁𝗶𝗻𝗴 𝗽𝘂𝗿𝗽𝗼𝘀𝗲𝘀 ⚠️👽 ### Descriptions: This is script for spamming the message from Wh

XML (Extensible Markup Language) is a markup language similar to HTML, but without predefined tags to use. Instead, you define your own tags designed specifically for your needs. This is a powerful wa