#!/usr/bin/perl  


# Grabs top every 5 minutes.
# Grep cpu load for various (processeses)measurements 
# Writes values as single line to /opt/Firehunter/DATA/ipcore_cpu/IPCore_CPU_HHMM.dat

# CPU Measurements collected for:
# input
# sfe2
# isuptcap-bo
# h248-bo
# sip-bo
# ncs-bo
# isuptcap-sfe1
# h248-sfe1
# sip-sfe1
# ncs-sfe1

#########################
# 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 (@list, @arr, @FinalArray) = ();  
my $time  = ""  ;  # extracted from top output and formatted
my $value = ""  ;  

$DestDir = "/opt/Firehunter/DATA/ipcore_cpu";  #tmp dir to hold single line results

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

# dump top  
  qx [/usr/bin/top -b -n 1 > /tmp/top.out];

  @list=("input", "sfe2", "isuptcap-bo", "h248-bo", "sip-bo",  "ncs-bo", "isuptcap-sfe1", "h248-sfe1", "sip-sfe1", "ncs-sfe1");
#  @list=("input");

 foreach my $process (@list){
      open INPUT,"</tmp/top.out" or die $!;
      while (<INPUT>) {
            @arr = ();  #initialize for each process
            
             chomp;

            #extract & format current time
            if ($_ =~ /average/) { 
                   # top - 11:12:28 up 32 days, 18:32,  3 users,  load average: 1.06, 1.32, 1.43
                   @arr = split(/\s+/,$_) ;
                   ($HH, $MM) = split(/:/ ,$arr[2]);      # time 
                    $time =~ s/^:\d+\.\d+//g;          # parse out seconds
                    $time = sprintf ("$HH:$MM");
            }       

            # print CPU load for designated process
                #  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
                #  997 root      15   0  171m 124m  16m S    0  0.8 307:32.49 isuptcap-sfe
            if ($_ =~ /$process/) { 
                  @arr = split(/\s+/, $_) ;
                  $topProcess = $arr[-1];    # process from top output (debug)
                  $cpu = $arr[-4];           # %cpu
# debug printf ("process: %-16s cpu:%3s \t%s\n",$process, $cpu, $_ );
            }
       } #done reading input file
       close(INPUT);

       #evaluate after reading file. Otherwise will get 0.0 value for each line.
       if ($cpu gt 0) {   # one actually exists
             push(@FinalArray,$cpu); 
       } else {
             push(@FinalArray,"0.0");  # NULL
       }
            
 } #foreach process

 open OUT,">$DestDir/IPCoreCPU_${sysHostname}_${time}.dat" or die $!;
 print  "@FinalArray\n";
 print OUT "@FinalArray";
 close(OUT);

