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