<html>
<body link="$0000ff" vlink="$0000ff">
<?php
/* apcupsd monitoring script
  Copyright April 25, 2005, Rob Kroll, rob@killerbob.ca

  Because I don't think I can keep anybody from doing what they want with it, nor would I want to, I'm releasing this script
  to the world without restrictions. There's also no warranty, implied or otherwise. If this script somehow manages to make
  your computer blow up, you're on your own. That said, I sincerely doubt that's even possible.

  User-Configurable variables below:
      $statusfile_location       This is the location of the apcupsd.status file, as found in /etc/apcupsd/apcupsd.conf
                                 If this file exists, the graphical parse will be displayed.
      $logfile_location          This is the location of the apcupsd.events file, as found in /etc/apcupsd/apcupsd.conf
                                 If this file exists, it will be displayed with most recent entries first.
      $showloglines              By default, this script does not display the entire .events file. This is the number of
                                 lines to display by default. The script generates a link that enables displaying the
                                 entire log.
      $goodcolour                Default: "lightgreen". This is the HTML colour for the background of cells where things
                                 are good.
      $warncolour                Default: "yellow". This is the HTML colour for the background of cells where things are
                                 in need of attention.
      $badcolour                 Default: "red". This is the HTML colour for the background of cells where things are bad.

*/


$statusfile_location = "/var/log/apcupsd.status";
$logfile_location = "/var/log/apcupsd.events";

$showloglines = 5;

$goodcolour = "lightgreen";
$warncolour = "yellow";
$badcolour = "red";

/*

  There are no more user-configurable variables beyond this point. You're welcome to browse the code, and submit any bugfixes you
  find. If you don't know much about coding, it can be educational, but you probably don't need to read further.

*/

// There's a logic problem with the display of a set number of log lines. I'm lazy, so rather than fix the logic, I'm just going
// to increase the number of log lines to show. The only problem this should cause is with a very short log.

// $showloglines++;


$showlog = $_GET["showlog"];


echo "<table border=2 width=\"100%\">\n";
echo "<tr><td colspan=2 align=center><b>UPS Status</b></td></tr><tr>\n";
if (file_exists($statusfile_location)) {
	// Open the Status file.
	$statusfile = file($statusfile_location);
	
	// Get the word status ("ONLINE", "ON-BATT", etc.)
	$dumbvar = split(":", $statusfile[10]);
	$status = $dumbvar[1];
	if (eregi('online', $status)) {
		$statusbg = $goodcolour;
	} else $statusbg = $warncolour;

	// Get the current UPS load
	$dumbvar = split(":", $statusfile[12]);
	$load = floatval($dumbvar[1]);
	if ($load > 75) {
		$loadbg = $badcolour;
	} else if ($batteryload > 25) {
		$loadbg = $warncolour;
	} else $loadbg = $goodcolour;

	// Get the battery charge level
	$dumbvar = split(":", $statusfile[13]);
	$charge = floatval($dumbvar[1]);
	if ($charge > 60) {
		$chargebg = $goodcolour;
	} else if ($charge > 25) {
		$chargebg = $warncolour;
	} else $chargebg = $badcolour;

	// Get the estimated time remaining
	$dumbvar = split(":", $statusfile[14]);
	$etl = $dumbvar[1];

	// Draw the table entry.
	echo "<td valign=center>\n";
	echo "<table border=0 width=\"100%\"><tr><td>\n";
	echo "<b>Battery Status:</b></td><td bgcolor=" . $statusbg . " align=center>" . $status . "</td></tr><tr><td>\n";
	echo "<b>UPS Load:</b></td><td bgcolor=" . $loadbg . " align=center>" . $load . "</td></tr><tr><td>\n";
	echo "<b>Battery Charge:</b></td><td bgcolor=" . $chargebg . " align=center>". $charge . "</td></tr><tr><td>\n";
	echo "<b>Estimated time left:</b></td><td align=center>" . $etl . "</td></tr></table></td>\n";
};

if (file_exists($logfile_location)) {
	// Open the log file.
	$logfile = file($logfile_location);
	$loglines = count($logfile);
	if ($loglines < $showloglines) $showloglines = $loglines;
	
	// Draw the table
	echo "<td>";
	if ($showlog == "yes") {   // If the user has clicked the "Show entire log" link, show the whole shebang in reverse order.
		echo "<table border=0 width=\"100%\">";
		for ($i = 0; $i <= $loglines; $i++) {
			$newline = $logfile[($loglines - $i - 1)];
			$notifycolour = "white";
			if (eregi("power is back", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("power failure", $newline)) {
				$notifycolour = $badcolour;
			} else if (eregi("startup succeeded", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("exiting", $newline)) {
				$notifycolour = $warncolour;
			} else if (eregi("shutdown succeeded", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("ups batteries", $newline)) {
				$notifycolour = $warncolour;
			} else if (eregi("exhausted", $newline)) {
				$notifycolour = $badcolour;
			} else {
				$notifycolour = $warncolour;
			};
			echo "<tr><td bgcolor=\"". $notifycolour ."\" width=15></td><td>";
			echo $newline;
			echo "</td></tr>\n";
		}
		echo "</table>\n";
		echo "</td></tr>\n";
		echo "<tr><td colspan=2 align=right>\n";
		
		// Add a link so that the user can switch this view off.
		echo "<a href=\"" . $_SERVER["PHP_SELF"] . "\">Hide old log entries</a></td></tr>\n";
	} else {  // By default, just show the last X lines. Save some screen real estate.
		echo "<table border=0 width=\"100%\">";
		for ($i = 0; $i < $showloglines; $i++) {
			$newline = $logfile[($loglines - $i - 1)];
			$notifycolour = "white";
			if (eregi("power is back", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("power failure", $newline)) {
				$notifycolour = $badcolour;
			} else if (eregi("startup succeeded", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("exiting", $newline)) {
				$notifycolour = $warncolour;
			} else if (eregi("shutdown succeeded", $newline)) {
				$notifycolour = $goodcolour;
			} else if (eregi("ups batteries", $newline)) {
				$notifycolour = $warncolour;
			} else if (eregi("exhausted", $newline)) {
				$notifycolour = $badcolour;
			} else {
				$notifycolour = $warncolour;
			};
			echo "<tr><td bgcolor=\"". $notifycolour ."\" width=15></td><td>";
			echo $newline;
			echo "</td></tr>\n";
		}
		echo "</table>\n";
		echo "</td></tr>\n";
		echo "<tr><td colspan=2 align=right>\n";
		
		// Add a link so the user can see the entire log from the beginning.
		echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?showlog=yes\">Show entire log</a></td>\n";
	}
};
echo "</tr></table>";
?>
</body>
</html>
