#!/usr/bin/perl
# Disclaimer: I have no idea what I'm doing.
use Expect;

$COMMAND        = "/usr/bin/telnet";
$AQUACONTROLLER = "HOSTNAME OF AC3-PRO";
$USERNAME       = "USERNAME\r";
$PASSWORD       = "PASSWORD\r";
$STATUSREQ      = "c\r";
$STATUSFILE     = "/var/spool/nagios/reefstat/data/status";
$LATESTFILE     = "/var/spool/nagios/reefstat/data/latest";

$mDATE   = '[A-z][a-z]+ [0-9]+ [0-9]+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9]';
$mPARAMS = '[0-9]+\.[0-9] [0-9]+\.[0-9]+ [0-9]+';

my $exp = new Expect;
$exp->raw_pty(1);
#$exp->debug(2);
#$exp->slave->stty(qw(raw -echo));


# This damn expect stuff is noisy.  I'm just dropping all STDOUT
# here, because I'm clearly not clever enough to do it "right."
open(SAVEOUT, ">&STDOUT");
open(STDOUT, ">/dev/null");
$exp->spawn("$COMMAND $AQUACONTROLLER") or die "Cannot spawn $COMMAND: $!\n";
$exp->expect(2, ":");
$exp->send("\r");
$exp->expect(2, ":");
$exp->send("\r");
$exp->expect(2, '-re', 'login: $');
$exp->send($USERNAME);
$exp->expect(2, '-re', 'password: $');
$exp->send($PASSWORD);
$exp->expect(2, '-re', 'AquaController> ');
$exp->send($STATUSREQ);
$exp->expect(2, '-re', $mDATE);
$datestring = $exp->match();
$exp->expect(2, '-re', $mPARAMS);
@PARAMS = split(' ', $exp->match());
@LINES = ();

$i = 0;
while ($exp->expect(2, '-re', ' [A-Z0-9]+ is .*')) {
  $newstring = $exp->match();
  $LINES[$i++] = $newstring;
} 

close(STDOUT);
open(STDOUT, ">&SAVEOUT");

# STDOUT is re-enabled, time to deliver plugin output.
# print "date: $datestring\n";
# /perfdata:.*temp=(\d+\.\d+);ph=(\d+\.\d+);orp=(\d+)/
$perfdata = "temp=$PARAMS[0];ph=$PARAMS[1];orp=$PARAMS[2]";
$latest = "temp $PARAMS[0], pH $PARAMS[1], ORP $PARAMS[2]";

$state = "OK";
$exitval = "0";

# Here's where we set thresholds.  Yeah there should be command line
# arguments, but this is just a silly little fishtank monitoring script.
# Adjust these values to taste.
if ( (($PARAMS[0] < 76) || ($PARAMS[0] > 82)) ||
     (($PARAMS[1] < 7.8) || ($PARAMS[1] > 8.3)) ) {
     $state = "WARNING";
     $exitval = 1;
     if ( (($PARAMS[0] < 74) || ($PARAMS[0] > 84)) ||
          (($PARAMS[1] < 7.7) || ($PARAMS[1] > 8.4)) ) {
      $state = "CRITICAL";
      $exitval = 2;
     }
}

$output="FISHTANK $state: $latest|$perfdata\n";

open LFILE, ">$LATESTFILE";
print LFILE $latest;
close(LFILE);

open SFILE, ">$STATUSFILE";
print SFILE "Current Status is:\n\n";
print SFILE "$datestring\n";
print SFILE "Temp  pH  ORP\n";
print SFILE "$PARAMS[0] $PARAMS[1] $PARAMS[2]\n";
foreach (@LINES) {
  print SFILE "$_\n";
}
close SFILE;

print $output;
exit $exitval;