#!/usr/local/bin/bash

: << =cut

=head1 NAME

cpu - Plugin to monitor CPU usage

HP-UX port from original cpu plugin, here using sar instead of
Solaris' kstat.  Also note that kstat as well as Linux /proc/stat
use counters (of cpu cycles?), whereas sar merely displays
percentages (hopefully this comes close enough)

=head1 CONFIGURATION

Your may adapt the following parameters to your needs.
The values shown here are the defaults

 [sar_cpu]
     env.SYSWPCT 30     # System percentage to warn at
     env.SYSCPCT 50     # System percentage where we're critical
     env.USRWPCT 80     # User percentage to warn at
     env.scaleto100 1   # Graph in percent rather than absolute ncpu

=head1 AUTHOR

Contributed by <ralph dot grothe at itdz minus berlin dot de>

=head1 LICENSE

GPLv2

=head1 MAGIC MARKERS

 #%# family=auto
 #%# capabilities=autoconf

=cut

PATH=/usr/bin:/usr/sbin

if [[ $1 = autoconf ]]; then
    if uname -s|grep -qEi 'hp-?ux'; then
	echo yes
	exit 0
    else
	echo "no (This plugin is meant to be run under HP-UX)"
	exit 0
    fi
fi

: "${SYSWPCT:=30}"
: "${SYSCPCT:=50}"
: "${USRWPCT:=80}"
: "${scaleto100:=1}"

graphlimit=$percent
case $scaleto100 in (1|y*|Y*) graphlimit=100;; esac

if [[ $1 = config ]]; then
    typeset -i percent=100 ncpu=$(/usr/sbin/ioscan -kd processor|grep -c processor)
    (( ncpu )) && ((percent*=ncpu))
    cpumax=$graphlimit

    # Indifferently carried over these crude threshold assumptions
    # from the original cpu plugin; should better be passed as envs
    # via plugins.conf

    syswarn=$((cpumax * SYSWPCT / 100))
    syscrit=$((cpumax * SYSCPCT / 100))
    usrwarn=$((cpumax * USRWPCT / 100))

    echo 'graph_title CPU usage'
    echo 'graph_order system user waitio idle'
    echo 'graph_category system'
    echo "graph_args --base 1000 --lower-limit 0 --rigid --upper-limit $graphlimit"
    echo 'graph_vlabel %'
    echo 'graph_scale no'
    # shellcheck disable=SC2016
    echo 'graph_period ${graph_period}'
    echo 'system.label system'
    echo 'system.draw AREA'
    echo 'system.type GAUGE'
    echo 'system.min 0'
    echo "system.max $cpumax"
    echo "system.warning $syswarn"
    echo "system.critical $syscrit"
    echo 'user.label user'
    echo 'user.draw STACK'
    echo 'user.type GAUGE'
    echo 'user.min 0'
    echo "user.max $cpumax"
    echo "user.warning $usrwarn"
    echo "waitio.max $cpumax"
    echo 'waitio.label waitio'
    echo 'waitio.draw STACK'
    echo 'waitio.type GAUGE'
    echo 'waitio.min 0'
    echo 'idle.label idle'
    echo 'idle.draw STACK'
    echo 'idle.type GAUGE'
    echo 'idle.min 0'
    echo "idle.max $cpumax"

    # this is kind of daft extrapolation to multi-cpu scaling from
    # sar's average

    if [[ $cpumax != 100 ]]; then
	echo "system.cdef system,$ncpu,*"
	echo "user.cdef user,$ncpu,*"
	echo "waitio.cdef waitio,$ncpu,*"
	echo "idle.cdef idle,$ncpu,*"
    fi
    exit 0
fi

sar -u 2 2 |\
awk '/verage/{printf"user.value %d\nsystem.value %d\nwaitio.value %d\nidle.value %d\n",$2,$3,$4,$5}'
