2 from select import select
6 LATCP_SOCKET = '/var/run/latlogin'
10 LATCP_CMD_TERMINALSESSION = 26
11 LATCP_CMD_ERRORMSG = 99
13 class LATClientException(Exception): pass
15 def read_for_a_bit(rfh):
18 r = select([rfh], [], [], 5.0)[0]
20 message = message + rfh.read(1)
23 print "Received message: ", repr(message)
26 def write_expecting_echo(rfh, wfh, message):
27 print "Writing message:", repr(message)
28 while len(message) > 0:
31 if message[0] == '\n':
33 expected_echo = '\r\n'
36 expected_echo = message[0]
37 if echo != expected_echo:
38 print "Gah, expected echo when writing", repr(message[0]), "but got", repr(echo)
40 print " --> Sent and echoed."
43 def __init__(self, service = None, node = None, port = None,
44 localport = None, password = None, is_queued = False,
45 server_name = '', connect_password='', priv_password=''):
47 self.server_name = server_name
48 self.connect_password = connect_password
49 self.priv_password = priv_password
51 self.sock = socket(AF_UNIX, SOCK_STREAM, 0);
52 self.sock.connect(LATCP_SOCKET)
53 self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000')
54 (cmd, msg) = self.read_reply()
55 if service == None: service = ''
56 if node == None: node = ''
57 if port == None: port = ''
58 if localport == None: localport = ''
59 if password == None: password = ''
64 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
66 len(service), service,
69 len(localport), localport,
70 len(password), password
72 (cmd, msg) = self.read_reply()
73 if ord(cmd) == LATCP_CMD_ERRORMSG:
74 raise LATClientException(msg)
76 self.rfh = self.sock.makefile('r')
77 self.wfh = self.sock.makefile('w')
79 r = select([self.rfh], [], [], 2.0)[0]
81 l = self.rfh.readline()
82 if l.find('Service in use') >= 0:
83 print "Service in use, apparently: restarting DEC server"
94 def send_msg(self, cmd, msg):
95 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
97 def reboot_server(self):
100 mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name)
104 mopw.write(self.connect_password+'\n')
106 write_expecting_echo(mopr, mopw, 'grim reaper\n')
108 write_expecting_echo(mopr, mopw, 'set priv\n')
110 write_expecting_echo(mopr, mopw, self.priv_password+'\n')
112 write_expecting_echo(mopr, mopw, 'init del 0\n')
117 print "Waiting 10 seconds for DEC server to come back to life..."
119 print "Rightyo, back to vending!"
121 raise LATClientException('needed to reboot server')
123 def read_reply(self):
124 head = self.sock.recv(3)
126 raise LATClientException('Short LAT packet')
128 length = ord(head[1])*256 + ord(head[2])
129 msg = self.sock.recv(length)
130 if cmd == LATCP_CMD_ERRORMSG:
131 raise LATClientException('Received LAT error: %s'%msg)
135 return (self.rfh, self.wfh)