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()
|
---|