--- 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) :