Sagar Kadambi
Sagar Kadambi

Reputation: 75

Not able to ignore socket.timeout error using Paramiko

I am trying to SSH into a bunch of routers and grep some info from each. Some of the router IPs might not be valid as they are got from the loop. For the ones that do not exist, i am getting a socket.timeout error (obviously) and the script exits execution at that point. I want python to ignore this error and continue with the rest of the iterations. I have included the except/pass/continue commands, but they somehow do not seem to be doing their job and i am still getting the socket.timeout error and exiting the script :

import paramiko
import socket
import subprocess
import time

site = ['sao2','mia2','par2','scs2','sin4','sjl1','syd3','tok2','tor1','wdc1','akl1','chc1','chi2','cop2','dal1','fra2']
csr_hostname = 'csr_1'
csr_pass = str('*******')
username = str('test_user')
csrcmd = 'sh ver \n'

f = open ("version_output.txt", 'r+')
#*********************************************************************
for DC in site :
    y = str(DC)

    mcp = socket.gethostbyname(y)

    mcpip = mcp.split('.')
    mcpip2 = int(mcpip[0])
    mcpip3 = int(mcpip[1])
    mcpip4 = int(mcpip[2])

    print (DC + ":")
    f.write('\n')
    f.write(DC)
    f.write('\n=====\n')

    for i in range(5,33):
        x=37+(2*i)
        mcpcsr = (str(mcpip2) + ('.') + str(mcpip3)+ ('.') + str(mcpip4)+ ('.') + str(x))
        fqdn1=(str(i)+'-01.'+str(DC))
        print i
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(mcpcsr, username=username, password=csr_pass, look_for_keys = False, allow_agent = False, timeout=10) 

        router_channel = ssh.invoke_shell()
        router_channel.settimeout(2)


        try :
            buff = ''
            router_channel.send(csrcmd)
            time.sleep(1)
            buff = router_channel.recv(99999)
            for item in buff.split("\n"):
                if "Cisco IOS XE Software, Version" in item :
                    csrver = (fqdn1 + " : " + item.strip())
                if "Cisco IOS Software" in item :
                    csrver1 = (item.strip())
            print csrver
            print csrver1
            f.write(csrver)
            f.write('\n')
            f.write(csrver1)
            f.write('\n')
            fqdn1 = ''
            ssh.close()


    #*********************************************************************

        except socket.timeout:
            print ("bla bla")
            pass
            continue

        except socket.error : 
            print ("bla bla")
            pass
            continue

        except paramiko.SSHException, socket.error :
            print ("bla bla")
            pass
            continue
        except Exception :
            print ("bla bla")
            pass
            continue

    #*********************************************************************   

Output :

Traceback (most recent call last):
  File "csrnum.py", line 36, in ?
    ssh.connect(mcpcsr, username=username, password=csr_pass, look_for_keys = False, allow_agent = False, timeout=10) 
  File "/usr/lib/python2.4/site-packages/paramiko/client.py", line 291, in connect
    sock.connect(addr)
  File "<string>", line 1, in connect
socket.timeout: timed out

Any insight into this will be much appreciated and grateful for!

Upvotes: 3

Views: 7072

Answers (1)

Sagar Kadambi
Sagar Kadambi

Reputation: 75

Figured it out! The exceptions were set one indent more than the one where the ssh connections were attempted. Made a small change to the code to accomodate this and the exceptions are working as expected!

Upvotes: 2

Related Questions