#!/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 sys
import socket
import paramiko

class CmdError(Exception):
  pass

try:
  raise CmdError("rick")
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

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='p2nn3nk03k',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 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)
          d = check_host(addr)
          datadump[iface_key]['bridge_type'] = d['board.name']
        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:]:
      check_host(host)
  main()
