#!/bin/bash
# check_mem - memory usage from /proc/meminfo (Nagios/NRPE plugin).
# Usage: check_mem -w <pct_used> -c <pct_used>
# OK/WARNING/CRITICAL on used-memory percentage. Perfdata in MB and %.
set -u
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH:-}"
warn=90; crit=95
while getopts "w:c:h" o; do
    case "$o" in
        w) warn=${OPTARG%\%} ;;
        c) crit=${OPTARG%\%} ;;
        h) echo "Usage: $(basename "$0") -w <pct> -c <pct>"; exit 3 ;;
        *) echo "UNKNOWN: bad option"; exit 3 ;;
    esac
done

MI=/proc/meminfo
[ -r "$MI" ] || { echo "UNKNOWN: cannot read $MI"; exit 3; }

total=$(awk '/^MemTotal:/{print $2; exit}' "$MI")
avail=$(awk '/^MemAvailable:/{print $2; exit}' "$MI")
if [ -z "${avail:-}" ]; then
    free=$(awk '/^MemFree:/{print $2; exit}' "$MI")
    buff=$(awk '/^Buffers:/{print $2; exit}' "$MI")
    cach=$(awk '/^Cached:/{print $2; exit}' "$MI")
    avail=$(( ${free:-0} + ${buff:-0} + ${cach:-0} ))
fi
[ -n "${total:-}" ] && [ "$total" -gt 0 ] || { echo "UNKNOWN: bad MemTotal"; exit 3; }

used=$(( total - avail ))
[ "$used" -lt 0 ] && used=0
pct=$(( used * 100 / total ))

tot_mb=$(( total / 1024 ))
used_mb=$(( used / 1024 ))
avail_mb=$(( avail / 1024 ))
warn_mb=$(( total * warn / 100 / 1024 ))
crit_mb=$(( total * crit / 100 / 1024 ))

perf="used=${used_mb}MB;${warn_mb};${crit_mb};0;${tot_mb} used_pct=${pct}%;${warn};${crit};0;100"
msg="${pct}% used (${used_mb}MB/${tot_mb}MB, ${avail_mb}MB available)"

if [ "$pct" -ge "$crit" ]; then echo "CRITICAL: $msg | $perf"; exit 2; fi
if [ "$pct" -ge "$warn" ]; then echo "WARNING: $msg | $perf"; exit 1; fi
echo "OK: $msg | $perf"; exit 0
