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