fix bugs in last few commits
[uccvend-vendserver.git] / sql-edition / servers / LATClient.py
index b7818de..ce77970 100644 (file)
@@ -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,
@@ -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,47 @@ 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):
-               return (self.sock.makefile('r'), self.sock.makefile('w'))
+               return (self.rfh, self.wfh)

UCC git Repository :: git.ucc.asn.au