githubEdit

Check Interface Status

  • Using Bash script

  • Collect list of indexes from ifAlias

#!/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"
fi

Python

  • Using Python

  • Collect list of indexes from ifAlias

Collect indexes from IfName

Python with bulkwalk to reduce CPU cycles

Simple Unit Test for above code

Last updated