#!/usr/bin/perl  

# interface audit

#########################
# Standard Declarations #
#########################
use POSIX;
use Env;

use Getopt::Long;      # Used for parsing runstring options
use English;
use Carp;
use Cwd;
use File::Path;
use File::Glob;
use File::Copy;

############################
# Declare Global Variables #
############################
my $sysOS;          # Operating System
my $sysHostname;    # Hostname
my $sysRelease;     # OS Release
my $sysVersion;     # OS Version
my $sysMachine;     # Architecture
($sysOS, $sysHostname, $sysRelease, $sysVersion, $sysMachine) = POSIX::uname();

# date 
my ($sys_day,$sys_mon,$sys_year) = (localtime)[3,4,5];
    $sys_mon += 1;  #jan is 0
    $sys_year += 1900;
    $today = sprintf "%d-%02d-%d",$sys_year,$sys_mon,$sys_day;  # date needs to match 2009-09-11 

##########################
my @filelist = ();
my (@ifconfig_arr, @vlan_arr, @sorted) = ();
$DestDir = "/tmp/wm";  #tmp dir to hold single line results
$LogsDir  = "/opt/ipcore/logs";    # where log files should be

##########################
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
#########


#create working directory
if (! -d $DestDir){
     mkpath($DestDir) or die "Failed to create $DestDir: $!\n";
     qx [chmod 777 $DestDir];  #to fix 755 permissions
}


# 1st array.
# Grab interfaces defineded by ifconfig
#
  qx [/sbin/ifconfig | grep -E "eth[0-9]" > $DestDir/junk1];

  open INPUT,"<$DestDir/junk1" or die $!;
  while (<INPUT>) {
       # eth1.205  Link encap:Ethernet  HWaddr 00:0E:0C:F6:DB:6D
       # eth3.262  Link encap:Ethernet  HWaddr 00:15:17:A6:31:48

       if ($_ =~ /^eth\d\.[0-9]*/) {
            s/eth[0-9]\.//g; 

            my @arr = split(/\s+/,$_) ;
            push(@ifconfig_arr, $arr[0]);      # eth.xxx into array
       }
  }
  close(INPUT);
  unlink("$DestDir/junk1");
  @sorted = sort { $a <=> $b } @ifconfig_arr;
  @ifconfig_arr = @sorted;
 
  my $ifconfig_size = @ifconfig_arr;
  print "ifconfig_size:$ifconfig_size  ";

# 2nd array
# Grab up interfaces defined by "ifconfig eth[0-9].xxx up" in /etc/init.d/vlansetup
#
  qx [grep up /etc/init.d/vlansetup | grep -E "eth[0-9]\.*" > $DestDir/junk1];

  open INPUT,"<$DestDir/junk1" or die $!;
  while (<INPUT>) {
       # ifconfig eth1.203 up
       $_ =~ s/eth\d./ /g;
       $_ =~ s/\s+/ /g;

       my @arr = split(/\s+/,$_) ;
       push(@vlan_arr, $arr[1]);     # just eth[0-9].xxx interface
  }
  close(INPUT);
  unlink("$DestDir/junk1");

  @sorted = sort { $a <=> $b } @vlan_arr;
  @vlan_arr = @sorted;

  my $vlansize = @vlan_arr;
  print "vlansize:$vlansize   ";

# 3rd array
# find last  "MultipleInput - Status" in /opt/agilent/ipcore/latest/logs/input.log
#
  qx [grep "MultipleInput - Status" /opt/agilent/ipcore/latest/logs/input.log | tail -1 > $DestDir/junk1];

  open INPUT,"<$DestDir/junk1" or die $!;
  while (<INPUT>) {

       # 2009-09-28 16:00:00.000 INFO  MultipleInput - Status = eth1(CON), eth1.203(CON), 
       $_ =~ s/\(CON\)|,/ /g;
       $_ =~ s/eth\d./ /g;
       $_ =~ s/\s+/ /g;

#print "$_\n";
       my @junk = split(/\s+/,$_) ;
       for ($i = 7; $i <= $#junk; $i++) {
            push(@inputlog_arr, $junk[$i]);    # bypass junk at front of line 
       }
  }
  close(INPUT);
  unlink("$DestDir/junk1");

  @sorted = sort { $a <=> $b } @inputlog_arr;
  @inputlog_arr = @sorted;

  my $logsize = @inputlog_arr;
  print "logsize:$logsize  ";

# 4th array
# Get last status from getTelemetry command
#
  qx [/opt/ipcore/bin/getTelemetry.ksh 10101 appMultipleInput  multiPcapInput | grep Status > $DestDir/junk1];

 #Status = eth1(CON), eth1.198(CON), eth1.203(CON), eth1.206(CON), 

  open INPUT,"<$DestDir/junk1" or die $!;
  while (<INPUT>) {
print "\n$_";
       chomp;
       $_ =~ s/eth[0-9]//g;
       $_ =~ s/\D//g;
#       $_ =~ s/Status|=|,|\.|\(CON\)//g;
print "\n$_";
       $_ =~ s/\s+/ /g;

       @telemetry_arr = split(/\s+/,$_) ;
  }
  close(INPUT);
  unlink("$DestDir/junk1");

  @sorted = sort { $a <=> $b } @telemetry_arr;
  @telemetry_arr = @sorted;

print "@telemetry_arr";
  my $telemsize = @telemetry_arr;
  print "telemetry:$telemsize ";


#  my($asize, $bsize, $missing, @aonly) = &unique_array(\@telemetry_arr,\@vlan_arr);
#  my($asize, $bsize, $missing, @aonly) = &unique_array(\@ifconfig_arr,\@telemetry_arr);
#  my($asize, $bsize, $missing, @aonly) = &unique_array(\@vlan_arr,\@ifconfig_arr);
 
  print "asize:$asize \n"; 
  print "bsize:$bsize \n"; 
  print "missing:$missing \n"; 
#  print "aonly:@aonly \n"; 


