#!/bin/bash
#
# CPU usage monitor plugin for Nagios
# Written by Vinicius Figueiredo (viniciusfs@gmail.com)
# Last Modified: 27-11-2007
#
# Usage: ./check_cpu <warning> <critical>
#
# Description:
# This plugin check how much percentage of CPU in the system is in use.
# Tested only in Linux (Debian, Ubuntu, CentOS and Red Hat Enterprise)
# and Solaris 8/9.
#
#######################################################################
 
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
 
CPU_IDLE=0
CPU_INUSE=0
 
print_help() {
        echo "CHECK_CPU - CPU usage monitor plugin for Nagios"
        echo "Copyright (c) 2007 Vinicius Figueiredo (viniciusfs@gmail.com)"
        echo ""
        echo "This script checks for CPU usage and generates an alarm when"
        echo "CPU usage is over threshold values."
        echo ""
        print_usage
        echo ""
        echo "Example: check_cpu 80 90"
        echo ""
        echo "This example will generates a warning alarm when CPU usage is over 80%"
        echo "and a critical alarm when CPU usage is over 90%."
}
 
print_usage() {
        echo "Usage: check_cpu <warning> <critical>"
}
 
case "$1" in
        --help|-h)
                print_help
                exit $STATE_OK
                ;;
        *)
                if [ $# -lt 2 ]; then
                        print_usage
                        exit $STATE_UNKNOWN
                elif [ $1 -ge $2 ]; then
                        print_usage
                        echo "Warning value must be greater than Critical value."
                        exit $STATE_UNKNOWN
                elif [ $1 -lt 1 ] || [ $1 -gt 100 ] || [ $2 -lt 1 ] || [ $2 -gt 100 ]; then
                        print_usage
                        echo "Values are out of range [0-100]."
                        exit $STATE_UNKNOWN
                fi
                ;;
esac
 
WARN=$1
CRIT=$2
 
OS=`uname -a | awk '{print $1}'`
 
case "$OS" in
        Linux)
                CPU_IDLE=`vmstat 1 5 | tail -1 | awk '{ print $15 }'`
                ;;
        SunOS)
                CPU_IDLE=`vmstat 1 5 | tail -1 | awk '{ print $22 }'`
                ;;
esac
 
CPU_INUSE=$((100-$CPU_IDLE))
PERFDATA="cpu=$CPU_INUSE%;$WARN;$CRIT;0;100"
 
if [ $CPU_INUSE -ge $CRIT ]; then
        echo "CPU CRITICAL - CPU usage in $CPU_INUSE%|$PERFDATA"
        exit $STATE_CRITICAL
elif [ $CPU_INUSE -ge $WARN ]; then
        echo "CPU WARNING - CPU usage in $CPU_INUSE%|$PERFDATA"
        exit $STATE_WARNING
else
        echo "CPU OK - CPU usage in $CPU_INUSE%|$PERFDATA"
        exit $STATE_OK
fi
