aboutsummaryrefslogtreecommitdiff
path: root/plugins/check_snmp_if
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/check_snmp_if')
-rwxr-xr-xplugins/check_snmp_if114
1 files changed, 114 insertions, 0 deletions
diff --git a/plugins/check_snmp_if b/plugins/check_snmp_if
new file mode 100755
index 0000000..5d56ae3
--- /dev/null
+++ b/plugins/check_snmp_if
@@ -0,0 +1,114 @@
+#!/bin/bash
+
+# https://ixnfo.com/en/snmp-oid-and-mib-for-interfaces.html
+# https://oidref.com/1.3.6.1.2.1.2.2.1
+# https://bestmonitoringtools.com/mibdb/mibdb_search.php?mib=IF-MIB
+
+RESULTS=(OK WARNING CRITICAL UNKNOWN)
+
+readonly MIB_IFOPERSTATUS="1.3.6.1.2.1.2.2.1.8"
+readonly MIB_ALIAS="1.3.6.1.2.1.31.1.1.1.18"
+readonly MIB_NAME="1.3.6.1.2.1.31.1.1.1.1"
+readonly MIB_IN="1.3.6.1.2.1.31.1.1.1.6"
+readonly MIB_OUT="1.3.6.1.2.1.31.1.1.1.10"
+readonly MIB_ERR_IN="1.3.6.1.2.1.2.2.1.14"
+readonly MIB_ERR_OUT="1.3.6.1.2.1.2.2.1.20"
+
+perror() {
+ echo "$@"
+} >&2
+
+fail() {
+ local RET=$1
+ shift
+ perror "$@"
+ exit $RET
+}
+
+result() {
+ local RET=$1
+ shift
+ echo -n "SNMP IF ${RESULTS[$RET]}: $@"
+ perfdata
+ exit $RET
+}
+
+walk() {
+ snmpwalk $AUTH "$HOSTNAME" "$1"
+ return $?
+}
+
+extract_val() {
+ sed -n 's/.*=\(.*\)/\1/p' | sed -n 's/.*:\s*\(.*\)/\1/p' | tr -d "\"'"
+}
+
+perfdata() {
+ [ $GENPERFDATA -eq 0 ] && return
+
+ echo -n "| "
+ echo -n "in=$INOCTETS "
+ echo -n "out=$OUTOCTETS "
+ echo -n "in_err=$INERRORS "
+ echo -n "out_err=$OUTERRORS "
+ echo
+}
+
+GENPERFDATA=0
+
+while getopts ":H:c:i:u:p:" opt; do
+ case $opt in
+ H)
+ HOSTNAME="$OPTARG"
+ ;;
+ c)
+ COMMUNITY="$OPTARG"
+ ;;
+ i)
+ INTERFACE="$OPTARG"
+ ;;
+ u)
+ SNMP_USER="$OPTARG"
+ ;;
+ p)
+ SNMP_PW="$OPTARG"
+ ;;
+ :)
+ fail 3 "$OPTARG requires Argument."
+ ;;
+ *)
+ fail 3 "Invalid option $OPTARG"
+ esac
+done
+
+AUTH=""
+if [ -n "$COMMUNITY" ]; then
+ AUTH="-c $COMMUNITY -v 2c"
+elif [ -n "$SNMP_USER" ] && [ -n "$SNMP_PW" ]; then
+ AUTH="-v 3 -u $SNMP_USER -A $SNMP_PW -l authNoPriv"
+else
+ result 3 "No or insufficient authentication info provided"
+fi
+
+SNMPWALK_RESULT=$(walk "$MIB_IFOPERSTATUS.$INTERFACE"; exit $?)
+RET=$?
+
+[ $RET -ne 0 ] && result 3 "snmpwalk failed with code $RET: $SNMPWALK_RESULT"
+[ -z "$SNMPWALK_RESULT" ] && result 2 "No matching entry found."
+
+GENPERFDATA=1
+
+NAME=$(walk "$MIB_NAME.$INTERFACE" | extract_val)
+ALIAS=$(walk "$MIB_ALIAS.$INTERFACE" | extract_val)
+
+COMPLETE_NAME="$NAME"
+if [ -n "$ALIAS" ]; then COMPLETE_NAME+=" ($ALIAS)"; fi
+
+INOCTETS=$(walk "$MIB_IN.$INTERFACE" | extract_val)
+OUTOCTETS=$(walk "$MIB_OUT.$INTERFACE" | extract_val)
+
+INERRORS=$(walk "$MIB_ERR_IN.$INTERFACE" | extract_val)
+OUTERRORS=$(walk "$MIB_ERR_OUT.$INTERFACE" | extract_val)
+
+extract_val <<< "$SNMPWALK_RESULT" | grep "up\|1" > /dev/null && result 0 "$COMPLETE_NAME is up."
+
+result 2 "$COMPLETE_NAME $INTERFACE is not up: $SNMPWALK_RESULT"