|
1 #!/usr/bin/env python |
|
2 """ |
|
3 Import data from pmacct to RRD |
|
4 """ |
|
5 |
|
6 import optparse |
|
7 import logging |
|
8 |
|
9 from rrdweb import pmacct |
|
10 |
|
11 log = logging.getLogger('rrdweb-pmacct') |
|
12 |
|
13 def parse_args (args) : |
|
14 global options |
|
15 |
|
16 parser = optparse.OptionParser( |
|
17 usage = "%prog [options]" |
|
18 ) |
|
19 |
|
20 # generic |
|
21 parser.add_option('-q', "--quiet", help="No output in normal operation", |
|
22 action='store_const', dest="loglvl", const=logging.WARNING, |
|
23 ) |
|
24 parser.add_option('-v', "--verbose", help="More output", |
|
25 action='store_const', dest="loglvl", const=logging.INFO, |
|
26 ) |
|
27 parser.add_option('-D', "--debug", help="Even more output", |
|
28 action='store_const', dest="loglvl", const=logging.DEBUG, |
|
29 ) |
|
30 |
|
31 # paths |
|
32 parser.add_option('-R', "--rrd-dir", default="var/rrd", help="Path to directory containing .rrd files") |
|
33 parser.add_option('-S', "--rrd-step", help="RRD step interval (seconds) for new .rrd's", metavar='STEP') |
|
34 |
|
35 parser.add_option('-I', "--in-sock", help="Path to pmacct host-in.sock", metavar='SOCK') |
|
36 parser.add_option('-O', "--out-sock", help="Path to pmacct host-out.sock", metavar='SOCK') |
|
37 |
|
38 |
|
39 # defaults |
|
40 parser.set_defaults( |
|
41 loglvl = logging.INFO, |
|
42 ) |
|
43 |
|
44 ## parse |
|
45 options, args = parser.parse_args(args) |
|
46 |
|
47 # validate |
|
48 if not (options.in_sock and options.out_sock) : |
|
49 raise Exception("Both --in-sock and --out-sock are required options") |
|
50 |
|
51 ## apply |
|
52 logging.basicConfig( |
|
53 format = "[%(levelname)8s] %(funcName)20s : %(message)s", |
|
54 level = options.loglvl, |
|
55 ) |
|
56 |
|
57 return args |
|
58 |
|
59 def get_hosts_data () : |
|
60 """ |
|
61 Returns the in/out host tables. |
|
62 """ |
|
63 |
|
64 log.debug("fetching hosts data from %s + %s", options.in_sock, options.out_sock) |
|
65 |
|
66 # read summaries |
|
67 in_table = list(pmacct.pmacct_summary(options.in_sock)) |
|
68 out_table = list(pmacct.pmacct_summary(options.out_sock)) |
|
69 |
|
70 # merge into host data |
|
71 hosts = pmacct.host_counters(in_table, out_table) |
|
72 |
|
73 log.debug("got %d in entries + %d out entries -> %d hosts", len(in_table), len(out_table), len(hosts)) |
|
74 |
|
75 return hosts.values() |
|
76 |
|
77 def main (args) : |
|
78 # parse |
|
79 args = parse_args(args) |
|
80 |
|
81 # list of Host objects |
|
82 hosts = get_hosts_data() |
|
83 |
|
84 log.debug("full set of host data: %s", hosts) |
|
85 log.info("Updating %d hosts...", len(hosts)) |
|
86 |
|
87 # update |
|
88 for host in hosts : |
|
89 log.info("Updating host %s...", host.ip) |
|
90 |
|
91 pmacct.update_host(host, rrd_root=options.rrd_dir, rrd_step=options.rrd_step) |
|
92 |
|
93 if __name__ == '__main__' : |
|
94 from sys import argv |
|
95 |
|
96 main(argv[1:]) |