summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-06 20:42:42 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-06 23:29:05 +0200
commit170f29cb034470560ca66b05d39a4e0961a6536e (patch)
tree55da82c0c10f1068d80b63aa34b9381efc915035
downloadhostinfo-maintainer-170f29cb034470560ca66b05d39a4e0961a6536e.tar.gz
hostinfo-maintainer-170f29cb034470560ca66b05d39a4e0961a6536e.tar.bz2
hostinfo-maintainer-170f29cb034470560ca66b05d39a4e0961a6536e.zip
initial commit0.1.0
-rwxr-xr-xhostinfo-checks121
-rw-r--r--version.py41
2 files changed, 162 insertions, 0 deletions
diff --git a/hostinfo-checks b/hostinfo-checks
new file mode 100755
index 0000000..019892b
--- /dev/null
+++ b/hostinfo-checks
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+
+"""
+This script checks, if for each maintainer (defined in the hostinfo data)
+a public ssh key is available in the bcfg2 repository.
+"""
+
+import os
+import sys
+import yaml
+import argparse
+import logging
+import nagiosplugin
+
+class MissingMaintainers(nagiosplugin.Resource):
+ def __init__(self, hostinfo, repo):
+ self.hostinfo = hostinfo
+ self.repo = repo
+
+ def _get_all_hosts(self):
+ hosts = list()
+ hosts_path = os.path.join(self.hostinfo, 'metadata', 'hosts')
+ with open(hosts_path) as hosts_file:
+ hostlist = yaml.load(hosts_file)
+ hosts = hostlist['hosts']
+ return hosts
+
+ def _get_all_maintainers(self, hosts):
+ maintainers = set()
+ for host in hosts:
+ data = dict()
+ with open(os.path.join(self.hostinfo, host)) as host_file:
+ data = yaml.load(host_file)
+
+ if 'maintainers' in data:
+ maintainers |= set(data['maintainers'])
+ return maintainers
+
+ def probe(self):
+ hosts = self._get_all_hosts()
+ maintainers = self._get_all_maintainers(hosts)
+
+ errors = list()
+ for maintainer in maintainers:
+ keyfile = os.path.join(self.repo, 'SSHKeys', maintainer + '.pub')
+ if not os.path.exists(keyfile):
+ errors.append(maintainer)
+
+ yield nagiosplugin.Metric('missing', errors, context='missing')
+
+class MaintainersContext(nagiosplugin.Context):
+ def __init__(self, name, result_cls=nagiosplugin.Result):
+ super(MaintainersContext, self).__init__(name, result_cls=result_cls)
+
+ def describe(self, metric):
+ logging.info("describe called")
+ if len(metric.value) > 0:
+ return ("missing keys: %s" % ', '.join(metric.value))
+
+ return "all keys available"
+
+ def evaluate(self, metric, resource):
+ if len(metric.value) > 0:
+ return self.result_cls(nagiosplugin.Critical,
+ hint=self.describe(metric), metric=metric)
+
+ return self.result_cls(nagiosplugin.Ok,
+ hint=self.describe(metric), metric=metric)
+
+ def performance(self, metric, resource):
+ return nagiosplugin.Performance(
+ label='missing',
+ value=len(metric.value),
+ crit="1",
+ min="0")
+
+def print_version():
+ try:
+ import version
+ ver = version.get_git_version()
+ print(" %s" % ver)
+ except:
+ sys.stderr.write('Unable to identify the version information.\n')
+ sys.exit(nagiosplugin.Unknown.code)
+
+@nagiosplugin.guarded
+def main():
+ basepath = '/usr/local/share/hostinfo'
+ repopath = '/var/lib/bcfg2/'
+ if 'HOSTINFO_PATH' in os.environ and os.environ['HOSTINFO_PATH'] != '':
+ basepath = os.environ['HOSTINFO_PATH']
+
+ parser = argparse.ArgumentParser(
+ description=__doc__,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser.add_argument("-p", "--path", default=basepath,
+ help="set the path to the hostinfo data")
+ parser.add_argument("-r", "--repo", default=repopath,
+ help="set the path to the bcfg2 repo")
+ parser.add_argument("-V", "--version", action="store_true",
+ help="only print the version number and exit")
+ parser.add_argument("-v", "--verbose", action="count", default=0,
+ help="increase output verbosity (use up to 3 times)")
+ args = parser.parse_args()
+
+ if args.version:
+ print_version()
+
+ if not os.path.exists(args.path):
+ raise Exception("hostinfo data not found in '%s'" % args.path)
+
+ if not os.path.exists(args.repo):
+ raise Exception("bcfg2 repo not found in '%s'" % args.repo)
+
+ check = nagiosplugin.Check(
+ MissingMaintainers(args.path, args.repo),
+ MaintainersContext('missing'))
+ check.main(verbose=args.verbose)
+
+if __name__ == '__main__':
+ main()
diff --git a/version.py b/version.py
new file mode 100644
index 0000000..a4c7ed6
--- /dev/null
+++ b/version.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+# To use this script, simply import it your setup.py file, and use the
+# results of get_git_version() as your package version:
+#
+# from version import *
+#
+# setup(
+# version=get_git_version(),
+# .
+# .
+# .
+# )
+
+__all__ = ["get_git_version"]
+
+import os
+import re
+from subprocess import Popen, PIPE
+
+OWN_DIR = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
+
+def call_git_describe(abbrev=4):
+ try:
+ p = Popen(['git', 'describe', '--abbrev=%d' % abbrev, '--tags'],
+ cwd=OWN_DIR, stdout=PIPE, stderr=PIPE)
+ p.stderr.close()
+ line = p.stdout.readlines()[0]
+ return line.strip()
+
+ except:
+ return None
+
+def get_git_version(abbrev=4):
+ version = call_git_describe(abbrev)
+ if version is None:
+ raise ValueError("Cannot find the version number!")
+
+ return re.sub('^debian/', '', version)
+
+if __name__ == "__main__":
+ print get_git_version()