]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Demo/rpc/rnusersclient.py
Inital import
[l4.git] / l4 / pkg / python / contrib / Demo / rpc / rnusersclient.py
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()