|
1 # Remote nusers client interface |
|
2 |
|
3 import rpc |
|
4 from rpc import Packer, Unpacker, UDPClient, BroadcastUDPClient |
|
5 |
|
6 |
|
7 class RnusersPacker(Packer): |
|
8 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) |
|
20 |
|
21 |
|
22 class RnusersUnpacker(Unpacker): |
|
23 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) |
|
35 |
|
36 |
|
37 class PartialRnusersClient: |
|
38 |
|
39 def addpackers(self): |
|
40 self.packer = RnusersPacker() |
|
41 self.unpacker = RnusersUnpacker('') |
|
42 |
|
43 def Num(self): |
|
44 return self.make_call(1, None, None, self.unpacker.unpack_int) |
|
45 |
|
46 def Names(self): |
|
47 return self.make_call(2, None, \ |
|
48 None, self.unpacker.unpack_utmpidlearr) |
|
49 |
|
50 def Allnames(self): |
|
51 return self.make_call(3, None, \ |
|
52 None, self.unpacker.unpack_utmpidlearr) |
|
53 |
|
54 |
|
55 class RnusersClient(PartialRnusersClient, UDPClient): |
|
56 |
|
57 def __init__(self, host): |
|
58 UDPClient.__init__(self, host, 100002, 2) |
|
59 |
|
60 |
|
61 class BroadcastRnusersClient(PartialRnusersClient, BroadcastUDPClient): |
|
62 |
|
63 def __init__(self, bcastaddr): |
|
64 BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2) |
|
65 |
|
66 |
|
67 def test(): |
|
68 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) |
|
80 print "%r %r %r %s %s" % (name, host, line, time, idle) |
|
81 |
|
82 def testbcast(): |
|
83 c = BroadcastRnusersClient('<broadcast>') |
|
84 def listit(list, fromaddr): |
|
85 host, port = fromaddr |
|
86 print host + '\t:', |
|
87 for (line, name, host, time), idle in list: |
|
88 print strip0(name), |
|
89 print |
|
90 c.set_reply_handler(listit) |
|
91 all = c.Names() |
|
92 print 'Total Count:', len(all) |
|
93 |
|
94 def strip0(s): |
|
95 while s and s[-1] == '\0': s = s[:-1] |
|
96 return s |
|
97 |
|
98 test() |