pvl/syslog/rule.py
author Tero Marttila <terom@paivola.fi>
Tue, 19 Feb 2013 19:27:51 +0200
changeset 220 e533260bcefd
parent 216 c0dbd44bd463
permissions -rw-r--r--
pvl-verkko: 0.4.1
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
         
100
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    61
        try :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    62
            return cls.config(name, rules, **attrs)
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    63
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    64
        except ValueError as ex :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    65
            raise ValueError("[%s] %s" % (name, ex))
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    67
    @classmethod
100
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    68
    def config_filters (cls, program=None, facility=None, pattern=None, **filters) :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    69
        """
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    70
            Return filter expression from given attr/value in config.
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    71
        """
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    72
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    73
        # XXX: get rid of these special cases
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    74
        if facility :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    75
            yield 'facility', facility # glob
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    76
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    77
        if program :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    78
            yield 'prog', program # glob
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    79
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    80
        if pattern :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    81
            filters['msg'] = pattern
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    82
        
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    83
        # generic
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    84
        for attr, value in filters.iteritems() :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    85
            try :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    86
                # regex
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    87
                yield attr, re.compile(value)
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    88
            
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    89
            except re.error as ex :
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    90
                raise ValueError("%s: %s" % (attr, ex))
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    91
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    92
    @classmethod
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
    93
    def config (cls, name, rules=None, format=None, irk=None, **filters) :
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    94
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    95
            Build SyslogRule from config options
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    96
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
    97
87
70edcd13a447 pvl.syslog.rule: fix default rule and empty text format
Tero Marttila <terom@paivola.fi>
parents: 76
diff changeset
    98
        if format is not None :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    99
            format = { 'text': format }
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   100
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   101
            format = { }
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   102
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   103
        if irk :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   104
            format['irk'] = irk
100
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
   105
        
0f34cf81b9f1 pvl.syslog.rule: implement better filters handling, and handle ValueErrors from e.g. regexp syntax
Tero Marttila <terom@paivola.fi>
parents: 87
diff changeset
   106
        filters = dict(cls.config_filters(**filters))
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   107
216
c0dbd44bd463 pvl.syslog.SyslogFilter: move filter-filtering to SyslogFilter.build(**filters) and fix match_* funcs to normalize on non-filter
Tero Marttila <terom@paivola.fi>
parents: 100
diff changeset
   108
        filter = SyslogFilter(filters)
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   109
        
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   110
        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
   111
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   112
        return cls(name, rules, filter, format)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   113
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   114
    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
   115
        self.name = name
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   116
        self.rules = rules or [] # sub-rules
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   117
        self.filter = filter # SyslogFilter
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   118
        self.formats = formats or {}
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   119
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   120
    def match (self, item) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   121
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   122
            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
   123
        """
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   124
        
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   125
        if self.filter :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   126
            # filter
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   127
            matches = self.filter.filter(item)
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   128
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   129
        else :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   130
            # 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
   131
            return { }
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   132
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   133
        log.debug("%s: %s", self, matches)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   134
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   135
        if matches :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   136
            return matches
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   137
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   138
            # no match
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   139
            return None
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   140
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   141
    def format (self, item) :
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   142
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   143
            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
   144
        """
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   145
        
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   146
        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
   147
            value = format.format(**item)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   148
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   149
            log.debug("%s: %s: %s", self, attr, value)
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   150
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   151
            yield attr, value
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   152
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    def apply (self, item) :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        """
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   155
            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
   156
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   157
            Matches are passed down the tree, and applies are passed up.
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        """
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   160
        log.debug("%s", self)
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   162
        # match rule -> matches
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   163
        matches = self.match(item)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   164
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   165
        if matches is None :
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   166
            # skip
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   167
            return None, None, None
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   168
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   169
        # merge matches down
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   170
        item = merge(item, matches)
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   171
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   172
        # recursive sub-rules -> apply
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   173
        for rule in self.rules :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   174
            try :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   175
                # pass matches down
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   176
                match, rules, apply = rule.apply(item)
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   177
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   178
            except Exception as ex :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   179
                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
   180
                continue # XXX: skip?
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   181
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   182
            if apply :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   183
                # pass apply up
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   184
                break
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   185
        else :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   186
            # self-match
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   187
            match, rules, apply = item, [], { }
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   188
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   189
        rules.append(self)
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   190
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   191
        # formats?
58
64885a7c6e85 pvl.syslog.rule: fixfix, implement format
Tero Marttila <terom@fixme.fi>
parents: 55
diff changeset
   192
        if self.formats :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   193
            # merge apply up
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   194
            apply = merge(dict(self.format(item)), apply)
66
1e3a144f25c0 pvl.syslog: nested sections
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   195
        
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   196
        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
   197
        
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   198
        return match, rules, apply
51
96d204b146b4 pvl.syslog.rule: refactor rule-config loading
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   199
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   200
    def __iter__ (self, items) :
47
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   201
        """
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   202
            Apply items against our rules, yielding any matches.
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   203
        """
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   204
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   205
        for item in items :
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   206
            match, rules, apply = self.apply(item)
47
eea08cf5fbc7 pvl.syslog: SyslogRules
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   207
76
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   208
            if apply :
60bdff4bedfb pvl.syslog.rule: implement proper match/apply support
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
   209
                yield apply
55
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   210
 
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   211
    def __str__ (self) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   212
        return self.name
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   213
    
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   214
    def __repr__ (self) :
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   215
        return 'SyslogRule({self.name}, ...)'.format(self=self)
cbdd49b76f16 pvl.syslog.rule: refactor SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   216