be able to reboot the DEC server when it dies
[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 LATClient:
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=''):
17
18                 self.server_name = server_name
19                 self.connect_password = connect_password
20                 self.priv_password = priv_password
21                 
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 = ''
31                 if is_queued == True:
32                         is_queued = 1
33                 else:
34                         is_queued = 0
35                 self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
36                         (is_queued,
37                          len(service), service,
38                          len(node), node,
39                          len(port), port,
40                          len(localport), localport,
41                          len(password), password
42                          ))
43                 (cmd, msg) = self.read_reply()
44                 if ord(cmd) == LATCP_CMD_ERRORMSG:
45                         raise Exception('LATClient: '+msg)
46
47                 r = select([self.sock], [], [], 2.0)[0]
48                 if r:
49                         l = self.sock.readline()
50                         if l.find('Service in use') >= 0:
51                                 print "Service in use, apparently: restarting DEC server"
52                                 self.reboot_server()
53
54         def __del__(self):
55                 try:
56                         self.sock.close()
57                         self.sock.shutdown(2)
58                 except:
59                         pass
60                 del self.sock
61
62         def send_msg(self, cmd, msg):
63                 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
64
65         def reboot_server(self):
66                 self.sock.shutdown(2)
67                 self.sock.close()
68                 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
69                 mop.write('\n')
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')
75                 mop.close()
76                 print "Waiting 10 seconds for DEC server to come back to life..."
77                 sleep(10)
78
79         def read_reply(self):
80                 head = self.sock.recv(3)
81                 if len(head) != 3:
82                         sys.stderr.write('Error: Short LAT packet\n')
83                         return None
84                 cmd = head[0]
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)
89                 return (cmd, msg)
90         
91         def get_fh(self):
92                 return (self.sock.makefile('r'), self.sock.makefile('w'))

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