pvl/syslog/rule.py
author Tero Marttila <terom@paivola.fi>
Sat, 12 Jan 2013 21:41:32 +0200
changeset 99 8d60eb5604e4
parent 87 70edcd13a447
child 100 0f34cf81b9f1
permissions -rw-r--r--
pvl.syslog.filter: fix to override attr from regex
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
from pvl.syslog.filter import SyslogFilter
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
import re
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     5
import optparse, sys
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
     6
import configobj
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     7
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
import logging; log = logging.getLogger('pvl.syslog.rule')
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    10
def parser (parser) :
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    11
    """
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    12
        Optparse option group.
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    13
    """
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    14
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    15
    syslog_rules = optparse.OptionGroup(parser, "Syslog rules")
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    16
    
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    17
    syslog_rules.add_option('--syslog-rules', metavar='FILE',
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    18
            help="Load syslog rules from file")
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    19
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    20
    return syslog_rules
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    21
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    22
def apply (options) :
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    23
    """
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    24
        Build SyslogRules from options.
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    25
    """
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    26
    
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    27
    if options.syslog_rules :
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    28
        return SyslogRule.load(open(options.syslog_rules))
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    29
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    30
    else :
87
70edcd13a447 pvl.syslog.rule: fix default rule and empty text format
Tero Marttila <terom@paivola.fi>
parents: 76
diff changeset
    31
        return SyslogRule('default', formats={ 'text': '{msg}' })
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    32
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    33
def merge (*dicts, **kwargs) :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    34
    return dict((k, v) for d in (dicts + (kwargs, )) for k, v in d.iteritems())
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    35
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    36
# TODO: combine SyslogRule/Rules into one heirarchial SyslogRule -type?
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
class SyslogRule (object) :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    39
        A named SyslogFilter with sub-rules.
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    41
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    42
    @classmethod
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    43
    def load (cls, file) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    44
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    45
            Load SyslogRule from file.
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    46
        """
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    48
        config = configobj.ConfigObj(file)
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    49
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    50
        return cls.config_section(file.name, config)
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    51
    
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    52
    @classmethod
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    53
    def config_section (cls, name, section) :
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    54
        """
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    55
            Recursively load Syslogrules from config section.
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    56
        """
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    57
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    58
        rules = [cls.config_section(subsection, section[subsection]) for subsection in section.sections]
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    59
        attrs = dict((name, section[name]) for name in section.scalars)
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    60
         
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    61
        return cls.config(name, rules, **attrs)
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    63
    @classmethod
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    64
    def config (cls, name, rules=None, format=None, irk=None, program=None, facility=None, pattern=None, **filters) :
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    65
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    66
            Build SyslogRule from config options
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    67
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    68
87
70edcd13a447 pvl.syslog.rule: fix default rule and empty text format
Tero Marttila <terom@paivola.fi>
parents: 76
diff changeset
    69
        if format is not None :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    70
            format = { 'text': format }
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    71
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    72
            format = { }
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    73
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    74
        if irk :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    75
            format['irk'] = irk
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    76
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    77
        filters = dict(
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    78
            (attr, re.compile(regex)) for attr, regex in filters.iteritems()
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    79
        )
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    80
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    81
        if facility :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    82
            filters['facility'] = facility # glob
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    83
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    84
        if program :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    85
            filters['prog'] = program # glob
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    86
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    87
        if pattern :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    88
            filters['msg'] = re.compile(pattern)
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    89
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    90
        filter = SyslogFilter(**filters)
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    91
        
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    92
        log.debug("%s: %s %s", name, rules, filter)
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    93
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    94
        return cls(name, rules, filter, format)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
    95
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
    96
    def __init__ (self, name, rules=None, filter=None, formats=None) : 
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    97
        self.name = name
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    98
        self.rules = rules or [] # sub-rules
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    99
        self.filter = filter # SyslogFilter
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   100
        self.formats = formats or {}
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   101
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   102
    def match (self, item) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   103
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   104
            Match item against our filter, returning match-dict (empty?) or None.
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   105
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   106
        
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   107
        if self.filter :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   108
            # filter
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   109
            matches = self.filter.filter(item)
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   110
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   111
        else :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   112
            # match all, we probably have sub-rules that we're interested in
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   113
            return { }
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   114
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   115
        log.debug("%s: %s", self, matches)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   116
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   117
        if matches :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   118
            return matches
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   119
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   120
            # no match
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   121
            return None
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   122
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   123
    def format (self, item) :
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   124
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   125
            Apply our output formats to given base apply, yielding (unique) attr, value tuples.
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   126
        """
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   127
        
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   128
        for attr, format in self.formats.iteritems() :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   129
            value = format.format(**item)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   130
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   131
            log.debug("%s: %s: %s", self, attr, value)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   132
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   133
            yield attr, value
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   134
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    def apply (self, item) :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   137
            Recursively match item against ourself and sub-rules. Returns applied output.
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   138
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   139
            Matches are passed down the tree, and applies are passed up.
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        """
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   142
        log.debug("%s", self)
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   144
        # match rule -> matches
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   145
        matches = self.match(item)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   146
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   147
        if matches is None :
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   148
            # skip
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   149
            return None, None, None
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   150
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   151
        # merge matches down
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   152
        item = merge(item, matches)
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   153
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   154
        # recursive sub-rules -> apply
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   155
        for rule in self.rules :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   156
            try :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   157
                # pass matches down
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   158
                match, rules, apply = rule.apply(item)
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   159
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   160
            except Exception as ex :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   161
                log.exception("%s -> %s: %r", self, rule, item)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   162
                continue # XXX: skip?
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   163
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   164
            if apply :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   165
                # pass apply up
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   166
                break
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   167
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   168
            # self-match
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   169
            match, rules, apply = item, [], { }
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   170
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   171
        rules.append(self)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   172
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   173
        # formats?
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   174
        if self.formats :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   175
            # merge apply up
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   176
            apply = merge(dict(self.format(item)), apply)
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   177
        
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   178
        log.debug("%s: %s", '/'.join(str(rule) for rule in rules), apply)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   179
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   180
        return match, rules, apply
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   181
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   182
    def __iter__ (self, items) :
47
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   183
        """
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   184
            Apply items against our rules, yielding any matches.
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   185
        """
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   186
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   187
        for item in items :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   188
            match, rules, apply = self.apply(item)
47
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   189
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   190
            if apply :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   191
                yield apply
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   192
 
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   193
    def __str__ (self) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   194
        return self.name
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   195
    
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   196
    def __repr__ (self) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   197
        return 'SyslogRule({self.name}, ...)'.format(self=self)
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   198