diff --git a/check_hddtemp b/check_hddtemp index 6e1438cd4ee689e7c6b22d8fd45c7e844e8ed2a8..34cc338d7e28c75a356412c18cd3b21f512975b7 100755 --- a/check_hddtemp +++ b/check_hddtemp @@ -2,7 +2,7 @@ # # Check the hddtemp daemon on a remote host # -# Usage: check_hddtemp host drive warn crit +# Usage: check_hddtemp host drive warn crit [ hysteresis ] # # This check script is maintained in a Subversion repository at # http://lsvn.lysator.liu.se/svnroot/nagios-plugins. Contact @@ -21,7 +21,50 @@ def connect(host): sys.exit(2) return s -def check_hddtemp(host, drive, warn, crit): + +def fs_quote(s): + return s.replace("\\", "\\p").replace("/", "\\s").replace("\0", "\\0") + +def hysteresis_file(host, drive): + return "/tmp/check_hddtemp-%s-%s" % ( + fs_quote(host), fs_quote(drive)) + +def load_hysteresis(host, drive, hysteresis): + if not hysteresis: + return 1, 1 + try: + fp = open(hysteresis_file(host, drive), "r") + except IOError: + return 1, 1 + line = fp.read(2) + fp.close() + if len(line) < 2: + return 1, 1 + def x(s): + if s == "0": + return 0 + else: + return 1 + return x(line[0]), x(line[1]) + +def save_hysteresis(host, drive, warn_enable, crit_enable): + fn = hysteresis_file(host, drive) + try: + os.remove(fn) + except: + pass + fp = open(hysteresis_file(host, drive), "w") + if warn_enable > 0: + fp.write("1") + else: + fp.write("0") + if crit_enable > 0: + fp.write("1\n") + else: + fp.write("0\n") + fp.close() + +def check_hddtemp(host, drive, warn, crit, hysteresis): s = connect(host) res = '' while True: @@ -30,6 +73,7 @@ def check_hddtemp(host, drive, warn, crit): break res += tmp s.close() + warn_enable, crit_enable = load_hysteresis(host, drive, hysteresis) for drive_desc in res.split('||'): drive_info = drive_desc.split('|') if len(drive_info) >= 5 and drive_info[0] == "": @@ -43,29 +87,36 @@ def check_hddtemp(host, drive, warn, crit): if drv_unit != "C": print "UNKNOWN - drive uses F, not C" sys.exit(3) - if drv_temp >= crit: + if drv_temp >= crit + crit_enable * hysteresis: print "CRITICAL -", drv_temp, "C | temp=%d" % drv_temp + save_hysteresis(host, drive, -1, -1) sys.exit(2) - elif drv_temp >= warn: + elif drv_temp >= warn + warn_enable * hysteresis: print "WARNING -", drv_temp, "C | temp=%d" % drv_temp + save_hysteresis(host, drive, -1, 1) sys.exit(1) else: print "OK -", drv_temp, "C | temp=%d" % drv_temp + save_hysteresis(host, drive, 1, 1) sys.exit(0) print "UNKNOWN -", drive, "not found" sys.exit(3) def usage(): - sys.stderr.write("usage: check_hddtemp host drive warn crit\n") + sys.stderr.write("usage: check_hddtemp host drive warn crit [ hysteresis ]\n") sys.exit(64) if __name__ == '__main__': - if len(sys.argv) == 5: + if len(sys.argv) in [5, 6]: host = sys.argv[1] drive = sys.argv[2] warn = int(sys.argv[3]) crit = int(sys.argv[4]) + if len(sys.argv) == 6: + hysteresis = int(sys.argv[5]) + else: + hysteresis = 0 else: usage() - check_hddtemp(host, drive, warn, crit) + check_hddtemp(host, drive, warn, crit, hysteresis)