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