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 r = select([self.sock], [], [], 2.0)[0]
51 l = self.sock.readline()
52 if l.find('Service in use') >= 0:
53 print "Service in use, apparently: restarting DEC server"
64 def send_msg(self, cmd, msg):
65 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
67 def reboot_server(self):
70 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
72 mop.write(self.connect_password+'\n')
73 mop.write('grim reaper\n')
74 mop.write('set priv\n')
75 mop.write(self.priv_password+'\n')
76 mop.write('init del 0\n')
78 print "Waiting 10 seconds for DEC server to come back to life..."
82 head = self.sock.recv(3)
84 sys.stderr.write('Error: Short LAT packet\n')
87 length = ord(head[1])*256 + ord(head[2])
88 msg = self.sock.recv(length)
89 if cmd == LATCP_CMD_ERRORMSG:
90 sys.stderr.write('Error: Received LAT error: %s\n'%msg)
94 return (self.sock.makefile('r'), self.sock.makefile('w'))