diff --git a/README.md b/README.md index 3c46605..7ea2387 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ check_expire follows the usual Nagios rules. The options are: * -c: critical threshold in days * -w: warning threshold in days * -v: verbose details in output +* -u: unixtime output ## Installation @@ -37,8 +38,8 @@ object CheckCommand "expiration" { apply Service "expiration" { import "generic-service" - check_command = "expiration" - + check_command = "expiration" + assign where host.address && host.vars.monitor_expiration } ``` @@ -48,15 +49,26 @@ And a possible use: ``` object Host "bortzmeyer-org" { ... - + address = "bortzmeyer.org" vars.monitor_expiration = true vars.expiration_verbose = true - + } ``` +## Zabbix configuration + +For monitoring systems that do not rely on exit codes but on calculation mechanism based on the metric they receive you can use the `-u` option that will only return the expiration date in unixtime format. + +For instance, you can use the following in zabbix 5.4: + +* item: `check_expire["-H","{HOST.CONN}","-u"]` +* trigger (30 days before expiration): `last(/check_expire["-H","{HOST.CONN}","-u"])-now()<2592000` + +Where `2592000` is the number of seconds in 30 days. + ## License GPL. See LICENSE. @@ -67,6 +79,4 @@ Stéphane Bortzmeyer . ## Reference site -https://forge.chapril.org/bortzmeyer/check_expire Use the Gitea issue tracker to report bugs or wishes. - - +https://forge.chapril.org/bortzmeyer/check_expire Use the Gitea issue tracker to report bugs or wishes. diff --git a/check_expire b/check_expire index a60fba0..63797df 100755 --- a/check_expire +++ b/check_expire @@ -42,10 +42,11 @@ verbose = False domain = None critical_t = datetime.timedelta(days=2) warning_t = datetime.timedelta(days=7) +unixtime = False # TODO implement timeout for HTTPS requests. -t option. Does Requests allow it? def usage(msg=None): - print("Usage: %s -H domain-name [-c critical -w warning]" % sys.argv[0], end="") + print("Usage: %s -H domain-name [-c critical -w warning -u unixtime]" % sys.argv[0], end="") if msg is not None and msg != "": print(" (%s)" % msg) else: @@ -80,8 +81,8 @@ def ok(msg=None): sys.exit(STATE_OK) try: - optlist, args = getopt.getopt (sys.argv[1:], "c:hH:vVw:", - ["critical=", "expiration", "help", "verbose", "version", "warning="]) + optlist, args = getopt.getopt (sys.argv[1:], "c:hH:vVw:u", + ["critical=", "expiration", "help", "verbose", "version", "warning=", "unixtime"]) for option, value in optlist: if option == "--critical" or option == "-c": critical_t = datetime.timedelta(days=int(value)) @@ -97,6 +98,8 @@ try: sys.exit(STATE_OK) elif option == "--warning" or option == "-w": warning_t = datetime.timedelta(days=int(value)) + elif option == "--unixtime" or option == "-u": + unixtime = True else: # Should never occur, it is trapped by getopt print("Unknown option %s" % option) @@ -136,6 +139,9 @@ for event in rdap["events"]: print("No recognized format for datetime \"%s\"" % event["eventDate"]) sys.exit(STATE_UNKNOWN) now = datetime.datetime.now(tz=UTCINFO) + if unixtime == True: + print(int(expiration.strftime("%s"))) + sys.exit(STATE_OK) if expiration < now: error("domain %s is already expired (%s ago)" % (domain, (now-expiration))) rest = expiration-now @@ -146,5 +152,3 @@ for event in rdap["events"]: else: ok("expires in %s." % (rest)) error("No expiration found") - -