check_memory
Check Memory Using Bash
#!/bin/bash
Parse command-line arguments
while getopts "H:u:a:p:A:X:w©" 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" ;;
w) WARNING="$OPTARG" ;;
c) CRITICAL="$OPTARG" ;;
)
echo "Usage: $0 -H host -u user -a auth_pass -p priv_pass -A auth_proto -X priv_proto [-w warning] [-c critical]"
exit 3
;;
esac
done
Set default thresholds
[[ -z "$WARNING" || "$WARNING" == -* ]] && WARNING=60
[[ -z "$CRITICAL" "$CRITICAL" == -* ]] && CRITICAL=80
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
Identify device type via sysDescr
SYSDESCR=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" 1.3.6.1.2.1.1.1.0 -Ovq 2>/dev/null)
if [[ "$SYSDESCR" == "Catalyst" ]]; then
DEVICE_TYPE="CiscoSwitch"
elif [[ "$SYSDESCR" == "NX-OS" ]]; then
DEVICE_TYPE="CiscoNexusSwitch"
elif [[ "$SYSDESCR" == "BIG-IP" ]]; then
DEVICE_TYPE="F5"
else
DEVICE_TYPE="CiscoRouter"
fi
# Set memory OIDs based on detected platform
if [[ "$DEVICE_TYPE" == "CiscoRouter" ]]; then
# cempMemPoolUsed => '1.3.6.1.4.1.9.9.221.1.1.1.1.7',
# cempMemPoolFree => '1.3.6.1.4.1.9.9.221.1.1.1.1.8',
# cempMemPoolType => '1.3.6.1.4.1.9.9.221.1.1.1.1.2',
# Define memory type mappings
declare -A MEMPOOL_TYPES=(
[1]="other"
[2]="processorMemory"
[3]="ioMemory"
[4]="pciMemory"
[5]="fastMemory"
[6]="multibusMemory"
[7]="interruptStackMemory"
[8]="processStackMemory"
[9]="localExceptionMemory"
[10]="virtualMemory"
[11]="reservedMemory"
[12]="imageMemory"
[13]="asicMemory"
[14]="posixMemory"
)
MEMTYPE='1.3.6.1.4.1.9.9.221.1.1.1.1.2'
# Get all memory pool types
TYPE_RAW=$(snmpwalk -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$MEMTYPE" 2>/dev/null)
# Loop through lines to find the suffix for processorMemory
PROCESSOR_SUFFIX=""
while IFS= read -r line; do
oid=$(echo "$line" | awk -F '=' '{print $1}' | xargs)
type_val=$(echo "$line" | awk -F ': ' '{print $NF}' | xargs)
suffix="${oid##*.1.1.1.1.2.}" # Get everything after the last known OID base
type_name="${MEMPOOL_TYPES[$type_val]}"
if [[ "$type_name" == "processorMemory" ]]; then
PROCESSOR_SUFFIX="$suffix"
break
fi
done <<< "$TYPE_RAW"
if [[ -z "$PROCESSOR_SUFFIX" ]]; then
echo "UNKNOWN - No processorMemory pool found"
exit 3
fi
FREE_OID=".1.3.6.1.4.1.9.9.221.1.1.1.1.8.${PROCESSOR_SUFFIX}"
USED_OID=".1.3.6.1.4.1.9.9.221.1.1.1.1.7.${PROCESSOR_SUFFIX}"
elif [[ "$DEVICE_TYPE" == "CiscoNexusSwitch" ]]; then
# 'cseSysCPUUtilization' => '1.3.6.1.4.1.9.9.305.1.1.1.0',
# 'cseSysMemoryUtilization' => '1.3.6.1.4.1.9.9.305.1.1.2.0',
UTIL_OID="1.3.6.1.4.1.9.9.305.1.1.2.0"
elif [[ "$DEVICE_TYPE" == "F5" ]]; then
# sysStatMemoryTotal => '1.3.6.1.4.1.3375.2.1.1.2.1.44',
# sysStatMemoryUsed => '1.3.6.1.4.1.3375.2.1.1.2.1.45',
TOTAL_OID=".1.3.6.1.4.1.3375.2.1.1.2.1.44.0"
USED_OID=".1.3.6.1.4.1.3375.2.1.1.2.1.45.0"
elif [[ "$DEVICE_TYPE" == "CiscoSwitch" ]]; then
# 'ciscoMemoryPoolUsed' => '1.3.6.1.4.1.9.9.48.1.1.1.5',
# 'ciscoMemoryPoolFree' => '1.3.6.1.4.1.9.9.48.1.1.1.6',
FREE_OID="1.3.6.1.4.1.9.9.48.1.1.1.6.1"
USED_OID="1.3.6.1.4.1.9.9.48.1.1.1.5.1"
else
echo "UNKNOWN - Unsupported device type: $SYSDESCR"
exit 3
fi
# Fetch SNMP data
if [[ "$DEVICE_TYPE" == "CiscoNexusSwitch" ]]; then
# echo "NX-OS"
UTIL=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$UTIL_OID" -Ovq 2>/dev/null)
# Validate data
if [[ -z "$UTIL" ! "$UTIL" =~ ^[0-9]+$ ]]; then
echo "UNKNOWN - Unable to retrieve memory data"
exit 3
fi
# Calculate usage percentage
USAGE=$(echo $UTIL | awk '{printf("%.2f", $0)}')
elif [[ "$DEVICE_TYPE" == "F5" ]]; then
# echo "F5"
TOTAL=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$TOTAL_OID" -Ovq 2>/dev/null)
USED=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$USED_OID" -Ovq 2>/dev/null)
# Validate data
if [[ -z "$TOTAL" -z "$USED" ! "$TOTAL" =~ ^[0-9]+$ ! "$USED" =~ ^[0-9]+$ ]]; then
echo "UNKNOWN - Unable to retrieve memory data"
exit 3
fi
# Calculate usage percentage
USAGE=$(echo "$USED * 100 / $TOTAL" | bc -l | awk '{printf("%.2f", $0)}')
else #if [[ "$DEVICE_TYPE" == "CiscoRouter" "$DEVICE_TYPE" == "CiscoSwitch" ]]; then
# echo "IOS"
USED=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$USED_OID" -Ovq 2>/dev/null)
FREE=$(snmpget -v3 -u "$USER" -a "$AUTH_PROTO" -A "$AUTH_PASS" -x "$PRIV_PROTO" -X "$PRIV_PASS" -l authPriv "$HOST" "$FREE_OID" -Ovq 2>/dev/null)
TOTAL=$(($USED + $FREE))
# Validate data
if [[ -z "$TOTAL" -z "$USED" -z "$FREE" ! "$TOTAL" =~ ^[0-9]+$ ! "$USED" =~ ^[0-9]+$ ! "$FREE" =~ ^[0-9]+$ ]]; then
echo "UNKNOWN - Unable to retrieve memory data"
exit 3
fi
# Calculate usage percentage
USAGE=$(echo "$USED * 100 / $TOTAL" | bc -l | awk '{printf("%.2f", $0)}')
fi
# Determine Status
if (( $(echo "$USAGE >= $CRITICAL" | bc -l) )); then
echo "CRITICAL - Memory usage is ${USAGE}% on $HOST"
exit 2
elif (( $(echo "$USAGE >= $WARNING" | bc -l) )); then
echo "WARNING - Memory usage is ${USAGE}% on $HOST"
exit 1
else
echo "OK - Memory usage is ${USAGE}% on $HOST"
exit 0
fiCheck Memory Using Python
Last updated