pvl/syslog/rule.py
changeset 58 64885a7c6e85
parent 55 cbdd49b76f16
child 62 c4798663e57c
--- a/pvl/syslog/rule.py	Fri Jan 04 21:15:25 2013 +0200
+++ b/pvl/syslog/rule.py	Fri Jan 04 21:15:42 2013 +0200
@@ -44,12 +44,13 @@
 
         config = configobj.ConfigObj(file)
         
-        rules = [SyslogRule.config(section, **dict(config[section])) for section in config.sections]
-
-        return cls(file.name, rules)
+        # TODO: sub-sections -> rules?
+        rules = [cls.config(section, **dict(config[section])) for section in config.sections]
+        
+        return cls.config(file.name, rules=rules, **dict((name, config[name]) for name in config.scalars))
 
     @classmethod
-    def config (cls, name, format=None, program=None, pattern=None, **filters) :
+    def config (cls, name, format=None, program=None, pattern=None, rules=None, **filters) :
         """
             Build SyslogRule from config options
         """
@@ -57,23 +58,30 @@
         if pattern :
             pattern = re.compile(pattern)
 
-        # XXX: rules/sub-sections support?
-        rules = ()
+        if format :
+            format = { name: format }
 
         filters = dict(
-            (cls.ATTRS.get(attr, attr), re.compile(regex)) for attr, regex in filters.iteritems()
+            (attr, re.compile(regex)) for attr, regex in filters.iteritems()
         )
 
-        filter = SyslogFilter(prog=program, msg=pattern, **filters)
+        if program :
+            filters['prog'] = program
 
-        return cls(name, rules, filter)
+        if pattern :
+            filters['msg'] = pattern
 
-    def __init__ (self, name, rules=None, filter=None) :
+        filter = SyslogFilter(**filters)
+
+        return cls(name, rules, filter, format)
+
+    def __init__ (self, name, rules=None, filter=None, formats=None) :
         log.debug("%s: %s", name, filter)
         
         self.name = name
         self.rules = rules or [] # sub-rules
         self.filter = filter # SyslogFilter
+        self.formats = formats
 
     def match (self, item) :
         """
@@ -84,13 +92,16 @@
             # filter
             matches = self.filter.filter(item)
 
-            if not matches :
-                # ignore
-                return None
         else :
             # match all
             matches = True
 
+        log.debug("%s: %s", self, matches)
+
+        if not matches :
+            # ignore
+            return None
+
         # apply
         item['rule'] = self
 
@@ -98,12 +109,22 @@
             # no-op filter
             pass
         else :
-            log.debug("%s: %s", self, matches)
             item.update(matches)
         
         # XXX: copy, not mutate?
         return item
-    
+
+    def format (self, item) :
+        """
+            Apply output formats
+        """
+        
+        for attr, format in self.formats.iteritems() :
+            value = item[attr] = format.format(**item)
+            log.debug("%s: %s: %s", self, attr, value)
+        
+        return item
+
     # TODO: __call__?
     def apply (self, item) :
         """
@@ -129,19 +150,14 @@
             else :
                 item = match
             
-        log.debug("%s: %s", self, item)
-       
         # TODO: routing/formatting
-        """
-        if self.tag is False :
-            # drop
-            return False
-            
-        if self.format :
-            # return
-            return self.tag, self.format.format(**item)
-        """
-        
+        #if self.tag is False :
+        #    # drop
+        #    return False
+    
+        if self.formats :
+            item = self.format(item)        
+
         return item
 
     def __iter__ (self, items) :