pvl/syslog/filter.py
author Tero Marttila <terom@fixme.fi>
Thu, 03 Jan 2013 13:04:51 +0200
changeset 45 10dfa434da77
parent 44 977442ccb72d
child 52 f04df0db2acd
permissions -rw-r--r--
pvl.syslog: SyslogRule
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
import logging; log = logging.getLogger('pvl.syslog.filter')
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
class SyslogFilter (object) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
    """
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     5
        Match syslog messages.
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     6
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     7
        XXX: do we need more than just prog?
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    def __init__ (self, prog=None) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
            prog        - match tag (process name)
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        """
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    14
        
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        self.prog = prog
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    def match_prog (self, prog) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
            Match given prog?
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    22
        if not self.prog :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    23
            return
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    24
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        # normalize
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        prog = prog.lower()
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        if prog.startswith('/') :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
            # base
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            prog = prog.split('/')[-1]
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        # match
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        if not prog :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
            # never matches non-tagged lines
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
            return False
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        elif self.prog.endswith('*') :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
            # prefix match
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
            return prog.startswith(self.prog[:-1])
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        else :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            return prog == self.prog
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    def filter (self, item) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            Match given item?
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        """
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    49
        for attr, func in (
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    50
            ( 'prog',   self.match_prog),
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    51
        ) :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    52
            match = func(item[attr])
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    54
            if match :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    55
                continue
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    56
            
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    57
            elif match is None :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    58
                pass
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    59
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    60
            else :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    61
                break
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    62
        
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    63
        # ok
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    64
        if match is None :
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    65
            # XXX: empty filter!?
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    66
            return True
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        else :
45
10dfa434da77 pvl.syslog: SyslogRule
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    68
            return match
44
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    def __call__ (self, items) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        for item in items:
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
            if self.filter(item) :
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
                yield item
977442ccb72d pvl.syslog: split out SyslogFilter
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74