#!/usr/bin/env python
# vim:ts=2:et:sw=2:ai
#
# Check configs with remote addresses
#
# Rick van der Zwet <info@rickvanderzwet.nl>
#
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' % vars(sess))
  return filter(None, retval)[0]



def main():
  for host in gformat.get_hostlist():
    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'):
        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):
          print "### Conection failed"
        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 sys.argv[1:]:
    for host in sys.argv[1:]:
      print get_bridge_type(host)
  else:
    main()







