#!/usr/bin/perl

($warnLevel, $criticalLevel)=@ARGV;

if ($#ARGV<1) {
   print "Usage:\n";
   print "check_mem.pl <warnningLevel> <criticalLevel>\n";
   print "Example: check_mem.pl 80 95\n";
   exit(-1);
}

($memTotal,$unit_used)=findValuesUnit("MemTotal:");
($memFree,$unit_used)=findValuesUnit("MemFree:");

$memUsed=$memTotal-$memFree;
$percentUsed=($memUsed*100)/$memTotal;
$rounded=sprintf("%.2f",$percentUsed);

$temp="$rounded% de memoria utilizada [MemTotal:".$memTotal." ".$unit_used." / MemUsed:".$memUsed." ".$unit_used." / MemFree:".$memFree." ".$unit_used."]|memoria=$rounded%;$warnLevel;$criticalLevel;0;100";

if ($rounded>$criticalLevel) {
   print "CRITICAL - $temp\n";
   exit(2);
}
if ($rounded>$warnLevel) {
   print "WARNING - $temp\n";
   exit(1);
}
print "OK - $temp\n";
exit(0);

sub findValuesUnit {
	local ($item)=@_;
	
	$file="/proc/meminfo";
	open(FILE, $file);
	@lines=<FILE>;
	close(file);

	$value=0;
	$unit="";
	$split_pattern="[ \t]+";
	foreach $line (@lines) {
		chomp($line);
		@parts=split(/$split_pattern/, $line);
		#print "$item - <$parts[0]> <$parts[1]> <$units>\n";		
		if ($item eq $parts[0]) {
			$value=$parts[1];
			$unit=uc($parts[2]);
		}
	}
	return($value, $unit);
}

sub convertUnitsMem {
   local ($value)=@_;
   
   $notYet=1;
   $count=0;
   while($notYet==1) {
      if ($value<1024) {
         $notYet=0;
      }
      else {
         $value=$value/1024;
         $count++;
      }
   }
   $memunit="Bytes";
   if ($count==1) {
      $memunit="KB";
   }
   if ($count==2) {
      $memunit="MB";
   }
   if ($count==3) {
      $memunit="GB";
   }
   if ($count==4) {
      $memunit="TB";
   }
   $value=sprintf("%.2f",$value);
   return($value, $memunit);
}
