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'
[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
+}