Compatibility SNMPv3

This commit is contained in:
Quentin Garnier 2013-01-14 17:23:56 +01:00
parent 18f94a0b8e
commit 8b5ecd0bdc

View File

@ -13,8 +13,9 @@ my $Version='1.10';
# help : ./check_snmp_process -h # help : ./check_snmp_process -h
use strict; use strict;
use Net::SNMP;
use Getopt::Long; use Getopt::Long;
require "@NAGIOS_PLUGINS@/Centreon/SNMP/Utils.pm";
############### BASE DIRECTORY FOR TEMP FILE ######## ############### BASE DIRECTORY FOR TEMP FILE ########
my $o_base_dir="/tmp/tmp_Nagios_proc."; my $o_base_dir="/tmp/tmp_Nagios_proc.";
@ -26,6 +27,16 @@ my $delta_of_time_to_make_average=300; # 5minutes by default
my $TIMEOUT = 15; my $TIMEOUT = 15;
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
my %OPTION = (
"host" => undef,
"snmp-community" => "public", "snmp-version" => 1, "snmp-port" => 161,
"snmp-auth-key" => undef, "snmp-auth-user" => undef, "snmp-auth-password" => undef, "snmp-auth-protocol" => "MD5",
"snmp-priv-key" => undef, "snmp-priv-password" => undef, "snmp-priv-protocol" => "DES",
"maxrepetitions" => undef,
"64-bits" => undef,
);
my $session_params;
# SNMP Datas # SNMP Datas
my $process_table= '1.3.6.1.2.1.25.4.2.1'; my $process_table= '1.3.6.1.2.1.25.4.2.1';
my $index_table = '1.3.6.1.2.1.25.4.2.1.1'; my $index_table = '1.3.6.1.2.1.25.4.2.1.1';
@ -37,12 +48,6 @@ my $proc_cpu_table = '1.3.6.1.2.1.25.5.1.1.1'; # Centi sec of CPU
my $proc_run_state = '1.3.6.1.2.1.25.4.2.1.7'; my $proc_run_state = '1.3.6.1.2.1.25.4.2.1.7';
# Globals # Globals
my $o_host = undef; # hostname
my $o_community =undef; # community
my $o_port = 161; # port
my $o_version2 = undef; #use snmp v2c
my $o_descr = undef; # description filter my $o_descr = undef; # description filter
my $o_warn = 0; # warning limit my $o_warn = 0; # warning limit
my @o_warnL= undef; # warning limits (min,max) my @o_warnL= undef; # warning limits (min,max)
@ -58,15 +63,6 @@ my $o_get_all= undef; # get all tables at once
my $o_param= undef; # Add process parameters for selection my $o_param= undef; # Add process parameters for selection
my $o_perf= undef; # Add performance output my $o_perf= undef; # Add performance output
my $o_timeout= 5; # Default 5s Timeout my $o_timeout= 5; # Default 5s Timeout
# SNMP V3 specific
my $o_login= undef; # snmp v3 login
my $o_passwd= undef; # snmp v3 passwd
my $v3protocols=undef; # V3 protocol list.
my $o_authproto='md5'; # Auth protocol
my $o_privproto='des'; # Priv protocol
my $o_privpass= undef; # priv password
# SNMP Message size parameter (Makina Corpus contrib)
my $o_octetlength=undef;
# Memory & CPU # Memory & CPU
my $o_mem= undef; # checks memory (max) my $o_mem= undef; # checks memory (max)
my @o_memL= undef; # warn and crit level for mem my @o_memL= undef; # warn and crit level for mem
@ -103,8 +99,7 @@ sub read_file {
my (@last_values,@file_values,$i); my (@last_values,@file_values,$i);
open(FILE,"<".$traffic_file) || return (1,0,0); open(FILE,"<".$traffic_file) || return (1,0,0);
while($ligne = <FILE>) while($ligne = <FILE>) {
{
chomp($ligne); chomp($ligne);
@file_values = split(":",$ligne); @file_values = split(":",$ligne);
#verb("@file_values"); #verb("@file_values");
@ -159,13 +154,6 @@ sub help {
Login and auth password for snmpv3 authentication Login and auth password for snmpv3 authentication
If no priv password exists, implies AuthNoPriv If no priv password exists, implies AuthNoPriv
-2 : use snmp v2c -2 : use snmp v2c
-X, --privpass=PASSWD
Priv password for snmpv3 (AuthPriv protocol)
-L, --protocols=<authproto>,<privproto>
<authproto> : Authentication protocol (md5|sha : default md5)
<privproto> : Priv protocole (des|aes : default des)
-p, --port=PORT
SNMP port (Default 161)
-n, --name=NAME -n, --name=NAME
Name of the process (regexp) Name of the process (regexp)
No trailing slash ! No trailing slash !
@ -205,10 +193,6 @@ Notes on warning and critical :
In some cases, it is necessary to get all data at once because In some cases, it is necessary to get all data at once because
process die very frequently. process die very frequently.
This option eats bandwidth an cpu (for remote host) at breakfast. This option eats bandwidth an cpu (for remote host) at breakfast.
-o, --octetlength=INTEGER
max-size of the SNMP message, usefull in case of Too Long responses.
Be carefull with network filters. Range 484 - 65535, default are
usually 1472,1452,1460 or 1440.
-t, --timeout=INTEGER -t, --timeout=INTEGER
timeout for SNMP in seconds (Default: 5) timeout for SNMP in seconds (Default: 5)
-V, --version -V, --version
@ -229,15 +213,22 @@ sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
sub check_options { sub check_options {
Getopt::Long::Configure ("bundling"); Getopt::Long::Configure ("bundling");
GetOptions( GetOptions(
"H|hostname|host=s" => \$OPTION{'host'},
"C|community=s" => \$OPTION{'snmp-community'},
"snmp|snmp-version=s" => \$OPTION{'snmp-version'},
"p|port|P|snmpport|snmp-port=i" => \$OPTION{'snmp-port'},
"l|login|username=s" => \$OPTION{'snmp-auth-user'},
"x|passwd|authpassword|password=s" => \$OPTION{'snmp-auth-password'},
"k|authkey=s" => \$OPTION{'snmp-auth-key'},
"authprotocol=s" => \$OPTION{'snmp-auth-protocol'},
"privpassword=s" => \$OPTION{'snmp-priv-password'},
"privkey=s" => \$OPTION{'snmp-priv-key'},
"privprotocol=s" => \$OPTION{'snmp-priv-protocol'},
"maxrepetitions=s" => \$OPTION{'maxrepetitions'},
"64-bits" => \$OPTION{'64-bits'},
'v' => \$o_verb, 'verbose' => \$o_verb, 'v' => \$o_verb, 'verbose' => \$o_verb,
'h' => \$o_help, 'help' => \$o_help, 'h' => \$o_help, 'help' => \$o_help,
'H:s' => \$o_host, 'hostname:s' => \$o_host,
'p:i' => \$o_port, 'port:i' => \$o_port,
'C:s' => \$o_community, 'community:s' => \$o_community,
'l:s' => \$o_login, 'login:s' => \$o_login,
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
'c:s' => \$o_crit, 'critical:s' => \$o_crit, 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
'w:s' => \$o_warn, 'warn:s' => \$o_warn, 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
@ -247,8 +238,6 @@ sub check_options {
'm:s' => \$o_mem, 'memory:s' => \$o_mem, 'm:s' => \$o_mem, 'memory:s' => \$o_mem,
'a' => \$o_mem_avg, 'average' => \$o_mem_avg, 'a' => \$o_mem_avg, 'average' => \$o_mem_avg,
'u:s' => \$o_cpu, 'cpu' => \$o_cpu, 'u:s' => \$o_cpu, 'cpu' => \$o_cpu,
'2' => \$o_version2, 'v2c' => \$o_version2,
'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength,
'g' => \$o_get_all, 'getall' => \$o_get_all, 'g' => \$o_get_all, 'getall' => \$o_get_all,
'A' => \$o_param, 'param' => \$o_param, 'A' => \$o_param, 'param' => \$o_param,
'F' => \$o_perf, 'perfout' => \$o_perf, 'F' => \$o_perf, 'perfout' => \$o_perf,
@ -258,23 +247,12 @@ sub check_options {
if (defined ($o_help)) { help(); exit $ERRORS{"UNKNOWN"}}; if (defined ($o_help)) { help(); exit $ERRORS{"UNKNOWN"}};
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
# check snmp information # check snmp information
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ) ($session_params) = Centreon::SNMP::Utils::check_snmp_options($ERRORS{'UNKNOWN'}, \%OPTION);
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
{ print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
if (defined ($v3protocols)) {
if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
my @v3proto=split(/,/,$v3protocols);
if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
}
if (defined($o_timeout) && (isnotnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60))) if (defined($o_timeout) && (isnotnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
if (!defined($o_timeout)) {$o_timeout=5;} if (!defined($o_timeout)) {$o_timeout=5;}
# Check compulsory attributes # Check compulsory attributes
if ( ! defined($o_descr) || ! defined($o_host) ) { print_usage(); exit $ERRORS{"UNKNOWN"}}; if ( ! defined($o_descr) ) { print_usage(); exit $ERRORS{"UNKNOWN"}};
@o_warnL=split(/,/,$o_warn); @o_warnL=split(/,/,$o_warn);
@o_critL=split(/,/,$o_crit); @o_critL=split(/,/,$o_crit);
verb("$o_warn $o_crit $#o_warnL $#o_critL"); verb("$o_warn $o_crit $#o_warnL $#o_critL");
@ -314,10 +292,6 @@ sub check_options {
if ($o_cpuL[0]>$o_cpuL[1]) if ($o_cpuL[0]>$o_cpuL[1])
{print "Warning must be <= Critical for cpu!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}; {print "Warning must be <= Critical for cpu!\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
} }
#### octet length checks
if (defined ($o_octetlength) && (isnotnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) {
print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"};
}
} }
########## MAIN ####### ########## MAIN #######
@ -333,139 +307,33 @@ if (defined($TIMEOUT)) {
alarm ($o_timeout+10); alarm ($o_timeout+10);
} }
# Connect to host my $session = Centreon::SNMP::Utils::connection($ERRORS{'UNKNOWN'}, $session_params);
my ($session,$error);
if ( defined($o_login) && defined($o_passwd)) {
# SNMPv3 login
if (!defined ($o_privpass)) {
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
($session, $error) = Net::SNMP->session(
-hostname => $o_host,
-version => '3',
-port => $o_port,
-username => $o_login,
-authpassword => $o_passwd,
-authprotocol => $o_authproto,
-timeout => $o_timeout
);
} else {
verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
($session, $error) = Net::SNMP->session(
-hostname => $o_host,
-version => '3',
-username => $o_login,
-port => $o_port,
-authpassword => $o_passwd,
-authprotocol => $o_authproto,
-privpassword => $o_privpass,
-privprotocol => $o_privproto,
-timeout => $o_timeout
);
}
} else {
if (defined ($o_version2)) {
# SNMPv2 Login
($session, $error) = Net::SNMP->session(
-hostname => $o_host,
-version => 2,
-community => $o_community,
-port => $o_port,
-timeout => $o_timeout
);
} else {
# SNMPV1 login
($session, $error) = Net::SNMP->session(
-hostname => $o_host,
-community => $o_community,
-port => $o_port,
-timeout => $o_timeout
);
}
}
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit $ERRORS{"UNKNOWN"};
}
if (defined($o_octetlength)) {
my $oct_resultat=undef;
my $oct_test= $session->max_msg_size();
verb(" actual max octets:: $oct_test");
$oct_resultat = $session->max_msg_size($o_octetlength);
if (!defined($oct_resultat)) {
printf("ERROR: Session settings : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
}
$oct_test= $session->max_msg_size();
verb(" new max octets:: $oct_test");
}
# Look for process in name or path name table # Look for process in name or path name table
my $resultat=undef; my $resultat=undef;
my %result_cons=(); my %result_cons=();
my ($getall_run,$getall_cpu,$getall_mem)=(undef,undef,undef); my ($getall_run,$getall_cpu,$getall_mem)=(undef,undef,undef);
if ( !defined ($o_path) ) { if ( !defined ($o_path) ) {
$resultat = (Net::SNMP->VERSION < 4) ? $resultat = Centreon::SNMP::Utils::get_snmp_table($run_name_table, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($run_name_table)
: $session->get_table(Baseoid => $run_name_table);
} else { } else {
$resultat = (Net::SNMP->VERSION < 4) ? $resultat = Centreon::SNMP::Utils::get_snmp_table($run_path_table, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($run_path_table)
:$session->get_table(Baseoid => $run_path_table);
}
if (!defined($resultat)) {
printf("ERROR: Process name table : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
} }
my $resultat_param=undef; my $resultat_param=undef;
if (defined($o_param)) { # Get parameter table too if (defined($o_param)) { # Get parameter table too
$resultat_param = (Net::SNMP->VERSION < 4) ? $resultat_param = Centreon::SNMP::Utils::get_snmp_table($run_param_table, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($run_param_table)
:$session->get_table(Baseoid => $run_param_table);
if (!defined($resultat_param)) {
printf("ERROR: Process param table : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
}
} }
if (defined ($o_get_all)) { if (defined ($o_get_all)) {
$getall_run = (Net::SNMP->VERSION < 4) ? $getall_run = Centreon::SNMP::Utils::get_snmp_table($proc_run_state, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($proc_run_state )
:$session->get_table(Baseoid => $proc_run_state );
if (!defined($getall_run)) {
printf("ERROR: Process run table : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
}
foreach my $key ( keys %$getall_run) { foreach my $key ( keys %$getall_run) {
$result_cons{$key}=$$getall_run{$key}; $result_cons{$key}=$$getall_run{$key};
} }
$getall_cpu = (Net::SNMP->VERSION < 4) ? $getall_cpu = Centreon::SNMP::Utils::get_snmp_table($proc_cpu_table, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($proc_cpu_table)
: $session->get_table(Baseoid => $proc_cpu_table);
if (!defined($getall_cpu)) {
printf("ERROR: Process cpu table : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
}
foreach my $key ( keys %$getall_cpu) { foreach my $key ( keys %$getall_cpu) {
$result_cons{$key}=$$getall_cpu{$key}; $result_cons{$key}=$$getall_cpu{$key};
} }
$getall_mem = (Net::SNMP->VERSION < 4) ? $getall_mem = Centreon::SNMP::Utils::get_snmp_table($proc_mem_table, $session, $ERRORS{'UNKNOWN'}, \%OPTION);
$session->get_table($proc_mem_table)
: $session->get_table(Baseoid => $proc_mem_table);
if (!defined($getall_mem)) {
printf("ERROR: Process memory table : %s.\n", $session->error);
$session->close;
exit $ERRORS{"UNKNOWN"};
}
foreach my $key ( keys %$getall_mem) { foreach my $key ( keys %$getall_mem) {
$result_cons{$key}=$$getall_mem{$key}; $result_cons{$key}=$$getall_mem{$key};
} }
@ -539,30 +407,17 @@ if (!defined ($o_get_all)) {
$toid[$i]=$oids[$i+$tmp_index]; $toid[$i]=$oids[$i+$tmp_index];
#verb("$i : $toid[$i] : $oids[$i+$tmp_index]"); #verb("$i : $toid[$i] : $oids[$i+$tmp_index]");
} }
$tmp_result = (Net::SNMP->VERSION < 4) ? $tmp_result = Centreon::SNMP::Utils::get_snmp_leef(\@toid, $session, $ERRORS{'UNKNOWN'});
$session->get_request(@toid)
: $session->get_request(Varbindlist => \@toid);
if (!defined($tmp_result)) { printf("ERROR: running table : %s.\n", $session->error); $session->close;
exit $ERRORS{"UNKNOWN"};
}
foreach (@toid) { $result_cons{$_}=$$tmp_result{$_}; } foreach (@toid) { $result_cons{$_}=$$tmp_result{$_}; }
$tmp_count-=$tmp_num; $tmp_count-=$tmp_num;
$tmp_index+=$tmp_num; $tmp_index+=$tmp_num;
} }
} else { } else {
$result = (Net::SNMP->VERSION < 4) ? my $tmp_result = Centreon::SNMP::Utils::get_snmp_leef(\@oids, $session, $ERRORS{'UNKNOWN'});
$session->get_request(@oids) foreach (@oids) {$result_cons{$_}=$$tmp_result{$_};}
: $session->get_request(Varbindlist => \@oids);
if (!defined($result)) { printf("ERROR: running table : %s.\n", $session->error); $session->close;
exit $ERRORS{"UNKNOWN"};
}
foreach (@oids) {$result_cons{$_}=$$result{$_};}
} }
} }
$session->close;
#Check if process are in running or runnable state #Check if process are in running or runnable state
for (my $i=0; $i< $num_int; $i++) { for (my $i=0; $i< $num_int; $i++) {
my $state=$result_cons{$proc_run_state . "." . $tindex[$i]}; my $state=$result_cons{$proc_run_state . "." . $tindex[$i]};
@ -628,7 +483,7 @@ if (defined ($o_cpu) ) {
#### Read file #### Read file
$temp_file_name=$o_descr; $temp_file_name=$o_descr;
$temp_file_name =~ s/ /_/g; $temp_file_name =~ s/ /_/g;
$temp_file_name = $o_base_dir . $o_host ."." . $temp_file_name; $temp_file_name = $o_base_dir . $OPTION{'host'} ."." . $temp_file_name;
# First, read entire file # First, read entire file
my @ret_array=read_file($temp_file_name,$n_items_check); my @ret_array=read_file($temp_file_name,$n_items_check);
$return = shift(@ret_array); $return = shift(@ret_array);
@ -714,4 +569,3 @@ if ($final_status==2) { exit $ERRORS{"CRITICAL"};}
if ($final_status==1) { exit $ERRORS{"WARNING"};} if ($final_status==1) { exit $ERRORS{"WARNING"};}
if ($final_status==3) { exit $ERRORS{"UNKNOWN"};} if ($final_status==3) { exit $ERRORS{"UNKNOWN"};}
exit $ERRORS{"OK"}; exit $ERRORS{"OK"};