blob: eaabefe365eb95431ebd737f96624d0c80a72e6e [file] [log] [blame]
Guido van Rossumcdd04ca1992-12-20 18:14:23 +00001# Remote nusers client interface
2
3import rpc
Guido van Rossumb6372211992-12-21 14:32:55 +00004from rpc import Packer, Unpacker, UDPClient, BroadcastUDPClient
Guido van Rossumcdd04ca1992-12-20 18:14:23 +00005
6
7class RnusersPacker(Packer):
Tim Peterse6ddc8b2004-07-18 05:56:09 +00008 def pack_utmp(self, ui):
9 ut_line, ut_name, ut_host, ut_time = utmp
10 self.pack_string(ut_line)
11 self.pack_string(ut_name)
12 self.pack_string(ut_host)
13 self.pack_int(ut_time)
14 def pack_utmpidle(self, ui):
15 ui_itmp, ui_idle = ui
16 self.pack_utmp(ui_utmp)
17 self.pack_uint(ui_idle)
18 def pack_utmpidlearr(self, list):
19 self.pack_array(list, self.pack_itmpidle)
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000020
21
22class RnusersUnpacker(Unpacker):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000023 def unpack_utmp(self):
24 ut_line = self.unpack_string()
25 ut_name = self.unpack_string()
26 ut_host = self.unpack_string()
27 ut_time = self.unpack_int()
28 return ut_line, ut_name, ut_host, ut_time
29 def unpack_utmpidle(self):
30 ui_utmp = self.unpack_utmp()
31 ui_idle = self.unpack_uint()
32 return ui_utmp, ui_idle
33 def unpack_utmpidlearr(self):
34 return self.unpack_array(self.unpack_utmpidle)
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000035
36
Guido van Rossumb6372211992-12-21 14:32:55 +000037class PartialRnusersClient:
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000038
Tim Peterse6ddc8b2004-07-18 05:56:09 +000039 def addpackers(self):
40 self.packer = RnusersPacker()
41 self.unpacker = RnusersUnpacker('')
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000042
Tim Peterse6ddc8b2004-07-18 05:56:09 +000043 def Num(self):
44 return self.make_call(1, None, None, self.unpacker.unpack_int)
Guido van Rossumb6372211992-12-21 14:32:55 +000045
Tim Peterse6ddc8b2004-07-18 05:56:09 +000046 def Names(self):
47 return self.make_call(2, None, \
48 None, self.unpacker.unpack_utmpidlearr)
Guido van Rossumb6372211992-12-21 14:32:55 +000049
Tim Peterse6ddc8b2004-07-18 05:56:09 +000050 def Allnames(self):
51 return self.make_call(3, None, \
52 None, self.unpacker.unpack_utmpidlearr)
Guido van Rossumb6372211992-12-21 14:32:55 +000053
54
55class RnusersClient(PartialRnusersClient, UDPClient):
56
Tim Peterse6ddc8b2004-07-18 05:56:09 +000057 def __init__(self, host):
58 UDPClient.__init__(self, host, 100002, 2)
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000059
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000060
Guido van Rossumb6372211992-12-21 14:32:55 +000061class BroadcastRnusersClient(PartialRnusersClient, BroadcastUDPClient):
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000062
Tim Peterse6ddc8b2004-07-18 05:56:09 +000063 def __init__(self, bcastaddr):
64 BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2)
Guido van Rossumcdd04ca1992-12-20 18:14:23 +000065
66
67def test():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000068 import sys
69 if not sys.argv[1:]:
70 testbcast()
71 return
72 else:
73 host = sys.argv[1]
74 c = RnusersClient(host)
75 list = c.Names()
76 for (line, name, host, time), idle in list:
77 line = strip0(line)
78 name = strip0(name)
79 host = strip0(host)
Collin Winter6f2df4d2007-07-17 20:59:35 +000080 print("%r %r %r %s %s" % (name, host, line, time, idle))
Guido van Rossumb6372211992-12-21 14:32:55 +000081
82def testbcast():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000083 c = BroadcastRnusersClient('<broadcast>')
84 def listit(list, fromaddr):
85 host, port = fromaddr
Collin Winter6f2df4d2007-07-17 20:59:35 +000086 print(host + '\t:', end=' ')
Tim Peterse6ddc8b2004-07-18 05:56:09 +000087 for (line, name, host, time), idle in list:
Collin Winter6f2df4d2007-07-17 20:59:35 +000088 print(strip0(name), end=' ')
89 print()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000090 c.set_reply_handler(listit)
91 all = c.Names()
Collin Winter6f2df4d2007-07-17 20:59:35 +000092 print('Total Count:', len(all))
Guido van Rossumb6372211992-12-21 14:32:55 +000093
94def strip0(s):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000095 while s and s[-1] == '\0': s = s[:-1]
96 return s
Guido van Rossumb6372211992-12-21 14:32:55 +000097
98test()