#!/bin/sh
# graph-envirosnmp, Boone, 04/03/09
# Generate graphs of environmental data stored in RRDs
#
# Modifications:
# 04/03/09 Boone      Initial coding
# End Modifications

	CONFIG=${1:-"/etc/envirosnmp.cf"}
	RRDDIR="/matrix/data/envirosnmp"
	DSTART=`perl -e 'print time-86400,"\n";'`
	WSTART=`perl -e 'print time-604800,"\n";'`
	MSTART=`perl -e 'print time-2592000,"\n";'`
	YSTART=`perl -e 'print time-31536000,"\n";'`
	END=`date +%s`

	apcups()
	{
		rrdtool graph ${GRAPHDIR}/${1}_input_${2}.png \
			-a PNG \
			--title="APC UPS: ${1}: Input Side" \
			--start=${START} \
			--end=${END} \
			--height=320 \
			--color=CANVAS#000000 \
			--lower-limit=0 \
			--upper-limit=250 \
			--rigid \
			DEF:inlinevoltage=${RRDFN}:inlinevoltage:AVERAGE \
			DEF:inlinefreq=${RRDFN}:inlinefreq:AVERAGE \
			VDEF:ilvmin=inlinevoltage,MINIMUM \
			VDEF:ilvavg=inlinevoltage,AVERAGE \
			VDEF:ilvmax=inlinevoltage,MAXIMUM \
			VDEF:ilfmin=inlinefreq,MINIMUM \
			VDEF:ilfavg=inlinefreq,AVERAGE \
			VDEF:ilfmax=inlinefreq,MAXIMUM \
			LINE2:inlinevoltage#0000ff:"Input Voltage  " \
			GPRINT:ilvmin:"%5.1lf Min " \
			GPRINT:ilvavg:"%5.1lf Avg " \
			GPRINT:ilvmax:"%5.1lf Max \l" \
			LINE2:inlinefreq#00ff00:"Input Frequency" \
			GPRINT:ilfmin:"%5.1lf Min " \
			GPRINT:ilfavg:"%5.1lf Avg " \
			GPRINT:ilfmax:"%5.1lf Max \l" \
			> /dev/null 2>&1
		rrdtool graph ${GRAPHDIR}/${1}_output_${2}.png \
			-a PNG \
			--title="APC UPS: ${1}: Output Side" \
			--start=${START} \
			--end=${END} \
			--height=320 \
			--color=CANVAS#000000 \
			--lower-limit=0 \
			--upper-limit=200 \
			--rigid \
			DEF:outlinevoltage=${RRDFN}:outlinevoltage:AVERAGE \
			DEF:outlinecurrent=${RRDFN}:outlinecurrent:AVERAGE \
			DEF:outlineload=${RRDFN}:outlineload:AVERAGE \
			DEF:batterycap=${RRDFN}:batterycap:AVERAGE \
			DEF:batteryruntime=${RRDFN}:batteryruntime:AVERAGE \
			VDEF:olvmin=outlinevoltage,MINIMUM \
			VDEF:olvavg=outlinevoltage,AVERAGE \
			VDEF:olvmax=outlinevoltage,MAXIMUM \
			VDEF:olcmin=outlinecurrent,MINIMUM \
			VDEF:olcavg=outlinecurrent,AVERAGE \
			VDEF:olcmax=outlinecurrent,MAXIMUM \
			VDEF:ollmin=outlineload,MINIMUM \
			VDEF:ollavg=outlineload,AVERAGE \
			VDEF:ollmax=outlineload,MAXIMUM \
			VDEF:bcmin=batterycap,MINIMUM \
			VDEF:bcavg=batterycap,AVERAGE \
			VDEF:bcmax=batterycap,MAXIMUM \
			VDEF:brmin=batteryruntime,MINIMUM \
			VDEF:bravg=batteryruntime,AVERAGE \
			VDEF:brmax=batteryruntime,MAXIMUM \
			LINE2:outlinevoltage#0000ff:"Output Voltage  " \
			GPRINT:olvmin:"%5.1lf Min " \
			GPRINT:olvavg:"%5.1lf Avg " \
			GPRINT:olvmax:"%5.1lf Max \l" \
			LINE2:outlinecurrent#00ff00:"Output Current  " \
			GPRINT:olcmin:"%5.1lf Min " \
			GPRINT:olcavg:"%5.1lf Avg " \
			GPRINT:olcmax:"%5.1lf Max \l" \
			LINE2:outlineload#ff0000:"Output Load %   " \
			GPRINT:ollmin:"%5.1lf Min " \
			GPRINT:ollavg:"%5.1lf Avg " \
			GPRINT:ollmax:"%5.1lf Max \l" \
			LINE2:batterycap#00ffff:"Battery Capacity" \
			GPRINT:bcmin:"%5.1lf Min " \
			GPRINT:bcavg:"%5.1lf Avg " \
			GPRINT:bcmax:"%5.1lf Max \l" \
			LINE2:batteryruntime#ffff00:"Battery Runtime " \
			GPRINT:brmin:"%5.1lf Min " \
			GPRINT:bravg:"%5.1lf Avg " \
			GPRINT:brmax:"%5.1lf Max \l" \
			> /dev/null 2>&1
	}

	liebertac()
	{
		rrdtool graph ${GRAPHDIR}/${1}_${2}.png \
			-a PNG \
			--title="Liebert A/C: ${1}" \
			--start=${START} \
			--end=${END} \
			--height=320 \
			--color=CANVAS#000000 \
			--upper-limit=120 \
			DEF:roomrelhumidity=${RRDFN}:roomrelhumidity:AVERAGE \
			DEF:roomtemperature=${RRDFN}:roomtemperature:AVERAGE \
			VDEF:rrhmin=roomrelhumidity,MINIMUM \
			VDEF:rrhavg=roomrelhumidity,AVERAGE \
			VDEF:rrhmax=roomrelhumidity,MAXIMUM \
			VDEF:rtmin=roomtemperature,MINIMUM \
			VDEF:rtavg=roomtemperature,AVERAGE \
			VDEF:rtmax=roomtemperature,MAXIMUM \
			LINE2:roomrelhumidity#0000ff:"Room Relative Humidity" \
			GPRINT:rrhmin:"%3.0lf Min " \
			GPRINT:rrhavg:"%3.0lf Avg " \
			GPRINT:rrhmax:"%3.0lf Max \l" \
			LINE2:roomtemperature#00ff00:"Room Temperature      " \
			GPRINT:rtmin:"%3.0lf Min " \
			GPRINT:rtavg:"%3.0lf Avg " \
			GPRINT:rtmax:"%3.0lf Max \l" \
			> /dev/null 2>&1
	}

	cat ${CONFIG} |
	perl -pe 's/#.*$//; s/\s+/ /g; s/^\s+|\s+$//; next if (/^$/); s/$/\n/;' |
	while read cfgline
	do
		set $cfgline
		verb="$1"
		parm="$2"

		case $verb in
			apcups)
				RRDFN="${RRDDIR}/${parm}_apcups.rrd"
				START="${DSTART}"
				apcups ${parm} "daily"
				START="${WSTART}"
				apcups ${parm} "weekly"
				START="${MSTART}"
				apcups ${parm} "monthly"
				START="${YSTART}"
#				apcups ${parm} "yearly"
				;;

			liebertac)
				RRDFN="${RRDDIR}/${parm}_liebertac.rrd"
				START="${DSTART}"
				liebertac ${parm} "daily"
				START="${WSTART}"
				liebertac ${parm} "weekly"
				START="${MSTART}"
				liebertac ${parm} "monthly"
				START="${YSTART}"
#				liebertac ${parm} "yearly"
				;;

			community)
				COMM="$parm"
				;;

			graphdir)
				GRAPHDIR="$parm"
				;;

			*)
				echo "unknown config file directive ${verb}"
				exit 22
				;;
		esac
	done
