Wir haben hier auf der Arbeit ein neues 8TB ReadyNAS von Netgear in Betrieb genommen. Um das ins Nagios mit aufzunehmen hab ich ein kleines Plugin geschrieben was per SNMP die Werte abruft und fuer Nagios aufbereitet. Das Plugin check_readynas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | #!/bin/bash ## # # receive statusinfo from Netgear ReadyNAS 2100 for Nagios # # you can get all snmp-options with: # snmpwalk -m ALL -v 2c -c MYCOMMUNITY MYIPADDRESS .1.3.6.1.4.1.4526 # # # Usage: # ./check_readynas IP-ADDRESS SNMP-COMMUNITY STATUSCHECK # # 2010-07-19: initial Version \\ Jan Toenjes <jtoenje@uni-goettingen.de> # ## # temperature values for warning or critical / hdd (from datasheet) MAXDISKTEMPCRIT="60" MINDISKTEMPCRIT="5" MAXDISKTEMPWARN="50" MINDISKTEMPWARN="15" # unused systemtemperature values for warning or critical / (from webinterface) MAXSYSTEMPCRIT="65" MINSYSTEMPCRIT="0" MAXSYSTEMPWARN="55" MINSYSTEMPWARN="10" # nagios return values export STATE_OK=0 export STATE_WARNING=1 export STATE_CRITICAL=2 export STATE_UNKNOWN=3 export STATE_DEPENDENT=4 # check disk temperature for warning or critical values function checkDiskTemperature () { true=$(echo "$1 >= $MAXDISKTEMPWARN" | bc) if [ $true = 1 ] ; then returnValue=$STATE_WARNING ; fi true=$(echo "$1 >= $MAXDISKTEMPCRIT" | bc) if [ $true = 1 ] ; then returnValue=$STATE_CRITICAL ; fi true=$(echo "$1 <= $MINDISKTEMPWARN" | bc) if [ $true = 1 ] ; then returnValue=$STATE_WARNING ; fi true=$(echo "$1 <= $MINDISKTEMPCRIT" | bc) if [ $true = 1 ] ; then returnValue=$STATE_CRITICAL ; fi return $returnValue } # check third parameter and return the information case "$3" in disk1status) DSK1=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.3.1 | sed 's/.*ING: " //g' | sed 's/"//g'` DSK1STAT=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.4.1 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $DSK1STAT == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="Disk1: $DSK1 - $DSK1STAT" ;; disk2status) DSK2=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.3.2 | sed 's/.*ING: " //g' | sed 's/"//g'` DSK2STAT=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.4.2 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $DSK2STAT == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="Disk2: $DSK2 - $DSK2STAT" ;; disk3status) DSK3=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.3.3 | sed 's/.*ING: " //g' | sed 's/"//g'` DSK3STAT=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.4.3 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $DSK3STAT == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="Disk3: $DSK3 - $DSK3STAT" ;; disk4status) DSK4=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.3.4 | sed 's/.*ING: " //g' | sed 's/"//g'` DSK4STAT=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.4.4 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $DSK4STAT == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="Disk4: $DSK4 - $DSK4STAT" ;; disk1temp) DSK1TEMP=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.5.1 | awk '{print $4}'` DSK1CEL=`echo "scale=2;(5/9)*($DSK1TEMP-32)"|bc` checkDiskTemperature $DSK1CEL intReturn=$? outMessage="Disk1: $DSK1CEL Celsius" ; ;; disk2temp) DSK2TEMP=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.5.2 | awk '{print $4}'` DSK2CEL=`echo "scale=2;(5/9)*($DSK2TEMP-32)"|bc` checkDiskTemperature $DSK2CEL intReturn=$? outMessage="Disk2: $DSK2CEL Celsius" ;; disk3temp) DSK3TEMP=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.5.3 | awk '{print $4}'` DSK3CEL=`echo "scale=2;(5/9)*($DSK3TEMP-32)"|bc` checkDiskTemperature $DSK3CEL intReturn=$? outMessage="Disk3: $DSK3CEL Celsius" ;; disk4temp) DSK4TEMP=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.3.1.5.4 | awk '{print $4}'` DSK4CEL=`echo "scale=2;(5/9)*($DSK4TEMP-32)"|bc` checkDiskTemperature $DSK4CEL intReturn=$? outMessage="Disk4: $DSK4CEL Celsius" ;; fan1) FAN1=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.4.1.2.1 | awk '{print $4}'` intReturn=$STATE_OK outMessage="Fan1: $FAN1" ;; fan2) FAN2=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.4.1.2.2 | awk '{print $4}'` intReturn=$STATE_OK outMessage="Fan2: $FAN2" ;; systemp) SYSTEMP=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.5.1.2.1 | awk '{print $4}'` SYSCEL=`echo "scale=2;(5/9)*($SYSTEMP-32)"|bc` SYSTEMPOK=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.5.1.3.1 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $SYSTEMPOK == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="System Temperature: $SYSCEL Celsius - $SYSTEMPOK" ;; raidstatus) RAID=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.7.1.3.1 | sed 's/.*ING: " //g' | sed 's/"//g'` RAIDSTAT=`snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.7.1.4.1 | sed 's/.*ING: "//g' | sed 's/"//g'` if [ $RAIDSTAT == "ok" ]; then intReturn=$STATE_OK else intReturn=$STATE_WARNING fi outMessage="RAID: $RAID - $RAIDSTAT" ;; freespace) SPACE=` snmpget $1 -v2c -c $2 .1.3.6.1.4.1.4526.18.7.1.5.1 | awk '{print $4}'` intReturn=$STATE_OK MB=`echo "scale=2; $SPACE/1024" | bc` outMessage="Free Space: $MB mb" ;; *) intReturn=$STATE_OK outMessage=" Usage: $0 IPADDRESS SNMPCOMMUNITY STATUS \n \n Available statuses are: \n\n disk1status|disk2status|disk3status|disk4status \n disk1temp|disk2temp|disk3temp|disk4temp \n fan1|fan2 \n systemp \n raidstatus \n freespace" ;; esac echo -e $outMessage exit $intReturn |
(download) in den Ordner /usr/lib/nagios/plugins/ verschieben und nachdem das folgende check_command in der /etc/nagios3/commands.cfg definiert wurde:
# Netgear ReadyNAS 2100 define command{ command_name check_readynas command_line $USER1$/check_readynas $HOSTADDRESS$ $ARG1$ $ARG2$ } |
kann man ganz einfach die entsprechenden Checks definieren. Beispiel:
define host { host_name netgear-readynas alias Netgear ReadyNAS 2100 Business Editon 8TB address 1.2.3.4 use device-template } define service{ host netgear-readynas service_description DISK1 TEMP check_command check_readynas!MYSNMPCOMMUNITY!disk1temp use device-service } |
Nabend, sieht schon ganz gut aus. Leider fehlt noch bc, line 179, 206 -> command not found.
Gruß aus Stemwede, Ralf
hi ralf. danke! hilft dir ein „aptitude install bc“ (debian basierende distribution vorausgesetzt) oder moechtest du auf fehlerhaften oder fehlenden code aufmerksam machen? vg jan
Hi,
great script, it saved me a lot of time. The only missing thing is perfdata. But since all values are provided I only changed the output lines and perfdata is there.
For example, free disk space:
outMessage=“Free Space: $MB mb | free=$MB“
Michael
Hi Michael. Thanks a lot for your suggestion. I’ll update the script and the post in the next days with the perfdata stuff. \jan :-)
Hallo Jan,
danke für das Script! Es ist genau das was ich suche! Funzt schon fast alles auf Anhieb! Bekomme aber bei den Temperaturabfragen „disk1temp“ und „systemp“ noch die folgenden Fehler:
(standard_in) 1: parse error
(standard_in) 1: parse error
/usr/lib/nagios/plugins/check_readynas: line 45: [: =: unary operator expected
(standard_in) 1: parse error
/usr/lib/nagios/plugins/check_readynas: line 50: [: =: unary operator expected
(standard_in) 1: parse error
/usr/lib/nagios/plugins/check_readynas: line 55: [: =: unary operator expected
(standard_in) 1: parse error
/usr/lib/nagios/plugins/check_readynas: line 60: [: =: unary operator expected
Disk1: Celsius
bei „systemp“
(standard_in) 1: parse error
System Temperature: °C – ok
Die Freespaceabfrage muss ich noch in GB umwandeln, da zeigt es 918.00 mb an statt 918.00 GB
Danke nochmal!
Grüße Ron
Habe leider die selben fehler bei der Temp abfrage…
bekomme es selber leider nicht gebacken..
ansonsten ein top Plugin..
<
Was ist denn der output von
snmpget IPADRESSE -v2c -c SNMPCOMMUNITY .1.3.6.1.4.1.4526.18.3.1.3.1 | sed ’s/.*ING: “ //g‘ | sed ’s/“//g’`
VG jan
Bitte beachtet auch das updated Plugin