terom@174: #!/usr/bin/env python terom@174: terom@174: """ terom@174: Monitor dhcpd leases -> database. terom@174: """ terom@174: terom@174: __version__ = '0.0' terom@174: terom@174: import pvl.args terom@174: import pvl.syslog.args terom@174: terom@174: import pvl.verkko.db as db terom@174: import pvl.dhcp.leases terom@174: terom@174: import logging, optparse terom@174: terom@174: log = logging.getLogger('main') terom@174: terom@174: def parse_options (argv) : terom@174: """ terom@174: Parse command-line arguments. terom@174: """ terom@174: terom@174: prog = argv[0] terom@174: terom@174: parser = optparse.OptionParser( terom@174: prog = prog, terom@174: usage = '%prog: [options]', terom@174: version = __version__, terom@174: terom@174: # module docstring terom@174: description = __doc__, terom@174: ) terom@174: terom@174: # options terom@174: parser.add_option_group(pvl.args.parser(parser)) terom@174: terom@174: ## leases terom@174: parser.add_option('--leases', metavar='FILE', default='/var/lib/dhcp/dhcpd.leases', terom@174: help="Synchronize dhcpd leases from given file") terom@174: terom@174: parser.add_option('--leases-tail', type='float', metavar='POLL', terom@174: help="Continuously poll leases file with given timeout") terom@174: terom@174: ## database terom@174: parser.add_option('--database', metavar='URI', terom@174: help="Track hosts in given database") terom@174: terom@174: parser.add_option('--create', action='store_true', terom@174: help="Initialize database") terom@174: terom@174: # defaults terom@174: parser.set_defaults( terom@174: terom@174: ) terom@174: terom@174: # parse terom@174: options, args = parser.parse_args(argv[1:]) terom@174: terom@174: # apply terom@174: pvl.args.apply(options, prog) terom@174: terom@174: if not options.database : terom@174: parser.error("Missing required option: --database") terom@174: terom@174: return options, args terom@174: terom@176: import time terom@176: terom@176: def mainloop (leases, db, poll) : terom@176: while True : terom@176: log.debug("tick") terom@176: terom@176: for lease in leases : terom@176: db(lease) terom@176: terom@176: log.debug("tock") terom@176: terom@176: if poll : terom@176: time.sleep(poll) terom@176: else : terom@176: return 0 terom@176: terom@174: def main (argv) : terom@174: options, args = parse_options(argv) terom@174: terom@174: # db terom@174: if not options.database : terom@174: log.error("No database given") terom@174: return 1 terom@174: terom@174: log.info("Open up database: %s", options.database) terom@174: db = pvl.verkko.db.Database(options.database) terom@174: leases_db = pvl.dhcp.leases.DHCPLeasesDatabase(db) terom@174: terom@174: if options.create : terom@192: leases_db.create() terom@174: terom@174: # leases terom@174: log.info("Open up DHCP leases...") terom@174: leases = pvl.dhcp.leases.DHCPLeases(options.leases) terom@174: terom@174: # polling interval? terom@174: if options.leases_tail : terom@174: poll = options.leases_tail terom@174: else : terom@174: poll = None terom@174: terom@174: # mainloop terom@174: log.info("Enter mainloop...") terom@176: return mainloop(leases, leases_db, poll) terom@174: terom@174: if __name__ == '__main__': terom@174: import sys terom@174: terom@174: sys.exit(main(sys.argv))