#!/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