#!/usr/bin/perl -w
##
## Brian T. Hunter
## 03/18/2023
## Script to check HEALTH OF Server
## Updated .profile in linux to execute script when user login in.
##
use strict;
use warnings;

while(1) {
system("clear");
	my $DEBUG="0";
	
	my $cmd_vmstat=`/usr/bin/vmstat 2 2 | tail -1`; 
	chomp($cmd_vmstat);
	
	my $log_vmstat="/tmp/vmstat_out.txt";
	unlink $log_vmstat if($log_vmstat);
	
	open(OUT,">>$log_vmstat") or die ("Unable to write to file $log_vmstat$!\n");
	print OUT "$cmd_vmstat\n";
	
	my $ostype=`/bin/uname -a | cut -d' ' -f1`; chomp($ostype);
	
	my($r,$b,$swpd,$free,$buff,$cache,$si,$so,$bi,$bo,$in,$cs,$us,$sy,$id,$wa,$st);
	
	print "===========================================================================================\n\n";
	my $MyDate=`date`; 
	chomp($MyDate);
	print "\t\t\t$MyDate\n";
	
	my $Hostname=`hostname`; 
	chomp($Hostname);
	print "\t\t\t$Hostname\n";
	
	print "\t\t\tOperating System is $ostype\n"; 
	
	my $kernel=`uname -r`;
	print "\t\t\tKernel Version is $kernel\n";
	
	
	open(OUT, "<$log_vmstat") or warn "Unable to open $log_vmstat :$!\n";
	while() {
	   print "BEFORE LINE: $_\n" if($DEBUG eq '1');
	   $_ =~ s/^ *//g;
	   $_ =~ s/  */:/g;
	   print "AFTER LINE: $_\n" if($DEBUG eq '1');
	   ($r,$b,$swpd,$free,$buff,$cache,,$si,$so,$bi,$bo,$in,$cs,$us,$sy,$id,$wa,$st) = split(/:/,$_);
	
	   print "r=$r\n" if($DEBUG eq '1');
	   print "b=$b\n" if($DEBUG eq '1');
	   print "swpd=$swpd\n" if($DEBUG eq '1');
	   print "free=$free\n" if($DEBUG eq '1');
	   print "buff=$buff\n" if($DEBUG eq '1');
	   print "cache=$cache\n" if($DEBUG eq '1');
	   print "si=$si\n" if($DEBUG eq '1');
	   print "so=$so\n" if($DEBUG eq '1');
	   print "bi=$bi\n" if($DEBUG eq '1');
	   print "bo=$bo\n" if($DEBUG eq '1');
	   print "in=$in\n" if($DEBUG eq '1');
	   print "cs=$cs\n" if($DEBUG eq '1');
	   print "us=$us\n" if($DEBUG eq '1');
	   print "sy=$sy\n" if($DEBUG eq '1');
	   print "id=$id\n" if($DEBUG eq '1');
	   print "wa=$wa\n" if($DEBUG eq '1');
	   print "st=$st\n" if($DEBUG eq '1');
	}	
	close(OUT);
	
	
	print "===========================================================================================\n\n";
	
	my @Partitions=`df -h | grep -v loop | grep ^\/dev`;
	print "PARTITIONS = @Partitions\n" if($DEBUG eq '1');
	foreach my $part (@Partitions) { 
	
		my($device,$size,$used,$free,$DiskPercent,$DiskName) = split(/  */,$part);
	
		chomp($DiskPercent);
		chomp($DiskName);
	
		print "DEVICE=$device\n" if($DEBUG eq '1');
		print "SIZE=$size\n" if($DEBUG eq '1');
		print "USED=$used\n" if($DEBUG eq '1');
		print "FREE=$free\n" if($DEBUG eq '1');
		print "DiskPercent=$DiskPercent\n" if($DEBUG eq '1');
		print "DiskName=$DiskName\n" if($DEBUG eq '1');
	
		my($DiskTotal,$sign) = split(/%/,$DiskPercent);
	
		   if($DiskTotal < "80") { 
	  	   print "PARTITION USUAGE PERCENTAGE.....................................................OK: [$DiskName]  $DiskPercent \n"; 
		  } else { 
	  		print "PARTITION USUAGE PERCENTAGE.............................................ALERT: [$DiskName]  $DiskPercent \n"; 
		  }
	
	}#foreach{}
	
	
	
	if($r < "100") { 
	   print "NUMBER OF RUNNABLE PROCESSES....................................................OK: $r \n"; 
	} else { 
	  print "NUMBER OF RUNNABLE PROCESSES.................................................ALERT: $r \n"; 
	}
	
	if($b < "100") { 
	  print "NUMBER OF PROCESSES UNINTERRUPTIBLE SLEEP.......................................OK: $b \n"; 
	} else { 
	  print "NUMBER OF PROCESSES UNINTERRUPTIBLE SLEEP....................................ALERT: $b \n"; 
	}
	
	
	my $SwapTotal=`cat /proc/meminfo | grep ^SwapTotal | cut -d: -f2  | awk -F'kB' '{print \$1}'`; chomp($SwapTotal);
	$SwapTotal =~ s/^ *//g;
	print "SWapTotal $SwapTotal\n" if($DEBUG eq '1');
	
	my $SwapFree=`cat /proc/meminfo | grep ^SwapFree | cut -d: -f2  | awk -F'kB' '{print \$1}'`; chomp($SwapFree);
	$SwapFree =~ s/^ *//g;
	print "SWapFree $SwapFree\n" if($DEBUG eq '1');
	
	my $SwapPercent=($SwapTotal * .80); #  Test for 80% or highter
	print "SwapPercent $SwapPercent\n" if($DEBUG eq '1');
	
	
	if($SwapFree >= $SwapPercent) { 
	  print "AMOUNT OF SWAP MEMORY FREE......................................................OK: $SwapFree \n";
	} else { 
	  print "AMOUNT OF SWAP MEMORY FREE...................................................ALERT: $SwapFree \n";
	}
	
	
	my $MemTotal=`cat /proc/meminfo | grep ^MemTotal | cut -d: -f2  | awk -F'kB' '{print \$1}'`; chomp($MemTotal);
	$MemTotal =~ s/^ *//g;
	print "MemTotal: $MemTotal\n" if($DEBUG eq '1');
	
	my $MemFree=`cat /proc/meminfo | grep ^MemFree | cut -d: -f2  | awk -F'kB' '{print \$1}'`; chomp($MemFree);
	$MemFree =~ s/^ *//g;
	print "MemFree $MemFree\n" if($DEBUG eq '1');
	
	my $MemAvailable=`cat /proc/meminfo | grep ^MemAvail | cut -d: -f2  | awk -F'kB' '{print \$1}'`; chomp($MemAvailable);
	$MemAvailable =~ s/^ *//g;
	print "MemAvailable $MemAvailable\n" if($DEBUG eq '1');
	
	my $MemPercent=($MemTotal * .20);  # Test for 80% or highter, the smaller the value the ALERT.
	print "MemPercent: $MemPercent\n" if($DEBUG eq '1');
	
	
	if( $MemAvailable >= $MemPercent ) { 
	  print "AMOUNT OF MEMORY FREE...........................................................OK: $MemAvailable \n";
	} else { 
	  print "AMOUNT OF MEMORY FREE.........................................................ALERT $MemAvailable \n";
	}
	
	if($si < "100") { 
	  print "AMOUNT OF MEMORY SWAPPED IN FROM DISK...........................................OK: $si \n"; 
	} else { 
	  print "AMOUNT OF MEMORY SWAPPED IN FROM DISK.........................................ALERT $si \n"; 
	}
	
	if($so < "100") { 
	  print "AMOUNT OF MEMORY SWAPPED TO DISK................................................OK: $so \n"; 
	} else { 
	  print "AMOUNT OF MEMORY SWAPPED TO DISK..............................................ALERT $so \n"; 
	}
	
	if($bi < "100") { 
	  print "BLOCKS RECEIVED FROM A BLOCK DEVICE PER SECONDS.................................OK: $bi \n"; 
	} else { 
	  print "BLOCKS RECEIVED FROM A BLOCK DEVICE PER SECONDS..............................ALERT: $bi \n"; 
	}
	
	if($bo <= "100") { 
	  print "BLOCKS SENT TO A BLOCK DEVICE PER SECONDS.......................................OK: $bo \n"; 
	} else { 
	  print "BLOCKS SENT TO A BLOCK DEVICE PER SECONDS....................................ALERT: $bo \n"; 
	}
	
	if($in <= "500") { 
	  print "NUMBER OF INTERRUPTS PER SCONDS.................................................OK: $in \n"; 
	} else { 
	  print "NUMBER OF INTERRUPTS PER SCONDS..............................................ALERT: $in \n"; 
	}
	
	if($cs <= "2000") { 
	  print "NUMBER OF CONTEXT SWITCHES PER SCONDS...........................................OK: $cs \n"; 
	} else { 
	  print "NUMBER OF CONTEXT SWITCHES PER SCONDS........................................ALERT: $cs \n"; 
	}
	
	if($us <= "85") { 
	  print "CPU USER USUAGE.................................................................OK: $us \n"; 
	} else { 
	  print "CPU USER USUAGE...............................................................ALERT $us \n"; 
	}
	
	if($sy <= "85") { 
	  print "CPU SYSTEM USUAGE...............................................................OK: $sy \n"; 
	} else { 
	  print "CPU SYSTEM USUAGE.............................................................ALERT $sy \n"; 
	}
	
	if($id >= "20") { 
	  print "CPU IDLE USUAGE.................................................................OK: $id \n"; 
	} else { 
	  print "CPU IDLE USUAGE...............................................................ALERT $id \n"; 
	}
	
	if($wa <= "30") { 
	  print "CPU WAITING FOR I/O USUAGE......................................................OK: $wa \n"; 
	} else { 
	  print "CPU WAITING FOR I/O USUAGE...................................................ALERT: $wa \n"; 
	}
	
	if($st <= "30") { 
	  print "CPU TIME STOLEN FROM VIRTUAL MACHINE USUAGE.....................................OK: $st \n"; 
	} else { 
	  print "CPU TIME STOLEN FROM VIRTUAL MACHINE USUAGE..................................ALERT: $st \n"; 
	}
	
	print "===========================================================================================\n";
	system("sleep 5");
	exit(0);
}
exit(0);