utmp.py
author Tero Marttila <terom@paivola.fi>
Fri, 21 Mar 2008 02:06:34 +0200
changeset 9 75cc996c6ba1
parent 8 3d648daf9538
child 11 2d33d62cd8f8
permissions -rw-r--r--
testing IPv6

committer: Tero Marttila <terom@paivola.fi>
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
     1
import socket, os, time
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import _utmp
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
class WtmpEntry (object) :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    _ATTRS = (
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
        "type", "pid", "line", "id", "user", "host", "exit", "session", "tv", "addr_v6"
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    )
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    10
    @staticmethod
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    11
    def fromFile (file) :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    12
        bytes = file.read(_utmp.size())
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    13
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    14
        if not bytes :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    15
            return
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    16
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    17
        result = _utmp.parse(bytes)
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    18
        
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    19
        wtmp = WtmpEntry()
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    20
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    21
        for name, field in zip(wtmp._ATTRS, result) :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    22
            if isinstance(field, str) and name not in ("addr_v6", ) :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    23
                field = field.rstrip("\0")
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    24
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    25
            setattr(wtmp, name, field)
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    26
        
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    27
        wtmp.addr_v6 = socket.inet_ntop(socket.AF_INET6, wtmp.addr_v6)
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    28
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    29
        return wtmp
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    30
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    def __str__ (self) :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        return " ".join("%s=%s" % (key, getattr(self, key)) for key in self._ATTRS)
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    34
class WtmpFile (object) :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    35
    def __init__ (self, path="/var/log/wtmp") :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    36
        self.path = path
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    37
        self.file = open(path)
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    38
        self.file.seek(0, os.SEEK_END)
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    40
    def tryRead (self) :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    41
        return WtmpEntry.fromFile(self.file)
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
def read_entries (file) :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    while True :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        wtmp = read_entry(file)
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        if wtmp :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            yield wtmp
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        else :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
            return
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    52
def follow_main () :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    53
    wtmp = WtmpFile()
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    54
    
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    55
    while True :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    56
        item = wtmp.tryRead()
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    57
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    58
        if item :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    59
            print item
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    60
        else :
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    61
            time.sleep(2)
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    62
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
def test_main () :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    fh = open("/var/log/wtmp", "r")
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    for item in read_entries(fh) :
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        print item
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
if __name__ == '__main__' :
8
3d648daf9538 WtmpFile && follow_main
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    70
    follow_main()
7
6a49fc285842 C module to handle utmp entires
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71