pvl/syslog/syslog.py
author Tero Marttila <terom@fixme.fi>
Fri, 04 Jan 2013 21:34:11 +0200
changeset 63 510a9a944f5a
parent 60 9326ed989645
child 112 8127c0f4223d
permissions -rw-r--r--
pvl.syslog.SyslogSource: provide __iter__
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Syslog handling.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
     5
import select
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
     6
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
import logging; log = logging.getLogger('pvl.syslog.source')
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
class SyslogSource (object) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
    """
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    11
        Process syslog input from a given source.
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    12
        
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    13
        Implements an iterable mainloop doing continuous polling on the source, using either a timeout or
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    14
        select():able source.
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    
60
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    17
    def __init__ (self, source, parser, filter, poll=None) :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
            Using given underlying line source.
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    20
                
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    21
                source      - source to select() if poll=True
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    22
                poll        - polling behaviour
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        """
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    24
        
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
        self.source = source
60
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    26
        self.parser = parser
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    27
        self.filter = filter
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    28
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    29
        self._poll = poll
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
63
510a9a944f5a pvl.syslog.SyslogSource: provide __iter__
Tero Marttila <terom@fixme.fi>
parents: 60
diff changeset
    31
    def __iter__ (self) :
60
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    32
        """
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    33
            Yield available input.
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    34
        """
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    35
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    36
        return self.filter(self.parser(self.source))
9326ed989645 pvl.syslog.source: fix iteration over filter/parser/source
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    37
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    38
    def poll (self, poll=None) :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
        """
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    40
            Poll our source for input, with given polling behaviour:
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    41
                True    - select() on source
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    42
                False   - peek on source
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    43
                float   - timeout in seconds
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    44
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    45
            Returns True if we have input waiting, False on timeout with no input. None on indeterminate.
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    46
        """
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    47
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    48
        reading = writing = ()
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    49
        
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    50
        if poll is True :
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    51
            timeout = None # block
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    52
            reading += (self.source, ) # file-like object with fileno()
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    53
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    54
        elif not poll :
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    55
            timeout = 0.0 # do not block
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    56
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    57
        else :
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    58
            timeout = float(poll)
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    59
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    60
        log.debug("%s", timeout)
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    61
    
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    62
        # select
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    63
        readable, writeable, ex = select.select(reading, writing, [], timeout)
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    64
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    65
        if readable :
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    66
            return True
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    67
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    68
        elif reading :
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    69
            # timeout
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    70
            return False
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    71
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    72
        else :
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    73
            # unknown
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    74
            return None
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    75
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    76
    def main (self, poll=None) :
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    77
        """
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    78
            yield items from syslog source, polling as given.
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    79
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    80
            Returns once no more lines are available.
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    81
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    82
            XXX: reconnect? or source takes care of that..
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    83
            TODO: SIGINT -> finish iteration and return?
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    84
        """
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    85
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    86
        if poll is None :
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    87
            poll = self._poll
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    88
        
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    89
        # mainloop
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    90
        while True :
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    91
            # pull in messages
63
510a9a944f5a pvl.syslog.SyslogSource: provide __iter__
Tero Marttila <terom@fixme.fi>
parents: 60
diff changeset
    92
            for item in self :
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    93
                log.debug("%s", item)
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    94
                yield item
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    96
            # poll
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    97
            if poll :
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    98
                # wait
50
0bbe2e7561a1 pvl.syslog: simplify SyslogSource, and implement better handling for sys.stdin using tail.Tail
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    99
                self.poll(poll)
43
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   100
            else :
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   101
                # done
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   102
                break
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   103
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   104
        log.debug("exit")
9d13b101beab pvl.syslog: implement pvl.syslog.args.apply -> SyslogSource as in pvl.verkko-dhcp
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
   105