terom@15: #!/usr/bin/env python terom@15: terom@15: """ terom@15: Monitor DHCP use. terom@15: """ terom@15: terom@174: __version__ = '0.1' terom@15: terom@15: import pvl.args terom@15: import pvl.syslog.args terom@15: terom@15: import pvl.verkko.db as db terom@169: import pvl.dhcp.syslog terom@174: import pvl.dhcp.hosts terom@15: terom@15: import logging, optparse terom@15: terom@15: log = logging.getLogger('main') terom@15: terom@15: # name of process in syslog terom@15: DHCP_SYSLOG_PROG = 'dhcpd' terom@15: terom@15: def parse_options (argv) : terom@15: """ terom@15: Parse command-line arguments. terom@15: """ terom@15: terom@15: prog = argv[0] terom@15: terom@15: parser = optparse.OptionParser( terom@15: prog = prog, terom@15: usage = '%prog: [options]', terom@15: version = __version__, terom@15: terom@15: # module docstring terom@15: description = __doc__, terom@15: ) terom@15: terom@15: # options terom@15: parser.add_option_group(pvl.args.parser(parser)) terom@15: terom@15: ## syslog terom@15: parser.add_option_group(pvl.syslog.args.parser(parser, prog=DHCP_SYSLOG_PROG)) terom@15: terom@15: ## XXX: networks terom@15: parser.add_option('--network', metavar='NET', action='append', terom@15: help="Filter leases by network prefix as plugin instance") terom@15: terom@15: parser.add_option('--gateway', metavar='GW/IFACE', action='append', terom@15: help="Filter messages by gateway/interface as plugin instance") terom@15: terom@15: ## hosts terom@15: parser.add_option('--database', metavar='URI', terom@15: help="Track hosts in given database") terom@15: terom@15: parser.add_option('--create', action='store_true', terom@15: help="Initialize database") terom@15: terom@15: # defaults terom@15: parser.set_defaults( terom@15: terom@15: ) terom@15: terom@15: # parse terom@15: options, args = parser.parse_args(argv[1:]) terom@15: terom@15: # apply terom@15: pvl.args.apply(options, prog) terom@15: terom@15: if not options.database : terom@15: parser.error("Missing required option: --database") terom@15: terom@15: return options, args terom@15: terom@15: def main (argv) : terom@15: options, args = parse_options(argv) terom@15: terom@16: # db terom@16: if not options.database : terom@16: log.error("No database given") terom@16: return 1 terom@16: terom@16: log.info("Open up database: %s", options.database) terom@174: db = pvl.verkko.db.Database(options.database) terom@174: hosts_db = pvl.dhcp.hosts.DHCPHostsDatabase(db) terom@174: terom@174: if options.create : terom@174: hosts_db.create() terom@174: terom@15: # syslog terom@15: log.info("Open up syslog...") terom@174: syslog = pvl.syslog.args.apply(options) terom@174: parser = pvl.dhcp.syslog.DHCPSyslogParser() terom@17: terom@174: log.info("Enter mainloop...") terom@174: for source in syslog.main() : terom@174: # parse dhcp messages from syslog terom@174: for host in parser(source) : terom@174: log.debug("%s: %s", source, host) terom@15: terom@174: hosts_db(host) terom@15: terom@15: # done terom@15: return 0 terom@15: terom@15: if __name__ == '__main__': terom@15: import sys terom@15: terom@15: sys.exit(main(sys.argv))