from select import select
from os import popen4
from time import sleep
+import logging
LATCP_SOCKET = '/var/run/latlogin'
while 1:
r = select([rfh], [], [], 5.0)[0]
if r:
- message = message + rfh.read(1)
+ try:
+ ch = rfh.read(1)
+ except socket.error:
+ ch = ''
+ if ch == '':
+ break
+ message = message + ch
else:
break
- print "Received message: ", repr(message)
+ logging.debug("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."
+def write_and_get_response(rfh, wfh, message, expect_echo=True):
+ logging.debug("Writing message:", repr(message))
+ wfh.write(message+'\r\n')
+ wfh.flush()
+ logging.debug(" --> 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,
if r:
l = self.rfh.readline()
if l.find('Service in use') >= 0:
- print "Service in use, apparently: restarting DEC server"
+ logging.warning("Service in use, apparently: restarting DEC server")
self.reboot_server()
def __del__(self):
def reboot_server(self):
self.sock.shutdown(2)
self.sock.close()
+
+ logging.info('Logging into DEC server')
mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name)
- 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)
+ write_and_get_response(mopr, mopw, '')
+
+ logging.info('Sending password')
+ r = write_and_get_response(mopr, mopw, self.connect_password, False)
+ if r.find('Enter username> ') == -1:
+ logging.warning("Expected username prompt, got " + repr(r))
+ raise LATClientException('failed to reboot server')
+
+ logging.info('Sending username')
+ r = write_and_get_response(mopr, mopw, 'grim reaper')
+ if r.find('Local> ') == -1:
+ logging.warning("Expected DEC server prompt, got " + repr(r))
+ raise LATClientException('failed to reboot server')
+
+ logging.info('Requesting privileges')
+ r = write_and_get_response(mopr, mopw, 'set priv')
+ if r.find('Password> ') == -1:
+ logging.warning("Expected priv password prompt, got " + repr(r))
+ raise LATClientException('failed to reboot server')
+
+ logging.info('Sending password')
+ r = write_and_get_response(mopr, mopw, self.priv_password, False)
+ if r.find('Local> ') == -1:
+ logging.warning("Expected DEC server prompt, got " + repr(r))
+ raise LATClientException('failed to reboot server')
+
+ logging.info('Sending reboot request')
+ r = write_and_get_response(mopr, mopw, 'init del 0')
+ if r.find('Target does not respond') == -1:
+ logging.warning("Expected DEC server to die, got " + repr(r))
+ raise LATClientException('failed to reboot server')
+
+ logging.info('Closed connection to server')
mopr.close()
mopw.close()
- print
- print "Waiting 10 seconds for DEC server to come back to life..."
+ logging.info("Waiting 10 seconds for DEC server to come back to life...")
sleep(10)
- print "Rightyo, back to vending!"
- print
+ logging.info("Rightyo, back to vending!")
raise LATClientException('needed to reboot server')
def read_reply(self):