--- /dev/null
+#!/usr/bin/env python
+from __future__ import unicode_literals
+
+import os
+import sys
+import time
+
+from ido_mysql import run_query
+
+
+STATE_OK = 0
+TYPE_PASSIVE_CHECK = 1
+
+CHECK_INTERVAL = 300 # seconds
+CHECKRESULT_READ_INTERVAL = 5 # seconds
+CHECKRESULT_LOCATION = '/tmp/icinga2/checkresults'
+CHECKRESULT_TEMPLATE = """
+host_name=%(hostname)s
+service_description=%(servicename)s
+check_type=%(check_type)s
+check_options=0
+scheduled_check=0
+reschedule_check=0
+latency=0
+start_time=%(start_time)s
+finish_time=%(finish_time)s
+early_timeout=0
+exited_ok=%(excited_ok)s
+return_code=%(return_code)s
+output=%(output)s
+"""
+
+
+def main():
+ # We need to wait a bit first as Icinga processes a
+ # checkresult only if its newer than the last check
+ query = 'select unix_timestamp(s.last_check) as last_check ' \
+ 'from icinga_servicestatus as s ' \
+ 'inner join icinga_services as c ' \
+ 'on s.service_object_id = c.service_object_id ' \
+ "where c.display_name = 'PassiveService1'"
+ state_time = float(next(iter(run_query(query)), {}).get('last_check', '0'))
+ if state_time == 0:
+ print '"PassiveService1" seems not to have been checked yet'
+ return 1
+
+ if (state_time + CHECK_INTERVAL) - time.time() < 30:
+ time.sleep(45)
+
+ # Now pass the checkresult in
+ with open(os.path.join(CHECKRESULT_LOCATION, 'cfoobar'), 'w') as f:
+ f.write(CHECKRESULT_TEMPLATE % {
+ 'hostname': 'nsca-ng',
+ 'servicename': 'PassiveService1',
+ 'check_type': TYPE_PASSIVE_CHECK,
+ 'start_time': time.time(),
+ 'finish_time': time.time(),
+ 'excited_ok': '1',
+ 'return_code': STATE_OK,
+ 'output': 'Passing in CheckResult header files works!'
+ })
+
+ # And notfiy Icinga that the file has been completely written...
+ with open(os.path.join(CHECKRESULT_LOCATION, 'cfoobar.ok'), 'w') as f:
+ pass
+
+ # Lastly check whether the service changed its state
+ time.sleep(CHECKRESULT_READ_INTERVAL * 2)
+
+ query = 'select s.output ' \
+ 'from icinga_servicestatus as s ' \
+ 'inner join icinga_services as c ' \
+ 'on s.service_object_id = c.service_object_id ' \
+ "where c.display_name = 'PassiveService1'"
+ output = next(iter(run_query(query)), {}).get('output', '')
+ if output != 'Passing in CheckResult header files works!':
+ print 'Checkresult header files seem not to be processed properly'
+ return 1
+
+ print 'Checkresult header files are processed properly'
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
"teardown": {
"clean": ["/tmp/ido_tests.py", "/tmp/ido_tests.pyc"]
}
+ },
+ "checkresult.test": {
+ "setup": {
+ "copy": [
+ "files/configs/checkresult.conf >> /tmp/checkresult.conf",
+ "files/wait_for_ido.sh >> /tmp/wait_for_ido.sh",
+ "ido_mysql.test >> /tmp/ido_mysql.py"
+ ],
+ "exec": [
+ "sudo mv /tmp/checkresult.conf /etc/icinga2/conf.d/",
+ "mkdir -p -m 0777 /tmp/icinga2/checkresults",
+ "sudo service icinga2 restart",
+ "/tmp/wait_for_ido.sh mysql"
+ ]
+ },
+ "teardown": {
+ "clean": ["/tmp/ido_mysql.py*"],
+ "exec": [
+ "sudo rm /etc/icinga2/conf.d/checkresult.conf",
+ "sudo service icinga2 restart",
+ "rmdir /tmp/icinga2/checkresults",
+ "/tmp/wait_for_ido.sh mysql",
+ "/tmp/wait_for_ido.sh pgsql && rm /tmp/wait_for_ido.sh"
+ ]
+ }
}
}
}