from socket import *
from select import select
-from os import popen
+from os import popen4
from time import sleep
LATCP_SOCKET = '/var/run/latlogin'
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,
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)