#!/usr/bin/perl
#################################
# Version 	0.2b
# Date	02:22 PM 2008/09/12
#Author	Paul Slabbert
#################################

use strict;
use Net::SNMP;
use Getopt::Long;

use lib "/usr/local/opmon/libexec";
use utils qw(%ERRORS $TIMEOUT);

our %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
#################################
# VARS
my $uptime='.1.3.6.1.2.1.1.3.0';
my $systime='.1.3.6.1.2.1.25.1.2.0';
my $host= "";
my $community= "";
my $port=161;
our $warn;
our $crit;
my $timeout=20;

my $session;
our $error=undef;
our $perfout = undef;
our $minute;
my $state;

#################################


sub print_usage {
    print "Usage: $0 -H <host> -C <snmp_community> [-p <port>] -w <warn levels> -c<crit levels> \n";
}

sub check_options {
    Getopt::Long::Configure ("bundling");
	GetOptions(
	"H=s"=>\$host,
	'C=s' => \$community,
	'p=i' => \$port,
	'w=s' => \$warn,
	'c=s' => \$crit,
	);
	if (!defined($host)){
		print"Must define Host name\n";
		print_usage();
		exit $ERRORS{"UNKNOWN"}
	}
	
	if (!defined($community)){
		print"Must define Community String\n";
		print_usage();
		exit $ERRORS{"UNKNOWN"}
	}

	if (!defined($warn)){
		print"Must define warn\n";
		print_usage();
		exit $ERRORS{"UNKNOWN"}
	}
	if (!defined($crit)){
		print"Must define critical\n";
		print_usage();
		exit $ERRORS{"UNKNOWN"}
	}

}#end check options

sub get_uptime(){

my $resultat=undef;
my $result;

   # SNMP1 Login
	 #verb("SNMP v1 login");
	 ($session, $error) = Net::SNMP->session(
	-hostname  => $host,
	-community => $community,
	-port      => $port,
	-timeout   => $timeout
	);
#error handle for connection error	
	if (!defined($session)) {
	   printf("ERROR opening session: %s.\n", $error);
	   exit $ERRORS{"UNKNOWN"};
	}

	$resultat=$session->get_request($uptime);

#error handle for OID error
	if (!defined($resultat)) {
		printf("ERROR: Description table : %s.\n", $session->error);
		$session->close;
		exit $ERRORS{"UNKNOWN"};
	}
	$session->close;
	
        $result=$resultat->{$uptime};
	if($result=~ m/(\d+)\sdays,\s(\d+):(\d+)/){
	
		$minute=($1*1440)+($2*60)+$3;
	
	}
	elsif($result=~ m/\s(\d+):(\d+)/){
		$minute=($1*60)+$2;
	}
	$perfout=$resultat->{$uptime};

	# STRING: 2009-5-25,12:3:36.0,-3:0
	my $return = `snmpget -v1 -c $community $host $systime -Ov 2>&1`;
	if ($return =~ m/(\d+)\-(\d+)\-(\d+),(\d+):(\d+):(\d+)/){
		$perfout .= " SystemDate($3/$2/$1 $4:$5:$6)"; 
	}
	
	
}#end Get_uptime

sub warn_crit(){
#can have critical changing to warning
#critical
	if($minute<$crit){
		$perfout="CRITICAL - Device Rebooted $perfout | uptime=$minute;$warn;$crit;0;\n";
		$state=$ERRORS{"CRITICAL"};
	}
#warning
	elsif($minute<$warn){
		$perfout="WARNING - Device Rebooted $perfout | uptime=$minute;$warn;$crit;0;\n";
		$state=$ERRORS{"WARNING"};
	}
#OK	
	if($minute=>$crit){
		$perfout="OK - Device UP $perfout | uptime=$minute;$warn;$crit;0;\n";
		$state=$ERRORS{"OK"};
	}
}

#end warn_crit
### start main ###

check_options();
get_uptime();
warn_crit();

print $perfout;
exit($state);
