b7818debc1171de0d2da36d22bdbe583fa1dfad1
[uccvend-vendserver.git] / sql-edition / servers / LATClient.py
1 from socket import *
2 from select import select
3 from os import popen
4 from time import sleep
5
6 LATCP_SOCKET = '/var/run/latlogin'
7
8 LAT_VERSION = '1.21'
9 LATCP_CMD_VERSION = 8
10 LATCP_CMD_TERMINALSESSION = 26
11 LATCP_CMD_ERRORMSG = 99
12
13 class LATClientException(Exception): pass
14
15 class LATClient:
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=''):
19
20                 self.server_name = server_name
21                 self.connect_password = connect_password
22                 self.priv_password = priv_password
23                 
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 = ''
33                 if is_queued == True:
34                         is_queued = 1
35                 else:
36                         is_queued = 0
37                 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
38                         (is_queued,
39                          len(service), service,
40                          len(node), node,
41                          len(port), port,
42                          len(localport), localport,
43                          len(password), password
44                          ))
45                 (cmd, msg) = self.read_reply()
46                 if ord(cmd) == LATCP_CMD_ERRORMSG:
47                         raise LATClientException(msg)
48
49                 r = select([self.sock], [], [], 2.0)[0]
50                 if r:
51                         l = self.sock.readline()
52                         if l.find('Service in use') >= 0:
53                                 print "Service in use, apparently: restarting DEC server"
54                                 self.reboot_server()
55
56         def __del__(self):
57                 try:
58                         self.sock.close()
59                         self.sock.shutdown(2)
60                 except:
61                         pass
62                 del self.sock
63
64         def send_msg(self, cmd, msg):
65                 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
66
67         def reboot_server(self):
68                 self.sock.shutdown(2)
69                 self.sock.close()
70                 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
71                 mop.write('\n')
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')
77                 mop.close()
78                 print "Waiting 10 seconds for DEC server to come back to life..."
79                 sleep(10)
80
81         def read_reply(self):
82                 head = self.sock.recv(3)
83                 if len(head) != 3:
84                         sys.stderr.write('Error: Short LAT packet\n')
85                         return None
86                 cmd = head[0]
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)
91                 return (cmd, msg)
92         
93         def get_fh(self):
94                 return (self.sock.makefile('r'), self.sock.makefile('w'))

UCC git Repository :: git.ucc.asn.au