#!/usr/bin/perl

$version="1.3";
$debug="0";
$logger="1";
$log_file="/tmp/cpu_utilization.txt";
$USE_LOG_FILE=0;
$values_log_file=10;
$sar_cmd="/usr/bin/sar -u 1 10";

($item, $warning, $critical) = @ARGV;

if ($#ARGV< 2) {
	print "check_cpu_utilization.pl v$version\n";
	print "Usage: ./check_cpu_utilization [item] [warning] [critical]\n";
	print "\n";
	print "-> item: Item a ser monitorado (Ex: user, nice, cpu_utilization, etc)\n";
	print "-> warning/critical: Parametros de warning e critical\n";
	exit(0);
}

@cpu_usage=`$sar_cmd`;
$centos=0;
for ($i=0; $i<=$#cpu_usage; $i++) {
	if ($cpu_usage[$i] =~ "steal") {
		$centos=1;
	}
	if ($cpu_usage[$i] =~ "Average") {
		@newsplit = split(/[ \t]+/,$cpu_usage[$i]);		
	}
}

$user=$newsplit[2];
chomp($user);
$nice=$newsplit[3];
chomp($nice);
$systemsar=$newsplit[4];
chomp($systemsar);
$iowait=$newsplit[5];
chomp($iowait);
if ($centos==1) {
	$idle=$newsplit[7];
}
else {
	$idle=$newsplit[6];
}
chomp($idle);
$cpu_utilization=$user+$systemsar+$nice;
chomp($cpu_utilization);

if ($debug) {
	print "=>Debug info\n";
	print "user: $user\nnice: $nice\nsystem: $systemsar\niowait: $iowait\nidle: $idle\ncpu_utilization: $cpu_utilization\n";

}

if ($USE_LOG_FILE==1) {
	if (-e "$log_file") {
		open(FILE,"<$log_file");
		@lines = <FILE>;
		close(FILE);
	}else{
		open(FILE, ">$log_file");
		close(FILE);
	}
	$count=0;
	for ($i=0; $i<=$#lines; $i++) {
		last if ($count == ($values_log_file-1)); 
		@splitLine = split(/[ ]+/, $lines[$i]);
		$log_user=$log_user+$splitLine[0];
		$log_nice=$log_nice+$splitLine[1];
		$log_system=$log_system+$splitLine[2];
		$log_iowait=$log_iowait+$splitLine[3];
		$log_idle=$log_idle+$splitLine[4];
		$log_cpu=$log_cpu+$splitLine[5];
		$count++;
	}
	if ($debug) {
		print "=>Soma das informacoes em log\n";
	        print "user: $log_user\nnice: $log_nice\nsystem: $log_system\niowait: $log_iowait\nidle: $log_idle\ncpu_utilization: $log_cpu\n";
	}
	$avguser=($user+$log_user)/($count+1);
	$avguser=sprintf("%.2f", $avguser);
	$avgnice=($nice+$log_nice)/($count+1);
	$avgnice=sprintf("%.2f", $avgnice);
	$avgsystem=($systemsar+$log_system)/($count+1);
	$avgsystem=sprintf("%.2f", $avgsystem);
	$avgiowait=($iowait+$log_iowait)/($count+1);
	$avgiowait=sprintf("%.2f", $avgiowait);
	$avgidle=($idle+$log_idle)/($count+1);
	$avgidle=sprintf("%.2f", $avgidle);
	$avgcpu_utilization=($cpu_utilization+$log_cpu)/($count+1);
	$avgcpu_utilization=sprintf("%.2f", $avgcpu_utilization);
	if ($debug) {
		print "Divisor: ",$count+1,"\n";
		print "=>Media os valores\n";
	        print "avguser: $avguser\navgnice: $avgnice\navgsystem: $avgsystem\navgiowait: $avgiowait\navgidle: $avgidle\navgcpu_utilization: $avgcpu_utilization\n";
	}

	if ($logger) {
		open(FILE, ">$log_file");
		print FILE "$avguser $avgnice $avgsystem $avgiowait $avgidle $avgcpu_utilization\n";
		for ($i=0; $i<($values_log_file-1); $i++) {
			print FILE "$lines[$i]";
		}
		close(FILE);
		$user=$avguser;
		$nice=$avgnice;
		$systemsar=$avgsystem;
		$iowait=$avgiowait;
		$idle=$avgidle;
	}
}
else {
	$avguser=$user;
	$avgnice=$nice;
	$avgsystem=$systemsar;
	$avgiowait=$iowait;
	$avgidle=$idle;
	$avgcpu_utilization=$cpu_utilization;
}

if ("$item" eq "user") {
	if ($avguser<$warning) {
		print "OK - $avguser% de CPU USER | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
	}
	elsif ($avguser<$critical) {
		print "WARNING - $avguser% de CPU USER | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	}
	else {
		print "CRITICAL - $avguser% de CPU USER | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}

if ("$item" eq "nice") {
	if ($avgnice<$warning) {
		print "OK - $avgnice% de CPU NICE | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
   }
   elsif ($avgnice<$critical) {
		print "WARNING - $avgnice% de CPU NICE | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	}
	else{
		print "CRITICAL - $avgnice% de CPU NICE | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}

if ("$item" eq "system") {
	if ($avgsystem<$warning) {
		print "OK - $avgsystem% de CPU SYSTEM | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
	}
	elsif ($avgsystem<$critical) {
		print "WARNING - $avgsystem% de CPU SYSTEM | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	}
	else {
		print "CRITICAL - $avgsystem% de CPU SYSTEM | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}

if ("$item" eq "iowait") {
	if ($avgiowait>$warning) {
		print "OK - $avgiowait% de CPU IO Wait | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
	}
	elsif ($avgiowait>$critical) {
		print "WARNING - $avgiowait% de CPU IO Wait | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	} else {
		print "CRITICAL - $avgiowait% de CPU IO Wait | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}

if ("$item" eq "idle") { 
	if ($avgidle<$warning) { 
		print "OK - $avgidle% de CPU Idle | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
	} 
	elsif ($avgidle<$critical) { 
		print "WARNING - $avgidle% de CPU Idle | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	}
	else {
		print "CRITICAL - $avgidle% de CPU Idle | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}

if ("$item" eq "cpu_utilization") {
	if ($avgcpu_utilization<$warning) {
		print "OK - $avgcpu_utilization% de Utilizacao da CPU|user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(0);
	}
	elsif ($avgcpu_utilization<$critical) {
		print "WARNING - $avgcpu_utilization% de Utilizacao da CPU | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(1);
	}
	else {
		print "CRITICAL - $avgcpu_utilization% de Utilizacao da CPU | user=$avguser%;$warning;$critical;0;100 system=$avgsystem%;$warning;$critical;0;100 iowait=$avgiowait%;$warning;$critical;0;100 idle=$avgidle%;$warning;$critical;0;100 cpu_utilization=$avgcpu_utilization%;$warning;$critical;0;100 nice=$avgnice%;$warning;$critical;0;100\n";
		exit(2);
	}
}
