#!/usr/bin/python

from time import sleep
from os.path import join
from sys import exc_info
from traceback import print_exception

from cluster import cluster, host
from ztest import kdc

failure = None
n = 3
try:
    c = cluster(spec=[kdc] + [host]*(n+1)) # client + n servers
    c.setup()


    hosts = [testmachine for (testmachine, prototype) in c.machines[host]]
    servers = hosts[1:]
    client = hosts[0]
    k = c.machines[kdc][0][1]

    for h in hosts:
        h.putstr('/etc/krb5.conf', k.krb5_conf)
        h.script('mkdir /etc/zephyr')
        h.putstr('/etc/zephyr/server.list', '\n'.join(t.params['hostname'] for t in servers) + '\n')

    ktname = k.keytab('zephyr/zephyr')

    for t in servers:
        t.putfile(ktname, '/etc/zephyr/krb5.keytab')
        t.script('touch /etc/zephyr/srvtab') # sigh, packaging bug

    #XXX need to cons up an apt repository
    packagepath='/home/kcr/src'
    packageversion = '3.0~beta.HEAD'
    arch = 'i386'
    serverpackages = ['libzephyr4-krb5', 'zephyr-server-krb5', 'zephyr-clients']
    clientpackages = ['libzephyr4-krb5', 'zephyr-clients']
    serverdebs = [package + '_' + packageversion + '_' + arch + '.deb'
                  for package in serverpackages]
    clientdebs = [package + '_' + packageversion + '_' + arch + '.deb'
                  for package in clientpackages]

    for t in servers:
        for deb in serverdebs:
            t.putfile(join(packagepath, deb), '/tmp')
            t.script('DEBIAN_FRONTEND=noninteractive dpkg -i ' + join('/tmp', deb))

    sleep(1) # let things settle

    for deb in clientdebs:
        client.putfile(join(packagepath, deb), '/tmp')
        client.script('DEBIAN_FRONTEND=noninteractive dpkg -i ' + join('/tmp', deb))

    sleep(1) # let things settle

    ret, stdout, stderr = client.run('zstat')

    assert stdout.count('SERV_UP') == n, 'server(s) not running'

    client.script(['echo test2 | kinit test2',
                   'zwgc -ttymode > /tmp/zwgcout',
                   'zwrite test2 -m FROTNITZ',
                   'zctl wg_exit',])
    
    ret, stdout, stderr = client.run('cat /tmp/zwgcout')

    assert 'FROTNITZ' in stdout, 'not receiving zephyrgrams'
    assert 'Authentic' in stdout, 'zephyrgram not authentic'

    ret, stdout, stderr = client.run('ps gax | grep -v grep | grep zwgc')

    assert 'zwgc' not in stdout, 'zwgc still running'
except:
    failure = exc_info()
finally:
    if failure is not None:
        print_exception(*failure)
        print 'waiting for acknowledgement'
        raw_input()
    c.teardown()
