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