githubEdit

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
fi

Check Memory Using Python

Last updated