#!/usr/bin/perl
#
# Action module for Ant monitoring system
#
# Dumps info to file it 'statall' format
#
#
# Agruments:
#      - dir to save files
#
# Template to log: nodename sens_name value
#
# Data for every node must be sent to module in 5 sec
#
my $interval=5;
my $count_init=int($interval/0.15);

use Fcntl;

$|=1;

$,=' ';

my $line;
my ($p,$np,@f,$np,$i,%nodes,%saves,$time,$count,$key);

chomp @ARGV;
my $to=shift @ARGV;

die "Usage: $0 dir-to-log\n" unless -d $to;

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

sub action();
sub save(;$);

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.15);
    if($count){
      if($count==1){
        save();
      }
      --$count;
    }
  }
  action();
  $count=$count_init;
}

sub save(;$ ){
  my @pool;
  $i=shift;

  if ($i ne '') {
    @pool=($i);
  } else {
    @pool=keys(%nodes);
  }
  foreach $i (@pool) {
    open F,">$to/$i.state" or return;

    print F "[$i]\n";
    print F "user      = $nodes{$i}->{cpu_user}\n";
    print F "system    = $nodes{$i}->{cpu_system}\n";
    print F "nice      = $nodes{$i}->{cpu_nice}\n";
    print F "idle      = $nodes{$i}->{cpu_idle}\n";
    for ($np=0;$np<64;++$np) {
      last unless defined $nodes{$i}->{"cpu_user$np"};

      $key="cpu_user$np";
      print F "user$np     = $nodes{$i}->{$key}\n";
      $key="cpu_system$np";
      print F "system$np   = $nodes{$i}->{$key}\n";
      $key="cpu_nice$np";
      print F "nice$np     = $nodes{$i}->{$key}\n";
      $key="cpu_idle$np";
      print F "idle$np     = $nodes{$i}->{$key}\n";
    }

    print F "loadavg    = $nodes{$i}->{loadavg}\n";
    print F "memfree    = $nodes{$i}->{memfree}\n";
    print F "memtotal   = $nodes{$i}->{memtotal}\n";
    print F "fan1       = $nodes{$i}->{fan1}\n";
    print F "min_fan1   = $nodes{$i}->{min_fan1}\n";
    print F "fan2       = $nodes{$i}->{fan2}\n";
    print F "min_fan2   = $nodes{$i}->{min_fan2}\n";
    print F "fan3       = $nodes{$i}->{fan3}\n";
    print F "min_fan3   = $nodes{$i}->{min_fan3}\n";
    print F "temp1      = $nodes{$i}->{temp1}\n";
    print F "max_temp1  = $nodes{$i}->{max_temp1}\n";
    print F "temp2      = $nodes{$i}->{temp2}\n";
    print F "max_temp2  = $nodes{$i}->{max_temp2}\n";
    print F "temp3      = $nodes{$i}->{temp3}\n";
    print F "max_temp3  = $nodes{$i}->{max_temp3}\n";

    if (defined $nodes{$i}->{lc1_link_errors}) {

      print F "lc1_link_errors                  = $nodes{$i}->{lc1_link_errors}\n";
      print F "lc0_up                           = $nodes{$i}->{lc0_up}\n";
      print F "lc1_state                        = ".($nodes{$i}->{lc1_state}?"up":"down")."\n";
      print F "sci_rawpackets_received          = $nodes{$i}->{sci_rawpackets_received}\n";
      print F "lc0_link_errors                  = $nodes{$i}->{lc0_link_errors}\n";
      print F "lc1_up                           = $nodes{$i}->{lc1_up}\n";
      print F "lc0_state                        = ".($nodes{$i}->{lc0_state}?"up":"down")."\n";
      print F "lc1_upstream_err                 = $nodes{$i}->{lc1_upstream_err}\n";
      print F "lc0_upstream_err                 = $nodes{$i}->{lc0_upstream_err}\n";
      print F "sci_nodeid                       = $nodes{$i}->{sci_nodeid}\n";
      print F "sci_reqpackets_send              = $nodes{$i}->{sci_reqpackets_send}\n";
    } else {
      print F "lc1_link_errors                  = 0\n";
      print F "lc0_up                           = 0\n";
      print F "lc1_state                        = down\n";
      print F "sci_rawpackets_received          = 0\n";
      print F "lc0_link_errors                  = 0\n";
      print F "lc1_up                           = 0\n";
      print F "lc0_state                        = down\n";
      print F "lc1_upstream_err                 = 0\n";
      print F "lc0_upstream_err                 = 0\n";
      print F "sci_nodeid                       = 0\n";
      print F "sci_reqpackets_send              = 0\n";
    }
    close F;

    $saves{$i}=$time;
##    print "Saved $i\n";
  }
}

sub action(){
  $time=time;

  @x=split(/ /,$line);

  $nodes{$x[0]}->{$x[1]}=$x[2];

  print ">> $x[0] : $x[1] = $x[2]\n";

  save($x[0]) if($time>$saves{$x[0]}+$interval);
}
