bin/pvl.dhcp-syslog
author Tero Marttila <terom@paivola.fi>
Mon, 09 Mar 2015 23:31:13 +0200
changeset 738 3104fdf7ea26
parent 228 3b1437d4b0a1
permissions -rwxr-xr-x
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
#!/usr/bin/env python

"""
    Monitor DHCP use.
"""

__version__ = '0.1'

import pvl.args
import pvl.syslog.args

import pvl.verkko.db as db
import pvl.dhcp.syslog
import pvl.dhcp.hosts

import logging, optparse

log = logging.getLogger('main')

# name of process in syslog
DHCP_SYSLOG_PROG = 'dhcpd'

def parse_options (argv) :
    """
        Parse command-line arguments.
    """

    prog = argv[0]

    parser = optparse.OptionParser(
            prog        = prog,
            usage       = '%prog: [options]',
            version     = __version__,

            # module docstring
            description = __doc__,
    )
    
    # options
    parser.add_option_group(pvl.args.parser(parser))

    ## syslog
    parser.add_option_group(pvl.syslog.args.parser(parser, prog=DHCP_SYSLOG_PROG))

    ## XXX: networks
    parser.add_option('--network',              metavar='NET', action='append',
            help="Filter leases by network prefix as plugin instance")

    parser.add_option('--gateway',              metavar='GW/IFACE', action='append',
            help="Filter messages by gateway/interface as plugin instance")

    ## hosts
    parser.add_option('--database',             metavar='URI',
            help="Track hosts in given database")

    parser.add_option('--create',               action='store_true',
            help="Initialize database")

    # defaults
    parser.set_defaults(

    )
    
    # parse
    options, args = parser.parse_args(argv[1:])
    
    # apply
    pvl.args.apply(options, prog)

    if not options.database :
        parser.error("Missing required option: --database")

    return options, args

def main (argv) :
    options, args = parse_options(argv)

    # db
    if not options.database :
        log.error("No database given")
        return 1

    log.info("Open up database: %s", options.database)
    db = pvl.verkko.db.Database(options.database)
    hosts_db = pvl.dhcp.hosts.DHCPHostsDatabase(db)

    if options.create :
        hosts_db.create()
  
    # syslog
    log.info("Open up syslog...")
    syslog = pvl.syslog.args.apply(options)
    parser = pvl.dhcp.syslog.DHCPSyslogParser()

    log.info("Enter mainloop...")
    for source in syslog.main() :
        # parse dhcp messages from syslog
        for host in parser(source) :
            log.debug("%s: %s", source, host)

            hosts_db(host)
    
    # done
    return 0

if __name__ == '__main__':
    import sys

    sys.exit(main(sys.argv))