#!/usr/bin/env python
"""
Monitor dhcpd leases -> database.
"""
__version__ = '0.0'
import pvl.args
import pvl.syslog.args
import pvl.verkko.db as db
import pvl.dhcp.leases
import logging, optparse
log = logging.getLogger('main')
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))
## leases
parser.add_option('--leases', metavar='FILE', default='/var/lib/dhcp/dhcpd.leases',
help="Synchronize dhcpd leases from given file")
parser.add_option('--leases-tail', type='float', metavar='POLL',
help="Continuously poll leases file with given timeout")
## database
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
import time
def mainloop (leases, db, poll) :
while True :
log.debug("tick")
for lease in leases :
db(lease)
log.debug("tock")
if poll :
time.sleep(poll)
else :
return 0
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)
leases_db = pvl.dhcp.leases.DHCPLeasesDatabase(db)
if options.create :
leases_db.create()
# leases
log.info("Open up DHCP leases...")
leases = pvl.dhcp.leases.DHCPLeases(options.leases)
# polling interval?
if options.leases_tail :
poll = options.leases_tail
else :
poll = None
# mainloop
log.info("Enter mainloop...")
return mainloop(leases, leases_db, poll)
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))