#!/bin/bash
set -e
while getopts ":i:H:c:w:u:" opt; do
  case $opt in
    i )
      KEYFILE="$OPTARG"
      ;;
    H )
      HSTNAME="$OPTARG" # Hostname is a reserved var
      ;;
    c )
      CRITLEVEL="$OPTARG"
      ;;
    w )
      WARNLEVEL="$OPTARG"
      ;;
    u )
      USRNAME="$OPTARG" # Username is a reserved var
      ;;
    ? )
      echo "script usage: $(basename $0) [-i keyfile] [-H hostname] [-u username] [-w warnLevel] [-c critLevel]" >&2
      exit 3
      ;;
  esac
done

# Assigning variables, subtracting 1 for Nagios processing
WARNMINUS=0
CRITMINUS=0
WARNMINUS=$(($WARNLEVEL-1))
CRITMINUS=$(($CRITLEVEL-1))
CPU_USAGE=0

# SSH into remote server, pull the aggregate CPU line from /proc/stat and assign to var
CPU=$(ssh -i $KEYFILE -o StrictHostKeyChecking=no  $USRNAME@$HSTNAME cat /proc/stat | grep '^cpu ' )

# Gets total CPU stats from processes executing in ...
# ... user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice
CPU_TOTAL=$(echo "$CPU" | awk '{print $2+$3+$4+$5+$6+$7+$8+$9+$10}')

# Gets the idle CPU time
CPU_IDLE=$(echo "$CPU" | awk '{print $5}')

# Subtracts CPU idle time from the total and multiplies by 1k, then ...
# ... divides by 10 at the end to make sure it returns an int
USAGE=$(((1000*($CPU_TOTAL-$CPU_IDLE)/$CPU_TOTAL+5)/10))

# Nagios returns
if [ "$USAGE" -ge 0 ] && [ "$USAGE" -le "$WARNMINUS" ]; then
    echo "OK - CPU usage is $USAGE%.|CPUusage=$USAGE%;$WARNLEVEL;$CRITLEVEL;"
    exit 0
elif [ "$USAGE" -ge "$WARNLEVEL" ] && [ "$USAGE" -le "$CRITMINUS" ]; then
    echo "WARNING - CPU usage is $USAGE%.|CPUusage=$USAGE%;$WARNLEVEL;$CRITLEVEL;"
    exit 1
elif [ "$USAGE" -ge "$CRITLEVEL" ] && [ "$USAGE" -le 100 ]; then
    echo "CRITICAL - CPU usage is $USAGE%.|CPUusage=$USAGE%;$WARNLEVEL;$CRITLEVEL;"
    exit 2
else
    echo "UNKNOWN - CPU usage is $USAGE%."
    exit 3
fi

