#!/usr/bin/perl

($warn, $crit) = @ARGV;

$VERSION="1.2";

$DOWN = 8;
$UNREACHABLE = 7;
$CRITICAL = 6;
$UNKNOWN = 5;
$WARNING = 4;
$FLAPPING = 3;
$ACK = 2;
$DOWNTIME = 1;
$OK = 0;

my @a = (0..8);
my @totals_service = ();
my @totals_service = ();
for my $i (@a){
	$totals_service[$i] = 0;
	$totals_host[$i] = 0;
}

$status_log="/usr/local/opmon/var/status.log";
if (not(-e "$status_log")) {
   print "UNKNOWN - $status_log not found\n";
   exit(3);
}

$status_line = "display_status=";
$foundHost = 0;
$foundService = 0;

open(STATUS, $status_log);
@status=<STATUS>;
close(STATUS);

$total_objects = 0;
$total_hosts = 0;
$total_services = 0;
for ($i=0; $i<=$#status; $i++) {
	if ("$status[$i]" =~ 'hoststatus [{]') {
			$foundHost = 1;
			$total_objects++;
			$total_hosts++;
	}
	if ($foundHost == 1 and "$status[$i]" =~ $status_line) {
		$foundHost = 0;
		chomp($status[$i]);
		($key, $value) = split(/[=]/,$status[$i]);
		$totals_host[$value]++;
	}

	if ("$status[$i]" =~ "servicestatus [{]") {
		$foundService = 1;
		$total_objects++;
		$total_services++;
	}
	if ($foundService == 1 and "$status[$i]" =~ $status_line) {
		$foundService = 0;
		chomp($status[$i]);
		($key, $value) = split(/[=]/,$status[$i]);
		$totals_service[$value]++;
	}
}

$total_host_problem = $totals_host[$DOWN] + $totals_host[$UNREACHABLE]+ $totals_host[$FLAPPING] + $totals_host[$ACK];
$total_service_problem = $totals_service[$CRITICAL] + $totals_service[$WARNING] + $totals_service[$UNKNOWN] + $totals_service[$FLAPPING] + $totals_service[$ACK];
$total_problem = $total_host_problem + $total_service_problem;
$pct_problem=($total_problem*100)/$total_objects;
$pct_problem=sprintf("%.02f",$pct_problem);

$msg = $pct_problem."% de problemas";
$msg .= " - Total de problemas ".$total_problem;
$msg .= ", em ".$total_hosts." hosts e ".$total_services." services";
$msg .= ", onde ".$totals_host[$DOWN]." hosts down";
$msg .= ", ".$totals_host[$UNREACHABLE]." hosts inalcansaveis";
$msg .= ", ".$totals_host[$FLAPPING]." hosts instaveis";
$msg .= ", ".$totals_host[$ACK]." hosts reconhecidos";
$msg .= ", ".$totals_host[$DOWNTIME]." hosts em manutenção";
$msg .= ", ".$totals_host[$OK]." hosts em OK";

$msg .= ", ".$totals_service[$CRITICAL]." serviços criticos";
$msg .= ", ".$totals_service[$WARNING]." serviços em alerta";
$msg .= ", ".$totals_service[$UNKNOWN]." serviços desconhecidos";
$msg .= ", ".$totals_service[$FLAPPING]." serviços instaveis";
$msg .= ", ".$totals_service[$ACK]." serviços reconhecidos";
$msg .= ", ".$totals_service[$DOWNTIME]." serviços em manutenção";
$msg .= ", ".$totals_service[$OK]." serviços em OK";

# totals
$perfdata = "Problemas=$pct_problem%;$warn;$crit;0;100";
$perfdata .=" total_problem=$total_problem";

# host
$perfdata .=" host_total=".$total_hosts;
$perfdata .=" host_down=".$totals_host[$DOWN];
$perfdata .=" host_unreachable=".$totals_host[$UNREACHABLE];
$perfdata .=" host_flapping=".$totals_host[$FLAPPING];
$perfdata .=" host_acknowledged=".$totals_host[$ACK];
$perfdata .=" host_downtime=".$totals_host[$DOWNTIME];
$perfdata .=" host_ok=".$totals_host[$OK];

# service
$perfdata .=" service_total=".$total_services;
$perfdata .=" service_critical=".$totals_service[$CRITICAL];
$perfdata .=" service_warning=".$totals_service[$WARNING];
$perfdata .=" service_unknown=".$totals_service[$UNKNOWN];
$perfdata .=" service_flapping=".$totals_service[$FLAPPING];
$perfdata .=" service_acknowledged=".$totals_service[$ACK];
$perfdata .=" service_downtime=".$totals_service[$DOWNTIME];
$perfdata .=" service_ok=".$totals_service[$OK];

$msg.= " | ".$perfdata."\n";

if ($pct_problem>=$crit) {
	print "Critical - ".$msg;
	exit(2);
}elsif($pct_problem>=$warn) {
	print "Warning - ".$msg;
	exit(1);
}else{
	print "OK - ".$msg;
	exit(0);
}
