bin/pvl.dhcp-leases
author Tero Marttila <terom@paivola.fi>
Mon, 09 Mar 2015 23:31:13 +0200
changeset 738 3104fdf7ea26
parent 192 9157c1984fd8
permissions -rwxr-xr-x
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
#!/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))