#!/usr/bin/env python
from paramiko import SSHClient, MissingHostKeyPolicy
from clusto.scripthelpers import init_script
from clusto.drivers import PenguinServer
import clusto

from optparse import OptionParser
from traceback import format_exc
import sys
import re

sys.path.insert(0, '/var/lib/clusto')
from sysinfo import discover_hardware, update_server 

ifpattern = re.compile('^(?P<type>[a-z]+)(?P<num>[0-9]+)$')

class SilentPolicy(MissingHostKeyPolicy):
    def missing_host_key(self, client, hostname, key): pass

def main():
    parser = OptionParser(usage='usage: %prog [options] <object>')
    options, args = parser.parse_args()

    if not args:
        parser.print_help()
        return -1

    try:
        obj = clusto.get(args[0])
    except LookupError:
        sys.stderr.write('Object does not exist: %s\n' % args[0])
        return -1
    obj = obj[0]

    if not obj.type in ('server', 'virtualserver'):
        obj = obj.contents()
    else:
        obj = [obj]

    for server in obj:
        if not server.type in ('server', 'virtualserver'):
            sys.stdout.write('Not a server\n')
            continue

        #if server.attr_values(key='disk', subkey='serial'):
        #    continue

        sys.stdout.write(server.name + ' ')
        sys.stdout.flush()

        ip = server.get_ips()
        if not ip:
            sys.stdout.write('No IP assigned\n')
            continue
        ip = ip[0]

        try:
            sys.stdout.write('discover_hardware ')
            sys.stdout.flush()
            info = discover_hardware(ip)
        except:
            sys.stdout.write('Unable to discover. %s\n' % sys.exc_info()[1])
            continue

        try:
            sys.stdout.write('update_server ')
            clusto.begin_transaction()
            update_server(server, info)
            clusto.commit()
            sys.stdout.write('.\n')
        except:
            sys.stdout.write('Error updating clusto:\n%s\n' % format_exc())
            clusto.rollback_transaction()
        sys.stdout.flush()

if __name__ == '__main__':
    init_script()

    sys.exit(main())
