githubEdit

Play BGP simple version

#!/bin/bash

# Default SNMPv3 credentials
VERBOSE=0
WARNING_STATE=5  # openconfirm or lower = warning
CRITICAL_STATE=3 # active or lower = critical

# Parse arguments
while getopts "H:u:a:p:A:X:v" 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" ;;
    v) VERBOSE=1 ;;
    *)
      echo "Usage: $0 -H host -u user -a auth_pass -p priv_pass -A auth_proto -X priv_proto [-v]"
      exit 3
      ;;
  esac
done

# Validate required 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

# BGP peer state table OID (RFC4273)
BGP_STATE_TABLE="1.3.6.1.2.1.15.3.1.2"

# Perform SNMP walk
RESULTS=$(snmpwalk -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$BGP_STATE_TABLE" 2>/dev/null)

# Check if walk succeeded
if [[ -z "$RESULTS" ]]; then
  echo "UNKNOWN - No SNMP response or BGP not enabled"
  exit 3
fi

# Initialize counters
CRIT_COUNT=0
WARN_COUNT=0
OK_COUNT=0
TOTAL=0
MSG=""

# Parse results
while IFS= read -r line; do
  ((TOTAL++))
  IP=$(echo "$line" | awk -F '.' '{print $(NF-3)"."$(NF-2)"."$(NF-1)"."$NF}' | awk '{print $1}')
  STATE=$(echo "$line" | awk '{print $NF}')
  case "$STATE" in
    6)
      ((OK_COUNT++))
      [[ "$VERBOSE" -eq 1 ]] && MSG+="OK: $IP is ESTABLISHED\n"
      ;;
    [45])
      ((WARN_COUNT++))
      MSG+="WARNING: $IP is in state $STATE\n"
      ;;
    [123])
      ((CRIT_COUNT++))
      MSG+="CRITICAL: $IP is in state $STATE\n"
      ;;
    *)
      MSG+="UNKNOWN: $IP returned unexpected state $STATE\n"
      ;;
  esac
done <<< "$RESULTS"

# Final status
if (( CRIT_COUNT > 0 )); then
  echo -e "CRITICAL - $CRIT_COUNT/$TOTAL BGP neighbors down\n$MSG"
  exit 2
elif (( WARN_COUNT > 0 )); then
  echo -e "WARNING - $WARN_COUNT/$TOTAL BGP neighbors not established\n$MSG"
  exit 1
else
  echo "OK - All $TOTAL BGP neighbors are ESTABLISHED"
  exit 0
fi

Last updated