2603ce9cafa14e032e0efee086f0fbf575c7f57b
[zanchey/dispense2.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                 self.rfh = self.sock.makefile('r')
50                 self.wfh = self.sock.makefile('w')
51
52                 r = select([self.rfh], [], [], 2.0)[0]
53                 if r:
54                         l = self.rfh.readline()
55                         if l.find('Service in use') >= 0:
56                                 print "Service in use, apparently: restarting DEC server"
57                                 self.reboot_server()
58
59         def __del__(self):
60                 try:
61                         self.sock.close()
62                         self.sock.shutdown(2)
63                 except:
64                         pass
65                 del self.sock
66
67         def send_msg(self, cmd, msg):
68                 self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
69
70         def reboot_server(self):
71                 self.sock.shutdown(2)
72                 self.sock.close()
73                 mop = popen('/usr/sbin/moprc '+self.server_name, 'w')
74                 mop.write('\n')
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')
80                 mop.close()
81                 print
82                 print "Waiting 10 seconds for DEC server to come back to life..."
83                 sleep(10)
84                 print "Rightyo, back to vending!"
85                 print
86
87         def read_reply(self):
88                 head = self.sock.recv(3)
89                 if len(head) != 3:
90                         sys.stderr.write('Error: Short LAT packet\n')
91                         return None
92                 cmd = head[0]
93                 length = ord(head[1])*256 + ord(head[2])
94                 msg = self.sock.recv(length)
95                 if cmd == LATCP_CMD_ERRORMSG:
96                         sys.stderr.write('Error: Received LAT error: %s\n'%msg)
97                 return (cmd, msg)
98         
99         def get_fh(self):
100                 return (self.rfh, self.wfh)

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