# Remote nusers client interface import rpc from rpc import Packer, Unpacker, TCPClient, UDPClient 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 RnusersClient(UDPClient): def addpackers(self): self.packer = RnusersPacker().init() self.unpacker = RnusersUnpacker().init('') def init(self, host): return UDPClient.init(self, host, 100002, 2) def Num(self): self.start_call(1) self.do_call() n = self.unpacker.unpack_int() self.end_call() return n def Names(self): self.start_call(2) self.do_call() list = self.unpacker.unpack_utmpidlearr() self.end_call() return list def Allnames(self): self.start_call(3) self.do_call() list = self.unpacker.unpack_utmpidlearr() self.end_call() return list def test(): import sys host = '' if sys.argv[1:]: host = sys.argv[1] c = RnusersClient().init(host) list = c.Names() def strip0(s): while s and s[-1] == '\0': s = s[:-1] return s for (line, name, host, time), idle in list: line = strip0(line) name = strip0(name) host = strip0(host) print name, host, line, time, idle