#!/usr/bin/perl
#Author:
#		Otavio Honorio (otavio.honorio@opservices.com.br)
#		Modify
#		Boris.Vasquez=> 29/03/2012
#			 Modificado o comando de checagem e adicionado mais argumentos, para que no opfw seja apenas 1 linha de comando

use strict;
use Getopt::Long;
use POSIX;
use File::Basename;
use IO::Socket::INET;
#--------------------------------------------------
# Setting environment
#--------------------------------------------------
$ENV{"USER"}="opuser";
$ENV{"HOME"}="/home/opuser";
#--------------------------------------------------
# Global variables
#--------------------------------------------------
our $name = basename($0, ".pl");
our $version = "1.0";
our $path = "/usr/local/opmon/libexec/check_remote_robots";
our ($opt_help, $opt_verbose, $opt_version, $opt_warn, $opt_crit,$host_robot,$robot_name,$opt_drive);
my @metrics = ("", "", ""); # Generate performance data.
my @return = (); # Return to complete performance data.
our $nrpe = "/usr/local/opmon/libexec/check_nrpe";
our $port_nrpe = 5666;
our $timeout = 15;
our ($command, @hosts, $ip,$exec_nrpe,$result);
our $localtime = strftime('%H:%M:%S %m/%d/%Y',localtime);
our $debug = 0;

sub main {
	getoption();
	my $debug = "$path/debug_$command.log";
	my $out = "$path/out_$command.log";

	@hosts = (#"187.45.212.89",
				"200.175.93.74",
				"187.52.42.169",
				"187.58.138.250"
			 );
	$ip = -1;
	my $crit = 0;
	my $warn = 0;
	my $unk = 0;
	my $size = scalar(@hosts);
	logger_debug("---------------Start Check---------------",$debug);
	foreach (@hosts) {
		$ip++;
		my $status = checkport($hosts[$ip],$port_nrpe);
		$exec_nrpe = `$nrpe -H $hosts[$ip] -p $port_nrpe -t $timeout -c $command -a $robot_name $opt_crit $opt_drive`;

		print "EXEC: $nrpe -H $hosts[$ip] -p $port_nrpe -t $timeout -c $command -a $robot_name $opt_crit $opt_drive\n" if ($opt_verbose > 0);
		logger_debug("EXEC: $nrpe -H $hosts[$ip] -p $port_nrpe -t $timeout -c $command -a $robot_name $opt_crit $opt_drive",$debug);

		my $return = $?;
		chomp($exec_nrpe);
		if ($exec_nrpe =~ /OK:/i) {
			print "Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe\n" if ($opt_verbose > 0);
			logger_debug("Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe",$debug);
			my @linha = split("\n", $exec_nrpe);
			print "$linha[0]\n";
			logger_out($exec_nrpe,$out);
			logger_debug("---------------End Check---------------",$debug);
			exit(0);
		} elsif($exec_nrpe =~/WARNING:/i){
			$warn++;
			print "Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe\n" if ($opt_verbose > 0);
			logger_debug("Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe",$debug);
			my @linha = split("\n", $exec_nrpe);
			print "$linha[0]\n";
			logger_debug("---------------End Check---------------",$debug);
			exit(1);
		} elsif ($exec_nrpe =~ /CRITICAL:/i) {
			$crit++;
			print "Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe\n" if ($opt_verbose > 0);
			logger_debug("Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe",$debug);
			my @linha = split("\n", $exec_nrpe);
			print "$linha[0]\n";
			logger_debug("---------------End Check---------------",$debug);
			exit(2);
		} else {
			print "Status Connection:($status) OUT: $hosts[$ip] : ($return) - $exec_nrpe\n" if ($opt_verbose > 0);
			logger_debug("Status Connection:($status) RESULT: $hosts[$ip] : ($return) - $exec_nrpe",$debug);
			$unk++;
		}
	}

	if ($unk > 0) {
		open (FL,"$out");
		while(<FL>) {
			print "$_";
			logger_debug("---------------End Check---------------",$debug);
			exit(0);
		}
	}
}
#--------------------------------------------------------------------------------------
sub checkport {
	my $host = shift;
	my $port = shift;
	my $result;
	my $sock = IO::Socket::INET->new(PeerAddr	=> $host,
									 PeerPort	=> $port,
									 Proto		=> 'tcp',
									 Timeout	=> 10);
	if ($sock) {
		$result = 0; #UP
	} else{
		$result = 1; #DOWN
	}
	return $result;
}
#--------------------------------------------------------------------------------------
sub getoption{
	 Getopt::Long::Configure('bundling');
	 GetOptions(
			'V|version'		=> \$opt_version,
			'c|critical=s'	=> \$opt_crit,
			'h|help'		=> \$opt_help,
			'v|verbose=i'	=> \$opt_verbose,
			'w|warning=f'	=> \$opt_warn,
			'C|command=s'	=> \$command,
			'H|host=s'		=> \$host_robot,
			'R|robot=s'		=> \$robot_name,
			'D|drive=s'		=> \$opt_drive,
		);

	 if($opt_help){
		printHelp();
		exit(1);
	 }

	 if($opt_version){
		print "$name.pl - '$version'\n";
		exit(1);
	 }

	 if(!$opt_verbose){
		$opt_verbose = 0;
	 }

	 if ((!$command)){
		printUsage();
		exit(1);
	 }
}
#--------------------------------------------------------------------------------------
sub logger_debug {
	if($debug != 0){
		my $msg = shift;
		my $log = shift;

		open(_LOG_, ">>$log");
		print _LOG_ "$localtime :: $msg\n";
		close(_LOG_);
	}
}
#--------------------------------------------------------------------------------------
sub logger_out {
	my $msg = shift;
	my $log = shift;

	open(_LOG_, ">$log");
	print _LOG_ "$msg\n";
	close(_LOG_);
}
#--------------------------------------------------------------------------------------
sub printUsage {
	 print <<EOB
Usage: $name.pl [OPTION]...

		-V, --version	Show version
		-c, --critical	 Threshold to critical
		-h, --help		 Show help
		-w, --warning	Threshold to warning

		-v, --verbose	0 = Print out to see in OpMon(Default)
						 1 = Print out in console for debug
													2 = Send log to file
EOB
}
#--------------------------------------------------------------------------------------
sub printHelp {
	my $help = <<'HELP';
	Insert help program
HELP
	print $help;
}
#--------------------------------------------------------------------------------------
&main;
