#!/usr/bin/perl -w
use strict;
use RRDs;

my $rrd = '/var/lib/rrd';
my $img = '/var/www/localhost/htdocs/rrdtool/ups';

my $monups = 'smart700@localhost';

&ProcessUPS("tripplite", "UPS :: $monups");

sub ShowErr
{
	if (my $err = RRDs::error) {
		print "$0: failed to create rrd: $err\n";
	}
}

sub ProcessUPS
{
	my ($name, $desc) = @_;

	print "$desc\n";

	my $in = `upsc $monups`;
	my ($battery_charge) = ($in =~ /battery.charge:\s+(\S+)/);
	my ($battery_voltage) = ($in =~ /battery.voltage:\s+(\S+)/);
	my ($input_frequency) = ($in =~ /input.frequency:\s+(\S+)/);
	my ($input_voltage) = ($in =~ /input.voltage:\s+(\S+)/);
	my ($ups_load) = ($in =~ /ups.load:\s+(\S+)/);
	my ($ups_temperature) = ($in =~ /ups.temperature:\s+(\S+)/);

	print "battery.charge: $battery_charge, battery.voltage: $battery_voltage\n";
	print "input.frequency: $input_frequency, input.voltage: $input_voltage\n";
	print "ups.load: $ups_load, ups.temperature: $ups_temperature\n";

	if (! -e "$rrd/$name.rrd")
	{
	print "creating rrd database for $name...\n";
	RRDs::create "$rrd/$name.rrd",
		"-s 300",
		"DS:bat_charge:GAUGE:600:U:U",
		"DS:bat_volt:GAUGE:600:U:U",
		"DS:in_freq:GAUGE:600:U:U",
		"DS:in_volt:GAUGE:600:U:U",
		"DS:ups_load:GAUGE:600:U:U",
		"DS:ups_temp:GAUGE:600:U:U",
		"RRA:AVERAGE:0.5:1:576",
		"RRA:AVERAGE:0.5:6:672",
		"RRA:AVERAGE:0.5:24:732",
		"RRA:AVERAGE:0.5:144:1460";
	&ShowErr();
	}

	RRDs::update "$rrd/$name.rrd",
		"-t", "bat_charge:bat_volt:in_freq:in_volt:ups_load:ups_temp",
		"N:$battery_charge:$battery_voltage:$input_frequency:$input_voltage:$ups_load:$ups_temperature";
	&ShowErr();

	my @intervals = ('day', 'week', 'month', 'year');
	foreach my $time (@intervals) {
	    &CreateGraph($name, $time, $desc);
	}
}

sub CreateGraph
{
	my ($name, $interval) = @_;

	RRDs::graph "$img/$interval/battery.png",
		"--lazy",
		"-s -1$interval",
		"-t Battery :: $monups",
		"-h", "160", "-w", "600",
		"-a", "PNG",
		"DEF:charge=$rrd/$name.rrd:bat_charge:AVERAGE",
		"DEF:volt=$rrd/$name.rrd:bat_volt:AVERAGE",
		"LINE2:charge#0000FF:Charge",
		"GPRINT:charge:MIN:  Min\\: %2.lf",
		"GPRINT:charge:MAX: Max\\: %3.lf",
		"GPRINT:charge:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:charge:LAST: Current\\: %3.lf percent\\n",
		"LINE2:volt#00FF00:Voltage",
		"GPRINT:volt:MIN:  Min\\: %4.1lf",
		"GPRINT:volt:MAX: Max\\: %4.1lf",
		"GPRINT:volt:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:volt:LAST: Current\\: %4.1lf volts";
	&ShowErr();

	RRDs::graph "$img/$interval/input.png",
		"--lazy",
		"-s -1$interval",
		"-t Input :: $monups",
		"-h", "160", "-w", "600",
		"-a", "PNG",
		"DEF:freq=$rrd/$name.rrd:in_freq:AVERAGE",
		"DEF:volt=$rrd/$name.rrd:in_volt:AVERAGE",
		"LINE2:freq#0000FF:Frequency",
		"GPRINT:freq:MIN:  Min\\: %4.2lf",
		"GPRINT:freq:MAX: Max\\: %4.2lf",
		"GPRINT:freq:AVERAGE: Avg\\: %4.2lf",
		"GPRINT:freq:LAST: Current\\: %4.2lf Hz\\n",
		"LINE2:volt#00FF00:Voltage",
		"GPRINT:volt:MIN:  Min\\: %3.lf",
		"GPRINT:volt:MAX: Max\\: %3.lf",
		"GPRINT:volt:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:volt:LAST: Current\\: %3.lf volts";
	&ShowErr();
		
	RRDs::graph "$img/$interval/ups.png",
		"--lazy",
		"-s -1$interval",
		"-t UPS :: $monups",
		"-h", "160", "-w", "600",
		"-a", "PNG",
		"DEF:load=$rrd/$name.rrd:ups_load:AVERAGE",
		"DEF:temp=$rrd/$name.rrd:ups_temp:AVERAGE",
		"LINE2:load#0000FF:Load",
		"GPRINT:load:MIN:  Min\\: %2.lf",
		"GPRINT:load:MAX: Max\\: %2.lf",
		"GPRINT:load:AVERAGE: Avg\\: %3.1lf",
		"GPRINT:load:LAST: Current\\: %2.lf percent\\n",
		"LINE2:temp#00FF00:Temperature",
		"GPRINT:temp:MIN:  Min\\: %2.lf",
		"GPRINT:temp:MAX: Max\\: %2.lf",
		"GPRINT:temp:AVERAGE: Avg\\: %3.1lf",
		"GPRINT:temp:LAST: Current\\: %2.lf C";
	&ShowErr();
}
