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
fiLast updated