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
16 def __init__(self, service = None, node = None, port = None,
17 localport = None, password = None, is_queued = False,
18 server_name = '', connect_password='', priv_password=''):
20 self.server_name = server_name
21 self.connect_password = connect_password
22 self.priv_password = priv_password
24 self.sock = socket(AF_UNIX, SOCK_STREAM, 0);
25 self.sock.connect(LATCP_SOCKET)
26 self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000')
27 (cmd, msg) = self.read_reply()
28 if service == None: service = ''
29 if node == None: node = ''
30 if port == None: port = ''
31 if localport == None: localport = ''
32 if password == None: password = ''
37 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
39 len(service), service,
42 len(localport), localport,
43 len(password), password
45 (cmd, msg) = self.read_reply()
46 if ord(cmd) == LATCP_CMD_ERRORMSG:
47 raise LATClientException(msg)
49 self.rfh = self.sock.makefile('r')
50 self.wfh = self.sock.makefile('w')
52 r = select([self.rfh], [], [], 2.0)[0]
54 l = self.rfh.readline()
55 if l.find('Service in use') >= 0:
56 print "Service in use, apparently: restarting DEC server"
67 def send_msg(self, cmd, msg):
68 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
70 def reboot_server(self):
73 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
75 mop.write(self.connect_password+'\n')
76 mop.write('grim reaper\n')
77 mop.write('set priv\n')
78 mop.write(self.priv_password+'\n')
79 mop.write('init del 0\n')
82 print "Waiting 10 seconds for DEC server to come back to life..."
84 print "Rightyo, back to vending!"
86 raise LATClientException('needed to reboot server')
89 head = self.sock.recv(3)
91 raise LATClientException('Short LAT packet')
93 length = ord(head[1])*256 + ord(head[2])
94 msg = self.sock.recv(length)
95 if cmd == LATCP_CMD_ERRORMSG:
96 raise LATClientException('Received LAT error: %s'%msg)
100 return (self.rfh, self.wfh)