--- a/bin/pvl.verkko-syslog Fri Jan 04 18:44:58 2013 +0200
+++ b/bin/pvl.verkko-syslog Fri Jan 04 18:45:59 2013 +0200
@@ -36,11 +36,8 @@
# input
parser.add_option_group(pvl.syslog.args.parser(parser))
+ parser.add_option_group(pvl.syslog.rule.parser(parser))
parser.add_option_group(pvl.irker.parser(parser))
-
- # processing
- parser.add_option('-r', '--rules', metavar='FILE',
- help="Syslog rules")
# parse
options, args = parser.parse_args(argv[1:])
@@ -61,22 +58,33 @@
log.info("Open syslog...")
syslog = pvl.syslog.args.apply(options)
-
+
log.info("Load rules...")
- rules = pvl.syslog.rule.config(open(options.rules))
+ rules = pvl.syslog.rule.apply(options)
log.info("Connect IRK..")
irk, target = pvl.irker.apply(options, target=target)
- if not target :
- log.error("No irk target given")
- return 2
log.info("Process syslog messages...")
- for tag, line in rules.process(syslog.loop()) :
+ for item in syslog :
+ if rules :
+ match = rules.apply(item)
+ else :
+ match = None, item['msg']
+
+ if not match :
+ continue
+
+ tag, line = match
+
+ log.info("%s", line)
+
# TODO: map tag -> target?
- log.info("%s", line)
- target(line)
+ if target :
+ target(line)
+ else :
+ print tag, line
# done
log.info("Exiting...")
--- a/pvl/syslog/rule.py Fri Jan 04 18:44:58 2013 +0200
+++ b/pvl/syslog/rule.py Fri Jan 04 18:45:59 2013 +0200
@@ -2,15 +2,44 @@
import re
+import optparse, sys
+
import logging; log = logging.getLogger('pvl.syslog.rule')
+# XXX: ConfigParser kinda sucks
+import ConfigParser
+
+def parser (parser) :
+ """
+ Optparse option group.
+ """
+
+ syslog_rules = optparse.OptionGroup(parser, "Syslog rules")
+
+ syslog_rules.add_option('--syslog-rules', metavar='FILE',
+ help="Load syslog rules from file")
+
+ return syslog_rules
+
+def apply (options) :
+ """
+ Build SyslogRules from options.
+ """
+
+ if options.syslog_rules :
+ return SyslogRules.load(open(options.syslog_rules))
+
+ else :
+ return None
+
+# TODO: combine SyslogRule/Rules into one heirarchial SyslogRule -type?
class SyslogRule (object) :
"""
A rule matches syslog lines, and formats them.
tag - apply given tag to matches
"""
-
+
def __init__ (self, tag, program=None, pattern=None, format=None, flags=0) :
log.debug("%s: %s", tag, pattern)
@@ -66,6 +95,19 @@
Apply a set of rules against lines.
"""
+ @classmethod
+ def load (cls, file) :
+ """
+ Load rules from file.
+ """
+ config = ConfigParser.RawConfigParser()
+ config.readfp(file)
+
+ # XXX: ordered in python2.7, unordered in python2.6 !
+ rules = [SyslogRule(section, **dict(config.items(section))) for section in config.sections()]
+
+ return cls(rules)
+
def __init__ (self, rules) :
self.rules = rules
@@ -102,24 +144,4 @@
if match :
yield match
-# XXX: ConfigParser kinda sucks
-import ConfigParser
-def config (file) :
- """
- Load SyslogRules from config.
- """
-
- config = ConfigParser.RawConfigParser()
- config.readfp(file)
-
- return SyslogRules(tuple(config_rules(config)))
-
-def config_rules (config) :
- """
- Yield SyslogRule's from given config.
- """
-
- for section in config.sections() :
- yield SyslogRule(section, **dict(config.items(section)))
-