|
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)) |