Check Interface Status
#!/bin/bash
# Parse command-line arguments
while getopts "H:u:a:p:A:X:t:" opt; do
case $opt in
H) HOST="$OPTARG" ;;
u) USER="$OPTARG" ;;
a) AUTH_PASS="$OPTARG" ;;
p) PRIV_PASS="$OPTARG" ;;
A) AUTH_PROTO="$OPTARG" ;;
X) PRIV_PROTO="$OPTARG" ;;
t) TAG="$OPTARG" ;;
*)
echo "Usage: $0 -H host -u user -a auth_pass -p priv_pass -A auth_proto -X priv_proto"
exit 3
;;
esac
done
# Validate inputs
if [[ -z "$HOST" -z "$USER" -z "$AUTH_PASS" -z "$PRIV_PASS" -z "$AUTH_PROTO" || -z "$PRIV_PROTO" ]]; then
echo "UNKNOWN - Missing required arguments"
exit 3
fi
# Set default Tag
[[ -z "$TAG" ]] && TAG="[M"
#OIDs
IFNAME_OID="1.3.6.1.2.1.31.1.1.1.1"
IFALIAS_OID="1.3.6.1.2.1.31.1.1.1.18"
IFADMINSTATUS_OID="1.3.6.1.2.1.2.2.1.7"
IFOPERSTATUS_OID="1.3.6.1.2.1.2.2.1.8"
# Get interface aliases (descriptions)
ALIASES=$(snmpwalk -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$IFALIAS_OID" -On 2>/dev/null)
echo $ALIASES
Track interfaces with $TAG and not up/up
declare -a BAD_INTERFACES=()
declare -a GOOD_INTERFACES=()
# Loop through alias lines
while read -r line; do
# Extract index and alias
#index=$(echo "$line" | awk -F '.' '{print $NF}' | awk '{print $1}')
# Step 1: Get the part before the equal sign
oid_part=$(echo "$line" | cut -d '=' -f1 | tr -d ' ')
# Step 2: Extract the index (last digit after the final dot)
index=$(echo "$oid_part" | awk -F '.' '{print $NF}')
alias=$(echo "$line" | cut -d ':' -f2- | xargs)
# Check for [M in alias
if [[ "$alias" == "$TAG" ]]; then
# Get interface name
IF_NAME=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$IFNAME_OID.$index" -Ovq 2>/dev/null)
ADMIN_STATUS=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$IFADMINSTATUS_OID.$index" -Ovq 2>/dev/null)
OPER_STATUS=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$IFOPERSTATUS_OID.$index" -Ovq 2>/dev/null)
echo "$IF_NAME" "$ADMIN_STATUS" "$OPER_STATUS"
if [[ "$ADMIN_STATUS" != "up" || "$OPER_STATUS" != "up" ]]; then
BAD_INTERFACES+=("$IF_NAME - $alias - (Admin: $ADMIN_STATUS, Oper: $OPER_STATUS)")
else
GOOD_INTERFACES+=("$IF_NAME - $alias - (Admin: $ADMIN_STATUS, Oper: $OPER_STATUS)")
fi
fi
done <<< "$ALIASES"
# Output result
if [[ ${#BAD_INTERFACES[@]} -gt 0 ]]; then
echo "CRITICAL - Monitored interfaces are not in up/up state:"
for iface in "${BAD_INTERFACES[@]}"; do
echo " $iface"
done
exit 2
elif [[ ${#GOOD_INTERFACES[@]} -gt 0 ]]; then
echo "OK - All monitored interfaces are up/up"
for iface in "${GOOD_INTERFACES[@]}"; do
echo " $iface"
done
exit 0
else
echo "OK - No interface with $TAG found"
fiPython
Collect indexes from IfName
Python with bulkwalk to reduce CPU cycles
Simple Unit Test for above code
Last updated