logwatcher.py
author Tero Marttila <terom@paivola.fi>
Thu, 20 Mar 2008 18:29:42 +0200
changeset 3 5ab150c4a328
child 4 34d7897bd0f5
permissions -rw-r--r--
it works \o/ + the start of logwatcher.py

committer: Tero Marttila <terom@paivola.fi>
from twisted.internet import protocol, reactor
from twisted.python import log
import sys, re

import api

class TailProcessProtocol (protocol.ProcessProtocol) :
    def __init__ (self, module, name, filters) :
        self.module = module
        self.name = name
        self.filters = filters

        self.buf = ""

    def errReceived (self, data) :
        self.module.error("tail for %s: %s" % (self.name, data))

    def outReceived (self, data) :
        data = buf + data
        
        while "\n" in data :
            line, data = data.split("\n", 1)

            for filter in self.filters :
                out = filter.test(line)

        self.buf = data

class Filter (object) :
    def __init__ (self, regexp, event_type) :
        self.regexp = re.compile(regexp)
        self.event_type = event_type

    def test (self, line) :
        match = self.regexp.search(line)
        
        if match :
            return self._filter(match)
        
    def _filter (self, match) :
        return match.string

class SudoFilter (Filter) :
    def __init__ (self) :
        super(Filter, self).__init__("sudo: (?P<username>\w+) : TTY=(?P<tty>\w+) ; PWD=(?P<pwd>\w+) ; USER=(?P<target_user>\w+) ; COMMAND=(?P<command>\w+)", "sudo")

    def _filter (self, match) :
        return "%(username)s:%(tty)s:%(pwd)s - `%(command)s` as %(target_user)s"

class ExampleModule (api.Module) :
    name = "logs"
    version = 0x0001
    
    event_types = [
        "error",
        "sudo"
    ]

    log_files = (
        ("auth.log", "/var/log/auth.log", (
            SudoFilter(),
        )),
    )

    log_objs = None

    def handleConnect (self) :
        log.msg("Spawning tail processes...")
        
        self.log_objs = dict()

        for name, file, filters in self.log_files :
            log.msg("%s - %s..." % (name, file)))

            p = self.log_objs[name] = TailProcessProtocol(filters)

            reactor.spawnProcess(p, "/usr/bin/tail", ["tail", "--follow=name", file])
    
    def error (self, msg) :
        self.sendEvent("error", msg)

if __name__ == '__main__' :
    log.startLogging(sys.stderr)
    
    module = ExampleModule()
    reactor.run()