pvl.syslog.rule: refactor rule-config loading
authorTero Marttila <terom@fixme.fi>
Fri, 04 Jan 2013 18:45:59 +0200
changeset 51 96d204b146b4
parent 50 0bbe2e7561a1
child 52 f04df0db2acd
pvl.syslog.rule: refactor rule-config loading
bin/pvl.verkko-syslog
pvl/syslog/rule.py
--- 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)))
-