#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib
use Getopt::Std;
use System;
use Net::Telnet;
use strict;
use Process;

use vars qw ($OUT %opts $data $ID);

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

my($renv, $devices, $hosts, $notifs) = PDM::ConfigFile->read();
System->set_renv($renv);

sub usage {
  print <<EOF;

 volverify -s [status] -p [print] -k -i ipno_list -b
   -s : process status
   -p : print log.
   -k : kill
   -i : ipno list separated by commas
   -b : run in background, default is foreground

EOF
}

if (!getopts("bsphki:", \%opts) || $opts{h}) {
    usage();
    exit;
}
$ID = "volverify";

my $IPS = $opts{i};

if ($opts{s}) {
   my $st = Process->status($opts{h}, $ID);
   print "$st \n";
   exit;
}


if ($opts{k}) {
  my $st = Process->status($opts{h}, $ID);
  if ($st =~ /Running/) {
     print "volverify -k already running!\n";
     exit(1);
  }
  my $opts = "-i \"$IPS\" " if ($IPS);
  Process->run($opts{h}, "sbin/volverify -k $opts", \&run, !$opts{b}, 60*60);
  $opts{p} = 1 if (!$opts{b});
}

if ($opts{p} || $opts{P}) {
  &printit($opts{h}, $ID, $opts{P});
}

sub printit {
  my $R = Process->read(undef, 'volverify');
  print "Data: $R->{date}\n$R->{data}\n";
}


sub run {

  my($renv, $devices, $hosts, $notifs) = PDM::ConfigFile->read();
  Process->start($ID);
  unlink System->get_home() . "/DATA/tmp/volverify.out";

  &log("START: volVerify -k (Process-Kill) started.\n");

  require MIME::Base64;
  my $password = MIME::Base64::decode($renv->{array_password});

  
  foreach my $dev (@$devices) {
     next if (index(",t3,6120,", ",$dev->{type},") < 0);
     next if (!$dev->isMineToMonitor());
     next if ($dev->{active} eq "N");
     next if ($IPS && index(",$IPS,", ",$dev->{ipno},") < 0);

     my $verify = $dev->{volVerify} || $renv->{volVerify};
     next if ($verify ne "Y");

     my($t) = new Net::Telnet (
               errmode => "return",
               Timeout => 30,
               Prompt  => '/<\d+\>/',
             );
     my $ipno = $dev->{ipno};
     my $ix = index($ipno, ":");
     if ($ix > 0) {
       $ipno = substr($ipno,0, $ix);
     }
     if (!defined($t->open($ipno))) {
       &log("telnet: Cannot open $ipno\n");
       next;
     }
     my $dev_password = Util->decode($dev->{telnet});
     $t->login("root", $dev_password || $password);
     if ($t->errmsg()) {
        &log("Telnet $dev->{ipno}: " . $t->errmsg() . "\n");
        next;
     }
     my @l = $t->cmd("proc list");
     my $kill;
     foreach my $l (@l) {
        if ($l =~ /[^\s]+\s+(\d+)\s+\d*\s+[\d\:]+\s+vol verify/) {
            $kill = $1;
        } 
     }
     if ($kill) {
        $t->timeout(3);
        my @l = $t->cmd("proc kill $kill");
        my @l = $t->cmd("y");
        &log("Killing vol verify pid=$kill on $dev->{name}\n");

        my $db = Util->deserialize("VolVerify/$dev->{key}");
        if (exists $db->{$dev->{ipno}}) {
           $db->{$dev->{ipno}}{progress} = "KILLED";
           Util->serialize("/VolVerify/$dev->{key}", $db);
        }
     }
     $t->cmd("exit");
  }
  &log("EXIT: volVerify Process-Kill finished.\n");

  my $report;

  $report->{debug}  = 1;
  $report->{data}   = $data;
  $report->{date}   = Util->get_today();
  Process->write($report, $ID);
  Process->done($ID);
}

     



sub log {
  my($l) = @_;
  $OUT = System->get_home() . "/DATA/tmp/volverify.out";
  $data .= $l;
  open(O, ">>$OUT");
  print O $l;
  close(O);
}
