diff --git a/roles/nagios_server/files/nagios/commands/koji.cfg b/roles/nagios_server/files/nagios/commands/koji.cfg index 03ab1d33f7..4f013cd4a3 100644 --- a/roles/nagios_server/files/nagios/commands/koji.cfg +++ b/roles/nagios_server/files/nagios/commands/koji.cfg @@ -27,3 +27,8 @@ define command{ command_line $USER1$/check_koji } +# 'check_koji_wellness' +define command { + command_name check_koji_wellness.py + command_line $USER1$/check_koji_wellness +} diff --git a/roles/nagios_server/files/nagios/plugins/check_koji_wellness.py b/roles/nagios_server/files/nagios/plugins/check_koji_wellness.py new file mode 100755 index 0000000000..08a576bb6a --- /dev/null +++ b/roles/nagios_server/files/nagios/plugins/check_koji_wellness.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +import sys +import re + +import requests + +koji_host = sys.argv[1] +try: + koji_pkg = sys.argv[2] +except IndexError: + koji_pkg = 'koji' + +NAGIOS = { + 'OK': 0, + 'WARN': 1, + 'CRIT': 2 +} + +TARGETS = { + 'web': 'https://%s/koji/' % koji_host, + 'hub': 'https://%s/kojihub/' % koji_host, + 'pkg': 'https://%s/packages/%s/' % (koji_host, koji_pkg) +} + + +def do_request(url, method='GET', headers=None, body=None): + try: + res = getattr(requests, method.lower())(url, headers=headers, data=body) + except requests.exceptions.ConnectionError as e: + return (500, e.message) + return (res.status_code, res.text) + + +def check_web(): + url = TARGETS['web'] + (status_code, data) = do_request(url) + if status_code != 200: + return (NAGIOS['CRIT'], 'Unable to access "%s"' % url) + if not re.search(r'', data): + return (NAGIOS['WARN'], 'Unable to match content from "%s"' % url) + return (NAGIOS['OK'], '') + + +def check_hub(method='system.listMethods'): + url = TARGETS['hub'] + xmlrpc = ''' + + %s + + ''' % method + headers = { + 'Content-Type': 'text/xml' + } + (status_code, data) = do_request(url, method='POST', headers=headers, body=xmlrpc) + if status_code != 200: + return (NAGIOS['CRIT'], 'Unable to access "%s"' % url) + if len(re.findall(r'[a-zA-Z0-9\._]+', data)) == 0: + return (NAGIOS['WARN'], 'Unable to parse content from "%s"' % url) + return (NAGIOS['OK'], None) + + +def check_pkg(): + url = TARGETS['pkg'] + (status_code, data) = do_request(url) + if status_code != 200: + return (NAGIOS['CRIT'], 'Unable to access "%s"' % url) + if len(re.findall(r'\[DIR\] [0-9.\/]+', data)) == 0: + return (NAGIOS['WARN'], 'Unable to match content from "%s"' % url) + return (NAGIOS['OK'], None) + + +def main(): + ok = NAGIOS['OK'] + for (code, msg) in (check_web(), check_hub(), check_pkg()): + if code != ok: + return (code, msg) + return (ok, None) + + +if __name__ == '__main__': + (code, reason) = main() + if code != NAGIOS['OK']: + sys.stderr.write('%s\n' % reason) + else: + sys.stdout.write('All checks passed.\n') + sys.exit(code) diff --git a/roles/nagios_server/files/nagios/services/koji.cfg b/roles/nagios_server/files/nagios/services/koji.cfg index e18f35c597..851e9b2115 100644 --- a/roles/nagios_server/files/nagios/services/koji.cfg +++ b/roles/nagios_server/files/nagios/services/koji.cfg @@ -6,3 +6,11 @@ define service { use criticaltemplate } + +define service { + host_name koji.fedoraproject.org + service_description Check Koji wellness + check_command check_koji_wellness!koji.fedoraproject.org!koji + max_check_attempts 5 + use criticaltemplate +}