fix bugs in last few commits
[uccvend-vendserver.git] / sql-edition / servers / LATClient.py
index 2603ce9..ce77970 100644 (file)
@@ -1,6 +1,6 @@
 from socket import *
 from select import select
 from socket import *
 from select import select
-from os import popen
+from os import popen4
 from time import sleep
 
 LATCP_SOCKET = '/var/run/latlogin'
 from time import sleep
 
 LATCP_SOCKET = '/var/run/latlogin'
@@ -12,6 +12,33 @@ LATCP_CMD_ERRORMSG = 99
 
 class LATClientException(Exception): pass
 
 
 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,
 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()
        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
                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:
 
        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:
                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 (cmd, msg)
        
        def get_fh(self):

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