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