#!/usr/bin/perl 

#ModulePurpose: Find highest datarate for each BPP.  Add up total datarate for each CC to find input rate for EPP
#               List top 10 BppDataRates 
#               List top  5 EppInputDataRates 
#ModuleName: xPP_DataRate_Check 
#TimeRequired: 4 min

# historical datarates are captured by cron each night.
# Results are saved to /h/bmetzger/s/tmp/all/site* 

# Problem Report:
#  --- 7 EPPs InputDataRate close to 49Mbit/s 
#  site:01 cc:02  EPP_InputDataRate:    6349  Kbits/sec
#  site:01 cc:03  EPP_InputDataRate:    6773  Kbits/sec
#  site:01 cc:04  EPP_InputDataRate:    6813  Kbits/sec

# Details Report
#   --- 0 EPPs InputDataRate close to 49Mbit/s 08.04.2009
#       Top 10 BPP DataRates for 08.04.2009
#   site:04 cc:29 bpp:02  BppMaxDataRate: 2527 Kbits/sec
#   site:04 cc:30 bpp:03  BppMaxDataRate: 2436 Kbits/sec
#   site:04 cc:30 bpp:04  BppMaxDataRate: 2286 Kbits/sec
#   site:02 cc:29 bpp:01  BppMaxDataRate: 2223 Kbits/sec
#   site:04 cc:10 bpp:01  BppMaxDataRate: 2117 Kbits/sec
#   site:04 cc:30 bpp:01  BppMaxDataRate: 2086 Kbits/sec
#   site:07 cc:05 bpp:02  BppMaxDataRate: 2079 Kbits/sec
#   site:04 cc:09 bpp:01  BppMaxDataRate: 2068 Kbits/sec
#   site:02 cc:30 bpp:02  BppMaxDataRate: 1998 Kbits/sec
#   site:04 cc:08 bpp:01  BppMaxDataRate: 1879 Kbits/sec
#   
#       Top 5 EPP InputDataRates for 08.04.2009
#   site:02 cc:30  EPP_InputDataRate: 10445 Kbits/sec
#   site:07 cc:04  EPP_InputDataRate: 8916 Kbits/sec
#   site:04 cc:30  EPP_InputDataRate: 8246 Kbits/sec
#   site:08 cc:04  EPP_InputDataRate: 7776 Kbits/sec
#   site:08 cc:03  EPP_InputDataRate: 7440 Kbits/sec
 

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 to count lines $!";
    my $lines = 0;
    $lines++ while <$fh>;
    return $lines;
    close ($fh);
} #line_count

#########
sub check {
# Look for high input levels on all EPPs 

     print "EPP InputDataRates\n";

      my $local_problems = "$TmpDir/epprates_problems";
      my $local_details  = "$TmpDir/epprates_details";
      my $local_bpps  = "$TmpDir/bpp_rates";
      my $local_epps  = "$TmpDir/epp_rates";

    # open local output files
    open (PROBLEMS, ">>$local_problems") or croak "Can't open local_problems for write: $!\n";
    open (DETAILS, ">>$local_details") or croak "Can't open local_details for write: $!\n";
    open (BPPs, ">>$local_bpps") or croak "Can't open local_bpps for write: $!\n";
    open (EPPs, ">>$local_epps") or croak "Can't open local_epps for write: $!\n";

#configurable                  
    @allfiles = </h/bmetzger/s/tmp/all/*.datarates>;
#    @allfiles = </h/bmetzger/s/tmp/all/site01.datarates>;

    foreach my $file (@allfiles){ 
        if (-C $file > 1) {   # if file created > one days ago.....
              printf   "$file is not current\n";

        }else {
               #create list of unique cardcages  for site
               open (IN, "<$file") or croak "Can't open datarates file $file for read: $!\n";
               while (my $line = <IN>) {
                      my @arr = split(/,/,$line);

                      if ( ($line =~ /BPP/) && ($line !~ /No/) )  {
                          $site =  $arr[0];
                          push(@tmpArr, $arr[1]);
                      } 
               } #1st read
               close (IN);
             
               undef %saw;
               @cages = grep(!$saw{$_}++, @tmpArr);

               # create list of BPPs for each cage 
               foreach $cc (@cages) {
                    (@bpps, @tmpArr) = ();
                    open (IN, "<$file") or croak "Can't open datarates file $file for read: $!\n";
                    while (my $line = <IN>) {
                           my @arr = split(/,/,$line);
                      
                           if ( ($line =~ /HIST/) && ($arr[1] == $cc) )  {
                               push(@tmpArr, $arr[2]);
                           }
                    }
                    close (IN);
                            
                    undef %saw;
                    @bpps = grep(!$saw{$_}++, @tmpArr);
               } #foreach cc

               # find max DATARATE value for each BPP 
               foreach $cc (@cages) {
                    $eppRate = 0;

                    foreach my $bpp (@bpps) {
                          (@values, @sorted) = ();
                          ($min, $max) = "";

                         open (IN, "<$file") or croak "Can't open datarates file: $!\n";
                         while (my $line = <IN>) {
                              chomp $line;
                              $line =~ s/\.0{4,}//g;
                              @arr = split(/,/,$line);
                              next if ($arr[6] > 10000);  #huge value.  Throw it out.

                             if ( ($line =~ /DATARATE/) && ($arr[1] == $cc) && ($arr[2] == $bpp) )  {
                               push(@values, $arr[6]);
                             }
                         }
                         @sorted = sort({$a <=> $b} @values);  #numberic sort
                         $min = shift(@sorted);    #all are kbps
                         $max = pop(@sorted); 
                         printf BPPs "   site:%2s cc:%2s bpp:%2s  BppMaxDataRate: %s Kbits/sec\n",$site, $cc, $bpp, $max; 
                         $eppRate += $max;
#print "cc:$cc  bpp:$bpp  min:$min  max:$max epp:$eppRate\n";
                   } #foreach bpp
                   close(IN);
#configurable                  
                   if ($eppRate >= 30000) {  #value in Kbps.  Max input value for EPP= 49Mbit/s per cardcage
                         printf PROBLEMS "   site:%2s cc:%2s EPP_InputDataRate:%7s Kbits/sec\n",$site, $cc, $eppRate; 

                         #Don't format.  It will be easier to sort on datarate field
                         printf EPPs "   site:%2s cc:%2s  EPP_InputDataRate: %s Kbits/sec\n",$site, $cc, $eppRate; 
#debug                   print "   site:$site cc:$cc  rate:$eppRate\n";   
                   } else {
                         printf EPPs "   site:%2s cc:%2s  EPP_InputDataRate: %s Kbits/sec\n",$site, $cc, $eppRate; 
                   }
              }#foreach cc
       }# else 
   } #all globbed files
   close (PROBLEMS);
   close (DETAILS);
   close (BPPs);
   close (EPPs);


   my $badcount = line_count($local_problems);

    # open local output files
    my $local_junk1    = "$TmpDir/junk1";    # temp file for problems
    my $local_junk2    = "$TmpDir/junk2";    # temp file for details

    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 EPPs InputDataRate close to 49Mbit/s -$today\n";
#    my $local_header = "\n    BPP      Period  Kb/sec     Date     Time\n";

    if ( $badcount > 0 ){  # at least one problem
         #format and header
         printf JUNK1 "$header";
         qx[cat $local_problems >> $local_junk1];
         close(JUNK1);

         printf JUNK2 $header;
         print  JUNK2 "    Top 10 BPP DataRates for $today\n";
         qx[sort -k5,5rn $local_bpps | head -10 >> $local_junk2];

         print JUNK2 "\n    Top 5 EPP InputDataRates for $today\n";
         qx[sort -k4,4rn $local_epps | head -5  >> $local_junk2];
          close(JUNK2);
    } else {
          #format and header
         printf JUNK2 $header;
         printf JUNK2 "    Top 10 BPP DataRates for $today\n";
         qx[sort -k5,5rn $local_bpps | head -10 >> $local_junk2];

         printf JUNK2 "\n    Top 5 EPP InputDataRates for $today\n";
         qx[sort -k4,4rn $local_epps | head -5  >> $local_junk2];
          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("$local_junk1") || print $!;
   unlink("$local_junk2") || print $!;
   unlink("$local_bpps") || print $!;
   unlink("$local_epps") || print $!;

 return($header, $local_problems, $local_details);
} #check

