#!/usr/bin/env python from __future__ import unicode_literals import os import sys import time import utils 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(): run_query = lambda q: utils.run_mysql_query(q, b'/usr/bin/mysql') # 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: utils.Logger.fail('"PassiveService1" seems not' ' to have been checked yet\n') return 1 if (state_time + CHECK_INTERVAL) - time.time() < 30: time.sleep(45) # Now pass the checkresult in resultfile_path = os.path.join(CHECKRESULT_LOCATION, 'cfoobar') with open(resultfile_path, '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!' }) utils.Logger.debug('Written file: {0}\n'.format(resultfile_path)) # And notfiy Icinga that the file has been completely written... resultfileok_path = os.path.join(CHECKRESULT_LOCATION, 'cfoobar.ok') with open(resultfileok_path, 'w') as f: pass utils.Logger.debug('Written file: {0}\n'.format(resultfileok_path)) # 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!': utils.Logger.fail('Checkresult header files seem ' 'not to be processed properly\n') return 1 utils.Logger.ok('Checkresult header files are processed properly\n') return 0 if __name__ == '__main__': sys.exit(main())