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