#!/usr/bin/perl
#
#  Action module for Ant monitoring system
#
#  Dumps html file with current state of sensors
#
#  Arguments - file to log
#
#  Template for logging: sensor_name;$num_state;$value
#
#

use Fcntl;
use IO::Handle;

my ($p,$line,%bads,%goods,$val,$name,$state,$i,$header,$footer,$filename);

$filename=shift;

die "No file to dump!\n" if $filename eq "";
$|=1;

$header=<<HEAD;
<html><head><title>Status page</title></head>
<body>
HEAD

$footer=<<FOOT;
</body></html>
FOOT

$bad_header=<<BAD_HEAD;
<center><h2>List of failed sensors:</h2>
<table width=70\% border="0">
BAD_HEAD

$bad_footer=<<BAD_FOOT;
</table></body></html>
BAD_FOOT

$good_header=<<GOOD_HEAD;
<center><h2>List of good sensors:</h2>
<table width=70\% border="0">
GOOD_HEAD

$good_footer=<<GOOD_FOOT;
</table>
GOOD_FOOT

sub dump_page(){
  ($name,$state,$val)=($line=~/^([^:]+);(\d+);(.*)/) or return;

  if($state){
    # Fail...
    delete $goods{$name};

    # add to list
    $bads{$name}=$val;
  }
  else{
    # Ok
    $goods{$name}=$val;

    # delete from list
    delete $bads{$name};
  }

  #dump to file

  open OUT,">$filename" or return;
  print OUT $header;
  print OUT $bad_header;
  foreach $i (sort(keys(%bads))){
    print OUT "<tr><td>$i</td><td> - </td><td>$bads{$i}</td></tr>\n";
  }
  print OUT $bad_footer;
  print OUT $good_header;
  foreach $i (sort(keys(%goods))){
    print OUT "<tr><td>$i</td><td> - </td><td>$goods{$i}</td></tr>\n";
  }
  print OUT $good_footer;
  print OUT $footer;
  close OUT;
}

fcntl(STDIN,F_SETFL,fcntl(STDIN,F_GETFL,0)|O_NONBLOCK);

for(;;){
  $line='';
INNER_LOOP:
  for(;;){
    while(read(STDIN,$p,1)>0){
      last INNER_LOOP if $p eq "\n";
      $line.=$p;
    }
    select(undef,undef,undef,0.1);
  }
  dump_page();
  flush STDERR;
}

print STDERR "logger end! ($!)\n";

