#!/usr/bin/perl  

#ModulePurpose: Look for BPPs for which:  ntp timesynch is Out of Sync 
#ModuleName: bpp_timesynch 
#TimeRequired:   5 minutes for 890 BPPs

# Problem Report:
# --- 2 BPP timesync issues
# m005ilm8p4  Out of Synch
# m005ilm2p5  NOT pingable


use lib '/h/bmetzger/s/p/hc/';
use HC qw(:ALL);  #functions available to all modules 

use English;
use Carp;
use Cwd;
use DBI;
use Net::Ping;
use File::Basename;
use File::Path;
use File::Glob;
use File::Copy;

###############3###
# define location of, and open files
##################

  my ($TmpDir,$sitelist,$global_problems,$global_details,$global_summary,$ArchiveDir) = InitVars();

  $ENV{'PATH'} = '/usr/bin:/usr/local/bin:/usr/sbin/:/usr/ucb:/etc/:/opt/platform7/lbin/:.';
  &initvars();

### checks
 ($header, $local_problems, $local_details)= &check(); 
  summarize($header, $local_problems, $local_details);

###################33
sub initvars {

   ($sys_day,$sys_mon,$sys_year) = (localtime)[3,4,5];
   $sys_mon += 1;  #jan is 0
   $sys_year += 1900;
   $today = sprintf "%02d.%02d.%d",$sys_mon,$sys_day,$sys_year;  # zero fill date

   $ENV{'PATH'} = '/usr/bin:/usr/local/bin:/usr/sbin/:/usr/ucb:/etc/:.';
} #initvars

####################
sub line_count {
# perform a  wc -l

  my $file = shift;
    open my $fh, "<", $file or die "could not open $file:$!";
    my $lines = 0;
    $lines++ while <$fh>;
    return $lines;
    close ($fh);
} #line_count

#########
sub unique_array {
# Find elements that are in one array but not another.
# find only elements in @A and not in @B
#assume @A and @B are already loaded

   $refA = shift;
   $refB = shift;
   ($asize, $bsize, $missing) = 0;

#foreach (@$refA) {
#   print "$_\n";
#}
   %seen = ();                  # lookup table to test membership of B
   @aonly = ();                 # answer

   # build lookup table
   foreach $item (@$refB) { $seen{$item} = 1 }

   # find only elements in @A and not in @B
   foreach $item (@$refA) {
       unless ($seen{$item}) {
           # it's not in %seen, so add to @aonly
           push(@aonly, $item);
print "aonly:$item\n";
       }
   }
       $asize = @$refA;
       $bsize = @$refB;
       $missing = scalar @aonly;
  return ($asize, $bsize, $missing, @aonly);
} #unique_array

#########
sub check {
# Look for bpps which lost timesync 

     print "bpp timesync check\n";

      my $bpplist        = "$TmpDir/bpplist";    
      my $local_problems = "$TmpDir/timesync_problems";
      my $local_details  = "$TmpDir/timesync_details";
      my $local_junk1    = "$TmpDir/junk1";    # temp file for problems
      my $local_junk2    = "$TmpDir/junk2";    # temp file for details

    unlink("$bpplist");


     #create list of boxes to check
      qx[/opt/platform7/lbin/list_processors -b > $bpplist];
#      qx[list_processors -b | grep -E "m005ilm8p4|m005ilm2p5" >> $bpplist];

      open (IN, "<$bpplist") or croak "Can't open bpplist for read: $!\n";
      foreach my $box (<IN>) {
          chomp($box);
          open (PROBLEMS, ">>$local_problems") or croak "Can't open local_problems for write: $!\n";

          $p = Net::Ping->new("icmp");    #need icmp or fails to tra1 and tra2
          if ( $p->ping($box) ) {
                   $results = qx[remsh $box showTimeInfo |grep "ntp timesynch"];   
                   chomp $results;
                   $results =~ s/\s+ntp timesynch\s+: //g;
                  
                   if ($results =~ /Out/) {
                         printf PROBLEMS  "   $box  $results\n" ;
                   }
           } else {
                 printf PROBLEMS  "   $box  NOT pingable\n" ;
           }
           close (PROBLEMS);  #close write
           $p->close();
      }

 my $badcount = line_count($local_problems);

 # open local output files
 open (JUNK1, ">>$local_junk1") or croak "Can't open file local_junk1 for write: $!\n";
 open (JUNK2, ">>$local_junk2") or croak "Can't open file $local_junk2 for write: $!\n";

 my $header = "\n--- $badcount BPP timesync issues -$today \n";
 if ( $badcount > 0 ){  # at least one problem
         #format and header
         printf JUNK1 "$header";
         qx[grep Out $local_problems >> $local_junk1];
         qx[grep NOT $local_problems >> $local_junk1];
         close(JUNK1);

         printf JUNK2 $header;
         close(JUNK2);
    } else {                         #no problems found
          #format and header
         printf JUNK2 $local_header;
         close(JUNK2);
    }
   copy($local_junk1,$local_problems) or die "junk1 cannot be copied";
   copy($local_junk2,$local_details) or die "junk2 cannot be copied";

   # cleanup
   unlink("$bpplist");
   unlink("$local_junk1") || print $!;
   unlink("$local_junk2") || print $!;
  return($header, $local_problems, $local_details);
} #check

