from binascii import b2a_hex
import psutil

BABEL_HMAC = 'babel_hmac0', 'babel_hmac1', 'babel_hmac2'

def getConfig(db, name):
    r = db.execute("SELECT value FROM config WHERE name=?", (name,)).fetchone()
    if r:
        return b2a_hex(*r)

def killRe6st(node):
    for p in psutil.Process(node._screen.pid).children():
        if p.cmdline()[-1].startswith('set ./py re6stnet '):
            p.kill()
            break

def checkHMAC(db, machines):
    hmac = [getConfig(db, k) for k in BABEL_HMAC]
    rc = True
    for x in psutil.Process().children(True):
        if x.name() == 'babeld':
            sign = accept = None
            args = x.cmdline()
            for x in args:
                if x.endswith('/babeld.log'):
                    if x[:-11] not in machines:
                        break
                elif x.startswith('key '):
                    x = x.split()
                    if 'sign' in x:
                        sign = x[-1]
                    elif 'accept' in x:
                        accept = x[-1]
            else:
                i = 0 if hmac[0] else 1
                if hmac[i] != sign or hmac[i+1] != accept:
                    print('HMAC config wrong for in %s' % args)
                    rc = False
    if rc:
        print('All nodes use Babel with the correct HMAC configuration')
    else:
        print(('Expected config: %s' % dict(list(zip(BABEL_HMAC, hmac)))))
    return rc