do even more logging
[zanchey/dispense2.git] / sql-edition / servers / LATClient.py
index 7c21d0d..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,14 +97,30 @@ 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
                print "Waiting 10 seconds for DEC server to come back to life..."
                sleep(10)

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