pvl/dhcp/leases.py
author Tero Marttila <terom@paivola.fi>
Sun, 10 Feb 2013 19:08:53 +0200
changeset 211 cf74bbb95d2b
parent 174 6f339a8a87dc
child 215 a0dedd0889f0
permissions -rw-r--r--
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    DHCP dhcpd.leases handling/tracking
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
169
a81ca751664d move pvl.verkko.dhcp and pvl.syslog.dhcp to pvl.dhcp.leases/syslog
Tero Marttila <terom@paivola.fi>
parents: 40
diff changeset
     5
import pvl.syslog.tail # TailFile
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from datetime import datetime
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
169
a81ca751664d move pvl.verkko.dhcp and pvl.syslog.dhcp to pvl.dhcp.leases/syslog
Tero Marttila <terom@paivola.fi>
parents: 40
diff changeset
     9
import logging; log = logging.getLogger('pvl.dhcp.leases')
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
    11
DHCPD_LEASES = '/var/lib/dhcp/dhcpd.leases'
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
    12
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
class DHCPLeasesParser (object) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
    """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
        Simplistic parser for a dhcpd.leases file.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
        Doesn't implement the full spec, but a useful approximation.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    def __init__ (self) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        self.block = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        self.items = []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    @classmethod
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    def split (cls, line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            Split given line-data.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
            >>> split = DHCPLeasesParser.split
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            >>> split('foo bar')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            ['foo', 'bar']
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            >>> split('"foo"')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            ['foo']
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            >>> split('foo "asdf quux" bar')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            ['foo', 'asdf quux', 'bar']
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            >>> split('foo "asdf quux"')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            ['foo', 'asdf quux']
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        # parse out one str
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        if '"' in line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            log.debug("%s", line)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
            # crude
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
            pre, line = line.split('"', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            data, post = line.rsplit('"', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            return pre.split() + [data] + post.split()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
            return line.split()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    @classmethod
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    def lex (self, line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            Yield tokens from the given lines.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
            >>> lex = DHCPLeasesParser.lex
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
            >>> list(lex('foo;'))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            [('item', ['foo'])]
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            >>> list(item for line in ['foo {', ' bar;', '}'] for item in lex(line))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            [('open', ['foo']), ('item', ['bar']), ('close', None)]
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        log.debug("%s", line)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        # comments?
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        if '#' in line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
            line, comment = line.split('#', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
            comment = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        # clean?
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        line = line.strip()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        # parse
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        if not line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
            # ignore, empty/comment
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
            return
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        elif line.startswith('uid') :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
            # XXX: too hard to parse properly
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
            return
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        elif '{' in line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            decl, line = line.split('{', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            # we are in a new decl
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            yield 'open', self.split(decl)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
       
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        elif ';' in line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            param, line = line.split(';', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
            # a stanza
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            yield 'item', self.split(param)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        elif '}' in line :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            close, line = line.split('}', 1)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            if close.strip() :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
                log.warn("Predata on close: %s", close)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            # end
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            yield 'close', None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
            log.warn("Unknown line: %s", line)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
            return
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        # got the whole line?
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        if line.strip() :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            log.warn("Data remains: %s", line)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
    def push_block (self, block) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            Open new block.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        # XXX: stack
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        assert not self.block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        self.block = block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        self.items = []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    def feed_block (self, item) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
            Add item to block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        assert self.block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        self.items.append(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
    def pop_block (self) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
            Close block. Returns
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
                (block, [items])
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
        assert self.block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        block, items = self.block, self.items
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        self.block = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        self.items = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        return block, items
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
    def parse (self, line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
            Parse given line, yielding any complete blocks that come out.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
            >>> parser = DHCPLeasesParser()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
            >>> list(parser.parse_lines(['foo {', ' bar;', ' quux asdf;', '}']))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            [(['foo'], [['bar'], ['quux', 'asdf']])]
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
            >>> parser = DHCPLeasesParser()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
            >>> list(parser.parse('foo {'))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
            []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
            >>> list(parser.parse_lines([' bar;', ' quux asdf;']))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
            >>> list(parser.parse('}'))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
            [(['foo'], [['bar'], ['quux', 'asdf']])]
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
        for token, args in self.lex(line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
            #log.debug("%s: %s [block=%s]", token, args, self.block)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
            if token == 'open' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
                # open new block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
                block = args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
                if self.block :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
                    log.warn("nested blocks: %s > %s", self.block, block)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
                    continue
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
                log.debug("open block: %s", block)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
                self.push_block(block)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
            elif token == 'close' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
                log.debug("close block: %s", self.block)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
                # collected block items
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
                yield self.pop_block()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
            # must be within block!
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
            elif token == 'item' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
                item = args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
                if not self.block :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
                    log.warn("token outside block: %s: %s", token, args)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
                    continue
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
                log.debug("block %s item: %s", self.block, item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
                self.feed_block(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
            else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
                # ???
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
                raise KeyError("Unknown token: {0}: {1}".format(token, args))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
    
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
    def parse_lines (self, lines) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            Trivial wrapper around parse to parse multiple lines.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
        for line in lines :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            for item in self.parse(line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
                yield item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   210
class DHCPLeases (object) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
    """
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   212
        Process log-structured leases file, updated by dhcpd.
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    LEASE_DATES = ('starts', 'ends', 'tstp', 'tsfp', 'atsfp', 'cltt')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
    # default format
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
    LEASE_DATE_NEVER = 'never'
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
    LEASE_DATE_FMT_DEFAULT = '%w %Y/%m/%d %H:%M:%S'
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
    lease_date_fmt = LEASE_DATE_FMT_DEFAULT
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
   223
    def __init__ (self, path=DHCPD_LEASES) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
            path        - path to dhcpd.leases file
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
        # tail; handles file re-writes
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   229
        self.source = pvl.syslog.tail.Tail(path)
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
        # parser state
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
        self.parser = DHCPLeasesParser()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
        # initial leases state
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   235
        self._leases = None
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
    def reset (self) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
            Reset state, if we started to read a new file.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   242
        self._leases = {}
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
    def process_lease_item_date (self, args) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
            Process lease-item date spec into datetime.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
            Returns None if 'never'.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
        data = ' '.join(args)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
        if data == self.LEASE_DATE_NEVER :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
            return None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
            return datetime.strptime(data, self.lease_date_fmt)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
    def process_lease_item (self, lease, item) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
            Process a single item from the lease, updating the lease dict
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
        item = list(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
        name = item.pop(0)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
        subname = item[0] if item else None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
        if name in self.LEASE_DATES :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
            lease[name] = self.process_lease_item_date(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
        elif name == 'hardware':
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
            # args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
            lease['hwtype'], lease['hwaddr'] = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
        elif name == 'uid' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
            lease['uid'], = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
        elif name == 'client-hostname' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
            lease['client-hostname'], = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
        elif name == 'abandoned' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
            lease['abandoned'] = True
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
        elif name == 'binding' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
            _state, lease['binding-state'] = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   287
        elif name == 'next' and subname == 'binding' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
            _binding, _state, lease['next-binding-state'] = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
            log.warn("unknown lease item: %s: %s", name, item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
    def process_lease (self, lease_name, items) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
            Process given lease block to update our state.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
            Returns the lease object, and a possible old lease.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
        # replace any existing
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   301
        lease = self._leases[lease_name] = {}
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
        # meta
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
        lease['lease'] = lease_name
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
        # parse items
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
        for item in items :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   308
            try :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
                self.process_lease_item(lease, item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
            except Exception as ex:
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
                log.warn("Failed to process lease item: %s: %s:", lease_name, item, exc_info=True)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
        # k
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
        log.debug("%-15s: %s", lease_name, lease)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
        return lease
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
    def log_lease (self, lease, old_lease=None) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
            Log given lease transition on stdout.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
        # log
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
        if old_lease :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
            log.info("%-15s: %20s @ %8s <- %-8s @ %20s", old_lease['lease'],
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
                old_lease.get('ends', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
                old_lease.get('next-binding-state', ''),    # optional
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
                old_lease.get('binding-state', '???'), 
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
                old_lease.get('starts', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
            )
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
        log.info("%-15s: %20s @ %8s -> %-8s @ %20s", lease['lease'], 
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
                lease.get('starts', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
                lease.get('binding-state', '???'), 
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
                lease.get('next-binding-state', ''),    # optional
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
                lease.get('ends', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
        )
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
    def process_block (self, blockdata, log_leases=False) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
            Process given block (from DHCPLeasesParser.parse()), to update state.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
        block, items = blockdata
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
        type = block.pop(0)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
        args = block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
        if type == 'lease' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
            if len(args) != 1 :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
                return log.warn("lease block with weird args, ignore: %s", args)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
            # the lease address
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
            lease, = args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
            log.debug("lease: %s: %s", lease, items)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358
            
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   359
            if lease in self._leases :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   360
                old = self._leases[lease]
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   361
            else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   362
                old = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   363
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   364
            new = self.process_lease(lease, items)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   365
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
            if log_leases :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   367
                self.log_lease(new, old)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   368
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
            return new
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   372
            log.warn("unknown block: %s: %s", type, args)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   373
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   374
    def readleases (self) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   376
            Read new lines from the leases database and update our state.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   377
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   378
            Yields changed leases. On startup and on periodic database reset, all leases are yielded.
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   379
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   380
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   381
        # handle file replace by reading until EOF
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   382
        sync = False
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   383
#        leases = []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   384
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   385
        if self._leases is None :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   386
            # initial sync
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   387
            self.reset()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   388
            sync = True
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   389
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   390
        # parse in any new lines from TailFile... yields None if the file was replaced
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   391
        for line in self.source.readlines(eof_mark=True) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   392
            if line is None :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   393
                log.info("Reading new dhcpd.leases")
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   394
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   395
                # resync
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   396
                self.reset()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   397
                sync = True
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   398
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   399
            else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   400
                # parse
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   401
                for blockdata in self.parser.parse(line) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   402
                    # don't log if syncing, only on normal updates (next tail-cycle)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   403
                    lease = self.process_block(blockdata, log_leases=(not sync))
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   404
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   405
                    #if not sync :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   406
                    #    leases.append(lease)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   407
                    yield lease
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   408
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   409
#        if sync :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   410
#            return True, self.leases.values()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   411
#        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   412
#            return False, leases
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   413
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   414
    __iter__ = readleases
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   415
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   416
    def leases (self) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   417
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   418
            Iterate over all leases.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   419
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   420
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
   421
        return self._leases.itervalues()
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   422
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   423
    # utils
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   424
    def lease_state (self, lease) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   425
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   426
            Get state for lease.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   427
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   428
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   429
        # count by state
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   430
        starts = lease.get('starts')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   431
        state = lease.get('binding-state', 'unknown')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   432
        next_state = lease.get('next-binding-state')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   433
        ends = lease.get('ends')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   434
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   435
        #log.debug("%-15s: %s: %8s -> %-8s: %s", ip, starts, state, next_state or '', ends)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   436
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   437
        if next_state and ends and ends < datetime.now() :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   438
            # XXX: mark as, "expired", even they next-binding-state is probably "free"
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   439
            state = 'expired' # lease['next-binding-state']
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   440
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   441
        return state
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   442
174
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   443
# XXX: from db.dhcp_leases instead?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   444
import pvl.verkko.db as db
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   445
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   446
class DHCPLeasesDatabase (object) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   447
    """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   448
        pvl.verkko.Database dhcp_leases model for updates.
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   449
    """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   450
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   451
    def __init__ (self, db) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   452
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   453
            db      - pvl.verkko.Database
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   454
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   455
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   456
        self.db = db
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   457
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   458
    def create (self) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   459
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   460
            CREATE TABLEs
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   461
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   462
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   463
        log.info("Creating database tables: dhcp_leases")
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   464
        db.dhcp_leases.create(self.db.engine, checkfirst=True)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   465
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   466
    def update (self, lease) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   467
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   468
            Try an extend an existing lease?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   469
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   470
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   471
        c = db.dhcp_leases.c
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   472
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   473
        ip = lease['lease']
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   474
        mac = lease.get('hwaddr')
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   475
        starts = lease['starts']
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   476
        ends = lease.get('ends')
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   477
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   478
        update = db.dhcp_leases.update()
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   479
        
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   480
        # XXX: if ends is None?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   481
        if mac :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   482
            # renew lease..?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   483
            update = update.where((c.ip == ip) & (c.mac == mac) & ((starts < c.ends) | (c.ends == None)))
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   484
        else :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   485
            # new state for lease..?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   486
            update = update.where((c.ip == ip) & ((starts < c.ends) | (c.ends == ends)))
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   487
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   488
        update = update.values(
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   489
                state       = lease['binding-state'],
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   490
                next        = lease.get('next-binding-state'),
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   491
                ends        = ends,
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   492
        )
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   493
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   494
        if lease.get('client-hostname') :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   495
            update = update.values(hostname = lease['client-hostname'])
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   496
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   497
        return self.db.update(update) > 0
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   498
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   499
    def insert (self, lease) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   500
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   501
            Record a new lease.
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   502
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   503
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   504
        c = db.dhcp_leases.c
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   505
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   506
        query = db.dhcp_leases.insert().values(
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   507
            ip          = lease['lease'],
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   508
            mac         = lease['hwaddr'],
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   509
            hostname    = lease.get('client-hostname'),
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   510
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   511
            starts      = lease['starts'],
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   512
            ends        = lease.get('ends'),
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   513
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   514
            state       = lease['binding-state'],
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   515
            next        = lease.get('next-binding-state'),
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   516
        )
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   517
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   518
        return self.db.insert(query)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   519
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   520
    def __call__ (self, lease) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   521
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   522
            Process given DHCP lease to update currently active lease, or insert a new one.
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   523
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   524
            XXX: transaction? *leases?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   525
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   526
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   527
        # update existing?
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   528
        if self.update(lease) :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   529
            log.info("Update: %s", lease)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   530
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   531
        elif lease.get('hwaddr') :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   532
            # new
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   533
            id = self.insert(lease)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   534
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   535
            log.info("Insert: %s -> %d", lease, id)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   536
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   537
        else :
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   538
            # may be a free lease
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   539
            log.warn("Ignored lease: %s", lease)
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   540
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   541
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   542
if __name__ == '__main__' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   543
    import logging
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   544
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   545
    logging.basicConfig()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   546
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   547
    import doctest
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   548
    doctest.testmod()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   549