#!/usr/bin/env python import os, sys, re, errno, time, random, syslog def add_color(status): if status == 'WARNING': return ("\x034%s\x0f" % status) elif status == 'CRITICAL' or status == 'UNKNOWN' or status == 'DOWN': return ("\x034\x02%s\x0f" % status) elif status == 'OK' or status == 'UP': return ("\x033\x02%s\x0f" % status) else: return status def clean_output(status, output): output = output.strip() if output.startswith(status): output = output[len(status):] return re.sub(r'^[- :]*', '', output) def main(): if len(sys.argv) < 4: print('Usage: %s (PIPE|--test) SERVICE STATUS OUTPUT' % sys.argv[0]) sys.exit(1) file = sys.argv.pop(1) service = sys.argv.pop(1) status = sys.argv.pop(1) output = sys.argv.pop(1) msg = "%s %s: %s\n" % (service, add_color(status), clean_output(status, output)) if file == '--test': sys.stdout.write(msg) sys.exit(0) if not os.path.exists(file): sys.exit(1) now = time.time() while True: try: f = os.open(file, os.O_WRONLY | os.O_NONBLOCK) break except OSError: if time.time() - now > 2: syslog.syslog("Dropping message: '%s'" % msg) sys.exit(1) else: time.sleep(random.random() * 0.3) os.write(f, msg) os.close(f) if __name__ == '__main__': main()