diff --git a/src/netgear_readynas/baseinfo.ini b/src/netgear_readynas/baseinfo.ini new file mode 100644 index 0000000..1c011d0 --- /dev/null +++ b/src/netgear_readynas/baseinfo.ini @@ -0,0 +1,7 @@ +[info] +title = Netgear ReadyNAS SNMP Checks +author = Markus Birth +description = SNMP based checks for the Netgear ReadyNAS. +version = 2016.08.23.1 +version.min_required = 1.2.8p2 +download_url = https://github.com/mbirth/check_mk-plugins diff --git a/src/netgear_readynas/checks/netgear_readynas_fan b/src/netgear_readynas/checks/netgear_readynas_fan new file mode 100644 index 0000000..3ffb488 --- /dev/null +++ b/src/netgear_readynas/checks/netgear_readynas_fan @@ -0,0 +1,55 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +netgear_readynas_fan_default_levels = { "lower": (2000, 1000), "upper": (8000, 9000) } + +def inventory_netgear_readynas_fan(info): + inventory = [] + for fanNumber, fanRpm, fanArea in info: + inventory.append( (fanArea, "netgear_readynas_fan_default_levels") ) + return inventory + +def check_netgear_readynas_fan(item, params, info): + status = 0 + for fanNumber, fanRpm, fanArea in info: + if fanArea != item: continue + + rpm = saveint(fanRpm) + lowerwarn, lowercrit = params["lower"] + upperwarn, uppercrit = params["upper"] + + rpmsym = "" + if rpm > uppercrit or rpm < lowercrit: + status = 2 + rpmsym = " (!!)" + elif rpm > upperwarn or rpm < lowerwarn: + status = 1 + rpmsym = " (!)" + + message = "Fan %s is at %i rpm.%s" % (fanArea, rpm, rpmsym) + perfdata = [ ("rpm", rpm, upperwarn, uppercrit, 0, uppercrit) ] + + return (status, message, perfdata) + + return (3, "%s not found in SNMP data." % item) + +check_info["netgear_readynas_fan"] = { + "check_function" : check_netgear_readynas_fan, + "inventory_function" : inventory_netgear_readynas_fan, + "group" : "hw_fans", + "service_description" : "Fan %s", + "snmp_info" : (".1.3.6.1.4.1.4526.18.4.1", [ + 1, # fanNumber + 2, # fanRPM + 3, # fanType + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.4526.18.1.0"), + "has_perfdata" : True +} diff --git a/src/netgear_readynas/checks/netgear_readynas_hdd b/src/netgear_readynas/checks/netgear_readynas_hdd new file mode 100644 index 0000000..c117d45 --- /dev/null +++ b/src/netgear_readynas/checks/netgear_readynas_hdd @@ -0,0 +1,55 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +def inventory_netgear_readynas_hdd(info): + inventory = [] + for diskNumber, diskChannel, diskModel, diskState, diskTemperature in info: + inventory.append( ("HDD Status", {}) ) + return inventory + +def check_netgear_readynas_hdd(item, params, info): + status = 0 + hddcount = 0 + badcount = 0 + hddlist = [] + for diskNumber, diskChannel, diskModel, diskState, diskTemperature in info: + hddcount += 1 + celsius = fahrenheit_to_celsius(saveint(diskTemperature)) + hddlist.append(u"%s-%s. %s: %i℃ (%s)" % (diskNumber, diskChannel, diskModel, celsius, diskState)) + if diskState != "ok": + status = 1 + badcount += 1 + + if badcount > 0: + statusmsg = u"%i bad disks! (!)" % (badcount) + else: + statusmsg = u"All ok." + + hddlist_str = "\\n".join(hddlist) + message = u"%i HDDs installed. %s\\n%s" % (hddcount, statusmsg, hddlist_str) + + return (status, message) + +check_info["netgear_readynas_hdd"] = { + "check_function" : check_netgear_readynas_hdd, + "inventory_function" : inventory_netgear_readynas_hdd, + "group" : "filesystem", + "service_description" : "%s", + "snmp_info" : (".1.3.6.1.4.1.4526.18.3.1", [ + 1, # diskNumber + 2, # diskChannel + 3, # diskModel + 4, # diskState + 5, # diskTemperature + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.4526.18.1.0"), + "includes" : [ "temperature.include" ], + "has_perfdata" : False +} diff --git a/src/netgear_readynas/checks/netgear_readynas_power b/src/netgear_readynas/checks/netgear_readynas_power new file mode 100644 index 0000000..b117e05 --- /dev/null +++ b/src/netgear_readynas/checks/netgear_readynas_power @@ -0,0 +1,42 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +def inventory_netgear_readynas_power(info): + inventory = [] + for psuNumber, psuDesc, psuStatus in info: + inventory.append( (psuNumber, None) ) + return inventory + +def check_netgear_readynas_power(item, params, info): + status = 0 + for psuNumber, psuDesc, psuStatus in info: + if psuNumber != item: continue + + if psuStatus != "ok": + status = 1 + + message = "%s (%s)" % (psuDesc, psuStatus) + + return (status, message) + + return (3, "%s not found in SNMP data." % item) + +check_info["netgear_readynas_power"] = { + "check_function" : check_netgear_readynas_power, + "inventory_function" : inventory_netgear_readynas_power, + "service_description" : "PSU %s", + "snmp_info" : (".1.3.6.1.4.1.4526.18.8.1", [ + 1, # psuNumber + 2, # psuDesc + 3, # psuStatus + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.4526.18.1.0"), + "has_perfdata" : False +} diff --git a/src/netgear_readynas/checks/netgear_readynas_temp b/src/netgear_readynas/checks/netgear_readynas_temp new file mode 100644 index 0000000..188b243 --- /dev/null +++ b/src/netgear_readynas/checks/netgear_readynas_temp @@ -0,0 +1,60 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +netgear_readynas_temp_default_levels = { "levels": (60, 80) } + +def inventory_netgear_readynas_temp(info): + inventory = [] + for tempNumber, tempFht, tempStatus in info: + inventory.append( (tempNumber, "netgear_readynas_temp_default_levels") ) + return inventory + +def check_netgear_readynas_temp(item, params, info): + status = 0 + for tempNumber, tempFht, tempStatus in info: + if tempNumber != item: continue + + fht = saveint(tempFht) + cel = fahrenheit_to_celsius(fht) + + if tempStatus != "ok": + status = 1 + + upperwarn, uppercrit = params["levels"] + + tempsym = "" + if cel > uppercrit: + status = 2 + tempsym = " (!!)" + elif cel > upperwarn and status <= 1: + status = 1 + tempsym = " (!)" + + message = u"Temperature %s is %i℃ (%i℉). (%s)%s" % (tempNumber, cel, fht, tempStatus, tempsym) + perfdata = [ ("Temperature_C", cel, upperwarn, uppercrit, 0, uppercrit) ] + + return (status, message, perfdata) + + return (3, "%s not found in SNMP data." % item) + +check_info["netgear_readynas_temp"] = { + "check_function" : check_netgear_readynas_temp, + "inventory_function" : inventory_netgear_readynas_temp, + "group" : "temperature", + "service_description" : "Temperature %s", + "snmp_info" : (".1.3.6.1.4.1.4526.18.5.1", [ + 1, # tempNumber + 2, # tempFahrenheit + 3, # tempStatus + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.4526.18.1.0"), + "includes" : [ "temperature.include" ], + "has_perfdata" : True +} diff --git a/src/netgear_readynas/checks/netgear_readynas_volume b/src/netgear_readynas/checks/netgear_readynas_volume new file mode 100644 index 0000000..43cd042 --- /dev/null +++ b/src/netgear_readynas/checks/netgear_readynas_volume @@ -0,0 +1,55 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +def inventory_netgear_readynas_volume(info): + mplist = [] + for volNumber, volName, volRaidLevel, volStatus, volSize, volFreeSpace in info: + mplist.append( volNumber ) + return df_inventory(mplist) + +def check_netgear_readynas_volume(item, params, info): + fslist = [] + status = 0 + for volNumber, volName, volRaidLevel, volStatus, volSize, volFreeSpace in info: + if volNumber != item: continue + + total = saveint(volSize) + free = saveint(volFreeSpace) + fslist.append( (("vol%s" % item), total, free, 0) ) + status, message, perfdata = df_check_filesystem_list(("vol%s" % item), params, fslist) + + message = u"%s: %s, %s (%s)" % (volName, message, volRaidLevel, volStatus) + + if volStatus != "ok": + status = max(status, 1) + message = u"%s: Volume Status %s (!), %s" % (volName, volStatus, volRaidLevel) + + return (status, message, perfdata) + + return (3, "%s not found in SNMP data." % item) + +check_info["netgear_readynas_volume"] = { + "check_function" : check_netgear_readynas_volume, + "inventory_function" : inventory_netgear_readynas_volume, + "group" : "filesystem", + "default_levels_variable": "filesystem_default_levels", + "service_description" : "Volume %s", + "snmp_info" : (".1.3.6.1.4.1.4526.18.7.1", [ + 1, # volumeNumber + 2, # volumeName + 3, # volumeRAIDLevel + 4, # volumeStatus + 5, # volumeSize + 6, # volumeFreeSpace + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.4526.18.1.0"), + "includes" : [ "df.include" ], + "has_perfdata" : True +}