2 from select import select
6 LATCP_SOCKET = '/var/run/latlogin'
10 LATCP_CMD_TERMINALSESSION = 26
11 LATCP_CMD_ERRORMSG = 99
14 def __init__(self, service = None, node = None, port = None,
15 localport = None, password = None, is_queued = False,
16 server_name = '', connect_password='', priv_password=''):
18 self.server_name = server_name
19 self.connect_password = connect_password
20 self.priv_password = priv_password
22 self.sock = socket(AF_UNIX, SOCK_STREAM, 0);
23 self.sock.connect(LATCP_SOCKET)
24 self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000')
25 (cmd, msg) = self.read_reply()
26 if service == None: service = ''
27 if node == None: node = ''
28 if port == None: port = ''
29 if localport == None: localport = ''
30 if password == None: password = ''
35 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
37 len(service), service,
40 len(localport), localport,
41 len(password), password
43 (cmd, msg) = self.read_reply()
44 if ord(cmd) == LATCP_CMD_ERRORMSG:
45 raise Exception('LATClient: '+msg)
47 r = select([self.sock], [], [], 2.0)[0]
49 l = self.sock.readline()
50 if l.find('Service in use') >= 0:
51 print "Service in use, apparently: restarting DEC server"
62 def send_msg(self, cmd, msg):
63 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
65 def reboot_server(self):
68 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
70 mop.write(self.connect_password+'\n')
71 mop.write('grim reaper\n')
72 mop.write('set priv\n')
73 mop.write(self.priv_password+'\n')
74 mop.write('init del 0\n')
76 print "Waiting 10 seconds for DEC server to come back to life..."
80 head = self.sock.recv(3)
82 sys.stderr.write('Error: Short LAT packet\n')
85 length = ord(head[1])*256 + ord(head[2])
86 msg = self.sock.recv(length)
87 if cmd == LATCP_CMD_ERRORMSG:
88 sys.stderr.write('Error: Received LAT error: %s\n'%msg)
92 return (self.sock.makefile('r'), self.sock.makefile('w'))