#!/usr/bin/perl -w
use strict;
use warnings;
use File::Basename qw(dirname);
use Cwd qw(abs_path);
use Data::Dumper;

our %opts = (
    'managedobject' => {
        type => "=s",
        help => "Managed object type: ClusterComputeResource, Datacenter, HostSystem or VirtualMachine",
        required => 1
    },
    'name' => {
        type => "=s",
        help => "Object's name",
        required => 1
    },
    'metric' => {
        type => "=s",
        help => "ID of the metric",
        required => 1
    },
    'warning' => {
        type => "=s",
        help => "Warning threshold",
        required => 0
    },
    'critical' => {
        type => "=s",
        help => "Critical threshold",
        required => 0
    }
);

sub warm_up_libs {
	use lib sprintf(
	    "%s/lib",
	    dirname(abs_path($0))
	);
	use OpMon::VMwareConnection;
}

sub main {
	my $conn;
	my $view;
	my $counter;
	my $poll;
	my $poll_values;
	my $counter_info;
	my $last_collect;
	my $value;
	my $val;
	my $unit_info;
	my $warning;
	my $critical;
	my $managedobject;

	warm_up_libs();
	Opts::add_options(%opts);
	Opts::parse();
	Opts::validate();

	$warning = Opts::get_option('warning');
	$critical = Opts::get_option('critical');
	$managedobject = Opts::get_option('managedobject');

	eval {
		$conn = VMwareConnection->new();
		$conn->connect();

		if ($managedobject eq "Datacenter" ||
		    $managedobject eq "ClusterComputeResource") {
			$conn->disable_refresh_rate_usage();
		}

		$view = $conn->get_view(
		    Opts::get_option('name'),
		    Opts::get_option('managedobject')
		);
		$poll = $conn->collect_counter(
		    $view,
		    Opts::get_option('metric')
		);

		$counter_info = $conn->get_counter_info(
		    Opts::get_option('metric')
		);
	};
	if ($@) {
		$@ =~ s/[\n\r-]//g;
		print sprintf("%s\n", $@);
		$conn->disconnect();
		exit 3;
	}

	$poll_values = $poll->{value};
	$last_collect = pop @$poll_values;
	$value = $last_collect->value;
	$val = pop @$value;

	# sometimes it returns -1.
	# still to be verified why
	if ($val < 0) {
		$val = 0;
	}

	$unit_info = $counter_info->{unitInfo};

	print sprintf(
	   "%s %s %s|'%s'=%s%s;;;;\n",
	   $counter_info->{nameInfo}->summary,
	   $val,
	   $unit_info->{label},
	   $unit_info->{key},
	   $val,
	   $unit_info->{label}
	);

	$conn->disconnect();
	if (!defined $warning || !defined $critical) {
		exit 0;
	}

	if ($val > $critical) {
		exit 2;
	} elsif ($val > $warning) {
		exit 1;
	}
	exit 0;
}

main();

# usage example:
#
# ./check_vmware_counter.pl                             \
#              --server 127.0.0.1                       \
#              --portnumber 2000                        \
#              --username opuser                        \
#              --password 'pass'                        \
#              --managedobject HostSystem               \
#              --name="localhost.domain.com.br"         \
#              --metric 90                              \
#              --warning 70                             \
#              --critical 90

