Skip to content
Snippets Groups Projects
Commit 6c7c2da0 authored by Hahn Axel (hahn)'s avatar Hahn Axel (hahn)
Browse files

update for check_snmp_synology for SNMP3

parent 72e25202
No related branches found
No related tags found
1 merge request!66update for check_snmp_synology for SNMP3
#!/bin/bash #!/bin/bash
# check_snmp_synology for nagios version 1.1 # check_snmp_synology for nagios version 1.2
# 30.04.2013 Nicolas Ordonez, Switzerland # 30.04.2013 Nicolas Ordonez, Switzerland
# 08.08.2020 Axel Hahn: add update, community string # 08.08.2020 Axel Hahn: add update, community string
# 03.05.2023 v1.2 ah support Snmpv3 connections
#--------------------------------------------------- #---------------------------------------------------
# this plugin check the health of your Synology NAS # this plugin check the health of your Synology NAS
# - System status (Power, Fans) # - System status (Power, Fans)
...@@ -9,21 +10,30 @@ ...@@ -9,21 +10,30 @@
# - RAID status # - RAID status
# - available updates # - available updates
# #
# Tested with DSM 6.2 # Tested with DSM 6.2 + 6.4 + 7.1
#--------------------------------------------------- #---------------------------------------------------
#
# ah = axel.hahn@unibe.ch
#
# see docs: # see docs:
# https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/All/enu/Synology_DiskStation_MIB_Guide.pdf # https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/All/enu/Synology_DiskStation_MIB_Guide.pdf
#--------------------------------------------------- #---------------------------------------------------
. `dirname $0`/inc_pluginfunctions . $(dirname $0)/inc_pluginfunctions
# --- basic vars # --- basic vars
self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] )
self_APPVERSION=1.2
SNMPCOMMUNITY="public" SNMPCOMMUNITY="public"
SNMPVERSION="2c" SNMPVERSION="2c"
SNMPWALK=$(which snmpwalk) SNMPWALK=$(which snmpwalk)
SNMPGET=$(which snmpget) SNMPGET=$(which snmpget)
HOSTNAME="" SNMPCONFIG=/etc/icingaclient/snmp.cfg
HOSTNAME="localhost"
option_found=0 option_found=0
healthString="" healthString=""
verbose="no" verbose="no"
...@@ -57,15 +67,61 @@ OID_RAIDSize="${OID_syno}.3.1.1.5" ...@@ -57,15 +67,61 @@ OID_RAIDSize="${OID_syno}.3.1.1.5"
# --- status arrays to show results # --- status arrays to show results
# 0 1 2 3 4 5 # 0 1 2 3 4 5
aStatusDual=( "???" Normal Failed)
aStatusUpgrade=( "???" Yes "Up to date" Connecting Disconnected Others) aStatusUpgrade=( "???" Yes "Up to date" Connecting Disconnected Others)
aStatusDisk=( "???" Normal Initialized NotInitialized SystemPartitionFailed Crashed) aStatusDisk=( "???" Normal Initialized NotInitialized SystemPartitionFailed Crashed)
aStatusRaid=( "???" Normal Repairing Migrating Expanding Deleting Creating RaidSyncing RaidParityChecking RaidAssembling Canceling Degrade Crashed DataScrubbing RaidDeploying RaidUnDeploying RaidMountCache RaidExpandingUnfinishedSHR RaidConvertSHRToPool RaidMigrateSHR1ToSHR2 RaidUnknownStatus) aStatusRaid=( "???" Normal Repairing Migrating Expanding Deleting Creating RaidSyncing RaidParityChecking RaidAssembling Canceling Degrade Crashed DataScrubbing RaidDeploying RaidUnDeploying RaidMountCache RaidExpandingUnfinishedSHR RaidConvertSHRToPool RaidMigrateSHR1ToSHR2 RaidUnknownStatus)
aStatusSystem=$aStatusDual _self=$( basename $0 )
aStatusPower=$aStatusDual USAGE="
aStatusFan=$aStatusDual ______________________________________________________________________
$self_APPNAME
v$self_APPVERSION
Based on script of Nicolas Ordonez.
Institute for Medical Education - University of Bern
Licence: GNU GPL 3
______________________________________________________________________
check cpu usage and cpu wait
Cpu infos are taken from output of top command.
On higher cpu usage it can show processes that cause cpu waits and
with most cpu consumption.
SYNTAX:
$_self [options]
OPTIONS:
-a authentication params for snmpwalk/ snmpget to connect to target;
default: \"-v2c -c public\" (Snmpv2 with community string \"public\")
-h host to connect as hostname or ip address
-f FILE
read authentication from config file
default: \"/etc/icingaclient/snmp.cfg\"
-v detailed output
CONFIG FILE:
The config file can be multiline and has the syntax
[hostname]:[auth parameters]
The auth parameters set the version and all needed values to connect.
Snmp v2 uses a community string.
Snmp v3 is highly recommended (you should disable Snmp v2) and needs
a user and password.
Example:
server-01.example.com:-v 3 -l authnoPriv -a SHA -u snmpmonitor -A password-for-server-01
server-02.example.com:-v 3 -l authnoPriv -a SHA -u snmpmonitor -A password-for-server-02
EXAMPLE:
$_self -h server-01.example.com -v
Show Synology status of server-01 using connect data from /etc/icingaclient/snmp.cfg
$_self -h server-01.example.com -v -f /opt/somewhere/snmp.conf
Show Synology status of server-01 using connect data from custom config
"
#--------------------------------------------------- #---------------------------------------------------
# FUNCTIONS # FUNCTIONS
...@@ -88,53 +144,70 @@ _get(){ ...@@ -88,53 +144,70 @@ _get(){
# --- show usage # --- show usage
usage() usage()
{ {
ph.abort "usage: ./check_snmp_synology -h hostname [-C communitystring] [-v verbose]" ph.abort "$USAGE"
}
read_config(){
SNMPAUTH="-v $SNMPVERSION -c $SNMPCOMMUNITY"
if [ -r "$SNMPCONFIG" ]; then
if grep "^${HOSTNAME}:" "$SNMPCONFIG" >/dev/null; then
SNMPAUTH="$( grep "^${HOSTNAME}:" "$SNMPCONFIG" | cut -f 2- -d ':' )"
else
SNMPAUTH="$( grep "^DEFAULT:" "$SNMPCONFIG" | cut -f 2- -d ':' )"
fi
else
ph.setStatus "unknown"
echo "ERROR: unable to read config file [$SNMPCONFIG]."
ph.exit
fi
} }
#--------------------------------------------------- #---------------------------------------------------
# MAIN # MAIN
#--------------------------------------------------- #---------------------------------------------------
while getopts h:v OPTNAME; do while getopts a:h:f:v OPTNAME; do
case "$OPTNAME" in case "$OPTNAME" in
a)
SNMPAUTH="$OPTARG"
;;
f)
SNMPCONFIG="$OPTARG"
;;
h) h)
HOSTNAME="$OPTARG" HOSTNAME="$OPTARG"
option_found=1 option_found=1
;; ;;
C)
SNMPCOMMUNITY="$OPTARG"
;;
v) v)
verbose="yes" verbose="yes"
;; ;;
*) *)
usage usage
;; ;;
esac esac
done done
if [ "$option_found" = "0" ] || [ "$HOSTNAME" = "" ] ; then
usage
# remark: script aborts ...
fi
# --- read config to get the authentication params for snmp commands
test -z "$SNMPAUTH" && read_config
# --- read raid and disks to get its single OIDs # --- read raid and disks to get its single OIDs
nbDisk=`$SNMPWALK -OQne -t 10 -v $SNMPVERSION -c $SNMPCOMMUNITY $HOSTNAME $OID_diskID 2> /dev/null | wc -l ` nbDisk=$($SNMPWALK -OQne -t 10 ${SNMPAUTH} $HOSTNAME $OID_diskID 2> /dev/null | wc -l )
nbRAID=`$SNMPWALK -OQne -t 10 -v $SNMPVERSION -c $SNMPCOMMUNITY $HOSTNAME $OID_RAIDName 2> /dev/null | wc -l` nbRAID=$($SNMPWALK -OQne -t 10 ${SNMPAUTH} $HOSTNAME $OID_RAIDName 2> /dev/null | wc -l)
for i in `seq 1 $nbDisk`; for i in $(seq 1 $nbDisk);
do do
OID_disk="$OID_disk $OID_diskID.$(($i-1)) $OID_diskModel.$(($i-1)) $OID_diskStatus.$(($i-1)) $OID_diskTemp.$(($i-1)) " OID_disk="$OID_disk $OID_diskID.$(($i-1)) $OID_diskModel.$(($i-1)) $OID_diskStatus.$(($i-1)) $OID_diskTemp.$(($i-1)) "
done done
for i in `seq 1 $nbRAID`; for i in $(seq 1 $nbRAID);
do do
OID_RAID="$OID_RAID $OID_RAIDName.$(($i-1)) $OID_RAIDStatus.$(($i-1)) $OID_RAIDSize.$(($i-1)) $OID_RAIDFree.$(($i-1))" OID_RAID="$OID_RAID $OID_RAIDName.$(($i-1)) $OID_RAIDStatus.$(($i-1)) $OID_RAIDSize.$(($i-1)) $OID_RAIDFree.$(($i-1))"
done done
# --- SNPGET to all wanted oids # --- SNPGET to all wanted oids
syno=`$SNMPGET -OQne -t 10 -v $SNMPVERSION -c $SNMPCOMMUNITY $HOSTNAME $OID_model $OID_serialNumber $OID_DSMVersion $OID_DSMUpdateAvailable $OID_systemStatus $OID_powerStatus $OID_systemFanStatus $OID_CPUFanStatus $OID_temp $OID_disk $OID_RAID 2> /dev/null | sed 's/^[ \t]*//;s/[ \t]*$//'` syno=$($SNMPGET -OQne -t 10 ${SNMPAUTH} $HOSTNAME $OID_model $OID_serialNumber $OID_DSMVersion $OID_DSMUpdateAvailable $OID_systemStatus $OID_powerStatus $OID_systemFanStatus $OID_CPUFanStatus $OID_temp $OID_disk $OID_RAID 2> /dev/null | sed 's/^[ \t]*//;s/[ \t]*$//')
if [ "$?" != "0" ] ; then if [ "$?" != "0" ] ; then
ph.abort "Problem with SNMP request" ph.abort "Problem with SNMP request"
...@@ -169,9 +242,9 @@ _wd "" ...@@ -169,9 +242,9 @@ _wd ""
# --- Check system status # --- Check system status
systemStatus=$(_get $OID_systemStatus) systemStatus="$(_get $OID_systemStatus)"
if [ $systemStatus != "1" ] ; then if [ "$systemStatus" != "1" ] ; then
if [ "$systemStatus" = "2" ] ; then systemStatus="Failed"; fi if [ "$systemStatus" = "2" ] ; then systemStatus="Failed"; fi
ph.setStatus "critical" ph.setStatus "critical"
healthString="$healthString, System status: $systemStatus " healthString="$healthString, System status: $systemStatus "
...@@ -182,9 +255,9 @@ _wd "System Status: $systemStatus" ...@@ -182,9 +255,9 @@ _wd "System Status: $systemStatus"
# --- Check power status # --- Check power status
powerStatus=$(_get $OID_powerStatus) powerStatus="$(_get $OID_powerStatus)"
if [ $powerStatus != "1" ] ; then if [ "$powerStatus" != "1" ] ; then
if [ "$powerStatus" = "2" ] ; then powerStatus="Failed"; fi if [ "$powerStatus" = "2" ] ; then powerStatus="Failed"; fi
ph.setStatus "critical" ph.setStatus "critical"
healthString="$healthString, Power status: $powerStatus " healthString="$healthString, Power status: $powerStatus "
...@@ -196,7 +269,7 @@ _wd "Power Status: $powerStatus" ...@@ -196,7 +269,7 @@ _wd "Power Status: $powerStatus"
# --- Check system fan status # --- Check system fan status
systemFanStatus=$(_get $OID_systemFanStatus) systemFanStatus=$(_get $OID_systemFanStatus)
if [ $systemFanStatus != "1" ] ; then if [ "$systemFanStatus" != "1" ] ; then
if [ "$systemFanStatus" = "2" ] ; then systemFanStatus="Failed"; fi if [ "$systemFanStatus" = "2" ] ; then systemFanStatus="Failed"; fi
ph.setStatus "critical" ph.setStatus "critical"
healthString="$healthString, System fan status: $systemFanStatus " healthString="$healthString, System fan status: $systemFanStatus "
...@@ -208,7 +281,7 @@ _wd "System Fan Status: $systemFanStatus" ...@@ -208,7 +281,7 @@ _wd "System Fan Status: $systemFanStatus"
# --- Check CPU fan status # --- Check CPU fan status
CPUFanStatus=$(_get $OID_CPUFanStatus) CPUFanStatus=$(_get $OID_CPUFanStatus)
if [ $CPUFanStatus != "1" ] ; then if [ "$CPUFanStatus" != "1" ] ; then
if [ "$CPUFanStatus" = "2" ] ; then CPUFanStatus="Failed"; fi if [ "$CPUFanStatus" = "2" ] ; then CPUFanStatus="Failed"; fi
ph.setStatus "critical" ph.setStatus "critical"
healthString="$healthString, CPU fan status: $CPUFanStatus " healthString="$healthString, CPU fan status: $CPUFanStatus "
...@@ -232,7 +305,7 @@ _wd "NAS temperature: $DeviceTemperature °C" ...@@ -232,7 +305,7 @@ _wd "NAS temperature: $DeviceTemperature °C"
# --- Check all disk status # --- Check all disk status
_wd "" _wd ""
_wd "Number of disks: $nbDisk" _wd "Number of disks: $nbDisk"
for i in `seq 1 $nbDisk`; for i in $(seq 1 $nbDisk);
do do
diskID[$i]=$(_get $OID_diskID.$(($i-1))) diskID[$i]=$(_get $OID_diskID.$(($i-1)))
diskModel[$i]=$(_get $OID_diskModel.$(($i-1))) diskModel[$i]=$(_get $OID_diskModel.$(($i-1)))
...@@ -253,7 +326,7 @@ done ...@@ -253,7 +326,7 @@ done
# --- Check all RAID volume status # --- Check all RAID volume status
_wd "" _wd ""
_wd "Number of RAID volume: $nbRAID" _wd "Number of RAID volume: $nbRAID"
for i in `seq 1 $nbRAID`; for i in $(seq 1 $nbRAID);
do do
RAIDName[$i]=$(_get $OID_RAIDName.$(($i-1))) RAIDName[$i]=$(_get $OID_RAIDName.$(($i-1)))
iRAIDStatus=$(_get $OID_RAIDStatus.$(($i-1))) iRAIDStatus=$(_get $OID_RAIDStatus.$(($i-1)))
...@@ -272,6 +345,7 @@ do ...@@ -272,6 +345,7 @@ do
_wd "${RAIDName[$i]} status: ${RAIDStatus[$i]} ($iRAIDStatus) - size $iRAIDSize GB, free $iRAIDFree GB (${iFree}%)" _wd "${RAIDName[$i]} status: ${RAIDStatus[$i]} ($iRAIDStatus) - size $iRAIDSize GB, free $iRAIDFree GB (${iFree}%)"
done done
# _wd ""; _wd "DEBUG: SNMPAUTH= $( echo "$SNMPAUTH" | sed 's#\-A [^\ ]*#-A **********#g' )"
# --- output status # --- output status
ph.status "$healthString" ph.status "$healthString"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment