# 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:', end=' ')
        for (line, name, host, time), idle in list:
            print(strip0(name), end=' ')
        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()
