X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FLATClient.py;h=ce77970f336f4a502522e884d6f401452352d5b9;hp=2603ce9cafa14e032e0efee086f0fbf575c7f57b;hb=37123733790f1525161256cfabd1da877bf37e74;hpb=ddbc951719d0798a96355931cf5077b6de8d94aa;ds=sidebyside diff --git a/sql-edition/servers/LATClient.py b/sql-edition/servers/LATClient.py index 2603ce9..ce77970 100644 --- a/sql-edition/servers/LATClient.py +++ b/sql-edition/servers/LATClient.py @@ -1,6 +1,6 @@ from socket import * from select import select -from os import popen +from os import popen4 from time import sleep LATCP_SOCKET = '/var/run/latlogin' @@ -12,6 +12,33 @@ LATCP_CMD_ERRORMSG = 99 class LATClientException(Exception): pass +def read_for_a_bit(rfh): + message = '' + while 1: + r = select([rfh], [], [], 5.0)[0] + if r: + try: + ch = rfh.read(1) + except socket.error: + ch = '' + if ch == '': + break + message = message + ch + else: + break + print "Received message: ", repr(message) + return message + +def write_and_get_response(rfh, wfh, message, expect_echo=True): + print "Writing message:", repr(message) + wfh.write(message+'\r\n') + wfh.flush() + print " --> Sent" + response = read_for_a_bit(rfh) + if response.find(message) == -1 and expect_echo: + raise LATClientException("Talking to DEC server, expected to find original message in echo but didn't") + return response + class LATClient: def __init__(self, service = None, node = None, port = None, localport = None, password = None, is_queued = False, @@ -70,30 +97,46 @@ class LATClient: def reboot_server(self): self.sock.shutdown(2) self.sock.close() - mop = popen('/usr/sbin/moprc '+self.server_name, 'w') - mop.write('\n') - mop.write(self.connect_password+'\n') - mop.write('grim reaper\n') - mop.write('set priv\n') - mop.write(self.priv_password+'\n') - mop.write('init del 0\n') - mop.close() + mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name) + write_and_get_response(mopr, mopw, '') + r = write_and_get_response(mopr, mopw, self.connect_password, False) + if r.find('Enter username> ') == -1: + print "Expected username prompt, got ", repr(r) + raise LATClientException('failed to reboot server') + r = write_and_get_response(mopr, mopw, 'grim reaper') + if r.find('Local> ') == -1: + print "Expected DEC server prompt, got ", repr(r) + raise LATClientException('failed to reboot server') + r = write_and_get_response(mopr, mopw, 'set priv') + if r.find('Password> ') == -1: + print "Expected priv password prompt, got ", repr(r) + raise LATClientException('failed to reboot server') + r = write_and_get_response(mopr, mopw, self.priv_password, False) + if r.find('Local> ') == -1: + print "Expected DEC server prompt, got ", repr(r) + raise LATClientException('failed to reboot server') + r = write_and_get_response(mopr, mopw, 'init del 0') + if r.find('Target does not respond') == -1: + print "Expected DEC server to die, got ", repr(r) + raise LATClientException('failed to reboot server') + mopr.close() + mopw.close() print print "Waiting 10 seconds for DEC server to come back to life..." sleep(10) print "Rightyo, back to vending!" print + raise LATClientException('needed to reboot server') def read_reply(self): head = self.sock.recv(3) if len(head) != 3: - sys.stderr.write('Error: Short LAT packet\n') - return None + raise LATClientException('Short LAT packet') cmd = head[0] length = ord(head[1])*256 + ord(head[2]) msg = self.sock.recv(length) if cmd == LATCP_CMD_ERRORMSG: - sys.stderr.write('Error: Received LAT error: %s\n'%msg) + raise LATClientException('Received LAT error: %s'%msg) return (cmd, msg) def get_fh(self):