bin/pvl.verkko-dhcp
author Tero Marttila <terom@paivola.fi>
Thu, 18 Oct 2012 23:06:23 +0300
changeset 16 51509b5ce1c0
parent 15 66f81f4b6aa7
child 17 29f0cf9220e0
permissions -rwxr-xr-x
request per session, move to postgres, rename columns, fixup state/name/error handling in updates
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Monitor DHCP use.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
__version__ = '0.0'
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pvl.args
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import pvl.syslog.args
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import pvl.verkko.db as db
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import pvl.syslog.dhcp
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
import logging, optparse
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
log = logging.getLogger('main')
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
# name of process in syslog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
DHCP_SYSLOG_PROG = 'dhcpd'
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
def parse_options (argv) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
        Parse command-line arguments.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    prog = argv[0]
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    parser = optparse.OptionParser(
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            prog        = prog,
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            usage       = '%prog: [options]',
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            version     = __version__,
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            # module docstring
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            description = __doc__,
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    )
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    # options
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    parser.add_option_group(pvl.args.parser(parser))
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    ## syslog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    parser.add_option_group(pvl.syslog.args.parser(parser, prog=DHCP_SYSLOG_PROG))
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    ## XXX: networks
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    parser.add_option('--network',              metavar='NET', action='append',
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            help="Filter leases by network prefix as plugin instance")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    parser.add_option('--gateway',              metavar='GW/IFACE', action='append',
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            help="Filter messages by gateway/interface as plugin instance")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    ## hosts
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    parser.add_option('--database',             metavar='URI',
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
            help="Track hosts in given database")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    parser.add_option('--create',               action='store_true',
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            help="Initialize database")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    # defaults
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    parser.set_defaults(
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    )
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    # parse
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    options, args = parser.parse_args(argv[1:])
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    # apply
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    pvl.args.apply(options, prog)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    if not options.database :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        parser.error("Missing required option: --database")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    return options, args
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
class DHCPHostsDatabase (db.Database) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    def create (self) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
            CREATE TABLEs
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        log.info("Creating database tables: dhcp_hosts")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        db.dhcp_hosts.create(self.engine)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    def insert (self, attrs) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            INSERT new host
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        query = db.dhcp_hosts.insert().values(
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
                ip          = attrs['ip'],
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
                mac         = attrs['mac'],
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
                gw          = attrs['gw'],
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
                first_seen  = attrs['timestamp'],
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
    95
                count       = 1,
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
                last_seen   = attrs['timestamp'],
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
    98
                state       = attrs['state'],
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
    99
                
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   100
                name        = attrs.get('name'),
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   101
                error       = attrs.get('error'),
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        )
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   103
        result = self.engine.execute(query)
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        id, = result.inserted_primary_key
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        return id
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    def update (self, attrs) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
            UPDATE existing host, or return False if not found.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        table = db.dhcp_hosts
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   115
        query = table.update()
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   116
        query = query.where((table.c.ip == attrs['ip']) & (table.c.mac == attrs['mac']) & (table.c.gw == attrs['gw']))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   117
        query = query.values(
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   118
                count       = db.func.coalesce(table.c.count, 0) + 1,
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
                # set
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
                last_seen   = attrs['timestamp'],
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   122
                state       = attrs['state'],
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        )
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   124
        
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   125
        if 'name' in attrs :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   126
            query = query.values(name = attrs['name'])
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   127
        
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   128
        if 'error' in attrs :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   129
            query = query.values(error = attrs['error'])
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   130
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   131
        result = self.engine.execute(query)
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
        # any matched rows?
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
        return result.rowcount > 0
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
    def process (self, item) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
            Process given DHCP syslog message to update the hosts table.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
        """
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   140
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   141
        attrs = {}
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
        # ignore unless we have enough info to fully identify the client
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        # this means that we omit DHCPDISCOVER messages, but we get the OFFER/REQUEST/ACK
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        if any(name not in item for name in ('lease', 'hwaddr', 'gateway')) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
            # ignore; we require these
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
            return
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   149
        # do not override error from request on NAK; clear otherwise
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   150
        if item.get('type') == 'DHCPNAK' :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   151
            pass
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   152
        else :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   153
            attrs['error'] = item.get('error')
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   154
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   155
        # do not override name unless known
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   156
        if item.get('name') :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   157
            attrs['name'] = item.get('name')
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   158
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        # db: syslog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        ATTR_MAP = (
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            ('ip',          'lease'),
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
            ('mac',         'hwaddr'),
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
            ('gw',          'gateway'),
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
            ('timestamp',   'timestamp'),
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
            ('state',       'type'),
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        )
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   169
        # generic attrs
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   170
        for key, name in ATTR_MAP :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   171
            attrs[key] = item.get(name)
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        # update existing?
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        if self.update(attrs) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
            log.info("Update: %s", attrs)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
        else :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            # new
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
            log.info("Insert: %s", attrs)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
            self.insert(attrs)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
class DHCPSyslogHandler (object) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
    """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        Process lines from syslog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
    """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    def __init__ (self, db) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        self.db = db
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        # XXX
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        self.filter = pvl.syslog.dhcp.DHCPSyslogFilter()
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
    def process (self, item) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
            Handle a single item read from syslog to DB.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
        filter = pvl.syslog.dhcp.DHCPSyslogFilter()
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
        dhcp_item = self.filter.parse(item['msg'])
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        if not dhcp_item :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            # ignore
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            return
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
        dhcp_item['timestamp'] = item['timestamp'] # XXX: fixup DHCPSyslogParser?
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   207
        if item.get('error') :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   208
            item['error'] = self.filter.parse_error(item['error'])
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   209
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
        self.db.process(dhcp_item)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
    def main (self, source, poll) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
            Read items from syslog source with given polling style.
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
            TODO: poll = false on SIGINT
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        """
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
        parser = pvl.syslog.parser.SyslogParser()
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
        
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        # mainloop
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
        while True :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
            # process from source
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
            for item in parser.process(source) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
                self.process(item)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
            
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
            if poll is False :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
                # done
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
                break
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
            else :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
                # wait
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
                source.poll(poll)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
            log.debug("tick")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
def main (argv) :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
    options, args = parse_options(argv)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   239
    # db
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   240
    if not options.database :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   241
        log.error("No database given")
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   242
        return 1
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   243
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   244
    log.info("Open up database: %s", options.database)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   245
    database = DHCPHostsDatabase(options.database)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   246
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   247
    if options.create :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   248
        database.create()
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   249
    
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
    # syslog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
    log.info("Open up syslog...")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
    syslog_parser = pvl.syslog.parser.SyslogParser(prog=DHCP_SYSLOG_PROG) # filter by prog
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
    if options.syslog_fifo :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
        source = pvl.syslog.fifo.Fifo(options.syslog_fifo)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
        poll = None # no timeout
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
    elif options.syslog_tail :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        # continuous file tail
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
        source = pvl.syslog.tail.TailFile(options.syslog_file)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
        poll = options.syslog_tail # polling interval
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
    elif options.syslog_file :
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
        # one-shot file read
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
        source = pvl.syslog.tail.TailFile(options.syslog_file)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
        poll = False # do not poll-loop
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
    else :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   269
        log.warning("No syslog source given")
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   270
        return 0
15
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
    # handler + main
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
    handler = DHCPSyslogHandler(database)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
    log.info("Enter mainloop...")
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
    handler.main(source, poll)
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
    
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
    # done
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
    return 0
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
if __name__ == '__main__':
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
    import sys
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
66f81f4b6aa7 bin/pvl.verkko-dhcp: re-implement syslog -> database based on pvl.collectd-dhcp; uses pvl.syslog from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
    sys.exit(main(sys.argv))