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:
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)
97 write_expecting_echo(mopr, mopw, '\n')
99 write_expecting_echo(mopr, mopw, self.connect_password+'\n')
101 write_expecting_echo(mopr, mopw, 'grim reaper\n')
103 write_expecting_echo(mopr, mopw, 'set priv\n')
105 write_expecting_echo(mopr, mopw, self.priv_password+'\n')
107 write_expecting_echo(mopr, mopw, 'init del 0\n')
112 print "Waiting 10 seconds for DEC server to come back to life..."
114 print "Rightyo, back to vending!"
116 raise LATClientException('needed to reboot server')
118 def read_reply(self):
119 head = self.sock.recv(3)
121 raise LATClientException('Short LAT packet')
123 length = ord(head[1])*256 + ord(head[2])
124 msg = self.sock.recv(length)
125 if cmd == LATCP_CMD_ERRORMSG:
126 raise LATClientException('Received LAT error: %s'%msg)
130 return (self.rfh, self.wfh)