# -*- Mode: Python; tab-width: 4 -*-

# monitor client, win32 version
# since we can't do select() on stdin/stdout, we simply
# use threads and blocking sockets.  <sigh>

from hashlib import md5
import socket
import string
import sys
import thread


def hex_digest(s):
    m = md5()
    m.update(s)
    return string.join(
        map(lambda x: hex(ord(x))[2:], map(None, m.digest())),
        '',
    )


def reader(lock, sock, password):
    # first grab the timestamp
    ts = sock.recv(1024)[:-2]
    sock.send(hex_digest(ts + password) + '\r\n')
    while 1:
        d = sock.recv(1024)
        if not d:
            lock.release()
            print('Connection closed.  Hit <return> to exit')
            thread.exit()
        sys.stdout.write(d)
        sys.stdout.flush()


def writer(lock, sock, barrel="just kidding"):
    while lock.locked():
        sock.send(
            sys.stdin.readline()[:-1] + '\r\n'
        )


if __name__ == '__main__':
    if len(sys.argv) == 1:
        print('Usage: %s host port')
        sys.exit(0)
    print('Enter Password: \n')
    p = raw_input()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((sys.argv[1], string.atoi(sys.argv[2])))
    l = thread.allocate_lock()
    l.acquire()
    thread.start_new_thread(reader, (l, s, p))
    writer(l, s)
