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: ", message
26 def write_expecting_echo(rfh, wfh, message):
27 print "Writing message:",message
28 while len(message) > 0:
32 if echo != message[0]:
33 print "Gah, expected echo when writing", message[0]
35 print " --> Sent and echoed."
38 def __init__(self, service = None, node = None, port = None,
39 localport = None, password = None, is_queued = False,
40 server_name = '', connect_password='', priv_password=''):
42 self.server_name = server_name
43 self.connect_password = connect_password
44 self.priv_password = priv_password
46 self.sock = socket(AF_UNIX, SOCK_STREAM, 0);
47 self.sock.connect(LATCP_SOCKET)
48 self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000')
49 (cmd, msg) = self.read_reply()
50 if service == None: service = ''
51 if node == None: node = ''
52 if port == None: port = ''
53 if localport == None: localport = ''
54 if password == None: password = ''
59 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
61 len(service), service,
64 len(localport), localport,
65 len(password), password
67 (cmd, msg) = self.read_reply()
68 if ord(cmd) == LATCP_CMD_ERRORMSG:
69 raise LATClientException(msg)
71 self.rfh = self.sock.makefile('r')
72 self.wfh = self.sock.makefile('w')
74 r = select([self.rfh], [], [], 2.0)[0]
76 l = self.rfh.readline()
77 if l.find('Service in use') >= 0:
78 print "Service in use, apparently: restarting DEC server"
89 def send_msg(self, cmd, msg):
90 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
92 def reboot_server(self):
95 mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name)
96 write_expecting_echo(mopr, mopw, '\n')
98 write_expecting_echo(mopr, mopw, self.connect_password+'\n')
100 write_expecting_echo(mopr, mopw, 'grim reaper\n')
102 write_expecting_echo(mopr, mopw, 'set priv\n')
104 write_expecting_echo(mopr, mopw, self.priv_password+'\n')
106 write_expecting_echo(mopr, mopw, 'init del 0\n')
111 print "Waiting 10 seconds for DEC server to come back to life..."
113 print "Rightyo, back to vending!"
115 raise LATClientException('needed to reboot server')
117 def read_reply(self):
118 head = self.sock.recv(3)
120 raise LATClientException('Short LAT packet')
122 length = ord(head[1])*256 + ord(head[2])
123 msg = self.sock.recv(length)
124 if cmd == LATCP_CMD_ERRORMSG:
125 raise LATClientException('Received LAT error: %s'%msg)
129 return (self.rfh, self.wfh)