githubEdit

check_bgp_cisco

Check BGP Peer Status

#!/bin/bash

# Default
VERBOSE=0
DESC_FILE=""

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

# Load descriptions if provided
declare -A DESC_MAP
if [[ -n "$DESC_FILE" && -f "$DESC_FILE" ]]; then
  while IFS=',' read -r name ip; do
    DESC_MAP["$ip"]="$name"
  done < "$DESC_FILE"
fi

# OIDs
STATE_OID="1.3.6.1.2.1.15.3.1.2"
ADMIN_OID="1.3.6.1.2.1.15.3.1.3"
ASN_OID="1.3.6.1.2.1.15.3.1.9"

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

STATE_RAW=$(walk "$STATE_OID")
ADMIN_RAW=$(walk "$ADMIN_OID")
ASN_RAW=$(walk "$ASN_OID")

# Parse into maps
declare -A STATE_MAP ADMIN_MAP ASN_MAP

parse_snmp() {
  local raw="$1" oid="$2" - line ip val
  while IFS= read -r line; do
    ip=$(echo "$line" | sed -E "s/.*$oid\.//" | awk '{print $1}' | tr '.' ' ' | awk '{print $(NF-3)"."$(NF-2)"."$(NF-1)"."$NF}')
    val=$(echo "$line" | awk '{print $NF}')
    echo "$ip $val"
  done <<< "$raw"
}

while read -r ip val; do STATE_MAP["$ip"]=$val; done < <(parse_snmp "$STATE_RAW" "$STATE_OID")
while read -r ip val; do ADMIN_MAP["$ip"]=$val; done < <(parse_snmp "$ADMIN_RAW" "$ADMIN_OID")
while read -r ip val; do ASN_MAP["$ip"]=$val; done < <(parse_snmp "$ASN_RAW" "$ASN_OID")

# Evaluate
OK=0; WARN=0; CRIT=0; TOTAL=0; MSG=""

for ip in "${!STATE_MAP[@]}"; do
  ((TOTAL++))
  state=${STATE_MAP[$ip]}
  admin=${ADMIN_MAP[$ip]:-2}
  asn=${ASN_MAP[$ip]:-unknown}
  name=${DESC_MAP[$ip]:-}

  label="$ip"
  [[ -n "$name" ]] && label="$name ($ip)"

  case "$state" in
    6)
      ((OK++))
      [[ "$VERBOSE" -eq 1 ]] && MSG+="OK: $label (AS$asn) is ESTABLISHED\n"
      ;;
    1)
      if [[ "$admin" -eq 1 ]]; then
        ((WARN++))
        MSG+="WARNING: $label (AS$asn) is administratively shut down (Idle)\n"
      else
        ((CRIT++))
        MSG+="CRITICAL: $label (AS$asn) is IDLE\n"
      fi
      ;;
    [2-5])
      ((CRIT++))
      MSG+="CRITICAL: $label (AS$asn) is in state $state\n"
      ;;
    *)
      MSG+="UNKNOWN: $label (AS$asn) returned unexpected state $state\n"
      ;;
  esac
done

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

Python Version

Last updated