#!/usr/bin/env python # vim:ts=2:et:sw=2:ai # # Check configs with remote addresses # # Rick van der Zwet # import gformat import netsnmp import paramiko import socket import sys netsnmp.verbose = 0 class CmdError(Exception): pass def check_host(hostname): cmd = "cat /etc/board.info" ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname, username='root', password='XXXXXXXXXX',timeout=3) stdin, stdout, stderr = ssh.exec_command(cmd) stdout = stdout.readlines() stderr = stderr.readlines() ssh.close() if stderr: raise CmdError(stderr) return dict(map(lambda x: x.strip().split('='),stdout)) def get_bridge_type(host): """ Both NS and NS Mx uses a slighly different OID""" var_list = netsnmp.VarList( *map(lambda x: netsnmp.Varbind(x), ['.1.2.840.10036.3.1.2.1.3.6', '.1.2.840.10036.3.1.2.1.3.7'])) sess = netsnmp.Session(Version=1, DestHost=host, Community='public', Timeout=2 * 100000, Retries=0) retval = sess.get(var_list) if sess.ErrorInd < 0: raise CmdError('[%(ErrorInd)s] %(ErrorStr)s (%(DestHost)s)' % vars(sess)) return filter(None, retval)[0] def main(hostfilter=None): for host in gformat.get_hostlist(): if hostfilter and not hostfilter in host: continue print "# Processing host", host datadump = gformat.get_yaml(host) for iface_key in datadump['autogen_iface_keys']: ifacedump = datadump[iface_key] if ifacedump.has_key('ns_ip') and ifacedump['ns_ip']: addr = ifacedump['ns_ip'].split('/')[0] print "## Bridge IP: %s" % addr try: socket.create_connection((addr,80),2) bridge_type = get_bridge_type(addr) datadump[iface_key]['bridge_type'] = bridge_type except (socket.timeout, socket.error) as e: print "### %s (%s)" % (e, addr) except paramiko.AuthenticationException: print "### Conection failed (invalid username/password)" except CmdError, e: print "### Command error: %s" % e gformat.store_yaml(datadump) if __name__ == '__main__': if len(sys.argv) == 2: main(hostfilter=sys.argv[1]) else: main()