terom@3: from twisted.internet import protocol, reactor terom@3: from twisted.python import log terom@15: import sys terom@3: terom@3: import api terom@15: import logwatch_config as config terom@3: terom@3: class TailProcessProtocol (protocol.ProcessProtocol) : terom@3: def __init__ (self, module, name, filters) : terom@3: self.module = module terom@3: self.name = name terom@3: self.filters = filters terom@3: terom@3: self.buf = "" terom@3: terom@3: def errReceived (self, data) : terom@3: self.module.error("tail for %s: %s" % (self.name, data)) terom@3: terom@3: def outReceived (self, data) : terom@4: data = self.buf + data terom@3: terom@3: while "\n" in data : terom@3: line, data = data.split("\n", 1) terom@4: terom@4: log.msg("Matching line `%s'..." % line) terom@3: terom@3: for filter in self.filters : terom@3: out = filter.test(line) terom@3: terom@4: if out : terom@4: log.msg("\t%s: %s" % (filter.event_type, out)) terom@4: self.module.sendEvent(filter.event_type, out) terom@4: terom@3: self.buf = data terom@3: terom@4: def processEnded (self, reason) : terom@4: msg = "tail process for %s quit: %s" % (self.name, reason.getErrorMessage()) terom@4: terom@4: log.err(msg) terom@4: self.module.error(msg) terom@4: terom@10: class LogWatchModule (api.Module) : terom@3: name = "logs" terom@3: version = 0x0001 terom@3: terom@3: event_types = [ terom@3: "error", terom@6: "sudo", terom@6: "ssh", terom@3: ] terom@15: terom@15: log_files = config.log_files terom@3: terom@3: log_objs = None terom@3: terom@3: def handleConnect (self) : terom@3: log.msg("Spawning tail processes...") terom@3: terom@3: self.log_objs = dict() terom@3: terom@3: for name, file, filters in self.log_files : terom@4: log.msg("\t%s - %s..." % (name, file)) terom@3: terom@4: p = self.log_objs[name] = TailProcessProtocol(self, name, filters) terom@3: terom@6: reactor.spawnProcess(p, "/usr/bin/tail", ["tail", "-n0", "--follow=name", file]) terom@3: terom@3: def error (self, msg) : terom@3: self.sendEvent("error", msg) terom@3: terom@3: if __name__ == '__main__' : terom@10: LogWatchModule().run() terom@3: