Skip to content

Instantly share code, notes, and snippets.

@vhsantos
Last active August 23, 2023 10:48
Show Gist options
  • Save vhsantos/92dd698cee00e9c786d3b87caf59d23c to your computer and use it in GitHub Desktop.
Save vhsantos/92dd698cee00e9c786d3b87caf59d23c to your computer and use it in GitHub Desktop.
Cloned from bshephard at nagios website
#!/bin/sh
#
# check_apcupsd_ng 1.1
#
# Changelog:
# Fix LineVolt to consider values between MIN/MAX as OK.
#
# Nagios plugin to monitor APC Smart-UPSes using apcupsd.
# Modified from Martin Toft's check_apcupsd 1.2 by Ben Shephard
# http://bshephard.com/?p=1119
#
# Copyright (c) 2008 Martin Toft <mt@martintoft.dk>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#
# Example configuration
#
# commands.cfg:
#
# define command {
# command_name check_apcupsd
# command_line $USER1$/check_apcupsd -w $ARG2$ -c $ARG3$ $ARG1$
# }
#
# define command {
# command_name check_apcupsd_no_notify
# command_line $USER1$/check_apcupsd $ARG1$
# }
#
# ups1.cfg:
#
# define service {
# use generic-service
# host_name ups1
# service_description CHARGE
# check_command check_apcupsd!bcharge!95!50
# }
#
# define service {
# use generic-service
# host_name ups1
# service_description TEMP
# check_command check_apcupsd!itemp!35!40
# }
#
# define service {
# use generic-service
# host_name ups1
# service_description LOAD
# check_command check_apcupsd!loadpct!70!85
# }
#
# define service {
# use generic-service
# host_name ups1
# service_description TIMELEFT
# check_command check_apcupsd_no_notify!timeleft
# }
#
#define service {
# use generic-service
# host_name ups1
# service_description BATTERY VOLTAGE
# check_command check_apcupsd!battv!25!24
# }
#
#define service {
# use generic-service
# host_name ups1
# service_description LINE VOLTAGE
# check_command check_apcupsd!linev!245!250
# }
#
#define service {
# use generic-service
# host_name ups1
# service_description OUTPUT VOLTAGE
# check_command check_apcupsd!outputv!245!250
# }
#
#define service {
# use generic-service
# host_name ups1
# service_description LINE FREQUENCY
# check_command check_apcupsd!linefreq!51!52
# }
#
#
APCACCESS=/sbin/apcaccess
usage()
{
echo "usage: check_apcupsd [-c critical_value] [-h hostname] [-p port]"
echo -n " [-w warning_value] "
echo "<bcharge|itemp|loadpct|timeleft>"
echo
echo "hostname and port defaults to localhost and 3551, respectively."
echo
echo "checks:"
echo " bcharge = battery charge, measured in percent."
echo " itemp = internal temperature, measured in degree Celcius."
echo " loadpct = load percent, measured in percent (do'h!)."
echo " timeleft = time left with current battery charge and load,"
echo " measured in minutes."
echo " linev = Line Voltage"
echo " battv = Battery Voltage"
echo " outputv = UPS Output Voltage"
echo " linefreq = Line Frequency"
exit 3
}
HOSTNAME=localhost
PORT=3551
while getopts c:h:p:w: OPTNAME; do
case "$OPTNAME" in
h)
HOSTNAME="$OPTARG"
;;
p)
PORT="$OPTARG"
;;
w)
WARNVAL="$OPTARG"
;;
c)
CRITVAL="$OPTARG"
;;
*)
usage
;;
esac
done
ARG="$@"
while [ $OPTIND -gt 1 ]; do
ARG=`echo "$ARG" | sed 's/^[^ ][^ ]* *//'`
OPTIND=$(($OPTIND-1))
done
if [ "$ARG" != "bcharge" -a "$ARG" != "itemp" -a "$ARG" != "loadpct" \
-a "$ARG" != "timeleft" -a "$ARG" != "linev" -a "$ARG" != "battv" \
-a "$ARG" != "outputv" -a "$ARG" != "linefreq" ]; then
usage
fi
if [ "`echo $PORT | grep '^[0-9][0-9]*$'`" = "" ]; then
echo "Error: port must be a positive integer!"
exit 3
fi
if [ "$WARNVAL" != "" -a "`echo $WARNVAL | grep '^[0-9][0-9]*$'`" = "" ]; then
echo "Error: warning_value must be a positive integer!"
exit 3
fi
if [ "$CRITVAL" != "" -a "`echo $CRITVAL | grep '^[0-9][0-9]*$'`" = "" ]; then
echo "Error: critical_value must be a positive integer!"
exit 3
fi
if [ "$WARNVAL" != "" -a "$CRITVAL" != "" ]; then
if [ "$ARG" = "bcharge" -o "$ARG" = "battv" -o "$ARG" = "timeleft" ]; then
if [ $WARNVAL -le $CRITVAL ]; then
echo "Error: warning_value must be greater than critical_value!"
exit 3
fi
else
if [ $WARNVAL -ge $CRITVAL ]; then
echo "Error: warning_value must be less than critical_value!"
exit 3
fi
fi
fi
if [ ! -x "$APCACCESS" ]; then
echo "Error: $APCACCESS must exist and be executable!"
exit 3
fi
$APCACCESS status $HOSTNAME:$PORT > /dev/null
if [ $? -ne 0 ]; then
# The error message from apcaccess will do fine.
exit 3
fi
VALUE=`$APCACCESS status $HOSTNAME:$PORT | grep -i ^$ARG | \
sed 's/.*: *\([0-9.][0-9.]*\)[^0-9.].*/\1/'`
if [ "$VALUE" != "0" ]; then
VALUE=`echo $VALUE | sed 's/^0*//'`
fi
ROUNDED=`echo $VALUE | sed 's/\..*//'`
case "$ARG" in
bcharge)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -lt $CRITVAL ]; then
echo "CRITICAL - Battery Charge: ${VALUE}% |charge=${VALUE}"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -lt $WARNVAL ]; then
echo "WARNING - Battery Charge: ${VALUE}% |charge=${VALUE}"
exit 1
fi
fi
echo "OK - Battery Charge: ${VALUE}% |charge=${VALUE}"
;;
itemp)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -ge $CRITVAL ]; then
echo "CRITICAL - Internal Temperature: $VALUE C |temp=$VALUE"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -ge $WARNVAL ]; then
echo "WARNING - Internal Temperature: $VALUE C |temp=$VALUE"
exit 1
fi
fi
echo "OK - Internal Temperature: $VALUE C |temp=$VALUE"
;;
loadpct)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -ge $CRITVAL ]; then
echo "CRITICAL - Load: ${VALUE}% |load=${VALUE}%"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -ge $WARNVAL ]; then
echo "WARNING - Load: ${VALUE}% |load=${VALUE}%"
exit 1
fi
fi
echo "OK - Load: ${VALUE}% | load=${VALUE}%"
;;
timeleft)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -lt $CRITVAL ]; then
echo "CRITICAL - Time Left: $VALUE Minutes |min=$VALUE"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -lt $WARNVAL ]; then
echo "WARNING - Time Left: $VALUE Minutes |min=$VALUE"
exit 1
fi
fi
echo "OK - Time Left: $VALUE Minutes |min=$VALUE"
;;
linev)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -ge $CRITVAL ]; then
echo "WARNING - Line Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 1
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -le $WARNVAL ]; then
echo "WARNING - Line Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 1
fi
fi
echo "OK - Line Voltage: ${VALUE} Volts |volts=${VALUE}"
;;
battv)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -le $CRITVAL ]; then
echo "CRITICAL - Battery Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -le $WARNVAL ]; then
echo "WARNING - Battery Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 1
fi
fi
echo "OK - Battery Voltage: ${VALUE} Volts |volts=${VALUE}"
;;
outputv)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -ge $CRITVAL ]; then
echo "CRITICAL - Output Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -ge $WARNVAL ]; then
echo "WARNING - Output Voltage: ${VALUE} Volts |volts=${VALUE}"
exit 1
fi
fi
echo "OK - Output Voltage: ${VALUE} Volts |volts=${VALUE}"
;;
linefreq)
if [ "$CRITVAL" != "" ]; then
if [ $ROUNDED -ge $CRITVAL ]; then
echo "CRITICAL - Line Frequency: ${VALUE}Hz |freq=${VALUE}"
exit 2
fi
fi
if [ "$WARNVAL" != "" ]; then
if [ $ROUNDED -ge $WARNVAL ]; then
echo "WARNING - Line Frequency: ${VALUE}Hz |freq=${VALUE}"
exit 1
fi
fi
echo "OK - Line Frequency: ${VALUE}Hz |freq=${VALUE}"
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment