#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib
use Getopt::Std;
use strict;
use Agent::T3;
use Health::T3;
use System;
use Perf;

use vars qw ($DEBUG_LEVEL %opts $START $was_running );

System->set_home("/opt/SUNWstade");

sub usage {
  print "\n  Usage: perf -f [frequency_secs] -c (clear) -d [debug_level] -b bucket_size_mins\n\n";
}


if (!getopts("b:f:ch?", \%opts) || $opts{h} || $opts{'?'}) {
    usage();
    exit;
}

$DEBUG_LEVEL = $opts{d} || 1;
my $CLEAR = $opts{c};
my $buckets = $opts{b} || 1;  # number of minutes of a bucket
my $FREQ  = $opts{f} || 30;

print <<EOF;
This program will sample array performance every $FREQ secs. The results 
can be seen in the agent GUI under Reports -> Performance -> Real-Time

EOF

$START = System->get_home() . "/DATA/start";

sub die_signal {
  if ($was_running) {
     open(O, ">$START");
     close(O);
  }
  print "Exiting...\n";
  exit;
}

$SIG{INT}  = \&die_signal;

$was_running = -f $START;
unlink $START;

my $D1 = System->get_home() . "/DATA/Perf";

if ($CLEAR) {

  opendir(O, $D1); my @dd = readdir(O); closedir(O);
  foreach my $f (@dd) {
    unlink "$D1/$f" if ($f =~ /^report_/);
  }
  unlink "$D1/rt";
}

my $info = { period => $buckets, frequency => $FREQ };
Util->serialize("Perf/rt.info", $info);

while (1) {
   &rt_data();
   &debug(1, "Sleeping $FREQ secs..");
   sleep $FREQ;
}

sub rt_data {
  my($q) = @_;
  my ($last_rep, $new_rep);

  my($renv, $devs, $hosts,$notifs) = PDM::ConfigFile->read();
  my $LF = System->get_home() . "/DATA/Perf/";
  my $db = Perf->read("rt");
  my $min1 = int(time/60/$buckets) % 1000; # $bucket minute buckets

  foreach my $d (@$devs) {
     next if (index("t3,6120", $d->{type}) < 0);
     my $new_rep = {};
     &debug(1, "  Reading $d->{name}/$d->{ipno}..");
     my $rc = Agent::T3->getTokens($d->{ipno}, 0, 30, "volperf");
     Agent::T3->generic_parse($new_rep,  $rc, "volume", "Flushes");

     $new_rep->{'id.device_name'} = $d->{name};
     $new_rep->{'id.timestamp'}   = time;

     if (-f "$LF/report_$d->{name}") {
         $last_rep = Util->deserialize("Perf/report_$d->{name}");
         Health::T3->performance($new_rep, $last_rep, "rt", $min1, $min1-40);
     }
     Util->serialize("Perf/report_$d->{name}", $new_rep);
  }
}

sub debug {
  my($level, $s) = @_;
  if ($level <= $DEBUG_LEVEL) {
     print "$s\n";
  }
}

