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