#!/bin/bash
# This script checks swap space available on the machine it is run on. It outputs the
# percentage of free space or mumber of bytes free, depending on input parameters.
#
# Usage: "check_swap_osx [-h] [-V] [-v] -w WARNING(INTEGER) -c CRITICAL(INTEGER)"
#
# WARNING > CRIT
#
# WARNING and CRIT are measured in percentage or bytes
#
# Returns the nagios native status codes:
#
# Nagios Status
#
# 0 = OK (SWAP FREE more than WARNING) 1 = WARNING (SWAP FREE between
# WARNING AND CRITICAL) 2 = CRITICAL (SWAP FREE less than CRITICAL) 3
# = UNKNOWN (Wrong usage)
#
# Tested on:
# - Mac OS X 10.9.2
#
# Copyright 2012 Shu Wei Tan (webblazers@yahoo.com)
# Copyright 2014 Thom DeCarlo (pixelpshr@gmail.com)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Change History:
# 10/05/2012 - Version 1.0 - Shu Wei Tan (webblazers@yahoo.com)
#
# 03/01/2014 - Version 1.1 - Thom DeCarlo (pixelpshr@gmail.com)
# Re for use on Mac OS X 10.9.2
#
version=1.1
## USAGE MESSAGE
usage() {
cat << EOF
usage: $0 options
Check swap space on local machine.
Usage:
check_swap [-h] [-V] [-v] -w % -c %
check_swap [-h] [-V] [-v] -w -c
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
-w, --warning=INTEGER
Exit with WARNING status if less than INTEGER bytes of swap space are free
-w, --warning=PERCENT%%
Exit with WARNING status if less than PERCENT of swap space is free
-c, --critical=INTEGER
Exit with CRITICAL status if less than INTEGER bytes of swap space are free
-c, --critical=PERCENT%%
Exit with CRITCAL status if less than PERCENT of swap space is free
-v, --verbose
Show details for command-line debugging (Nagios may truncate output)
Critical trigger must be less than Warning trigger
EOF
}
VERBOSE=false
SWAP_WARN=
SWAP_CRIT=
WARN_IS_PERCENT=false
CRIT_IS_PERCENT=false
WARN_MULT=1
CRIT_MULT=1
## FETCH ARGUMENTS
while getopts "hvVw:c:" OPTION; do
case "${OPTION}" in
h)
usage
exit 3
;;
V)
echo check_swap_osx Version ${version}
exit 3
;;
v)
VERBOSE=true
;;
w)
SWAP_WARN=${OPTARG}
;;
c)
SWAP_CRIT=${OPTARG}
;;
?)
usage
exit 3
;;
esac
done
## CHECK ARGUMENTS (WILL CHECK VALUES LATER)
if [ -z ${SWAP_WARN} ] || [ -z ${SWAP_CRIT} ] ; then
usage
exit 3
fi
## GET SWAP SPACE INFO FROM MACHINE
SWAP_TOTAL=$(sysctl -n vm.swapusage | awk '{print $3}')
SWAP_USED=$(sysctl -n vm.swapusage | awk '{print $6}')
SWAP_FREE=$(sysctl -n vm.swapusage | awk '{print $9}')
TOTAL_LAST_CHAR=$(echo "${SWAP_TOTAL}"| sed 's/^.*\(.\)$/\1/')
case "${TOTAL_LAST_CHAR}" in
K)
TOTAL_MULT=$(echo '2^10'| bc)
SWAP_TOTAL=$(echo "${SWAP_TOTAL}"| sed 's/.$//')
;;
M)
TOTAL_MULT=$(echo '2^20'| bc)
SWAP_TOTAL=$(echo "${SWAP_TOTAL}"| sed 's/.$//')
;;
G)
TOTAL_MULT=$(echo '2^30'| bc)
SWAP_TOTAL=$(echo "${SWAP_TOTAL}"| sed 's/.$//')
;;
*)
;;
esac
SWAP_TOTAL=$(echo "${SWAP_TOTAL} * ${TOTAL_MULT}" | bc)
if [ ${VERBOSE} = true ] ; then
echo SWAP_TOTAL = ${SWAP_TOTAL}
fi
FREE_LAST_CHAR=$(echo "${SWAP_FREE}"| sed 's/^.*\(.\)$/\1/')
case "${FREE_LAST_CHAR}" in
K)
FREE_MULT=$(echo '2^10'| bc)
SWAP_FREE=$(echo "${SWAP_FREE}"| sed 's/.$//')
;;
M)
FREE_MULT=$(echo '2^20'| bc)
SWAP_FREE=$(echo "${SWAP_FREE}"| sed 's/.$//')
;;
G)
FREE_MULT=$(echo '2^30'| bc)
SWAP_FREE=$(echo "${SWAP_FREE}"| sed 's/.$//')
;;
*)
;;
esac
SWAP_FREE=$(echo "${SWAP_FREE} * ${FREE_MULT}" | bc)
SWAP_PERCENT_FREE=$(echo "100 * ${SWAP_FREE} / ${SWAP_TOTAL}" | bc)
if [ ${VERBOSE} = true ] ; then
echo SWAP_FREE = ${SWAP_FREE}
echo SWAP_PERCENT_FREE = ${SWAP_PERCENT_FREE}
fi
# NOW WE HAVE THE VALUE. DETERMINE HOW WE SHOULD TEST IT.
# Is the warning parameter a percentage, or does it have a size modifier?
WARN_LAST_CHAR=$(echo "${SWAP_WARN}"| sed 's/^.*\(.\)$/\1/')
case "${WARN_LAST_CHAR}" in
\%)
WARN_IS_PERCENT=true
SWAP_WARN=$(echo "${SWAP_WARN}"| sed 's/.$//')
;;
K)
WARN_MULT=$(echo '2^10'| bc)
SWAP_WARN=$(echo "${SWAP_WARN}"| sed 's/.$//')
;;
M)
WARN_MULT=$(echo '2^20'| bc)
SWAP_WARN=$(echo "${SWAP_WARN}"| sed 's/.$//')
;;
G)
WARN_MULT=$(echo '2^30'| bc)
SWAP_WARN=$(echo "${SWAP_WARN}"| sed 's/.$//')
;;
*)
;;
esac
SWAP_WARN=$(echo "${SWAP_WARN} * ${WARN_MULT}" | bc)
if [ ${VERBOSE} = true ] ; then
echo SWAP_WARN = ${SWAP_WARN}
echo WARN_IS_PERCENT = ${WARN_IS_PERCENT}
fi
CRIT_LAST_CHAR=$(echo "${SWAP_CRIT}"| sed 's/^.*\(.\)$/\1/')
case "${CRIT_LAST_CHAR}" in
\%)
CRIT_IS_PERCENT=true
SWAP_CRIT=$(echo "${SWAP_CRIT}" | sed 's/.$//')
;;
K)
CRIT_MULT=$(echo '2^10'| bc)
SWAP_CRIT=$(echo "${SWAP_CRIT}" | sed 's/.$//')
;;
M)
CRIT_MULT=$(echo '2^20'| bc)
SWAP_CRIT=$(echo "${SWAP_CRIT}" | sed 's/.$//')
;;
G)
CRIT_MULT=$(echo '2^30'| bc)
SWAP_CRIT=$(echo "${SWAP_CRIT}" | sed 's/.$//')
;;
*)
;;
esac
SWAP_CRIT=$(echo "${SWAP_CRIT} * ${CRIT_MULT}" | bc)
if [ ${VERBOSE} = true ] ; then
echo SWAP_CRIT = ${SWAP_CRIT}
echo CRIT_IS_PERCENT = ${CRIT_IS_PERCENT}
fi
# calculate how many bytes of free swap will trigger the WARN
if [ ${WARN_IS_PERCENT} = true ] ; then
WARN_BYTES=$(echo "${SWAP_TOTAL}*${SWAP_WARN}/100.0" | bc)
else
WARN_BYTES=${SWAP_WARN}
fi
if [ ${VERBOSE} = true ] ; then
echo WARN_BYTES = ${WARN_BYTES}
fi
# calculate how many bytes of free swap will trigger the CRIT
if [ ${CRIT_IS_PERCENT} = true ] ; then
CRIT_BYTES=$(echo "${SWAP_TOTAL}*${SWAP_CRIT}/100.0" | bc)
else
CRIT_BYTES=${SWAP_CRIT}
fi
if [ ${VERBOSE} = true ] ; then
echo CRIT_BYTES = ${CRIT_BYTES}
fi
## CHECK ARGUMENTS
if [ -z ${SWAP_WARN} ] || [ -z ${SWAP_CRIT} ] || [ ${SWAP_WARN} -lt ${SWAP_CRIT} ] ; then
usage
exit 3
fi
## CHECK SWAP SPACE ON MACHINE
if (( ${CRIT_IS_PERCENT} == true )) && (( $(bc <<< "${SWAP_PERCENT_FREE} < ${SWAP_CRIT}") == 1 ))
then
## SWAP IS IN CRITICAL STATE
LINE="CRITICAL! Swap free: ${SWAP_PERCENT_FREE}% | swap_free=${SWAP_PERCENT_FREE}%;${SWAP_WARN}%;${SWAP_CRIT}%;"
echo $LINE
exit 2
elif (( ${CRIT_IS_PERCENT} == false )) && (( $(bc <<< "${SWAP_FREE} < ${CRIT_BYTES}") == 1 ))
then
## SWAP IS IN CRITICAL STATE
LINE="CRITICAL! Swap free: ${SWAP_FREE}B | swap_free=${SWAP_FREE}B;${WARN_BYTES}B;${CRIT_BYTES}B;"
echo $LINE
exit 2
elif (( ${WARN_IS_PERCENT} == true )) && (( $(bc <<< "${SWAP_PERCENT_FREE} < ${SWAP_WARN}") == 1 ))
then
## SWAP IS IN WARNING STATE
LINE="WARNING! Swap free: ${SWAP_PERCENT_FREE}% | swap_free=${SWAP_PERCENT_FREE}%;${SWAP_WARN}%;${SWAP_CRIT}%;"
echo $LINE
exit 1
elif (( ${WARN_IS_PERCENT} == false )) && (( $(bc <<< "${SWAP_FREE} < ${WARN_BYTES}") == 1 ))
then
## SWAP IS IN WARN STATE
LINE="WARNING! Swap free: ${SWAP_FREE}B | swap_free=${SWAP_FREE}B;${WARN_BYTES}B;${CRIT_BYTES}B;"
echo $LINE
exit 1
elif (( ${WARN_IS_PERCENT} == true )) && (( $(bc <<< "${SWAP_PERCENT_FREE} >= ${SWAP_WARN}") == 1 ))
then
## SWAP IS OK
LINE="OK! Free Swap space: ${SWAP_PERCENT_FREE}% | swap_free=${SWAP_PERCENT_FREE}%;${SWAP_WARN}%;${SWAP_CRIT}%;"
echo $LINE
exit 0
elif (( ${WARN_IS_PERCENT} == false )) && (( $(bc <<< "${SWAP_FREE} >= ${WARN_BYTES}") == 1 ))
then
## SWAP IS OK
LINE="OK! Free Swap space: ${SWAP_FREE}B | swap_free=${SWAP_FREE}B;${WARN_BYTES}B;${CRIT_BYTES}B;"
echo $LINE
exit 0
else
## SHOULD NEVER REACH THIS POINT, MUST BE USAGE :)
usage
exit 3
fi