98 lines · 2.6 KB · Python
RawDownload
# Remote nusers client interface import rpcfrom 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()