aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido G√ľnther <agx@sigxcpu.org>2008-11-20 14:17:14 +0100
committerGuido Guenther <agx@sigxcpu.org>2008-11-20 14:33:29 +0100
commitde0c1a3e21ce0bcf4eeed7bbf952a38c8983ef75 (patch)
tree8bdb326a40fb1590683cda2314e16a1ba47b64ea
parent532cac06c0779ec953eeb474981c6348ee2a7d51 (diff)
detect script for autoconfiguration
-rw-r--r--Makefile29
-rw-r--r--munin-libvirt-plugins-detect.in119
2 files changed, 139 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index f972c82..0054d77 100644
--- a/Makefile
+++ b/Makefile
@@ -1,29 +1,40 @@
VERSION=0.0.4
-PKG=munin-libvirt-plugins
-PLUGINDIR=/usr/share/munin/plugins/
+PACKAGE=munin-libvirt-plugins
+SBINDIR=/usr/sbin
+PLUGINDIR=/usr/share/munin/plugins
+MUNINCONFDIR=/etc/munin
PLUGINS=libvirt-cputime \
libvirt-blkstat \
libvirt-ifstat \
libvirt-mem
-ALL=$(PLUGINS) Makefile COPYING INSTALL
-PYFILES=$(patsubst %,%.py,$(PLUGINS))
+DETECT=$(PACKAGE)-detect
+PYFILES=$(patsubst %,%.py,$(PLUGINS) $(DETECT))
-install: $(PLUGINS)
+all: $(DETECT)
+
+install: build
install -d $(DESTDIR)$(PLUGINDIR)
install -m 755 $(PLUGINS) $(DESTDIR)$(PLUGINDIR)
+ install -m 755 $(DETECT) $(DESTDIR)$(SBINDIR)
+
+$(DETECT): $(DETECT).in
+ sed -e "s,::MUNINCONFDIR::,$(MUNINCONFDIR),"\
+ -e "s,::PLUGINDIR::,$(PLUGINDIR)," \
+ -e "s,::VERSION::,$(VERSION)," \
+ < $< > $@
%.py: %
ln -s $< $@
pychecker -q -e Error $@
-check: $(PYFILES)
+check: $(DETECT) $(PYFILES)
clean:
- rm -f *.py *.pyc
+ rm -f *.py *.pyc $(DETECT)
dist: clean check
- git-archive --format=tar --prefix=$(PKG)-$(VERSION)/ HEAD | gzip -c > ../$(PKG)-$(VERSION).tar.gz
+ git-archive --format=tar --prefix=$(PACKAGE)-$(VERSION)/ HEAD | gzip -c > ../$(PACKAGE)-$(VERSION).tar.gz
-.PHONY: clean check dist install
+.PHONY: clean check dist install build
diff --git a/munin-libvirt-plugins-detect.in b/munin-libvirt-plugins-detect.in
new file mode 100644
index 0000000..29012d3
--- /dev/null
+++ b/munin-libvirt-plugins-detect.in
@@ -0,0 +1,119 @@
+#/!/usr/bin/python
+# vim: set fileencoding=utf-8 :
+#
+# Configure and enable munin libvirt plugins
+#
+# Copyright 2008 Guido Guenther <agx@sigxcpu.org>
+#
+# Licesnse: GPLv2
+#
+# Detect connection uri and enable plugins
+
+import os
+import sys
+from optparse import OptionParser
+
+try:
+ import libvirt
+ has_libvirt = True
+except ImportError:
+ has_libvirt = False
+
+URIS = [ "xen:///", "qemu:///system" ]
+PLUGIN_CONF = "::MUNINCONFDIR::/plugin-conf.d/libvirt"
+PLUGINS = [ "blkstat", "cputime", "ifstat", "mem" ]
+PLUGIN_SRC = "::PLUGINDIR::"
+PLUGIN_DST = "::MUNINCONFDIR::/plugins/"
+
+def check_uris(uris, force=False):
+ detected = None
+
+ for uri in uris:
+ try:
+ libvirt.openReadOnly(uri)
+ detected = uri
+ break
+ except libvirt.libvirtError, err:
+ pass
+
+ if detected:
+ print "Hypervisor at %s detected." % detected
+ if not os.path.exists(PLUGIN_CONF) or force:
+ try:
+ conf = file(PLUGIN_CONF, "w+")
+ print >>conf, "[libvirt-*]"
+ print >>conf, "env.uri %s""" % detected
+ conf.close()
+ except IOError, err:
+ print >>sys.stderr, err
+ return 1
+ else:
+ print >>sys.stderr, "Plugin configuration '%s' already exists - doing nothing" % PLUGIN_CONF
+ return 0
+
+
+def enable_plugins(force=False):
+ for plugin in map(lambda x: "libvirt-" + x, PLUGINS):
+ src = os.path.join(PLUGIN_SRC, plugin)
+ dst = os.path.join(PLUGIN_DST, plugin)
+ if force:
+ try:
+ os.unlink(dst)
+ except OSError:
+ pass
+ if os.path.exists(dst):
+ print >>sys.stderr, "Plugin '%s' already enabled - doing nothing" % plugin
+ else:
+ print >>sys.stderr, "Enabling plugin '%s'" % plugin
+ os.symlink(src, dst)
+ return 0
+
+
+def restart_munin_node():
+ act = dict(service='munin-node', action='restart')
+
+ for path in [ '/usr/sbin/invoke-rc.d',
+ '/sbin/service' ]:
+ if os.path.exists(path):
+ act['exec'] = path
+ ret = os.system('%(exec)s %(service)s %(action)s' % act)
+ return ret
+ else:
+ if os.path.exists('/etc/init.d/%(service)s' % act):
+ ret = os.system('/etc/init.d/%(service)s %(action)s' % act)
+ return ret
+ return 1
+
+
+def main(args):
+ parser = OptionParser(usage="%prog [-f] [uris]", version="%prog ::VERSION::")
+ parser.add_option("-f", "--force", action="store_true", dest="force", default=False,
+ help="overwrite files and symlinks")
+ parser.add_option("-r", "--restart", action="store_true", dest="restart", default=False,
+ help="restart munin-node to let changes take effect")
+ (options, args) = parser.parse_args(args)
+
+ if len(args) > 1:
+ uris = args[1:]
+ else:
+ uris = URIS
+
+ if not has_libvirt:
+ print >>sys.stderr, "Libvirt not available."
+ return 1
+
+ ret = check_uris(uris, options.force)
+ if ret:
+ return ret
+ ret = enable_plugins(options.force)
+ if ret:
+ return ret
+ if options.restart:
+ ret = restart_munin_node()
+ return ret
+
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))
+
+# vim:et:ts=4:sw=4: