| # Remote nusers client interface | 
 |  | 
 | import rpc | 
 | from rpc import Packer, Unpacker, UDPClient, BroadcastUDPClient | 
 |  | 
 |  | 
 | class RnusersPacker(Packer): | 
 |     def pack_utmp(self, ui): | 
 |         ut_line, ut_name, ut_host, ut_time = utmp | 
 |         self.pack_string(ut_line) | 
 |         self.pack_string(ut_name) | 
 |         self.pack_string(ut_host) | 
 |         self.pack_int(ut_time) | 
 |     def pack_utmpidle(self, ui): | 
 |         ui_itmp, ui_idle = ui | 
 |         self.pack_utmp(ui_utmp) | 
 |         self.pack_uint(ui_idle) | 
 |     def pack_utmpidlearr(self, list): | 
 |         self.pack_array(list, self.pack_itmpidle) | 
 |  | 
 |  | 
 | class RnusersUnpacker(Unpacker): | 
 |     def unpack_utmp(self): | 
 |         ut_line = self.unpack_string() | 
 |         ut_name = self.unpack_string() | 
 |         ut_host = self.unpack_string() | 
 |         ut_time = self.unpack_int() | 
 |         return ut_line, ut_name, ut_host, ut_time | 
 |     def unpack_utmpidle(self): | 
 |         ui_utmp = self.unpack_utmp() | 
 |         ui_idle = self.unpack_uint() | 
 |         return ui_utmp, ui_idle | 
 |     def unpack_utmpidlearr(self): | 
 |         return self.unpack_array(self.unpack_utmpidle) | 
 |  | 
 |  | 
 | class PartialRnusersClient: | 
 |  | 
 |     def addpackers(self): | 
 |         self.packer = RnusersPacker() | 
 |         self.unpacker = RnusersUnpacker('') | 
 |  | 
 |     def Num(self): | 
 |         return self.make_call(1, None, None, self.unpacker.unpack_int) | 
 |  | 
 |     def Names(self): | 
 |         return self.make_call(2, None, \ | 
 |                 None, self.unpacker.unpack_utmpidlearr) | 
 |  | 
 |     def Allnames(self): | 
 |         return self.make_call(3, None, \ | 
 |                 None, self.unpacker.unpack_utmpidlearr) | 
 |  | 
 |  | 
 | class RnusersClient(PartialRnusersClient, UDPClient): | 
 |  | 
 |     def __init__(self, host): | 
 |         UDPClient.__init__(self, host, 100002, 2) | 
 |  | 
 |  | 
 | class BroadcastRnusersClient(PartialRnusersClient, BroadcastUDPClient): | 
 |  | 
 |     def __init__(self, bcastaddr): | 
 |         BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2) | 
 |  | 
 |  | 
 | def test(): | 
 |     import sys | 
 |     if not sys.argv[1:]: | 
 |         testbcast() | 
 |         return | 
 |     else: | 
 |         host = sys.argv[1] | 
 |     c = RnusersClient(host) | 
 |     list = c.Names() | 
 |     for (line, name, host, time), idle in list: | 
 |         line = strip0(line) | 
 |         name = strip0(name) | 
 |         host = strip0(host) | 
 |         print "%r %r %r %s %s" % (name, host, line, time, idle) | 
 |  | 
 | def testbcast(): | 
 |     c = BroadcastRnusersClient('<broadcast>') | 
 |     def listit(list, fromaddr): | 
 |         host, port = fromaddr | 
 |         print host + '\t:', | 
 |         for (line, name, host, time), idle in list: | 
 |             print strip0(name), | 
 |         print | 
 |     c.set_reply_handler(listit) | 
 |     all = c.Names() | 
 |     print 'Total Count:', len(all) | 
 |  | 
 | def strip0(s): | 
 |     while s and s[-1] == '\0': s = s[:-1] | 
 |     return s | 
 |  | 
 | test() |