X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FLATClient.py;h=d9b06148c6dfe57fe33c36b963d3ed4069854142;hp=12cc47ceef5f64c9650dc6bf985ef0dab849e44f;hb=ed18ff345c52cd0d868b8e26ee23cfcd7711abfd;hpb=40e17947a5da57fefc76768a23f55a9b9aed6e92 diff --git a/sql-edition/servers/LATClient.py b/sql-edition/servers/LATClient.py index 12cc47c..d9b0614 100644 --- a/sql-edition/servers/LATClient.py +++ b/sql-edition/servers/LATClient.py @@ -2,10 +2,11 @@ from socket import * from select import select from os import popen4 from time import sleep +import logging LATCP_SOCKET = '/var/run/latlogin' -LAT_VERSION = '1.21' +LAT_VERSION = '1.22' LATCP_CMD_VERSION = 8 LATCP_CMD_TERMINALSESSION = 26 LATCP_CMD_ERRORMSG = 99 @@ -17,27 +18,27 @@ def read_for_a_bit(rfh): while 1: r = select([rfh], [], [], 5.0)[0] if r: - message = message + rfh.read(1) + try: + ch = rfh.read(1) + except socket.error: + ch = '' + if ch == '': + break + message = message + ch else: break - print "Received message: ", repr(message) + logging.debug("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." +def write_and_get_response(rfh, wfh, message, expect_echo=True): + logging.debug("Writing message:", repr(message)) + wfh.write(message+'\r\n') + wfh.flush() + logging.debug(" --> 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, @@ -80,7 +81,7 @@ class LATClient: if r: l = self.rfh.readline() if l.find('Service in use') >= 0: - print "Service in use, apparently: restarting DEC server" + logging.warning("Service in use, apparently: restarting DEC server") self.reboot_server() def __del__(self): @@ -97,27 +98,47 @@ class LATClient: def reboot_server(self): self.sock.shutdown(2) self.sock.close() + + logging.info('Logging into DEC server') 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) + write_and_get_response(mopr, mopw, '') + + logging.info('Sending password') + r = write_and_get_response(mopr, mopw, self.connect_password, False) + if r.find('Enter username> ') == -1: + logging.warning("Expected username prompt, got " + repr(r)) + raise LATClientException('failed to reboot server') + + logging.info('Sending username') + r = write_and_get_response(mopr, mopw, 'grim reaper') + if r.find('Local> ') == -1: + logging.warning("Expected DEC server prompt, got " + repr(r)) + raise LATClientException('failed to reboot server') + + logging.info('Requesting privileges') + r = write_and_get_response(mopr, mopw, 'set priv') + if r.find('Password> ') == -1: + logging.warning("Expected priv password prompt, got " + repr(r)) + raise LATClientException('failed to reboot server') + + logging.info('Sending password') + r = write_and_get_response(mopr, mopw, self.priv_password, False) + if r.find('Local> ') == -1: + logging.warning("Expected DEC server prompt, got " + repr(r)) + raise LATClientException('failed to reboot server') + + logging.info('Sending reboot request') + r = write_and_get_response(mopr, mopw, 'init del 0') + if r.find('Target does not respond') == -1: + logging.warning("Expected DEC server to die, got " + repr(r)) + raise LATClientException('failed to reboot server') + + logging.info('Closed connection to server') mopr.close() mopw.close() - print - print "Waiting 10 seconds for DEC server to come back to life..." + logging.info("Waiting 10 seconds for DEC server to come back to life...") sleep(10) - print "Rightyo, back to vending!" - print + logging.info("Rightyo, back to vending!") raise LATClientException('needed to reboot server') def read_reply(self):