1# Remote nusers client interface 2 3import rpc 4from rpc import Packer, Unpacker, UDPClient, BroadcastUDPClient 5 6 7class 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 22class 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 37class 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 55class RnusersClient(PartialRnusersClient, UDPClient): 56 57 def __init__(self, host): 58 UDPClient.__init__(self, host, 100002, 2) 59 60 61class BroadcastRnusersClient(PartialRnusersClient, BroadcastUDPClient): 62 63 def __init__(self, bcastaddr): 64 BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2) 65 66 67def 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 82def 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 94def strip0(s): 95 while s and s[-1] == '\0': s = s[:-1] 96 return s 97 98test() 99