start by reading
[zanchey/dispense2.git] / sql-edition / servers / LATClient.py
index 2603ce9..ffa8963 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,28 @@ 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:
+                       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()
+               echo = rfh.read(1)
+               if echo != message[0]:
+                       print "Gah, expected echo when writing", message[0]
+               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,
 class LATClient:
        def __init__(self, service = None, node = None, port = None,
                     localport = None, password = None, is_queued = False,
@@ -70,30 +92,38 @@ 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)
+               read_for_a_bit(mopr)
+               write_expecting_echo(mopr, mopw, '\n')
+               read_for_a_bit(mopr)
+               write_expecting_echo(mopr, mopw, 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
                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