X-Git-Url: https://git.ucc.asn.au/?p=zanchey%2Fdispense2.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FLATClient.py;h=12cc47ceef5f64c9650dc6bf985ef0dab849e44f;hp=b7818debc1171de0d2da36d22bdbe583fa1dfad1;hb=970001af150dd11d28f38d3fbe643db9812a4cfd;hpb=312dc943f2731acc8fc8b8b5cc186941169bd898 diff --git a/sql-edition/servers/LATClient.py b/sql-edition/servers/LATClient.py index b7818de..12cc47c 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: + message = message + rfh.read(1) + else: + break + print "Received message: ", repr(message) + return message + +def write_expecting_echo(rfh, wfh, message): + print "Writing message:", repr(message) + while len(message) > 0: + wfh.write(message[0]) + wfh.flush() + if message[0] == '\n': + echo = rfh.read(2) + expected_echo = '\r\n' + else: + echo = rfh.read(1) + expected_echo = message[0] + if echo != expected_echo: + print "Gah, expected echo when writing", repr(message[0]), "but got", repr(echo) + message = message[1:] + print " --> Sent and echoed." + class LATClient: def __init__(self, service = None, node = None, port = None, localport = None, password = None, is_queued = False, @@ -46,9 +73,12 @@ class LATClient: if ord(cmd) == LATCP_CMD_ERRORMSG: raise LATClientException(msg) - r = select([self.sock], [], [], 2.0)[0] + self.rfh = self.sock.makefile('r') + self.wfh = self.sock.makefile('w') + + r = select([self.rfh], [], [], 2.0)[0] if r: - l = self.sock.readline() + l = self.rfh.readline() if l.find('Service in use') >= 0: print "Service in use, apparently: restarting DEC server" self.reboot_server() @@ -67,28 +97,39 @@ 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) + read_for_a_bit(mopr) + mopw.write('\n') + read_for_a_bit(mopr) + mopw.write(self.connect_password+'\n') + read_for_a_bit(mopr) + write_expecting_echo(mopr, mopw, 'grim reaper\n') + read_for_a_bit(mopr) + write_expecting_echo(mopr, mopw, 'set priv\n') + read_for_a_bit(mopr) + write_expecting_echo(mopr, mopw, self.priv_password+'\n') + read_for_a_bit(mopr) + write_expecting_echo(mopr, mopw, 'init del 0\n') + read_for_a_bit(mopr) + 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): - return (self.sock.makefile('r'), self.sock.makefile('w')) + return (self.rfh, self.wfh)