pvl/dhcp/leases.py
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:40:31 +0300
changeset 428 956b3d4918bb
parent 420 ee31a0b573f2
permissions -rw-r--r--
pvl.rrd.hosts: also support @domain for the collectd host
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
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents: 215
diff changeset
     8
from pvl.dhcp.config import DHCPConfigParser
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
169
a81ca751664d move pvl.verkko.dhcp and pvl.syslog.dhcp to pvl.dhcp.leases/syslog
Tero Marttila <terom@paivola.fi>
parents: 40
diff changeset
    10
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
    11
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
    12
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
    13
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
    14
class DHCPLeases (object) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    """
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
    16
        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
    17
    """
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
    LEASE_DATES = ('starts', 'ends', 'tstp', 'tsfp', 'atsfp', 'cltt')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    # default format
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    LEASE_DATE_NEVER = 'never'
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    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
    24
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    lease_date_fmt = LEASE_DATE_FMT_DEFAULT
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
    27
    def __init__ (self, path=DHCPD_LEASES) :
32
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
            path        - path to dhcpd.leases file
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        # 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
    33
        self.source = pvl.syslog.tail.Tail(path)
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        # parser state
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents: 215
diff changeset
    36
        self.parser = DHCPConfigParser()
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        # 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
    39
        self._leases = None
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    def reset (self) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
            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
    44
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
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
    46
        self._leases = {}
32
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
    def process_lease_item_date (self, args) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
            Process lease-item date spec into datetime.
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
            Returns None if 'never'.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        """
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
        data = ' '.join(args)
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
        if data == self.LEASE_DATE_NEVER :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
            return None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            return datetime.strptime(data, self.lease_date_fmt)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    def process_lease_item (self, lease, item) :
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
            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
    65
        """
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
        item = list(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
        name = item.pop(0)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        subname = item[0] if item else None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        if name in self.LEASE_DATES :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
            lease[name] = self.process_lease_item_date(item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        elif name == 'hardware':
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
            # args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            lease['hwtype'], lease['hwaddr'] = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        elif name == 'uid' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
            lease['uid'], = item
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        elif name == 'client-hostname' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
            lease['client-hostname'], = item
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 name == 'abandoned' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            lease['abandoned'] = True
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
        elif name == 'binding' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            _state, lease['binding-state'] = item
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 name == 'next' and subname == 'binding' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            _binding, _state, lease['next-binding-state'] = item
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
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            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
    96
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    def process_lease (self, lease_name, items) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
            Process given lease block to update our state.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            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
   102
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        # 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
   105
        lease = self._leases[lease_name] = {}
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        # meta
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        lease['lease'] = lease_name
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
        # parse items
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        for item in items :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            try :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
                self.process_lease_item(lease, item)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
            except Exception as ex:
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
                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
   117
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        # k
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        log.debug("%-15s: %s", lease_name, lease)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        return lease
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
    def log_lease (self, lease, old_lease=None) :
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
            Log given lease transition on stdout.
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
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        # log
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        if old_lease :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
            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
   131
                old_lease.get('ends', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
                old_lease.get('next-binding-state', ''),    # optional
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
                old_lease.get('binding-state', '???'), 
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
                old_lease.get('starts', '???'),
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
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        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
   138
                lease.get('starts', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
                lease.get('binding-state', '???'), 
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
                lease.get('next-binding-state', ''),    # optional
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
                lease.get('ends', '???'),
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        )
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
    def process_block (self, blockdata, log_leases=False) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        """
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents: 215
diff changeset
   146
            Process given block (from DHCPConfigParser.parse()), to update state.
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        """
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
        block, items = blockdata
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
        type = block.pop(0)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
        args = block
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        if type == 'lease' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            if len(args) != 1 :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
                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
   157
            
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
            # the lease address
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
            lease, = args
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            log.debug("lease: %s: %s", lease, items)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
            
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
   163
            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
   164
                old = self._leases[lease]
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
            else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
                old = None
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            new = self.process_lease(lease, items)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
            if log_leases :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
                self.log_lease(new, old)
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
            return new
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
            log.warn("unknown block: %s: %s", type, args)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
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
   178
    def readleases (self) :
32
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
            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
   181
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
   182
            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
   183
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
        # handle file replace by reading until EOF
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
        sync = False
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
#        leases = []
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
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
   189
        if self._leases is None :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
            # initial sync
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
            self.reset()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
            sync = True
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
        # 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
   195
        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
   196
            if line is None :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
                log.info("Reading new dhcpd.leases")
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
                # resync
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
                self.reset()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
                sync = True
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
            else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
                # parse
420
ee31a0b573f2 pvl.dhcp.leases: fix DHCPConfigParser changes
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   205
                for blockdata in self.parser.parse_line(line) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
                    # 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
   207
                    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
   208
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
                    #if not sync :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
                    #    leases.append(lease)
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
                    yield lease
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
#        if sync :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
#            return True, self.leases.values()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
#        else :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
#            return False, leases
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
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
   218
    __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
   219
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   220
    def leases (self) :
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
            Iterate over all leases.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents: 174
diff changeset
   225
        return self._leases.itervalues()
32
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
    # utils
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
    def lease_state (self, lease) :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
            Get state for lease.
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
        """
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
        # count by state
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
        starts = lease.get('starts')
215
a0dedd0889f0 pvl.dhcp.leases: don't make up lease state, just use next-binding-state
Tero Marttila <terom@paivola.fi>
parents: 211
diff changeset
   235
        state = lease.get('binding-state')
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
        next_state = lease.get('next-binding-state')
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
        ends = lease.get('ends')
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
        #log.debug("%-15s: %s: %8s -> %-8s: %s", ip, starts, state, next_state or '', ends)
215
a0dedd0889f0 pvl.dhcp.leases: don't make up lease state, just use next-binding-state
Tero Marttila <terom@paivola.fi>
parents: 211
diff changeset
   240
        
a0dedd0889f0 pvl.dhcp.leases: don't make up lease state, just use next-binding-state
Tero Marttila <terom@paivola.fi>
parents: 211
diff changeset
   241
        # XXX: datetime UTC or local?
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
        if next_state and ends and ends < datetime.now() :
215
a0dedd0889f0 pvl.dhcp.leases: don't make up lease state, just use next-binding-state
Tero Marttila <terom@paivola.fi>
parents: 211
diff changeset
   243
            state = next_state
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
        return state
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
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
   247
# 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
   248
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
   249
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   250
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
   251
    """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   252
        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
   253
    """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   254
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   255
    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
   256
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   257
            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
   258
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   259
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   260
        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
   261
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   262
    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
   263
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   264
            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
   265
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   266
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   267
        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
   268
        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
   269
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   270
    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
   271
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   272
            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
   273
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   274
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   275
        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
   276
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   277
        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
   278
        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
   279
        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
   280
        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
   281
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   282
        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
   283
        
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   284
        # 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
   285
        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
   286
            # 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
   287
            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
   288
        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
   289
            # 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
   290
            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
   291
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   292
        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
   293
                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
   294
                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
   295
                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
   296
        )
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   297
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   298
        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
   299
            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
   300
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
        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
   302
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   303
    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
   304
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   305
            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
   306
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   307
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   308
        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
   309
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   310
        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
   311
            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
   312
            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
   313
            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
   314
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   315
            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
   316
            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
   317
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   318
            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
   319
            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
   320
        )
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   321
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   322
        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
   323
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   324
    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
   325
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   326
            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
   327
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   328
            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
   329
        """
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   330
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   331
        # 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
   332
        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
   333
            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
   334
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   335
        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
   336
            # 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
   337
            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
   338
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   339
            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
   340
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   341
        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
   342
            # 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
   343
            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
   344
6f339a8a87dc split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents: 169
diff changeset
   345
32
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
if __name__ == '__main__' :
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
    import logging
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
    logging.basicConfig()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
    import doctest
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
    doctest.testmod()
12816e361b2d pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353