#!/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    = System->getPassword('array');

  
  foreach my $dev (@$devices) {
     next if (index(",t3,6120,6020,", ",$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, $volname);
     foreach my $l (@l) {
        if ($l =~ /([^\s]+)\s+(\d+)\s+\d*\s+[\d\:]+\s+vol verify/) {
            $volname = $1;
            $kill    = $2;
        } 
     }
     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} = "ABORTED";
           my $VOLS = $db->{$dev->{ipno}}{VOL};
           foreach my $el (keys %$VOLS) {
             my $obj = $VOLS->{$el};
             if ($obj->{volume_name} eq $volname) {
               $obj->{progress} = "ABORTED";
             }
           }
           Util->serialize("/VolVerify/$dev->{key}", $db);
        }
     }
     $t->cmd("exit");
  }
  &log( "EXIT: volVerify Process-Kill on $renv->{hostname} 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) = @_;
  my $renv = System->get_renv();
  
  my $master = Util->findMaster;
  if (!$master) {
    $OUT = System->get_home() . "/DATA/tmp/volverify.out";
    $data .= $l;
    open(O, ">>$OUT");
    print O $l;
    close(O);
  } else {
    Util::Http->appendFile($master, "tmp/volverify.out", $l, 10) ;
  }
}
