#!/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))