summaryrefslogtreecommitdiffstats
path: root/hostinfo-checks
blob: 019892b05d9adbb1b419fbac4a6c9c6f87ab2fc1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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()