diff -r 472f0a422234 -r a34e7260568b bin/pvl.rrd-interfaces --- a/bin/pvl.rrd-interfaces Thu May 16 01:14:35 2013 +0300 +++ b/bin/pvl.rrd-interfaces Thu Jul 04 03:49:27 2013 +0300 @@ -6,137 +6,15 @@ __version__ = '0.1' -import shlex import os import pvl.args +import pvl.rrd.hosts +from pvl.rrd.hosts import hostreverse import optparse import logging; log = logging.getLogger('main') -def hostjoin (*hosts) : - """ - DNS hostname join. - """ - - return '.'.join(hosts) - -def hostreverse (host) : - """ - Reverse hostname. - """ - - return '.'.join(reversed(host.split('.'))) - -def collectd_interfaces (options, file, collectd_domain, collectd_plugin) : - """ - Read collectd (host, type-instance, name) items, and yield (collectd-rrd, out-rrd) tuples. - - file - read host/ports from file - collectd_domain - append given domain to collectd hostname - collectd_plugin - use given collectd plugin's type-instances - """ - - host = None - - log.info("scanning %s/.%s/%s/%s-.rrd", options.collectd_rrd, collectd_domain, collectd_plugin, options.collectd_type) - - for idx, line in enumerate(file, 1) : - line = line.rstrip() - - if not line : - continue - - # comment? - if line.startswith('#') : - continue - - # line - parts = shlex.split(line) - - if not line[0].isspace() : - host = parts.pop(0) - - # host-spec? - if '=' in host : - collectd_host, interface_host = host.split('=') - else : - collectd_host = interface_host = host - - # flip from DNS-ordering -> path-ordering - if options.reverse_host : - interface_host = hostreverse(interface_host) - - # host has domain in collectd? - if collectd_domain : - collectd_host = hostjoin(collectd_host, collectd_domain) - - if not parts : - # keep host for following lines - continue - - port = parts.pop(0) - - # possibly multiple tags.. - for tag in parts : - if options.collectd_instance == 'type' : - type = options.collectd_type + '-' + port - else : - type = options.collectd_type - - if options.collectd_instance == 'plugin' : - plugin = collectd_plugin + '-' + port - else : - plugin = collectd_plugin - - collectd_rrd = os.path.join(options.collectd_rrd, collectd_host, plugin, type) + '.rrd' - - if not os.path.exists(collectd_rrd) : - log.warn("%s: missing collectd rrd: %s", idx, collectd_rrd) - continue - - # out - interface_rrd = os.path.join(interface_host, tag + '.rrd') - - log.debug("%s: %s", interface_rrd, collectd_rrd) - - yield collectd_rrd, interface_rrd - -def sync_links (options, links, dir) : - """ - Sync given (collectd, name) symlinks in given dir. - """ - - log.info("%s", dir) - - for path, name in links : - link = os.path.join(dir, name) - - # sync - if os.path.exists(link) : - continue - - log.info("%s: %s: %s", dir, name, path) - - yield link, path - -def apply_links (options, links) : - """ - Apply given symlinks - """ - - for link, path in links : - linkdir = os.path.dirname(link) - - # do - if not os.path.exists(linkdir) : - log.warn("mkdir: %s", linkdir) - os.mkdir(linkdir) - - print path - - os.symlink(path, link) - COLLECTD_RRD = '/var/lib/collectd/rrd' COLLECTD_PLUGIN = 'interfaces' COLLECTD_TYPE = 'if_octets' @@ -201,6 +79,41 @@ return options, args +def sync_links (options, links, dir) : + """ + Sync given (collectd, name) symlinks in given dir. + """ + + log.info("%s", dir) + + for path, name in links : + link = os.path.join(dir, name) + + # sync + if os.path.exists(link) : + continue + + log.info("%s: %s: %s", dir, name, path) + + yield link, path + +def apply_links (options, links) : + """ + Apply given symlinks + """ + + for link, path in links : + linkdir = os.path.dirname(link) + + # do + if not os.path.exists(linkdir) : + log.warn("mkdir: %s", linkdir) + os.mkdir(linkdir) + + print path + + os.symlink(path, link) + def main (argv) : options, args = parse_argv(argv) @@ -233,7 +146,7 @@ rrd = basepath # generate links from spec - links = list(collectd_interfaces(options, open(txt), + links = list(pvl.rrd.hosts.collectd_interfaces(options, open(txt), collectd_domain = domain, collectd_plugin = options.collectd_plugin or collectd_plugin or COLLECTD_PLUGIN, ))