#!/bin/sh
#
# Plugin to monitor various statistics exported by a UPS.
#
# Written by Andras Korn in 2005. Licensed under the GPL.
#
# (presumably also Copyright Andras Korn in 2005  -- Peter Palfrader, 2006-04-28)
# Copyright 2006 Peter Palfrader <peter@palfrader.org>
#
# changes:
#  2006-04-28 Peter Palfrader:
#   - add runtime and temperature graphs
#   - append @localhost to UPS variable
#   - change AC frequency to input and output frequency
#
# usage: ups_upsid_function
#
#%# family=contrib
#%# capabilities=autoconf suggest

UPS=$(basename $0 | cut -d_ -f2)"@localhost"
FUNCTION=$(basename $0 | cut -d_ -f3)

if [ "$1" = "autoconf" ]; then
	[ -x /bin/upsc ] && [ -r /etc/nut/ups.conf ] && echo yes && exit 0
	echo "no (/bin/upsc or /etc/nut/ups.conf not found)"
	exit 1
fi

if [ "$1" = "suggest" ]; then
	grep '^\[[^]]*\]$' /etc/nut/ups.conf \
		| tr -d '][' \
		| while read ups; do
			for i in voltages freq charge current runtime temperature; do
				echo ${ups}_${i}
			done
		done
fi

function voltages() {
	if [ "$1" = "config" ]; then
		echo "graph_title $UPS voltages"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel Volt"
		for i in battery nominal input output; do
			echo "${i}.label $i"
			echo "${i}.type GAUGE"
			echo "${i}.max 1000"
			echo "${i}.min 0"
		done
	else
		upsc $UPS | sed -n '/volt/{
					s/://
					/nominal/s/.* /nominal.value /
					/voltage/s/\.[^ ]*/.value/
					p
				}'
	fi
}

function charge() {
	if [ "$1" = "config" ]; then

		echo "graph_title $UPS charge"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel %"
		for i in charge low load; do
			echo "${i}.label $i"
			echo "${i}.type GAUGE"
			echo "${i}.max 100"
			echo "${i}.min 0"
		done
	else
		upsc $UPS | sed -n '/charge/{
					s/^[^:]*\.//g
					s/:/.value/
					p
				}
				/load/{
					s/.*:/load.value/
					p
				}'
	fi
}

function frequency() {
	if [ "$1" = "config" ]; then

		echo "graph_title $UPS AC frequency"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel frequency 1/s"
		for i in input output; do
			echo "${i}.label ${i} frequency"
			echo "${i}.type GAUGE"
			echo "${i}.max 100"
			echo "${i}.min 5"
		done
	else
		upsc $UPS | sed -n '/frequency/{s/frequency:/value/;p}'
	fi
}

function current() {
	if [ "$1" = "config" ]; then

		echo "graph_title $UPS output current"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel Amper"
		echo "current.label out-current"
		echo "current.type GAUGE"
		echo "current.max 100"
		echo "current.min 0"
	else
		upsc $UPS | sed -n '/current/{s/.*:/current.value/;p}'
	fi
}

function runtime() {
	if [ "$1" = "config" ]; then

		echo "graph_title $UPS battery runtime"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel minutes"
		echo "runtime.label runtime"
		echo "runtime.cdef runtime,60,/"
		echo "runtime.type GAUGE"
		echo "runtime.max 10000"
		echo "runtime.min 0"
	else
		upsc $UPS | sed -n '/battery.runtime/{s/.*:/runtime.value/;p}'
	fi
}

function temperature() {
	if [ "$1" = "config" ]; then

		echo "graph_title $UPS ambient temperature"
		echo "graph_args --base 1000 -l 0"
		echo "graph_vlabel degrees Celsius"
		echo "temperature.label temperature"
		echo "temperature.type GAUGE"
		echo "temperature.max 100"
		echo "temperature.min -20"
	else
		upsc $UPS | sed -n '/ambient.temperature/{s/.*:/temperature.value/;p}'
	fi
}

if [ "$1" = "config" ]; then
	echo "graph_category sensors"
	if [ -n "$host" ]; then
		echo "host_name $host"
	fi
fi

case "$FUNCTION" in
	voltages)
		voltages $1
		;;
	charge)
		charge $1
		;;
	freq)
		frequency $1
		;;
	current)
		current $1
		;;
	runtime)
		runtime $1
		;;
	temperature)
		temperature $1
		;;
esac