bin/pvl.dhcp-syslog
changeset 228 3b1437d4b0a1
parent 174 6f339a8a87dc
equal deleted inserted replaced
227:c98944a7db08 228:3b1437d4b0a1
       
     1 #!/usr/bin/env python
       
     2 
       
     3 """
       
     4     Monitor DHCP use.
       
     5 """
       
     6 
       
     7 __version__ = '0.1'
       
     8 
       
     9 import pvl.args
       
    10 import pvl.syslog.args
       
    11 
       
    12 import pvl.verkko.db as db
       
    13 import pvl.dhcp.syslog
       
    14 import pvl.dhcp.hosts
       
    15 
       
    16 import logging, optparse
       
    17 
       
    18 log = logging.getLogger('main')
       
    19 
       
    20 # name of process in syslog
       
    21 DHCP_SYSLOG_PROG = 'dhcpd'
       
    22 
       
    23 def parse_options (argv) :
       
    24     """
       
    25         Parse command-line arguments.
       
    26     """
       
    27 
       
    28     prog = argv[0]
       
    29 
       
    30     parser = optparse.OptionParser(
       
    31             prog        = prog,
       
    32             usage       = '%prog: [options]',
       
    33             version     = __version__,
       
    34 
       
    35             # module docstring
       
    36             description = __doc__,
       
    37     )
       
    38     
       
    39     # options
       
    40     parser.add_option_group(pvl.args.parser(parser))
       
    41 
       
    42     ## syslog
       
    43     parser.add_option_group(pvl.syslog.args.parser(parser, prog=DHCP_SYSLOG_PROG))
       
    44 
       
    45     ## XXX: networks
       
    46     parser.add_option('--network',              metavar='NET', action='append',
       
    47             help="Filter leases by network prefix as plugin instance")
       
    48 
       
    49     parser.add_option('--gateway',              metavar='GW/IFACE', action='append',
       
    50             help="Filter messages by gateway/interface as plugin instance")
       
    51 
       
    52     ## hosts
       
    53     parser.add_option('--database',             metavar='URI',
       
    54             help="Track hosts in given database")
       
    55 
       
    56     parser.add_option('--create',               action='store_true',
       
    57             help="Initialize database")
       
    58 
       
    59     # defaults
       
    60     parser.set_defaults(
       
    61 
       
    62     )
       
    63     
       
    64     # parse
       
    65     options, args = parser.parse_args(argv[1:])
       
    66     
       
    67     # apply
       
    68     pvl.args.apply(options, prog)
       
    69 
       
    70     if not options.database :
       
    71         parser.error("Missing required option: --database")
       
    72 
       
    73     return options, args
       
    74 
       
    75 def main (argv) :
       
    76     options, args = parse_options(argv)
       
    77 
       
    78     # db
       
    79     if not options.database :
       
    80         log.error("No database given")
       
    81         return 1
       
    82 
       
    83     log.info("Open up database: %s", options.database)
       
    84     db = pvl.verkko.db.Database(options.database)
       
    85     hosts_db = pvl.dhcp.hosts.DHCPHostsDatabase(db)
       
    86 
       
    87     if options.create :
       
    88         hosts_db.create()
       
    89   
       
    90     # syslog
       
    91     log.info("Open up syslog...")
       
    92     syslog = pvl.syslog.args.apply(options)
       
    93     parser = pvl.dhcp.syslog.DHCPSyslogParser()
       
    94 
       
    95     log.info("Enter mainloop...")
       
    96     for source in syslog.main() :
       
    97         # parse dhcp messages from syslog
       
    98         for host in parser(source) :
       
    99             log.debug("%s: %s", source, host)
       
   100 
       
   101             hosts_db(host)
       
   102     
       
   103     # done
       
   104     return 0
       
   105 
       
   106 if __name__ == '__main__':
       
   107     import sys
       
   108 
       
   109     sys.exit(main(sys.argv))