#!/usr/bin/perl -w
# Quick-hack monitoring the USV via apcupsd and notifying admins of REAL Trouble
# (because if the USV itselfs is supplied by an 160kva-USV and a "Diesel"-Generator)
# Use at your own risk...script provided "As is"
# <zig@thepentagon.com> 

$alarm = 0; $batt = 0;
while(1) {

  open(USV, "/etc/apcupsd.status") or die "Error!";
  while(defined($temp = <USV>)) {
	if($temp =~ /NLINE/) {
		if(@tempa = split(" ", $temp)) {
			if($tempa[2] < 220 && $alarm == 0) {
				$alarm=1;
				$message = "Power-Failure USV rzmnt0";
				sendmsg();
			}
			elsif($tempa[2] > 220 && alarm == 1) {
				$alarm=0;
				$message = "Stromversorgung in R1 wieder hergestellt";
				sendmsg();
			}
		}
	}
	if($temp =~ /BCHAR/) {
		if(@tempa = split(" ", $temp)) {
			if($tempa[2] == 100 && $batt > 0) {
				$batt=0;
				$message = "Batterie USV rzmnt0 auf 100\%";
				sendmsg();
			}
			elsif($tempa[2] < 100 && $batt < 1) {
				$batt=1;
				$message = "Batterie USV rzmnt0 unter 100\%";
				sendmsg();
			}
			elsif($tempa[2] < 75 && $batt < 2) {
				$batt=2;
				$message = "Batterie USV rzmnt0 unter 75\%";
				sendmsg();
			}
			elsif($tempa[2] < 50 && $batt < 3) {
				$batt=3;
				$message = "Batterie USV rzmnt0 unter 50\%";
				sendmsg();
			}
			elsif($tempa[2] < 25 && $batt < 4) {
				$batt=4;
				$message = "Batterie USV rzmnt0 unter 25\%";
				sendmsg();
			}
			elsif($tempa[2] < 5 && $batt < 5) {
				$batt=5;
				$message = "Gleich is vorbei (Batterie auf 5\%)";
				sendmsg();
			}
		}
	}
  }
  close(USV);
  sleep(5);
}

# The next sub is for sending out the alarms, in my case via a sendsms-perl script where phone number and message are piped into...
sub sendmsg() {
	open(SMS, "| /usr/local/sms/sendsms");
	print SMS "<mobile-phone-number>\n";
	print SMS "$message\n";
	close(SMS);

	open(SMS, "| /usr/local/sms/sendsms");
	print SMS "<mobile-phone-number>\n";
	print SMS "$message\n";
	close(SMS);
}
