diff --git a/check_qnap_health/Makefile b/check_qnap_health/Makefile new file mode 100644 index 0000000..cf9673d --- /dev/null +++ b/check_qnap_health/Makefile @@ -0,0 +1,3 @@ +#/usr/bin/make -f + +include ../common.mk diff --git a/check_qnap_health/check_qnap_health b/check_qnap_health/check_qnap_health new file mode 100644 index 0000000..980ef63 --- /dev/null +++ b/check_qnap_health/check_qnap_health @@ -0,0 +1,857 @@ +#!/usr/bin/env bash +############################# Written and Manteined by Nicola Bandini ############### +############################# Created and written by Matthias Luettermann ############### +############################# finetuning by primator@gmail.com +############################# finetuning by n.bandini@gmail.com +############################# finetuning by vitamin.b@mailbox.org +############################# with code by Tom Lesniak and Hugo Geijteman +############################# with code by Carsten Koebke +# +# copyright (c) 2008 Shahid Iqbal +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# contact the author directly for more information at: matthias@xcontrol.de +########################################################################################## +plgVer=1.00 + +usage() { + echo + echo "qnap_health $plgVer" + echo + echo "Warning: Wrong command line arguments." + echo + echo "Usage: ${0##*/} [-V protocol] -H -C -p -w -c " + echo + echo "Where: -p|--part - part to check" + echo " -h - no human-readable output; do not use unit suffixes" + echo " -w|--warning - warning" + echo " -c|--critical - critical" + echo " -t|--timeout - timeout for snmp connect, default: 5s" + echo " --help - show this help" + echo + echo "SNMP specific" + echo " -H|--hostname - hostname or IP" + echo " -V - SNMP protocol version to use (1, 2c, 3); default: 2c" + echo " -P|--port - SNMP port; default: 161" + echo + echo "SNMP Version 1|2c specific" + echo " -C|--community - SNMP community name; default: public" + echo + echo "SNMP Version 3 specific" + echo " -l|--level - security level (noAuthNoPriv|authNoPriv|authPriv)" + echo " -u|--user - security name" + echo " -a|--authprotocol - authentication protocol (MD5|SHA)" + echo " -A|--authpassphrase - authentication protocol pass phrase" + echo " -x|--privprotocol - privacy protocol (DES|AES)" + echo " -X|--privpassphrase - privacy protocol pass phrase" + echo + echo "Parts are: status, sysinfo, systemuptime, temp, cpu, cputemp, freeram, powerstatus, fans, diskused, hdstatus, hdtemp, lunstatus (for iSCSI luns), volstatus (Raid Volume Status)" + echo + echo "volstatus & lunstatus checks all vols/luns and vols/lun space; powerstatus checks power supply" + echo "<#> is 1-8 for hd, 1-5 for vol" + echo + echo " Example for diskusage: ${0##*/} -H 127.0.0.1 -C public -p diskused -w 80 -c 95" + echo + echo " Example for volstatus: ${0##*/} -H 127.0.0.1 -C public -p volstatus -w 15 -c 10" + echo " critical and warning value are related to free disk space" + echo + echo " Example for fans: ${0##*/} -H 127.0.0.1 -C public -p fans -w 2000 -c 1900" + echo " critical and warning are minimum speed in rpm for fans" + echo + echo " this plugin requires the following programs to be installed:" + echo " * bc" + echo " * awk" + echo " * snmpget" + echo " * snmpwalk" + exit $EXIT_UNKOWN +} + +# Default values +strProtocol="2c" +strCommunity="public" +strPort="161" +timeout="5" + +# Exit codes +EXIT_OK="0" +EXIT_WARNING="1" +EXIT_CRITICAL="2" +EXIT_UNKNOWN="3" + +# check for needed programs +SNMPGET_BIN=$(which snmpget) +SNMPWALK_BIN=$(which snmpwalk) +BC_BIN=$(which bc) +AWK_BIN=$(which awk) + +if [ -z "$SNMPGET_BIN" ]; then + echo "Could not find 'snmpget'!" + usage +fi + +if [ -z "$SNMPWALK_BIN" ]; then + echo "Could not find 'snmpwalk'!" + usage +fi + +if [ -z "$BC_BIN" ]; then + echo "Could not find 'bc'!" + usage +fi + +if [ -z "$AWK_BIN" ]; then + echo "Could not find 'awk'!" + usage +fi + +# Options + +PARSED_OPTIONS=$(getopt -n "$0" -o V:H:C:p:hw:c:t:l:u:a:A:x:X:P: --long "hostname:,community:,part:,warning:,critical:,timeout:,level:,user:,authprotocol:,authpassphrase:,privprotocol:,privpassphrase:,port:,help" -- "$@") +if [ $? -ne 0 ]; then + usage + exit $EXIT_UNKOWN +fi + +if [ $# -eq 0 ]; then + usage + exit $EXIT_UNKOWN +fi +eval set -- "$PARSED_OPTIONS" + +while true; do + case "$1" in + --help) + usage + shift + ;; + -C|--community) + strCommunity="$2" + shift 2 + ;; + -P|--port) + strPort="$2" + shift 2 + ;; + -h) + inhuman=1 + shift + ;; + -H|--hostname) + strHostname="$2" + shift 2 + ;; + -p|--part) + strPart="$2" + shift 2 + ;; + -V) + if [ -n "$2" ]; then + strProtocol="$2" + case "$strProtocol" in + 1|2c|3) + ;; + *) + echo "ERROR: wrong protocol version" >&2 + usage + ;; + esac + fi + shift 2 + ;; + -w|--warning) + strWarning="$2" + shift 2 + ;; + -c|--critical) + strCritical="$2" + shift 2 + ;; + -t|--timeout) + timeout="$2" + shift 2 + ;; + -l|--level) + if [ -n "$2" ]; then + strLevel="$2" + case "$strLevel" in + noAuthNoPriv|authNoPriv|authPriv) + ;; + *) + echo "ERROR: wrong security level" >&2 + usage + ;; + esac + fi + shift 2 + ;; + -u|--user) + if [ -n "$2" ]; then + strUser="$2" + fi + shift 2 + ;; + -a|--authprotocol) + if [ -n "$2" ]; then + strAuthprotocol="${2,,}" + case "$strAuthprotocol" in + md5|sha) + ;; + *) + echo "ERROR: wrong authentication protocol" >&2 + usage + ;; + esac + fi + shift 2 + ;; + -A|--authpassphrase) + if [ -n "$2" ]; then + strAuthpassphrase="$2" + else + echo "ERROR: authentification passphrase is missing" >&2 + usage + fi + shift 2 + ;; + -x|--privprotocol) + if [ -n "$2" ]; then + strPrivprotocol="${2,,}" + case "$strPrivprotocol" in + des|aes) + ;; + *) + echo "ERROR: wrong privacy protocol" >&2 + usage + ;; + esac + fi + shift 2 + ;; + -X|--privpassphrase) + if [ -n "$2" ]; then + strPrivpassphrase="$2" + else + echo "ERROR: privacy passphrase is missing" >&2 + exit 3 + fi + shift 2 + ;; + --) + shift + break + ;; + esac +done + +if ([ "$strPart" != "sysinfo" -a "$strPart" != "hdstatus" -a "$strPart" != "powerstatus" ]) && ( [ -z "$strWarning" -o -z "$strCritical" ]);then + echo "UKNOWN: $strPart check needs warning and critical threshold set." + exit 3 +fi + +function _cmdparam() { + case "$strProtocol" in + 1|2c) + cmd="-v $strProtocol -c $strCommunity" + ;; + 3) + cmd="-v $strProtocol -u $strUser -l $strLevel -a $strAuthprotocol -A $strAuthpassphrase -x $strPrivprotocol -X $strPrivpassphrase" + ;; + esac + + if [ -n "$strPort" ]; then + cmd="$cmd $strHostname:$strPort" + else + cmd="$cmd $strHostname" + fi + + echo "$cmd" +} + +function _trim() { + echo $1 | awk '{$1=$1};1' +} + +function _snmpget() { + snmpget $(_cmdparam) "$@" +} + +function _snmpwalk() { + snmpwalk $(_cmdparam) "$@" +} + +function _snmpgetval() { + snmpget $(_cmdparam) -Oqv "$@" +} + +function _snmpstatus() { + snmpstatus $(_cmdparam) "$@" +} + +function _get_exp() { + case "$1" in + PB) echo "50" ;; + TB) echo "40" ;; + GB) echo "30" ;; + MB) echo "20" ;; + KB) echo "10" ;; + '') echo "0" ;; + *) echo "ERROR: unknown unit '$1'" ;; + esac +} + +# Check if QNAP is online +TEST="$(_snmpstatus -t $timeout -r 0 2>&1)" +if [ "$TEST" == "Timeout: No Response from $strHostname" ]; then + echo "UNKOWN: SNMP to $strHostname is not available or wrong community string"; + exit $EXIT_UNKNOWN; +fi + +# STATUS --------------------------------------------------------------------------------------------------------------------------------------- +if [ "$strPart" == "status" ]; then + echo "$TEST"; + +# DISKUSED --------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "diskused" ]; then + diskStr="$(_snmpget 1.3.6.1.4.1.24681.1.2.17.1.4.1)" + freeStr="$(_snmpget 1.3.6.1.4.1.24681.1.2.17.1.5.1)" + + diskSize="$(echo "$diskStr" | awk '{print $4}' | sed 's/.\(.*\)/\1/')" + freeSize="$(echo "$freeStr" | awk '{print $4}' | sed 's/.\(.*\)/\1/')" + diskUnit="$(echo "$diskStr" | awk '{print $5}' | sed 's/.*\(.B\).*/\1/')" + freeUnit="$(echo "$freeStr" | awk '{print $5}' | sed 's/.*\(.B\).*/\1/')" + + diskExp="$(_get_exp "$diskUnit")" + freeExp="$(_get_exp "$freeUnit")" + + disk="$(echo "scale=0; $diskSize*(2^$diskExp)" | bc -l)" + free="$(echo "scale=0; $freeSize*(2^$freeExp)" | bc -l)" + + used="$(echo "scale=0; $disk-$free" | bc -l)" + perc="$(echo "scale=0; $used*100/$disk" | bc -l)" + + diskH="$(echo "scale=2; $disk/(2^$diskExp)" | bc -l)" + freeH="$(echo "scale=2; $free/(2^$freeExp)" | bc -l)" + usedH="$(echo "scale=2; $used/(2^$diskExp)" | bc -l)" + + if [ "${inhuman:-0}" -eq 1 ]; then + diskF="$disk" + freeF="$free" + usedF="$used" + else + diskF="$diskH$diskUnit" + freeF="$freeH$freeUnit" + usedF="$usedH$diskUnit" + fi + + #wdisk=$(echo "scale=0; $strWarning*$disk/100" | bc -l) + #cdisk=$(echo "scale=0; $strCritical*$disk/100" | bc -l) + + OUTPUT="Total:$diskF - Used:$usedF - Free:$freeF - Used Space: $perc%|Used=$perc;$strWarning;$strCritical;0;100" + + if [ $perc -ge $strCritical ]; then + echo "CRITICAL: $OUTPUT" + exit $EXIT_CRITICAL + elif [ $perc -ge $strWarning ]; then + echo "WARNING: $OUTPUT" + exit $EXIT_WARNING + else + echo "OK: $OUTPUT" + exit $EXIT_OK + fi + +# CPU ---------------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "cpu" ]; then + CPU="$(_snmpgetval 1.3.6.1.4.1.24681.1.2.1.0 | sed -E 's/"([0-9.]+) ?%"/\1/')" + + OUTPUT="CPU Load=$CPU%|CPU load=$CPU%;$strWarning;$strCritical;0;100" + + if (( $(echo "$CPU > $strCritical" | bc -l) )); then + echo "CRITICAL: $OUTPUT" + exit $EXIT_CRITICAL + elif (( $(echo "$CPU > $strWarning" | bc -l) )); then + echo "WARNING: $OUTPUT" + exit $EXIT_WARNING + else + echo "OK: $OUTPUT" + exit $EXIT_OK + fi + +# CPUTEMP ---------------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "cputemp" ]; then + TEMP0="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.5.0 | sed -E 's/"([0-9.]+) ?C.*/\1/')" + OUTPUT="CPU Temperature: ${TEMP0}°C|NAS CPUtemperature=${TEMP0}C;$strWarning;$strCritical;;" + + if [ "$TEMP0" -ge "$strCritical" ]; then + echo "CRITICAL: $OUTPUT" + exit $EXIT_CRITICAL + elif [ "$TEMP0" -ge "$strWarning" ]; then + echo "WARNING: $OUTPUT" + exit $EXIT_WARNING + else + echo "OK: $OUTPUT" + exit $EXIT_OK + fi + +# Free RAM--------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "freeram" ]; then + totalMemStr="$(_snmpgetval 1.3.6.1.4.1.24681.1.2.2.0)" + freeMemStr="$(_snmpgetval 1.3.6.1.4.1.24681.1.2.3.0)" + + totalMemSize="$(echo "$totalMemStr" | sed -E 's/"([0-9.]+) ?.?B"/\1/')" + freeMemSize="$(echo "$freeMemStr" | sed -E 's/"([0-9.]+) ?.?B"/\1/')" + totalMemUnit="$(echo "$totalMemStr" | sed -E 's/"[0-9.]+ ?(.?B)"/\1/')" + freeMemUnit="$(echo "$freeMemStr" | sed -E 's/"[0-9.]+ ?(.?B)"/\1/')" + + totalMemExp="$(_get_exp "$totalMemUnit")" + freeMemExp="$(_get_exp "$freeMemUnit")" + + totalMem="$(echo "scale=0; $totalMemSize*(2^$totalMemExp)" | bc -l)" + freeMem="$(echo "scale=0; $freeMemSize*(2^$freeMemExp)" | bc -l)" + + usedMem="$(echo "scale=0; $totalMem-$freeMem" | bc -l)" + percMem="$(echo "scale=0; $usedMem*100/$totalMem" | bc -l)" + + totalMemH="$(echo "scale=1; $totalMem/(2^$totalMemExp)" | bc -l)" + freeMemH="$(echo "scale=1; $freeMem/(2^$freeMemExp)" | bc -l)" + usedMemH="$(echo "scale=1; $usedMem/(2^$freeMemExp)" | bc -l)" + + if [ "${inhuman:-0}" -eq 1 ]; then + totalMemF="$totalMem" + freeMemF="$freeMem" + usedMemF="$usedMem" + else + totalMemF="$totalMemH$totalMemUnit" + freeMemF="$freeMemH$freeMemUnit" + usedMemF="$usedMemH$freeMemUnit" + fi + + OUTPUT="Total:$totalMemF - Used:$usedMemF - Free:$freeMemF = $percMem%|Memory usage=$percMem%;$strWarning;$strCritical;0;100" + + if [ $percMem -ge $strCritical ]; then + echo "CRITICAL: $OUTPUT" + exit $EXIT_CRITICAL + elif [ $percMem -ge $strWarning ]; then + echo "WARNING: $OUTPUT" + exit $EXIT_WARNING + else + echo "OK: $OUTPUT" + exit $EXIT_OK + fi + +# System Temperature--------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "temp" ]; then + TEMP0="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.6.0 | sed -E 's/"([0-9.]+) ?C.*/\1/')" + OUTPUT="Temperature: ${TEMP0}°C|NAS temperature=${TEMP0}C;$strWarning;$strCritical;;" + + if [ "$TEMP0" -ge "$strCritical" ]; then + echo "CRITICAL: $OUTPUT" + exit $EXIT_CRITICAL + elif [ "$TEMP0" -ge "$strWarning" ]; then + echo "WARNING: $OUTPUT" + exit $EXIT_WARNING + else + echo "OK: $OUTPUT" + exit $EXIT_OK + fi + + +# HD# Temperature--------------------------------------------------------------------------------------------------------------------------------------- +elif [[ "$strPart" == hdtemp ]]; then + PERFOUTPUT="" + UnknownStr="" + CriticalStr="" + WarningStr="" + EXIT=0 + + hdnum="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.10.0)" + for (( c=1; c<=$hdnum; c++ )) + do + TEMPHD="$(_snmpgetval "1.3.6.1.4.1.24681.1.2.11.1.3.$c" | sed -E 's/"([0-9.]+) ?C.*/\1/')" + + if [ "$(echo "$TEMPHD" | sed -E 's/[0-9.]+//g')" != "" ]; then + if [ -n "$UnknownStr"]; then + UnknownStr="${UnknownStr},HDD${c}" + else + UnknownStr="UNKNOWN: HD${c}" + fi + fi + if [ $TEMPHD -ge $strCritical ]; then + if [ -n "$CriticalStr" ]; then + CriticalStr="${CriticalStr}, HDD${c}: ${TEMPHD}°C" + else + CriticalStr="CRITICAL: HDD${c}: ${TEMPHD}°C" + fi + elif [ $TEMPHD -ge $strWarning -a $TEMPHD -lt $strCritical ]; then + if [ -n "$WarningStr" ]; then + WarningStr="${WarningStr}, HDD${c}: ${TEMPHD}°C" + else + WarningStr="WARNING: HDD${c}: ${TEMPHD}°C" + fi + fi + if [ -n "$PERFOUTPUT" ]; then + PERFOUTPUT="${PERFOUTPUT} HDD${c}_temperature=${TEMPHD};$strWarning;$strCritical;;" + else + PERFOUTPUT="HDD${c}_temperature=${TEMPHD};$strWarning;$strCritical;;" + fi + done + + if [ -z "$CriticalStr" -a -z "$WarningStr" -a -z "$UnknownStr" ]; then + OUTPUT="OK: All HDD are fine." + else + if [ -n "$CriticalStr" ]; then + EXIT=$EXIT_CRITICAL + OUTPUT="$CriticalStr" + fi + if [ -n "$WarningStr" ]; then + if [ ! $EXIT -eq 2 ]; then + EXIT=$EXIT_WARNING + fi + OUTPUT="$OUTPUT $WarningStr" + fi + if [ -n "$UnknownStr" ];then + if [ ! $EXIT -eq 1 -o ! $EXIT -eq 2 ];then + EXIT=$EXIT_UNKNOWN + fi + OUTPUT="$OUTPUT $UnknownStr" + fi + fi + echo "$(_trim "$OUTPUT")|$PERFOUTPUT" + exit $EXIT + +# HD Status---------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "hdstatus" ]; then + hdnum="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.10.0)" + hdok=0 + hdnok=0 + hdnop=0 + output_crit="" + + for (( c=1; c<=$hdnum; c++ )) + do + HD="$(_snmpgetval "1.3.6.1.4.1.24681.1.2.11.1.7.$c" | sed 's/^"\(.*\).$/\1/')" + + if [ "$HD" == "GOOD" ]; then + ((hdok+=1)) + elif [ "$HD" == "--" ]; then + ((hdnop+=1)) + else + output_crit="${output_crit} Disk ${c}" + ((hdnok+=1)) + fi + done + + PERFDATA="|hdok=$hdok;;;; hdnok=$hdnok;;;; unused=$hdnop;;;;" + + if [ -n "$output_crit" ] + then + echo "CRITICAL: $(_trim "${output_crit}")$PERFDATA" + exit $EXIT_CRITICAL + else + echo "OK: Online Disk $hdok, Free Slot ${hdnop}$PERFDATA" + exit $EXIT_OK + fi + +# LUN Status---------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "lunstatus" ]; then + ALLOUTPUT="" + PERFOUTPUT="" + WARNING=0 + CRITICAL=0 + lun=1 + lunCOUNT="$(_snmpwalk .1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.2 | wc -l)" + + #if [ "$strWarning" -lt "$strCritical" ]; then + # echo "Warning threshold ($strWarning) is less than critical threshold ($strCritical) ! -- Are you sure ?" + #fi + while [ "$lun" -le "$lunCOUNT" ]; do + lun_Status="$(_snmpgetval ".1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.5.$lun" | sed 's/^"\(.*\).$/\1/')" + lun_name="$(_snmpgetval ".1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.6.$lun" | sed 's/^"\(.*\).$/\1/')" + if [ "$lun_Status" == "Enabled" ]; then + lunSTAT="OK($lun_Status)" + else + lunSTAT="CRITICAL($lun_Status)" + CRITICAL=1 + fi + + lunCpctStr="$(_snmpgetval ".1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.3.$lun")" + lunUsedPct="$(_snmpgetval ".1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.4.$lun")" + + lunCpct="$(echo "scale=0; $lunCpctStr*(2^0)" | bc -l)" + lunUsedCpct="$(echo "scale=0; $lunCpct/100*$lunUsedPct" | bc -l)" + lunUsedWarn="$(echo "scale=0; $lunCpct/100*$strWarning" | bc -l)" + lunusedCrit="$(echo "scale=0; $lunCpct/100*$strCritical" | bc -l)" + + if [ "$lunUsedPct" -ge "$strCritical" ]; then + lunUsedPctStr="CRITICAL($lunUsedPct)" + CRITICAL=1 + elif [ "$lunUsedPct" -ge "$strWarning" -a "$lunUsedPct" -lt "$strCritical" ]; then + lunUsedPctStr="WARNING($lunUsedPct)" + WARNING=1 + fi + + if [ -n "$ALLOUTPUT" ] ; then + ALLOUTPUT="${ALLOUTPUT} :: " + fi + if [ "$lunUsedPctStr" != "" ]; then + ALLOUTPUT="${ALLOUTPUT}$lun_name: $lunSTAT, used: ${lunUsedPctStr}%" + fi + + #Performance Data + if [ $lun -gt 1 ]; then + PERFOUTPUT="$PERFOUTPUT " + fi + PERFOUTPUT="${PERFOUTPUT}usedpct_$lun_name=${lunUsedPct}%;$strWarning;$strCritical;0;100 used_$lun_name=${lunUsedCpct}b;$lunUsedWarn;$lunusedCrit;0;$lunCpct" + + lun="`expr $lun + 1`" + unset lunUsedPctStr + done + + if [ -z $ALLOUTPUT ]; then + ALLOUTPUT="OK: All luns are fine." + fi + echo "$ALLOUTPUT| $PERFOUTPUT" + + if [ $CRITICAL -eq 1 ]; then + exit $EXIT_CRITICAL + elif [ $WARNING -eq 1 ]; then + exit $EXIT_WARNING + else + exit $EXIT_OK + fi +# Volume Status---------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "volstatus" ]; then + ALLOUTPUT="" + PERFOUTPUT="" + WARNING=0 + CRITICAL=0 + VOL=1 + VOLCOUNT="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.16.0)" + + if [ "$strWarning" -lt "$strCritical" ]; then + echo "Warning threshold ($strWarning) is less than critical threshold ($strCritical) ! -- Are you sure ?" + fi + + while [ "$VOL" -le "$VOLCOUNT" ]; do + Vol_Status="$(_snmpgetval ".1.3.6.1.4.1.24681.1.2.17.1.6.$VOL" | sed 's/^"\(.*\).$/\1/')" + + if [ "$Vol_Status" == "Ready" ]; then + VOLSTAT="OK: $Vol_Status" + elif [ "$Vol_Status" == "Rebuilding..." ]; then + VOLSTAT="WARNING: $Vol_Status" + WARNING=1 + else + VOLSTAT="CRITICAL: $Vol_Status" + CRITICAL=1 + fi + + volCpctStr="$(_snmpget ".1.3.6.1.4.1.24681.1.2.17.1.4.$VOL")" + volFreeStr="$(_snmpget ".1.3.6.1.4.1.24681.1.2.17.1.5.$VOL")" + + volCpctSize="$(echo "$volCpctStr" | awk '{print $4}' | sed 's/.\(.*\)/\1/')" + volFreeSize="$(echo "$volFreeStr" | awk '{print $4}' | sed 's/.\(.*\)/\1/')" + volCpctUnit="$(echo "$volCpctStr" | awk '{print $5}' | sed 's/.*\(.B\).*/\1/')" + volFreeUnit="$(echo "$volFreeStr" | awk '{print $5}' | sed 's/.*\(.B\).*/\1/')" + + volCpctExp="$(_get_exp "$volCpctUnit")" + volFreeExp="$(_get_exp "$volFreeUnit")" + + volCpct="$(echo "scale=0; $volCpctSize*(2^$volCpctExp)" | bc -l)" + volFree="$(echo "scale=0; $volFreeSize*(2^$volFreeExp)" | bc -l)" + volUsed="$(echo "scale=0; $volCpct-$volFree" | bc -l)" + + volFreePct="$(echo "scale=0; $volFree*100/$volCpct" | bc -l)" + volUsedPct="$(echo "scale=0; $volUsed*100/$volCpct" | bc -l)" + + volCpctH="$(echo "scale=2; $volCpct/(2^$volCpctExp)" | bc -l)" + volFreeH="$(echo "scale=2; $volFree/(2^$volFreeExp)" | bc -l)" + volUsedH="$(echo "scale=2; $volUsed/(2^$volFreeExp)" | bc -l)" + + if [ "${inhuman:-0}" -eq 1 ]; then + volCpctF="$volCpct" + volFreeF="$volFree" + volUsedF="$volUsed" + else + volCpctF="$volCpctH $volCpctUnit" + volFreeF="$volFreeH $volFreeUnit" + volUsedF="$volUsedH $volFreeUnit" + fi + + if [ "$volFreePct" -le "$strCritical" ]; then + volFreePct="CRITICAL: $volFreePct" + CRITICAL=1 + elif [ "$volFreePct" -le "$strWarning" ]; then + volFreePct="WARNING: $volFreePct" + WARNING=1 + fi + + ALLOUTPUT="${ALLOUTPUT}Volume #$VOL: $VOLSTAT, Total Size (bytes): $volCpctF, Free: $volFreeF (${volFreePct}%)" + if [ "$VOL" -lt "$VOLCOUNT" ]; then + ALLOUTPUT="${ALLOUTPUT}, " + fi + + #Performance Data + if [ $VOL -gt 1 ]; then + PERFOUTPUT="$PERFOUTPUT " + fi + PERFOUTPUT="${PERFOUTPUT}FreeSize_Volume-$VOL=${volFreePct}%;$strWarning;$strCritical;0;100" + + VOL="`expr $VOL + 1`" + done + + echo "$ALLOUTPUT|$PERFOUTPUT" + + if [ $CRITICAL -eq 1 ]; then + exit $EXIT_CRITICAL + elif [ $WARNING -eq 1 ]; then + exit $EXIT_WARNING + else + exit $EXIT_OK + fi + +# Power Supply Status ---------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "powerstatus" ]; then + ALLOUTPUT="" + WARNING=0 + CRITICAL=0 + PS=1 + COUNT="$(_snmpgetval .1.3.6.1.4.1.24681.1.4.1.1.1.1.3.1.0)" + + if [[ "$COUNT" == 'No Such Object'* ]]; then + echo "UNKOWN: Could not get information about powersupplies" + exit $EXIT_UNKNOWN + fi + + while [ "$PS" -le "$COUNT" ]; do + STATUS="$(_snmpgetval ".1.3.6.1.4.1.24681.1.4.1.1.1.1.3.2.1.4.$PS")" + if [ "$STATUS" -eq 0 ]; then + PSSTATUS="OK: GOOD" + else + PSSTATUS="CRITICAL: ERROR" + CRITICAL=1 + fi + ALLOUTPUT="${ALLOUTPUT}Power Supply #$PS - $PSSTATUS" + if [ "$PS" -lt "$COUNT" ]; then + ALLOUTPUT="$ALLOUTPUT\n" + fi + PS="`expr $PS + 1`" + done + + echo "$ALLOUTPUT" + + if [ $CRITICAL -eq 1 ]; then + exit $EXIT_CRITICAL + elif [ $WARNING -eq 1 ]; then + exit $EXIT_WARNING + else + exit $EXIT_OK + fi + +# Fan Status---------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "fans" ]; then + ALLOUTPUT="" + PERFOUTPUT="" + WARNING=0 + CRITICAL=0 + FAN=1 + FANCOUNT="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.14.0)" + + if [ "$strWarning" -lt "$strCritical" ]; then + echo "Warning threshold ($strWarning) is less than critical threshold ($strCritical) ! -- Are you sure ?" + fi + + while [ "$FAN" -le "$FANCOUNT" ]; do + FANSPEED="$(_snmpgetval ".1.3.6.1.4.1.24681.1.2.15.1.3.$FAN" | sed -E 's/"([0-9]+) ?RPM"/\1/')" + + #Performance data + if [ $FAN -gt 1 ]; then + PERFOUTPUT="$PERFOUTPUT " + fi + PERFOUTPUT="${PERFOUTPUT}Fan-$FAN=$FANSPEED;$strWarning;$strCritical;;" + + if [ "$FANSPEED" == "" ]; then + FANSTAT="CRITICAL: $FANSPEED RPM" + CRITICAL=1 + elif [ "$FANSPEED" -le "$strCritical" ]; then + FANSTAT="CRITICAL: $FANSPEED RPM" + CRITICAL=1 + elif [ "$FANSPEED" -le "$strWarning" ]; then + FANSTAT="WARNING: $FANSPEED RPM" + WARNING=1 + else + FANSTAT="OK: $FANSPEED RPM" + fi + + ALLOUTPUT="${ALLOUTPUT}Fan #${FAN}: $FANSTAT" + if [ "$FAN" -lt "$FANCOUNT" ]; then + ALLOUTPUT="${ALLOUTPUT}, " + fi + FAN="`expr $FAN + 1`" + done + + echo "$ALLOUTPUT|$PERFOUTPUT" + + if [ $CRITICAL -eq 1 ]; then + exit $EXIT_CRITICAL + elif [ $WARNING -eq 1 ]; then + exit $EXIT_WARNING + else + exit $EXIT_OK + fi + +# System Uptime---------------------------------------------------------------------------------------------------------------------------------------- +elif [ "$strPart" == "systemuptime" ]; then + EXIT=0 + netuptime="$(echo "scale=0; $(_snmpget .1.3.6.1.2.1.1.3.0 | sed -r 's/.*\(([0-9]+)\).*/\1/g')/100" | bc -l)" + sysuptime="$(echo "scale=0; $(_snmpget .1.3.6.1.2.1.25.1.1.0 | sed -r 's/.*\(([0-9]+)\).*/\1/g')/100" | bc -l)" + + if [ -z $sysuptime -o -z $netuptime ]; then + OUTPUT="UNKOWN: Could not get uptime information!" + EXIT=$EXIT_UNKOWN + fi + if [ "$sysuptime" -le "$strCritical" ]; then + OUTPUT="CRITICAL: System up since $(date -d @$(( $(date +%s) - $sysuptime )))" + EXIT=$EXIT_CRITICAL + elif [ "$sysuptime" -le "$strWarning" ]; then + OUTPUT="WARNING: System up since $(date -d @$(( $(date +%s) - $sysuptime )))" + EXIT=$EXIT_WARNING + elif [ "$netuptime" -le "$strCritical" ]; then + OUTPUT="$OUTPUT CRITICAL: Network up since $(date -d @$(( $(date +%s) - $netuptime )))" + EXIT=$EXIT_CRITICAL + elif [ "$netuptime" -le "$strWarning" ]; then + OUTPUT="$OUTPUT WARNING: Network up since $(date -d @$(( $(date +%s) - $netuptime )))" + if [ ! $EXIT -eq 2 ];then + EXIT=$EXIT_WARNING + fi + else + OUTPUT="OK: System up since $(date -d @$(( $(date +%s) - $sysuptime ))) - Network up since $(date -d @$(( $(date +%s) - $netuptime )))" + fi + + PERFDATA="| system_uptime=${sysuptime}s;$strWarning;$strCritical;; network_uptime=${netuptime}s;$strWarning;$strCritical;;" + + echo "$(_trim "$OUTPUT $PERFDATA")" + exit $EXIT + +# System Info------------------------------------------------------------------------------------------------------------------------------------------ +elif [ "$strPart" == "sysinfo" ]; then + model="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.12.0 | sed 's/^"\(.*\).$/\1/')" + hdnum="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.10.0)" + VOLCOUNT="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.16.0)" + lunCOUNT="$(_snmpwalk .1.3.6.1.4.1.24681.1.4.1.1.2.1.10.2.1.2 | wc -l)" + name="$(_snmpgetval .1.3.6.1.4.1.24681.1.2.13.0 | sed 's/^"\(.*\)$/\1/')" + firmware="$(_snmpgetval .1.3.6.1.2.1.47.1.1.1.1.9.1 | sed 's/^"\(.*\)$/\1/')" + + echo "NAS $name, Model $model, Firmware $firmware, Max HD number $hdnum, No. Volume $VOLCOUNT, No. iSCSI LUNs $lunCOUNT" + exit $EXIT_OK + +#---------------------------------------------------------------------------------------------------------------------------------------------------- +else + echo "Unknown Part!" && exit $EXIT_UNKNOWN +fi +exit $EXIT_OK diff --git a/check_qnap_health/control b/check_qnap_health/control new file mode 100644 index 0000000..50bfb8a --- /dev/null +++ b/check_qnap_health/control @@ -0,0 +1,6 @@ +Homepage: https://github.com/Mikesch-mp/qnap_health +Watch: https://raw.githubusercontent.com/Mikesch-mp/qnap_health/master/qnap_health plgVer=([0-9.]+) +Uploaders: Jan Wagner +Description: plugin to check NAS QNAP. +Recommends: snmp +Version: 1.00 diff --git a/check_qnap_health/copyright b/check_qnap_health/copyright new file mode 100644 index 0000000..50c4003 --- /dev/null +++ b/check_qnap_health/copyright @@ -0,0 +1,7 @@ +Copyright (c) 2008 Shahid Iqbal + +License: GPL+ + + On Debian systems, the complete text of the GNU General + Public License can be found in "/usr/share/common-licenses/GPL". +