utmp.py
author Tero Marttila <terom@paivola.fi>
Fri, 21 Mar 2008 02:02:52 +0200
changeset 8 3d648daf9538
parent 7 6a49fc285842
child 11 2d33d62cd8f8
permissions -rw-r--r--
WtmpFile && follow_main

committer: Tero Marttila <terom@paivola.fi>
import socket, os, time

import _utmp

class WtmpEntry (object) :
    _ATTRS = (
        "type", "pid", "line", "id", "user", "host", "exit", "session", "tv", "addr_v6"
    )

    @staticmethod
    def fromFile (file) :
        bytes = file.read(_utmp.size())

        if not bytes :
            return

        result = _utmp.parse(bytes)
        
        wtmp = WtmpEntry()

        for name, field in zip(wtmp._ATTRS, result) :
            if isinstance(field, str) and name not in ("addr_v6", ) :
                field = field.rstrip("\0")

            setattr(wtmp, name, field)
        
        wtmp.addr_v6 = socket.inet_ntop(socket.AF_INET6, wtmp.addr_v6)

        return wtmp

    def __str__ (self) :
        return " ".join("%s=%s" % (key, getattr(self, key)) for key in self._ATTRS)

class WtmpFile (object) :
    def __init__ (self, path="/var/log/wtmp") :
        self.path = path
        self.file = open(path)
        self.file.seek(0, os.SEEK_END)

    def tryRead (self) :
        return WtmpEntry.fromFile(self.file)

def read_entries (file) :
    while True :
        wtmp = read_entry(file)

        if wtmp :
            yield wtmp
        else :
            return

def follow_main () :
    wtmp = WtmpFile()
    
    while True :
        item = wtmp.tryRead()

        if item :
            print item
        else :
            time.sleep(2)

def test_main () :
    fh = open("/var/log/wtmp", "r")
    
    for item in read_entries(fh) :
        print item

if __name__ == '__main__' :
    follow_main()