initial commit
This commit is contained in:
713
check_snmp_load.pl
Executable file
713
check_snmp_load.pl
Executable file
@@ -0,0 +1,713 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
############################## check_snmp_load #################
|
||||||
|
my $Version='1.12';
|
||||||
|
# Date : Oct 12 2007
|
||||||
|
# Author : Patrick Proy ( patrick at proy.org)
|
||||||
|
# Help : http://nagios.manubulon.com/
|
||||||
|
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||||
|
# Contributors : F. Lacroix and many others !!!
|
||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
# Help : ./check_snmp_load.pl -h
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Net::SNMP;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
# Nagios specific
|
||||||
|
|
||||||
|
my $TIMEOUT = 15;
|
||||||
|
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||||
|
|
||||||
|
# SNMP Datas
|
||||||
|
|
||||||
|
# Generic with host-ressource-mib
|
||||||
|
my $base_proc = "1.3.6.1.2.1.25.3.3.1"; # oid for all proc info
|
||||||
|
my $proc_id = "1.3.6.1.2.1.25.3.3.1.1"; # list of processors (product ID)
|
||||||
|
my $proc_load = "1.3.6.1.2.1.25.3.3.1.2"; # %time the proc was not idle over last minute
|
||||||
|
|
||||||
|
# Linux load
|
||||||
|
|
||||||
|
my $linload_table= "1.3.6.1.4.1.2021.10.1"; # net-snmp load table
|
||||||
|
my $linload_name = "1.3.6.1.4.1.2021.10.1.2"; # text 'Load-1','Load-5', 'Load-15'
|
||||||
|
my $linload_load = "1.3.6.1.4.1.2021.10.1.3"; # effective load table
|
||||||
|
|
||||||
|
# Cisco cpu/load
|
||||||
|
|
||||||
|
my $cisco_cpu_5m = "1.3.6.1.4.1.9.2.1.58.0"; # Cisco CPU load (5min %)
|
||||||
|
my $cisco_cpu_1m = "1.3.6.1.4.1.9.2.1.57.0"; # Cisco CPU load (1min %)
|
||||||
|
my $cisco_cpu_5s = "1.3.6.1.4.1.9.2.1.56.0"; # Cisco CPU load (5sec %)
|
||||||
|
|
||||||
|
# Cisco catalyst cpu/load
|
||||||
|
|
||||||
|
my $ciscocata_cpu_5m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.5.9"; # Cisco CPU load (5min %)
|
||||||
|
my $ciscocata_cpu_1m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.3.9"; # Cisco CPU load (1min %)
|
||||||
|
my $ciscocata_cpu_5s = ".1.3.6.1.4.1.9.9.109.1.1.1.1.4.9"; # Cisco CPU load (5sec %)
|
||||||
|
|
||||||
|
# Netscreen cpu/load
|
||||||
|
|
||||||
|
my $nsc_cpu_5m = "1.3.6.1.4.1.3224.16.1.4.0"; # NS CPU load (5min %)
|
||||||
|
my $nsc_cpu_1m = "1.3.6.1.4.1.3224.16.1.2.0"; # NS CPU load (1min %)
|
||||||
|
my $nsc_cpu_5s = "1.3.6.1.4.1.3224.16.1.3.0"; # NS CPU load (5sec %)
|
||||||
|
|
||||||
|
# AS/400 CPU
|
||||||
|
|
||||||
|
my $as400_cpu = "1.3.6.1.4.1.2.6.4.5.1.0"; # AS400 CPU load (10000=100%);
|
||||||
|
|
||||||
|
# Net-SNMP CPU
|
||||||
|
|
||||||
|
my $ns_cpu_idle = "1.3.6.1.4.1.2021.11.11.0"; # Net-snmp cpu idle
|
||||||
|
my $ns_cpu_user = "1.3.6.1.4.1.2021.11.9.0"; # Net-snmp user cpu usage
|
||||||
|
my $ns_cpu_system = "1.3.6.1.4.1.2021.11.10.0"; # Net-snmp system cpu usage
|
||||||
|
|
||||||
|
# Procurve CPU
|
||||||
|
my $procurve_cpu = "1.3.6.1.4.1.11.2.14.11.5.1.9.6.1.0"; # Procurve CPU Counter
|
||||||
|
|
||||||
|
# Nokia CPU
|
||||||
|
my $nokia_cpu = "1.3.6.1.4.1.94.1.21.1.7.1.0"; # Nokia CPU % usage
|
||||||
|
|
||||||
|
# Bluecoat Appliance
|
||||||
|
my $bluecoat_cpu = "1.3.6.1.4.1.3417.2.4.1.1.1.4.1"; # Bluecoat %cpu usage.
|
||||||
|
|
||||||
|
# Fortigate CPU
|
||||||
|
my $fortigate_cpu = ".1.3.6.1.4.1.12356.1.8.0"; # Fortigate CPU % usage
|
||||||
|
|
||||||
|
# Linkproof Appliance
|
||||||
|
my $linkproof_cpu= "1.3.6.1.4.1.89.35.1.55.0"; # CPU RE (Routing Engine Tasks)
|
||||||
|
# 1.3.6.1.4.1.89.35.1.53.0 : Ressource utilisation (%) Considers network utilization and internal CPU utilization
|
||||||
|
# 1.3.6.1.4.1.89.35.1.54 : CPU only (%)
|
||||||
|
# 1.3.6.1.4.1.89.35.1.55 : network only (%)
|
||||||
|
|
||||||
|
# HP-UX cpu usage (thanks to krizb for the OIDs).
|
||||||
|
my $hpux_load_1_min="1.3.6.1.4.1.11.2.3.1.1.3.0";
|
||||||
|
my $hpux_load_5_min="1.3.6.1.4.1.11.2.3.1.1.4.0";
|
||||||
|
my $hpux_load_15_min="1.3.6.1.4.1.11.2.3.1.1.5.0";
|
||||||
|
|
||||||
|
# valid values
|
||||||
|
my @valid_types = ("stand","netsc","netsl","as400","cisco","cata","nsc","fg","bc","nokia","hp","lp","hpux");
|
||||||
|
# CPU OID array
|
||||||
|
my %cpu_oid = ("netsc",$ns_cpu_idle,"as400",$as400_cpu,"bc",$bluecoat_cpu,"nokia",$nokia_cpu,"hp",$procurve_cpu,"lp",$linkproof_cpu,"fg",$fortigate_cpu);
|
||||||
|
|
||||||
|
# Globals
|
||||||
|
|
||||||
|
|
||||||
|
my $o_host = undef; # hostname
|
||||||
|
my $o_community = undef; # community
|
||||||
|
my $o_port = 161; # port
|
||||||
|
my $o_help= undef; # wan't some help ?
|
||||||
|
my $o_verb= undef; # verbose mode
|
||||||
|
my $o_version= undef; # print version
|
||||||
|
# check type : stand | netsc | netsl | as400 | cisco | cata | nsc | fg | bc | nokia | hp | lp | hpux
|
||||||
|
my $o_check_type= "stand";
|
||||||
|
# End compatibility
|
||||||
|
my $o_warn= undef; # warning level
|
||||||
|
my @o_warnL= undef; # warning levels for Linux Load or Cisco CPU
|
||||||
|
my $o_crit= undef; # critical level
|
||||||
|
my @o_critL= undef; # critical level for Linux Load or Cisco CPU
|
||||||
|
my $o_timeout= undef; # Timeout (Default 5)
|
||||||
|
my $o_perf= undef; # Output performance data
|
||||||
|
my $o_version2= undef; # use snmp v2c
|
||||||
|
# SNMPv3 specific
|
||||||
|
my $o_login= undef; # Login for snmpv3
|
||||||
|
my $o_passwd= undef; # Pass for snmpv3
|
||||||
|
my $v3protocols=undef; # V3 protocol list.
|
||||||
|
my $o_authproto='md5'; # Auth protocol
|
||||||
|
my $o_privproto='des'; # Priv protocol
|
||||||
|
my $o_privpass= undef; # priv password
|
||||||
|
|
||||||
|
# functions
|
||||||
|
|
||||||
|
sub p_version { print "check_snmp_load version : $Version\n"; }
|
||||||
|
|
||||||
|
sub print_usage {
|
||||||
|
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -w <warn level> -c <crit level> -T=[stand|netsl|netsc|as400|cisco|cata|nsc|fg|bc|nokia|hp|lp|hpux] [-f] [-t <timeout>] [-V]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub isnnum { # Return true if arg is not a number
|
||||||
|
my $num = shift;
|
||||||
|
if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub help {
|
||||||
|
print "\nSNMP Load & CPU Monitor for Nagios version ",$Version,"\n";
|
||||||
|
print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
|
||||||
|
print_usage();
|
||||||
|
print <<EOT;
|
||||||
|
-v, --verbose
|
||||||
|
print extra debugging information
|
||||||
|
-h, --help
|
||||||
|
print this help message
|
||||||
|
-H, --hostname=HOST
|
||||||
|
name or IP address of host to check
|
||||||
|
-C, --community=COMMUNITY NAME
|
||||||
|
community name for the host's SNMP agent (implies v1 protocol)
|
||||||
|
-2, --v2c
|
||||||
|
Use snmp v2c
|
||||||
|
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||||
|
Login and auth password for snmpv3 authentication
|
||||||
|
If no priv password exists, implies AuthNoPriv
|
||||||
|
-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)
|
||||||
|
-w, --warn=INTEGER | INT,INT,INT
|
||||||
|
1 value check : warning level for cpu in percent (on one minute)
|
||||||
|
3 value check : comma separated level for load or cpu for 1min, 5min, 15min
|
||||||
|
-c, --crit=INTEGER | INT,INT,INT
|
||||||
|
critical level for cpu in percent (on one minute)
|
||||||
|
1 value check : critical level for cpu in percent (on one minute)
|
||||||
|
3 value check : comma separated level for load or cpu for 1min, 5min, 15min
|
||||||
|
-T, --type=stand|netsl|netsc|as400|cisco|bc|nokia|hp|lp
|
||||||
|
CPU check :
|
||||||
|
stand : standard MIBII (works with Windows),
|
||||||
|
can handle multiple CPU.
|
||||||
|
netsl : linux load provided by Net SNMP (1,5 & 15 minutes values)
|
||||||
|
netsc : cpu usage given by net-snmp (100-idle)
|
||||||
|
as400 : as400 CPU usage
|
||||||
|
cisco : Cisco CPU usage
|
||||||
|
cata : Cisco catalyst CPU usage
|
||||||
|
nsc : NetScreen CPU usage
|
||||||
|
fg : Fortigate CPU usage
|
||||||
|
bc : Bluecoat CPU usage
|
||||||
|
nokia : Nokia CPU usage
|
||||||
|
hp : HP procurve switch CPU usage
|
||||||
|
lp : Linkproof CPU usage
|
||||||
|
hpux : HP-UX load (1,5 & 15 minutes values)
|
||||||
|
-f, --perfparse
|
||||||
|
Perfparse compatible output
|
||||||
|
-t, --timeout=INTEGER
|
||||||
|
timeout for SNMP in seconds (Default: 5)
|
||||||
|
-V, --version
|
||||||
|
prints version number
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
# For verbose output
|
||||||
|
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||||
|
|
||||||
|
sub check_options {
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
GetOptions(
|
||||||
|
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||||
|
'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,
|
||||||
|
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||||
|
'V' => \$o_version, 'version' => \$o_version,
|
||||||
|
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||||
|
'c:s' => \$o_crit, 'critical:s' => \$o_crit,
|
||||||
|
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||||
|
'f' => \$o_perf, 'perfparse' => \$o_perf,
|
||||||
|
'T:s' => \$o_check_type, 'type:s' => \$o_check_type
|
||||||
|
);
|
||||||
|
# check the -T option
|
||||||
|
my $T_option_valid=0;
|
||||||
|
foreach (@valid_types) { if ($_ eq $o_check_type) {$T_option_valid=1} };
|
||||||
|
if ( $T_option_valid == 0 )
|
||||||
|
{print "Invalid check type (-T)!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# Basic checks
|
||||||
|
if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
|
||||||
|
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if (!defined($o_timeout)) {$o_timeout=5;}
|
||||||
|
if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if ( ! defined($o_host) ) # check host and filter
|
||||||
|
{ print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# check snmp information
|
||||||
|
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||||
|
{ 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"}}
|
||||||
|
}
|
||||||
|
# Check warnings and critical
|
||||||
|
if (!defined($o_warn) || !defined($o_crit))
|
||||||
|
{ print "put warning and critical info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# Get rid of % sign
|
||||||
|
$o_warn =~ s/\%//g;
|
||||||
|
$o_crit =~ s/\%//g;
|
||||||
|
# Check for multiple warning and crit in case of -L
|
||||||
|
if (($o_check_type eq "netsl") || ($o_check_type eq "cisco") || ($o_check_type eq "cata") ||
|
||||||
|
($o_check_type eq "nsc") || ($o_check_type eq "hpux")) {
|
||||||
|
@o_warnL=split(/,/ , $o_warn);
|
||||||
|
@o_critL=split(/,/ , $o_crit);
|
||||||
|
if (($#o_warnL != 2) || ($#o_critL != 2))
|
||||||
|
{ print "3 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
|
||||||
|
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if ($o_warnL[$i] > $o_critL[$i])
|
||||||
|
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (($o_warn =~ /,/) || ($o_crit =~ /,/)) {
|
||||||
|
{ print "Multiple warning/critical levels not available for this check\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
}
|
||||||
|
if ( isnnum($o_warn) || isnnum($o_crit) )
|
||||||
|
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if ($o_warn > $o_crit)
|
||||||
|
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
########## MAIN #######
|
||||||
|
|
||||||
|
check_options();
|
||||||
|
|
||||||
|
# Check gobal timeout if snmp screws up
|
||||||
|
if (defined($TIMEOUT)) {
|
||||||
|
verb("Alarm at $TIMEOUT + 5");
|
||||||
|
alarm($TIMEOUT+5);
|
||||||
|
} else {
|
||||||
|
verb("no global timeout defined : $o_timeout + 10");
|
||||||
|
alarm ($o_timeout+10);
|
||||||
|
}
|
||||||
|
|
||||||
|
$SIG{'ALRM'} = sub {
|
||||||
|
print "No answer from host\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Connect to host
|
||||||
|
my ($session,$error);
|
||||||
|
if ( defined($o_login) && defined($o_passwd)) {
|
||||||
|
# SNMPv3 login
|
||||||
|
verb("SNMPv3 login");
|
||||||
|
if (!defined ($o_privpass)) {
|
||||||
|
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-version => '3',
|
||||||
|
-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,
|
||||||
|
-authpassword => $o_passwd,
|
||||||
|
-authprotocol => $o_authproto,
|
||||||
|
-privpassword => $o_privpass,
|
||||||
|
-privprotocol => $o_privproto,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (defined ($o_version2)) {
|
||||||
|
# SNMPv2 Login
|
||||||
|
verb("SNMP v2c login");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-version => 2,
|
||||||
|
-community => $o_community,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
# SNMPV1 login
|
||||||
|
verb("SNMP v1 login");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-community => $o_community,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined($session)) {
|
||||||
|
printf("ERROR opening session: %s.\n", $error);
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my $exit_val=undef;
|
||||||
|
########### Linux load check ##############
|
||||||
|
|
||||||
|
if ($o_check_type eq "netsl") {
|
||||||
|
|
||||||
|
verb("Checking linux load");
|
||||||
|
# Get load table
|
||||||
|
my $resultat = $session->get_table(Baseoid => $linload_table);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
my @load = undef;
|
||||||
|
my @iload = undef;
|
||||||
|
my @oid=undef;
|
||||||
|
my $exist=0;
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
if ( $key =~ /$linload_name/ ) {
|
||||||
|
@oid=split (/\./,$key);
|
||||||
|
$iload[0]= pop(@oid) if ($$resultat{$key} eq "Load-1");
|
||||||
|
$iload[1]= pop(@oid) if ($$resultat{$key} eq "Load-5");
|
||||||
|
$iload[2]= pop(@oid) if ($$resultat{$key} eq "Load-15");
|
||||||
|
$exist=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($exist == 0) {
|
||||||
|
print "Can't find snmp information on load : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (my $i=0;$i<3;$i++) { $load[$i] = $$resultat{$linload_load . "." . $iload[$i]}};
|
||||||
|
|
||||||
|
print "Load : $load[0] $load[1] $load[2] :";
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( $load[$i] > $o_critL[$i] ) {
|
||||||
|
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $load[$i] > $o_warnL[$i] ) {
|
||||||
|
# output warn error only if no critical was found
|
||||||
|
if ($exit_val eq $ERRORS{"OK"}) {
|
||||||
|
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
print " | load_1_min=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||||
|
print "load_5_min=$load[1];$o_warnL[1];$o_critL[1] ";
|
||||||
|
print "load_15_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||||
|
} else {
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
exit $exit_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
############## Cisco CPU check ################
|
||||||
|
|
||||||
|
if ($o_check_type eq "cisco") {
|
||||||
|
my @oidlists = ($cisco_cpu_5m, $cisco_cpu_1m, $cisco_cpu_5s);
|
||||||
|
my $resultat = $session->get_request(-varbindlist => \@oidlists);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
if (!defined ($$resultat{$cisco_cpu_5s})) {
|
||||||
|
print "No CPU information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my @load = undef;
|
||||||
|
|
||||||
|
$load[0]=$$resultat{$cisco_cpu_5s};
|
||||||
|
$load[1]=$$resultat{$cisco_cpu_1m};
|
||||||
|
$load[2]=$$resultat{$cisco_cpu_5m};
|
||||||
|
|
||||||
|
print "CPU : $load[0] $load[1] $load[2] :";
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( $load[$i] > $o_critL[$i] ) {
|
||||||
|
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $load[$i] > $o_warnL[$i] ) {
|
||||||
|
# output warn error only if no critical was found
|
||||||
|
if ($exit_val eq $ERRORS{"OK"}) {
|
||||||
|
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
print " | load_5_sec=$load[0]%;$o_warnL[0];$o_critL[0] ";
|
||||||
|
print "load_1_min=$load[1]%;$o_warnL[1];$o_critL[1] ";
|
||||||
|
print "load_5_min=$load[2]%;$o_warnL[2];$o_critL[2]\n";
|
||||||
|
} else {
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $exit_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
############## Cisco Catalyst CPU check ################
|
||||||
|
|
||||||
|
if ($o_check_type eq "cata") {
|
||||||
|
my @oidlists = ($ciscocata_cpu_5m, $ciscocata_cpu_1m, $ciscocata_cpu_5s);
|
||||||
|
my $resultat = $session->get_request(-varbindlist => \@oidlists);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
if (!defined ($$resultat{$ciscocata_cpu_5s})) {
|
||||||
|
print "No CPU information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my @load = undef;
|
||||||
|
|
||||||
|
$load[0]=$$resultat{$ciscocata_cpu_5s};
|
||||||
|
$load[1]=$$resultat{$ciscocata_cpu_1m};
|
||||||
|
$load[2]=$$resultat{$ciscocata_cpu_5m};
|
||||||
|
|
||||||
|
print "CPU : $load[0] $load[1] $load[2] :";
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( $load[$i] > $o_critL[$i] ) {
|
||||||
|
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $load[$i] > $o_warnL[$i] ) {
|
||||||
|
# output warn error only if no critical was found
|
||||||
|
if ($exit_val eq $ERRORS{"OK"}) {
|
||||||
|
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
print " | load_5_sec=$load[0]%;$o_warnL[0];$o_critL[0] ";
|
||||||
|
print "load_1_min=$load[1]%;$o_warnL[1];$o_critL[1] ";
|
||||||
|
print "load_5_min=$load[2]%;$o_warnL[2];$o_critL[2]\n";
|
||||||
|
} else {
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $exit_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
############## Netscreen CPU check ################
|
||||||
|
|
||||||
|
if ($o_check_type eq "nsc") {
|
||||||
|
my @oidlists = ($nsc_cpu_5m, $nsc_cpu_1m, $nsc_cpu_5s);
|
||||||
|
my $resultat = $session->get_request(-varbindlist => \@oidlists);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
if (!defined ($$resultat{$nsc_cpu_5s})) {
|
||||||
|
print "No CPU information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my @load = undef;
|
||||||
|
|
||||||
|
$load[0]=$$resultat{$nsc_cpu_5s};
|
||||||
|
$load[1]=$$resultat{$nsc_cpu_1m};
|
||||||
|
$load[2]=$$resultat{$nsc_cpu_5m};
|
||||||
|
|
||||||
|
print "CPU : $load[0] $load[1] $load[2] :";
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( $load[$i] > $o_critL[$i] ) {
|
||||||
|
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $load[$i] > $o_warnL[$i] ) {
|
||||||
|
# output warn error only if no critical was found
|
||||||
|
if ($exit_val eq $ERRORS{"OK"}) {
|
||||||
|
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
print " | cpu_5_sec=$load[0]%;$o_warnL[0];$o_critL[0] ";
|
||||||
|
print "cpu_1_min=$load[1]%;$o_warnL[1];$o_critL[1] ";
|
||||||
|
print "cpu_5_min=$load[2]%;$o_warnL[2];$o_critL[2]\n";
|
||||||
|
} else {
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $exit_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
################## CPU for : AS/400 , Netsnmp, HP, Bluecoat, linkproof, fortigate ###########
|
||||||
|
if ( $o_check_type =~ /netsc|as400|bc|nokia|^hp$|lp|fg/ ) {
|
||||||
|
|
||||||
|
# Get load table
|
||||||
|
my @oidlist = $cpu_oid{$o_check_type};
|
||||||
|
verb("Checking OID : @oidlist");
|
||||||
|
my $resultat = $session->get_request(-varbindlist => \@oidlist);
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
if (!defined ($$resultat{$cpu_oid{$o_check_type}})) {
|
||||||
|
print "No CPU information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my $load=$$resultat{$cpu_oid{$o_check_type}};
|
||||||
|
verb("OID returned $load");
|
||||||
|
# for AS400, divide by 100
|
||||||
|
if ($o_check_type eq "as400") {$load /= 100; };
|
||||||
|
# for Net-snmp : oid returned idle time so load = 100-idle.
|
||||||
|
if ($o_check_type eq "netsc") {$load = 100 - $load; };
|
||||||
|
|
||||||
|
printf("CPU used %.1f%% (",$load);
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
if ($load > $o_crit) {
|
||||||
|
print ">$o_crit) : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
} else {
|
||||||
|
if ($load > $o_warn) {
|
||||||
|
print ">$o_warn) : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "<$o_warn) : OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
(defined($o_perf)) ?
|
||||||
|
print " | cpu_prct_used=$load%;$o_warn;$o_crit\n"
|
||||||
|
: print "\n";
|
||||||
|
exit $exit_val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
##### Checking hpux load
|
||||||
|
if ($o_check_type eq "hpux") {
|
||||||
|
|
||||||
|
verb("Checking hpux load");
|
||||||
|
|
||||||
|
my @oidlists = ($hpux_load_1_min, $hpux_load_5_min, $hpux_load_15_min);
|
||||||
|
my $resultat = $session->get_request(-varbindlist => \@oidlists);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Load table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
if (!defined ($$resultat{$hpux_load_1_min})) {
|
||||||
|
print "No Load information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my @load = undef;
|
||||||
|
|
||||||
|
$load[0]=$$resultat{$hpux_load_1_min}/100;
|
||||||
|
$load[1]=$$resultat{$hpux_load_5_min}/100;
|
||||||
|
$load[2]=$$resultat{$hpux_load_15_min}/100;
|
||||||
|
|
||||||
|
print "Load : $load[0] $load[1] $load[2] :";
|
||||||
|
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
for (my $i=0;$i<3;$i++) {
|
||||||
|
if ( $load[$i] > $o_critL[$i] ) {
|
||||||
|
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $load[$i] > $o_warnL[$i] ) {
|
||||||
|
# output warn error only if no critical was found
|
||||||
|
if ($exit_val eq $ERRORS{"OK"}) {
|
||||||
|
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
print " | load_1_min=$load[0]%;$o_warnL[0];$o_critL[0] ";
|
||||||
|
print "load_5_min=$load[1]%;$o_warnL[1];$o_critL[1] ";
|
||||||
|
print "load_15_min=$load[2]%;$o_warnL[2];$o_critL[2]\n";
|
||||||
|
} else {
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $exit_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
########## Standard cpu usage check ############
|
||||||
|
# Get desctiption table
|
||||||
|
my $resultat= $session->get_table(Baseoid => $base_proc);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
my ($cpu_used,$ncpu)=(0,0);
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
if ( $key =~ /$proc_load/) {
|
||||||
|
$cpu_used += $$resultat{$key};
|
||||||
|
$ncpu++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ncpu==0) {
|
||||||
|
print "Can't find CPU usage information : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$cpu_used /= $ncpu;
|
||||||
|
|
||||||
|
print "$ncpu CPU, ", $ncpu==1 ? "load" : "average load";
|
||||||
|
printf(" %.1f%%",$cpu_used);
|
||||||
|
$exit_val=$ERRORS{"OK"};
|
||||||
|
|
||||||
|
if ($cpu_used > $o_crit) {
|
||||||
|
print " > $o_crit% : CRITICAL";
|
||||||
|
$exit_val=$ERRORS{"CRITICAL"};
|
||||||
|
} else {
|
||||||
|
if ($cpu_used > $o_warn) {
|
||||||
|
print " > $o_warn% : WARNING";
|
||||||
|
$exit_val=$ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print " < $o_warn% : OK" if ($exit_val eq $ERRORS{"OK"});
|
||||||
|
(defined($o_perf)) ?
|
||||||
|
print " | cpu_prct_used=$cpu_used%;$o_warn;$o_crit\n"
|
||||||
|
: print "\n";
|
||||||
|
exit $exit_val;
|
||||||
|
|
||||||
519
check_snmp_mem.pl
Executable file
519
check_snmp_mem.pl
Executable file
@@ -0,0 +1,519 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
############################## check_snmp_mem ##############
|
||||||
|
# Version : 1.1
|
||||||
|
# Date : Jul 09 2006
|
||||||
|
# Author : Patrick Proy (nagios at proy.org)
|
||||||
|
# Help : http://www.manubulon.com/nagios/
|
||||||
|
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||||
|
# Contrib : Jan Jungmann
|
||||||
|
# TODO :
|
||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
# Help : ./check_snmp_mem.pl -h
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Net::SNMP;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
# Nagios specific
|
||||||
|
|
||||||
|
use lib "/usr/lib64/nagios/plugins";
|
||||||
|
use utils qw(%ERRORS $TIMEOUT);
|
||||||
|
#my $TIMEOUT = 15;
|
||||||
|
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||||
|
|
||||||
|
# SNMP Datas
|
||||||
|
|
||||||
|
# Net-snmp memory
|
||||||
|
|
||||||
|
my $nets_ram_free = "1.3.6.1.4.1.2021.4.6.0"; # Real memory free
|
||||||
|
my $nets_ram_total = "1.3.6.1.4.1.2021.4.5.0"; # Real memory total
|
||||||
|
my $nets_ram_cache = "1.3.6.1.4.1.2021.4.15.0"; # Real memory cached
|
||||||
|
my $nets_swap_free = "1.3.6.1.4.1.2021.4.4.0"; # swap memory free
|
||||||
|
my $nets_swap_total = "1.3.6.1.4.1.2021.4.3.0"; # Swap memory total
|
||||||
|
my @nets_oids = ($nets_ram_free,$nets_ram_total,$nets_swap_free,$nets_swap_total,$nets_ram_cache);
|
||||||
|
|
||||||
|
# Cisco
|
||||||
|
|
||||||
|
my $cisco_mem_pool = "1.3.6.1.4.1.9.9.48.1.1.1"; # Cisco memory pool
|
||||||
|
my $cisco_index = "1.3.6.1.4.1.9.9.48.1.1.1.2"; # memory pool name and index
|
||||||
|
my $cisco_valid = "1.3.6.1.4.1.9.9.48.1.1.1.4"; # Valid memory if 1
|
||||||
|
my $cisco_used = "1.3.6.1.4.1.9.9.48.1.1.1.5"; # Used memory
|
||||||
|
my $cisco_free = "1.3.6.1.4.1.9.9.48.1.1.1.6"; # Free memory
|
||||||
|
# .1 : type, .2 : name, .3 : alternate, .4 : valid, .5 : used, .6 : free, .7 : max free
|
||||||
|
|
||||||
|
# HP Procurve
|
||||||
|
|
||||||
|
my $hp_mem_pool = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1"; # HP memory pool
|
||||||
|
my $hp_mem_index = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.1"; # memory slot index
|
||||||
|
my $hp_mem_total = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.5"; # Total Bytes
|
||||||
|
my $hp_mem_free = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.6"; # Free Bytes
|
||||||
|
my $hp_mem_free_seg = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.3"; # Free segments
|
||||||
|
|
||||||
|
# AS/400
|
||||||
|
|
||||||
|
# Windows NT/2K/(XP?)
|
||||||
|
|
||||||
|
# check_snmp_storage.pl -C <community> -H <hostIP> -m "^Virtual Memory$" -w <warn %> -c <crit %>
|
||||||
|
|
||||||
|
|
||||||
|
# Globals
|
||||||
|
|
||||||
|
my $Version='1.1';
|
||||||
|
|
||||||
|
my $o_host = undef; # hostname
|
||||||
|
my $o_community = undef; # community
|
||||||
|
my $o_port = 161; # port
|
||||||
|
my $o_help= undef; # wan't some help ?
|
||||||
|
my $o_verb= undef; # verbose mode
|
||||||
|
my $o_version= undef; # print version
|
||||||
|
my $o_netsnmp= 1; # Check with netsnmp (default)
|
||||||
|
my $o_cisco= undef; # Check cisco router mem
|
||||||
|
my $o_hp= undef; # Check hp procurve mem
|
||||||
|
my $o_warn= undef; # warning level option
|
||||||
|
my $o_warnR= undef; # warning level for Real memory
|
||||||
|
my $o_warnS= undef; # warning levels for swap
|
||||||
|
my $o_crit= undef; # Critical level option
|
||||||
|
my $o_critR= undef; # critical level for Real memory
|
||||||
|
my $o_critS= undef; # critical level for swap
|
||||||
|
my $o_perf= undef; # Performance data option
|
||||||
|
my $o_cache= undef; # Include cached memory as used memory
|
||||||
|
my $o_timeout= undef; # Timeout (Default 5)
|
||||||
|
my $o_version2= undef; # use snmp v2c
|
||||||
|
# SNMPv3 specific
|
||||||
|
my $o_login= undef; # Login for snmpv3
|
||||||
|
my $o_passwd= undef; # Pass for snmpv3
|
||||||
|
my $v3protocols=undef; # V3 protocol list.
|
||||||
|
my $o_authproto='md5'; # Auth protocol
|
||||||
|
my $o_privproto='des'; # Priv protocol
|
||||||
|
my $o_privpass= undef; # priv password
|
||||||
|
|
||||||
|
# functions
|
||||||
|
|
||||||
|
sub p_version { print "check_snmp_mem version : $Version\n"; }
|
||||||
|
|
||||||
|
sub print_usage {
|
||||||
|
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -w <warn level> -c <crit level> [-I|-N|-E] [-f] [-m] [-t <timeout>] [-V]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub isnnum { # Return true if arg is not a number
|
||||||
|
my $num = shift;
|
||||||
|
if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub round ($$) {
|
||||||
|
sprintf "%.$_[1]f", $_[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
sub help {
|
||||||
|
print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n";
|
||||||
|
print "(c)2004-2006 to my cat Ratoune - Author: Patrick Proy\n\n";
|
||||||
|
print_usage();
|
||||||
|
print <<EOT;
|
||||||
|
-v, --verbose
|
||||||
|
print extra debugging information (including interface list on the system)
|
||||||
|
-h, --help
|
||||||
|
print this help message
|
||||||
|
-H, --hostname=HOST
|
||||||
|
name or IP address of host to check
|
||||||
|
-C, --community=COMMUNITY NAME
|
||||||
|
community name for the host's SNMP agent (implies SNMP v1 or v2c with option)
|
||||||
|
-2, --v2c
|
||||||
|
Use snmp v2c
|
||||||
|
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||||
|
Login and auth password for snmpv3 authentication
|
||||||
|
If no priv password exists, implies AuthNoPriv
|
||||||
|
-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)
|
||||||
|
-w, --warn=INTEGER | INT,INT
|
||||||
|
warning level for memory in percent (0 for no checks)
|
||||||
|
Default (-N switch) : comma separated level for Real Memory and Swap
|
||||||
|
-I switch : warning level
|
||||||
|
-c, --crit=INTEGER | INT,INT
|
||||||
|
critical level for memory in percent (0 for no checks)
|
||||||
|
Default (-N switch) : comma separated level for Real Memory and Swap
|
||||||
|
-I switch : critical level
|
||||||
|
-N, --netsnmp (default)
|
||||||
|
check linux memory & swap provided by Net SNMP
|
||||||
|
-m, --memcache
|
||||||
|
include cached memory in used memory (only with Net-SNMP)
|
||||||
|
-I, --cisco
|
||||||
|
check cisco memory (sum of all memory pools)
|
||||||
|
-E, --hp
|
||||||
|
check HP proccurve memory
|
||||||
|
-f, --perfdata
|
||||||
|
Performance data output
|
||||||
|
-t, --timeout=INTEGER
|
||||||
|
timeout for SNMP in seconds (Default: 5)
|
||||||
|
-V, --version
|
||||||
|
prints version number
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
# For verbose output
|
||||||
|
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||||
|
|
||||||
|
# Get the alarm signal (just in case snmp timout screws up)
|
||||||
|
$SIG{'ALRM'} = sub {
|
||||||
|
print ("ERROR: Alarm signal (Nagios time-out)\n");
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
};
|
||||||
|
|
||||||
|
sub check_options {
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
GetOptions(
|
||||||
|
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||||
|
'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,
|
||||||
|
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||||
|
'V' => \$o_version, 'version' => \$o_version,
|
||||||
|
'I' => \$o_cisco, 'cisco' => \$o_cisco,
|
||||||
|
'N' => \$o_netsnmp, 'netsnmp' => \$o_netsnmp,
|
||||||
|
'E' => \$o_hp, 'hp' => \$o_hp,
|
||||||
|
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||||
|
'c:s' => \$o_crit, 'critical:s' => \$o_crit,
|
||||||
|
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||||
|
'm' => \$o_cache, 'memcache' => \$o_cache,
|
||||||
|
'f' => \$o_perf, 'perfdata' => \$o_perf
|
||||||
|
);
|
||||||
|
if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if ( ! defined($o_host) ) # check host and filter
|
||||||
|
{ print "No host defined!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# check snmp information
|
||||||
|
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||||
|
{ 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) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
|
||||||
|
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if (!defined($o_timeout)) {$o_timeout=5;}
|
||||||
|
#Check Warning and crit are present
|
||||||
|
if ( ! defined($o_warn) || ! defined($o_crit))
|
||||||
|
{ print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# Get rid of % sign
|
||||||
|
$o_warn =~ s/\%//g;
|
||||||
|
$o_crit =~ s/\%//g;
|
||||||
|
# if -N or -E switch , undef $o_netsnmp
|
||||||
|
if (defined($o_cisco) || defined($o_hp) ) {
|
||||||
|
$o_netsnmp=undef;
|
||||||
|
if ( isnnum($o_warn) || isnnum($o_crit))
|
||||||
|
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
|
||||||
|
if ( ($o_crit != 0) && ($o_warn > $o_crit) )
|
||||||
|
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
}
|
||||||
|
if (defined($o_netsnmp)) {
|
||||||
|
my @o_warnL=split(/,/ , $o_warn);
|
||||||
|
my @o_critL=split(/,/ , $o_crit);
|
||||||
|
if (($#o_warnL != 1) || ($#o_critL != 1))
|
||||||
|
{ print "2 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
for (my $i=0;$i<2;$i++) {
|
||||||
|
if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
|
||||||
|
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
|
||||||
|
if (($o_critL[$i]!= 0) && ($o_warnL[$i] > $o_critL[$i]))
|
||||||
|
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if ( $o_critL[$i] > 100)
|
||||||
|
{ print "critical percent must be < 100 !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
}
|
||||||
|
$o_warnR=$o_warnL[0];$o_warnS=$o_warnL[1];
|
||||||
|
$o_critR=$o_critL[0];$o_critS=$o_critL[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
########## MAIN #######
|
||||||
|
|
||||||
|
check_options();
|
||||||
|
|
||||||
|
# Check gobal timeout if snmp screws up
|
||||||
|
if (defined($TIMEOUT)) {
|
||||||
|
verb("Alarm at $TIMEOUT");
|
||||||
|
alarm($TIMEOUT);
|
||||||
|
} else {
|
||||||
|
verb("no timeout defined : $o_timeout + 10");
|
||||||
|
alarm ($o_timeout+10);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Connect to host
|
||||||
|
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',
|
||||||
|
-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,
|
||||||
|
-authpassword => $o_passwd,
|
||||||
|
-authprotocol => $o_authproto,
|
||||||
|
-privpassword => $o_privpass,
|
||||||
|
-privprotocol => $o_privproto,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (defined ($o_version2)) {
|
||||||
|
# SNMPv2 Login
|
||||||
|
verb("SNMP v2c login");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-version => 2,
|
||||||
|
-community => $o_community,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
# SNMPV1 login
|
||||||
|
verb("SNMP v1 login");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-community => $o_community,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined($session)) {
|
||||||
|
printf("ERROR opening session: %s.\n", $error);
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Global variable
|
||||||
|
my $resultat=undef;
|
||||||
|
|
||||||
|
########### Cisco memory check ############
|
||||||
|
if (defined ($o_cisco)) {
|
||||||
|
|
||||||
|
# Get Cisco memory table
|
||||||
|
$resultat = $session->get_table(Baseoid => $cisco_mem_pool);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
my (@oid,@index)=(undef,undef);
|
||||||
|
my $nindex=0;
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
if ( $key =~ /$cisco_index/ ) {
|
||||||
|
@oid=split (/\./,$key);
|
||||||
|
$index[$nindex++] = pop(@oid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if at least 1 memory pool exists
|
||||||
|
if ($nindex == 0) {
|
||||||
|
printf("ERROR: No memory pools found");
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test every memory pool
|
||||||
|
my ($c_output,$prct_free)=(undef,undef);
|
||||||
|
my ($warn_s,$crit_s)=(0,0);
|
||||||
|
my ($used,$free)=(0,0);
|
||||||
|
foreach (@index) {
|
||||||
|
$c_output .="," if defined ($c_output);
|
||||||
|
if ( $$resultat{$cisco_valid . "." . $_} == 1 ) {
|
||||||
|
$used += $$resultat{$cisco_used . "." . $_};
|
||||||
|
$free += $$resultat{$cisco_free . "." . $_};
|
||||||
|
$prct_free=round($$resultat{$cisco_used . "." . $_}*100/($$resultat{$cisco_free . "." . $_}+$$resultat{$cisco_used . "." . $_}) ,0);
|
||||||
|
$c_output .= $$resultat{$cisco_index . "." . $_} . ":" . $prct_free . "%";
|
||||||
|
if (($o_crit!=0)&&($o_crit <= $prct_free)) {
|
||||||
|
$crit_s =1;
|
||||||
|
} elsif (($o_warn!=0)&&($o_warn <= $prct_free)) {
|
||||||
|
$warn_s=1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$c_output .= $$resultat{$cisco_index . "." . $_} . ": INVALID";
|
||||||
|
$crit_s =1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
my $total=$used+$free;
|
||||||
|
$prct_free=round($used*100/($total),0);
|
||||||
|
verb("Total used : $used, free: $free, output : $c_output");
|
||||||
|
my $c_status="OK";
|
||||||
|
$c_output .=" : " . $prct_free ."% : ";
|
||||||
|
if ($crit_s == 1 ) {
|
||||||
|
$c_output .= " > " . $o_crit ;
|
||||||
|
$c_status="CRITICAL";
|
||||||
|
} else {
|
||||||
|
if ($warn_s == 1 ) {
|
||||||
|
$c_output.=" > " . $o_warn;
|
||||||
|
$c_status="WARNING";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$c_output .= " ; ".$c_status;
|
||||||
|
if (defined ($o_perf)) {
|
||||||
|
$c_output .= " | ram_used=" . $used.";";
|
||||||
|
$c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
|
||||||
|
$c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
|
||||||
|
$c_output .= "0;" . $total ;
|
||||||
|
}
|
||||||
|
$session->close;
|
||||||
|
print "$c_output \n";
|
||||||
|
exit $ERRORS{$c_status};
|
||||||
|
}
|
||||||
|
|
||||||
|
########### HP Procurve memory check ############
|
||||||
|
if (defined ($o_hp)) {
|
||||||
|
|
||||||
|
# Get hp memory table
|
||||||
|
$resultat = $session->get_table(Baseoid => $hp_mem_pool);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: Description table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
my (@oid,@index)=(undef,undef);
|
||||||
|
my $nindex=0;
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
if ( $key =~ /$hp_mem_index/ ) {
|
||||||
|
@oid=split (/\./,$key);
|
||||||
|
$index[$nindex++] = pop(@oid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if at least 1 memory slots exists
|
||||||
|
if ($nindex == 0) {
|
||||||
|
printf("ERROR: No memory slots found");
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Consolidate the datas
|
||||||
|
my ($total,$free)=(0,0);
|
||||||
|
my ($c_output,$prct_free)=(undef,undef);
|
||||||
|
foreach (@index) {
|
||||||
|
$c_output .="," if defined ($c_output);
|
||||||
|
$total += $$resultat{$hp_mem_total . "." . $_};
|
||||||
|
$free += $$resultat{$hp_mem_free . "." . $_};
|
||||||
|
$c_output .= "Slot " . $$resultat{$hp_mem_index . "." . $_} . ":"
|
||||||
|
.round(
|
||||||
|
100 - ($$resultat{$hp_mem_free . "." . $_} *100 /
|
||||||
|
$$resultat{$hp_mem_total . "." . $_}) ,0)
|
||||||
|
. "%";
|
||||||
|
}
|
||||||
|
my $used = $total - $free;
|
||||||
|
$prct_free=round($used*100/($total),0);
|
||||||
|
verb("Used : $used, Free: $free, Output : $c_output");
|
||||||
|
my $c_status="OK";
|
||||||
|
$c_output .=" : " . $prct_free ."% : ";
|
||||||
|
if (($o_crit!=0)&&($o_crit <= $prct_free)) {
|
||||||
|
$c_output .= " > " . $o_crit ;
|
||||||
|
$c_status="CRITICAL";
|
||||||
|
} else {
|
||||||
|
if (($o_warn!=0)&&($o_warn <= $prct_free)) {
|
||||||
|
$c_output.=" > " . $o_warn;
|
||||||
|
$c_status="WARNING";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$c_output .= " ; ".$c_status;
|
||||||
|
if (defined ($o_perf)) {
|
||||||
|
$c_output .= " | ram_used=" . $used.";";
|
||||||
|
$c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
|
||||||
|
$c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
|
||||||
|
$c_output .= "0;" . $total ;
|
||||||
|
}
|
||||||
|
$session->close;
|
||||||
|
print "$c_output \n";
|
||||||
|
exit $ERRORS{$c_status};
|
||||||
|
}
|
||||||
|
|
||||||
|
########### Net snmp memory check ############
|
||||||
|
if (defined ($o_netsnmp)) {
|
||||||
|
|
||||||
|
# Get NetSNMP memory values
|
||||||
|
$resultat = $session->get_request(-varbindlist => \@nets_oids);
|
||||||
|
|
||||||
|
if (!defined($resultat)) {
|
||||||
|
printf("ERROR: netsnmp : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($realused,$swapused)=(undef,undef);
|
||||||
|
|
||||||
|
$realused= defined($o_cache) ?
|
||||||
|
($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free})/$$resultat{$nets_ram_total}
|
||||||
|
:
|
||||||
|
($$resultat{$nets_ram_total}-($$resultat{$nets_ram_free}+$$resultat{$nets_ram_cache}))/$$resultat{$nets_ram_total};
|
||||||
|
|
||||||
|
if($$resultat{$nets_ram_total} == 0) { $realused = 0; }
|
||||||
|
|
||||||
|
$swapused= ($$resultat{$nets_swap_total} == 0) ? 0 :
|
||||||
|
($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free})/$$resultat{$nets_swap_total};
|
||||||
|
$realused=round($realused*100,0);
|
||||||
|
$swapused=round($swapused*100,0);
|
||||||
|
defined($o_cache) ?
|
||||||
|
verb ("Ram : $$resultat{$nets_ram_free} / $$resultat{$nets_ram_total} : $realused")
|
||||||
|
:
|
||||||
|
verb ("Ram : $$resultat{$nets_ram_free} ($$resultat{$nets_ram_cache} cached) / $$resultat{$nets_ram_total} : $realused");
|
||||||
|
verb ("Swap : $$resultat{$nets_swap_free} / $$resultat{$nets_swap_total} : $swapused");
|
||||||
|
|
||||||
|
my $n_status="OK";
|
||||||
|
my $n_output="Ram : " . $realused . "%, Swap : " . $swapused . "% :";
|
||||||
|
if ((($o_critR!=0)&&($o_critR <= $realused)) || (($o_critS!=0)&&($o_critS <= $swapused))) {
|
||||||
|
$n_output .= " > " . $o_critR . ", " . $o_critS;
|
||||||
|
$n_status="CRITICAL";
|
||||||
|
} else {
|
||||||
|
if ((($o_warnR!=0)&&($o_warnR <= $realused)) || (($o_warnS!=0)&&($o_warnS <= $swapused))) {
|
||||||
|
$n_output.=" > " . $o_warnR . ", " . $o_warnS;
|
||||||
|
$n_status="WARNING";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$n_output .= " ; ".$n_status;
|
||||||
|
if (defined ($o_perf)) {
|
||||||
|
if (defined ($o_cache)) {
|
||||||
|
$n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}).";";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}-$$resultat{$nets_ram_cache}).";";
|
||||||
|
}
|
||||||
|
$n_output .= ($o_warnR ==0)? ";" : round($o_warnR * $$resultat{$nets_ram_total}/100,0).";";
|
||||||
|
$n_output .= ($o_critR ==0)? ";" : round($o_critR * $$resultat{$nets_ram_total}/100,0).";";
|
||||||
|
$n_output .= "0;" . $$resultat{$nets_ram_total}. " ";
|
||||||
|
$n_output .= "swap_used=" . ($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free}).";";
|
||||||
|
$n_output .= ($o_warnS ==0)? ";" : round($o_warnS * $$resultat{$nets_swap_total}/100,0).";";
|
||||||
|
$n_output .= ($o_critS ==0)? ";" : round($o_critS * $$resultat{$nets_swap_total}/100,0).";";
|
||||||
|
$n_output .= "0;" . $$resultat{$nets_swap_total};
|
||||||
|
}
|
||||||
|
$session->close;
|
||||||
|
print "$n_output \n";
|
||||||
|
exit $ERRORS{$n_status};
|
||||||
|
|
||||||
|
}
|
||||||
702
check_snmp_process.pl
Executable file
702
check_snmp_process.pl
Executable file
@@ -0,0 +1,702 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
############################## check_snmp_process ##############
|
||||||
|
my $Version='1.10';
|
||||||
|
# Date : Oct 12 2007
|
||||||
|
# Author : Patrick Proy (patrick at proy dot org)
|
||||||
|
# Help : http://nagios.manubulon.com
|
||||||
|
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||||
|
# Contrib : Makina Corpus, adam At greekattic d0t com
|
||||||
|
# TODO : put $o_delta as an option
|
||||||
|
# If testing on localhost, selects itself....
|
||||||
|
###############################################################
|
||||||
|
#
|
||||||
|
# help : ./check_snmp_process -h
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Net::SNMP;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
############### BASE DIRECTORY FOR TEMP FILE ########
|
||||||
|
my $o_base_dir="/tmp/tmp_Nagios_proc.";
|
||||||
|
my $file_history=200; # number of data to keep in files.
|
||||||
|
my $delta_of_time_to_make_average=300; # 5minutes by default
|
||||||
|
|
||||||
|
# Nagios specific
|
||||||
|
|
||||||
|
my $TIMEOUT = 15;
|
||||||
|
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||||
|
|
||||||
|
# SNMP Datas
|
||||||
|
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 $run_name_table = '1.3.6.1.2.1.25.4.2.1.2';
|
||||||
|
my $run_path_table = '1.3.6.1.2.1.25.4.2.1.4';
|
||||||
|
my $run_param_table = '1.3.6.1.2.1.25.4.2.1.5';
|
||||||
|
my $proc_mem_table = '1.3.6.1.2.1.25.5.1.1.2'; # Kbytes
|
||||||
|
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';
|
||||||
|
|
||||||
|
# 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_warn = 0; # warning limit
|
||||||
|
my @o_warnL= undef; # warning limits (min,max)
|
||||||
|
my $o_crit= 0; # critical limit
|
||||||
|
my @o_critL= undef; # critical limits (min,max)
|
||||||
|
my $o_help= undef; # wan't some help ?
|
||||||
|
my $o_verb= undef; # verbose mode
|
||||||
|
my $o_version= undef; # print version
|
||||||
|
my $o_noreg= undef; # Do not use Regexp for name
|
||||||
|
my $o_path= undef; # check path instead of name
|
||||||
|
my $o_inverse= undef; # checks max instead of min number of process
|
||||||
|
my $o_get_all= undef; # get all tables at once
|
||||||
|
my $o_param= undef; # Add process parameters for selection
|
||||||
|
my $o_perf= undef; # Add performance output
|
||||||
|
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
|
||||||
|
my $o_mem= undef; # checks memory (max)
|
||||||
|
my @o_memL= undef; # warn and crit level for mem
|
||||||
|
my $o_mem_avg= undef; # cheks memory average
|
||||||
|
my $o_cpu= undef; # checks CPU usage
|
||||||
|
my @o_cpuL= undef; # warn and crit level for cpu
|
||||||
|
my $o_delta= $delta_of_time_to_make_average; # delta time for CPU check
|
||||||
|
|
||||||
|
# functions
|
||||||
|
|
||||||
|
sub p_version { print "check_snmp_process version : $Version\n"; }
|
||||||
|
|
||||||
|
sub print_usage {
|
||||||
|
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd) [-p <port>] -n <name> [-w <min_proc>[,<max_proc>] -c <min_proc>[,max_proc] ] [-m<warn Mb>,<crit Mb> -a -u<warn %>,<crit%> -d<delta> ] [-t <timeout>] [-o <octet_length>] [-f -A -F ] [-r] [-V] [-g]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub isnotnum { # Return true if arg is not a number
|
||||||
|
my $num = shift;
|
||||||
|
if ( $num =~ /^-?(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the alarm signal (just in case snmp timout screws up)
|
||||||
|
$SIG{'ALRM'} = sub {
|
||||||
|
print ("ERROR: Alarm signal (Nagios time-out)\n");
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
};
|
||||||
|
|
||||||
|
sub read_file {
|
||||||
|
# Input : File, items_number
|
||||||
|
# Returns : array of value : [line][item]
|
||||||
|
my ($traffic_file,$items_number)=@_;
|
||||||
|
my ($ligne,$n_rows)=(undef,0);
|
||||||
|
my (@last_values,@file_values,$i);
|
||||||
|
open(FILE,"<".$traffic_file) || return (1,0,0);
|
||||||
|
|
||||||
|
while($ligne = <FILE>)
|
||||||
|
{
|
||||||
|
chomp($ligne);
|
||||||
|
@file_values = split(":",$ligne);
|
||||||
|
#verb("@file_values");
|
||||||
|
if ($#file_values >= ($items_number-1)) {
|
||||||
|
# check if there is enough data, else ignore line
|
||||||
|
for ( $i=0 ; $i< $items_number ; $i++ ) {$last_values[$n_rows][$i]=$file_values[$i]; }
|
||||||
|
$n_rows++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close FILE;
|
||||||
|
if ($n_rows != 0) {
|
||||||
|
return (0,$n_rows,@last_values);
|
||||||
|
} else {
|
||||||
|
return (1,0,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
# Input : file , rows, items, array of value : [line][item]
|
||||||
|
# Returns : 0 / OK, 1 / error
|
||||||
|
my ($file_out,$rows,$item,@file_values)=@_;
|
||||||
|
my $start_line= ($rows > $file_history) ? $rows - $file_history : 0;
|
||||||
|
if ( open(FILE2,">".$file_out) ) {
|
||||||
|
for (my $i=$start_line;$i<$rows;$i++) {
|
||||||
|
for (my $j=0;$j<$item;$j++) {
|
||||||
|
print FILE2 $file_values[$i][$j];
|
||||||
|
if ($j != ($item -1)) { print FILE2 ":" };
|
||||||
|
}
|
||||||
|
print FILE2 "\n";
|
||||||
|
}
|
||||||
|
close FILE2;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub help {
|
||||||
|
print "\nSNMP Process Monitor for Nagios version ",$Version,"\n";
|
||||||
|
print "GPL licence, (c)2004-2006 Patrick Proy\n\n";
|
||||||
|
print_usage();
|
||||||
|
print <<EOT;
|
||||||
|
-v, --verbose
|
||||||
|
print extra debugging information (and lists all storages)
|
||||||
|
-h, --help
|
||||||
|
print this help message
|
||||||
|
-H, --hostname=HOST
|
||||||
|
name or IP address of host to check
|
||||||
|
-C, --community=COMMUNITY NAME
|
||||||
|
community name for the host's SNMP agent (implies SNMP v1 or v2c with option)
|
||||||
|
-l, --login=LOGIN ; -x, --passwd=PASSWD, -2, --v2c
|
||||||
|
Login and auth password for snmpv3 authentication
|
||||||
|
If no priv password exists, implies AuthNoPriv
|
||||||
|
-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
|
||||||
|
Name of the process (regexp)
|
||||||
|
No trailing slash !
|
||||||
|
-r, --noregexp
|
||||||
|
Do not use regexp to match NAME in description OID
|
||||||
|
-f, --fullpath
|
||||||
|
Use full path name instead of process name
|
||||||
|
(Windows doesn't provide full path name)
|
||||||
|
-A, --param
|
||||||
|
Add parameters to select processes.
|
||||||
|
ex : "named.*-t /var/named/chroot" will only select named process with this parameter
|
||||||
|
-F, --perfout
|
||||||
|
Add performance output
|
||||||
|
outputs : memory_usage, num_process, cpu_usage
|
||||||
|
-w, --warn=MIN[,MAX]
|
||||||
|
Number of process that will cause a warning
|
||||||
|
-1 for no warning, MAX must be >0. Ex : -w-1,50
|
||||||
|
-c, --critical=MIN[,MAX]
|
||||||
|
number of process that will cause an error (
|
||||||
|
-1 for no critical, MAX must be >0. Ex : -c-1,50
|
||||||
|
Notes on warning and critical :
|
||||||
|
with the following options : -w m1,x1 -c m2,x2
|
||||||
|
you must have : m2 <= m1 < x1 <= x2
|
||||||
|
you can omit x1 or x2 or both
|
||||||
|
-m, --memory=WARN,CRIT
|
||||||
|
checks memory usage (default max of all process)
|
||||||
|
values are warning and critical values in Mb
|
||||||
|
-a, --average
|
||||||
|
makes an average of memory used by process instead of max
|
||||||
|
-u, --cpu=WARN,CRIT
|
||||||
|
checks cpu usage of all process
|
||||||
|
values are warning and critical values in % of CPU usage
|
||||||
|
if more than one CPU, value can be > 100% : 100%=1 CPU
|
||||||
|
-d, --delta=seconds
|
||||||
|
make an average of <delta> seconds for CPU (default 300=5min)
|
||||||
|
-g, --getall
|
||||||
|
In some cases, it is necessary to get all data at once because
|
||||||
|
process die very frequently.
|
||||||
|
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
|
||||||
|
timeout for SNMP in seconds (Default: 5)
|
||||||
|
-V, --version
|
||||||
|
prints version number
|
||||||
|
Note :
|
||||||
|
CPU usage is in % of one cpu, so maximum can be 100% * number of CPU
|
||||||
|
example :
|
||||||
|
Browse process list : <script> -C <community> -H <host> -n <anything> -v
|
||||||
|
the -n option allows regexp in perl format :
|
||||||
|
All process of /opt/soft/bin : -n /opt/soft/bin/ -f
|
||||||
|
All 'named' process : -n named
|
||||||
|
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||||
|
|
||||||
|
sub check_options {
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
GetOptions(
|
||||||
|
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||||
|
'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,
|
||||||
|
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||||
|
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||||
|
'n:s' => \$o_descr, 'name:s' => \$o_descr,
|
||||||
|
'r' => \$o_noreg, 'noregexp' => \$o_noreg,
|
||||||
|
'f' => \$o_path, 'fullpath' => \$o_path,
|
||||||
|
'm:s' => \$o_mem, 'memory:s' => \$o_mem,
|
||||||
|
'a' => \$o_mem_avg, 'average' => \$o_mem_avg,
|
||||||
|
'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,
|
||||||
|
'A' => \$o_param, 'param' => \$o_param,
|
||||||
|
'F' => \$o_perf, 'perfout' => \$o_perf,
|
||||||
|
'd:i' => \$o_delta, 'delta:i' => \$o_delta,
|
||||||
|
'V' => \$o_version, 'version' => \$o_version
|
||||||
|
);
|
||||||
|
if (defined ($o_help)) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# check snmp information
|
||||||
|
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||||
|
{ 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)))
|
||||||
|
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
if (!defined($o_timeout)) {$o_timeout=5;}
|
||||||
|
# Check compulsory attributes
|
||||||
|
if ( ! defined($o_descr) || ! defined($o_host) ) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
@o_warnL=split(/,/,$o_warn);
|
||||||
|
@o_critL=split(/,/,$o_crit);
|
||||||
|
verb("$o_warn $o_crit $#o_warnL $#o_critL");
|
||||||
|
if ( isnotnum($o_warnL[0]) || isnotnum($o_critL[0]))
|
||||||
|
{ print "Numerical values for warning and critical\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||||
|
if ((defined($o_warnL[1]) && isnotnum($o_warnL[1])) || (defined($o_critL[1]) && isnotnum($o_critL[1])))
|
||||||
|
{ print "Numerical values for warning and critical\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||||
|
# Check for positive numbers on maximum number of processes
|
||||||
|
if ((defined($o_warnL[1]) && ($o_warnL[1] < 0)) || (defined($o_critL[1]) && ($o_critL[1] < 0)))
|
||||||
|
{ print " Maximum process warn and critical > 0 \n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# Check min_crit < min warn < max warn < crit warn
|
||||||
|
if ($o_warnL[0] < $o_critL[0]) { print " warn minimum must be >= crit minimum\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (defined($o_warnL[1])) {
|
||||||
|
if ($o_warnL[1] <= $o_warnL[0])
|
||||||
|
{ print "warn minimum must be < warn maximum\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
} elsif ( defined($o_critL[1]) && ($o_critL[1] <= $o_warnL[0]))
|
||||||
|
{ print "warn minimum must be < crit maximum when no crit warning defined\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||||
|
if ( defined($o_critL[1]) && defined($o_warnL[1]) && ($o_critL[1]<$o_warnL[1]))
|
||||||
|
{ print "warn max must be <= crit maximum\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||||
|
#### Memory checks
|
||||||
|
if (defined ($o_mem)) {
|
||||||
|
@o_memL=split(/,/,$o_mem);
|
||||||
|
if ($#o_memL != 1)
|
||||||
|
{print "2 values (warning,critical) for memory\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (isnotnum($o_memL[0]) || isnotnum($o_memL[1]))
|
||||||
|
{print "Numeric values for memory!\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if ($o_memL[0]>$o_memL[1])
|
||||||
|
{print "Warning must be <= Critical for memory!\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
}
|
||||||
|
#### CPU checks
|
||||||
|
if (defined ($o_cpu)) {
|
||||||
|
@o_cpuL=split(/,/,$o_cpu);
|
||||||
|
if ($#o_cpuL != 1)
|
||||||
|
{print "2 values (warning,critical) for cpu\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (isnotnum($o_cpuL[0]) || isnotnum($o_cpuL[1]))
|
||||||
|
{print "Numeric values for cpu!\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if ($o_cpuL[0]>$o_cpuL[1])
|
||||||
|
{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 #######
|
||||||
|
|
||||||
|
check_options();
|
||||||
|
|
||||||
|
# Check gobal timeout if snmp screws up
|
||||||
|
if (defined($TIMEOUT)) {
|
||||||
|
verb("Alarm at $TIMEOUT");
|
||||||
|
alarm($TIMEOUT);
|
||||||
|
} else {
|
||||||
|
verb("no timeout defined : $o_timeout + 10");
|
||||||
|
alarm ($o_timeout+10);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Connect to host
|
||||||
|
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
|
||||||
|
my $resultat=undef;
|
||||||
|
my %result_cons=();
|
||||||
|
my ($getall_run,$getall_cpu,$getall_mem)=(undef,undef,undef);
|
||||||
|
if ( !defined ($o_path) ) {
|
||||||
|
$resultat=$session->get_table(Baseoid => $run_name_table);
|
||||||
|
} else {
|
||||||
|
$resultat =
|
||||||
|
$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;
|
||||||
|
if (defined($o_param)) { # Get parameter table too
|
||||||
|
$resultat_param = $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)) {
|
||||||
|
$getall_run = $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) {
|
||||||
|
$result_cons{$key}=$$getall_run{$key};
|
||||||
|
}
|
||||||
|
$getall_cpu = $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) {
|
||||||
|
$result_cons{$key}=$$getall_cpu{$key};
|
||||||
|
}
|
||||||
|
$getall_mem = $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) {
|
||||||
|
$result_cons{$key}=$$getall_mem{$key};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @tindex = undef;
|
||||||
|
my @oids = undef;
|
||||||
|
my @descr = undef;
|
||||||
|
my $num_int = 0;
|
||||||
|
my $count_oid = 0;
|
||||||
|
# Select storage by regexp of exact match
|
||||||
|
# and put the oid to query in an array
|
||||||
|
|
||||||
|
verb("Filter : $o_descr");
|
||||||
|
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
# test by regexp or exact match
|
||||||
|
# First add param if necessary
|
||||||
|
if (defined($o_param)){
|
||||||
|
my $pid = (split /\./,$key)[-1];
|
||||||
|
$pid = $run_param_table .".".$pid;
|
||||||
|
$$resultat{$key} .= " " . $$resultat_param{$pid};
|
||||||
|
}
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
my $test = defined($o_noreg)
|
||||||
|
? $$resultat{$key} eq $o_descr
|
||||||
|
: $$resultat{$key} =~ /$o_descr/;
|
||||||
|
if ($test) {
|
||||||
|
# get the index number of the interface
|
||||||
|
my @oid_list = split (/\./,$key);
|
||||||
|
$tindex[$num_int] = pop (@oid_list);
|
||||||
|
# get the full description
|
||||||
|
$descr[$num_int]=$$resultat{$key};
|
||||||
|
# put the oid of running and mem (check this maybe ?) in an array.
|
||||||
|
$oids[$count_oid++]=$proc_mem_table . "." . $tindex[$num_int];
|
||||||
|
$oids[$count_oid++]=$proc_cpu_table . "." . $tindex[$num_int];
|
||||||
|
$oids[$count_oid++]=$proc_run_state . "." . $tindex[$num_int];
|
||||||
|
#verb("Name : $descr[$num_int], Index : $tindex[$num_int]");
|
||||||
|
verb($oids[$count_oid-1]);
|
||||||
|
$num_int++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $num_int == 0) {
|
||||||
|
print "No process ",(defined ($o_noreg)) ? "named " : "matching ", $o_descr, " found : ";
|
||||||
|
if ($o_critL[0]>=0) {
|
||||||
|
print "CRITICAL\n";
|
||||||
|
exit $ERRORS{"CRITICAL"};
|
||||||
|
} elsif ($o_warnL[0]>=0) {
|
||||||
|
print "WARNING\n";
|
||||||
|
exit $ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
print "YOU told me it was : OK\n";
|
||||||
|
exit $ERRORS{"OK"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my $result=undef;
|
||||||
|
my $num_int_ok=0;
|
||||||
|
# Splitting snmp request because can't use get_bulk_request with v1 protocol
|
||||||
|
if (!defined ($o_get_all)) {
|
||||||
|
if ( $count_oid >= 50) {
|
||||||
|
my @toid=undef;
|
||||||
|
my $tmp_num=0;
|
||||||
|
my $tmp_index=0;
|
||||||
|
my $tmp_count=$count_oid;
|
||||||
|
my $tmp_result=undef;
|
||||||
|
verb("More than 50 oid, splitting");
|
||||||
|
while ( $tmp_count != 0 ) {
|
||||||
|
$tmp_num = ($tmp_count >=50) ? 50 : $tmp_count;
|
||||||
|
for (my $i=0; $i<$tmp_num;$i++) {
|
||||||
|
$toid[$i]=$oids[$i+$tmp_index];
|
||||||
|
#verb("$i : $toid[$i] : $oids[$i+$tmp_index]");
|
||||||
|
}
|
||||||
|
$tmp_result = $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{$_}; }
|
||||||
|
$tmp_count-=$tmp_num;
|
||||||
|
$tmp_index+=$tmp_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$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
|
||||||
|
for (my $i=0; $i< $num_int; $i++) {
|
||||||
|
my $state=$result_cons{$proc_run_state . "." . $tindex[$i]};
|
||||||
|
my $tmpmem=$result_cons{$proc_mem_table . "." . $tindex[$i]};
|
||||||
|
my $tmpcpu=$result_cons{$proc_cpu_table . "." . $tindex[$i]};
|
||||||
|
verb ("Process $tindex[$i] in state $state using $tmpmem, and $tmpcpu CPU");
|
||||||
|
if (!isnotnum($state)) { # check argument is numeric (can be NoSuchInstance)
|
||||||
|
$num_int_ok++ if (($state == 1) || ($state ==2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $final_status=0;
|
||||||
|
my $perf_output;
|
||||||
|
my ($res_memory,$res_cpu)=(0,0);
|
||||||
|
my $memory_print="";
|
||||||
|
my $cpu_print="";
|
||||||
|
###### Checks memory usage
|
||||||
|
|
||||||
|
if (defined ($o_mem) ) {
|
||||||
|
if (defined ($o_mem_avg)) {
|
||||||
|
for (my $i=0; $i< $num_int; $i++) { $res_memory += $result_cons{$proc_mem_table . "." . $tindex[$i]};}
|
||||||
|
$res_memory /= ($num_int_ok*1024);
|
||||||
|
verb("Memory average : $res_memory");
|
||||||
|
} else {
|
||||||
|
for (my $i=0; $i< $num_int; $i++) {
|
||||||
|
$res_memory = ($result_cons{$proc_mem_table . "." . $tindex[$i]} > $res_memory) ? $result_cons{$proc_mem_table . "." . $tindex[$i]} : $res_memory;
|
||||||
|
}
|
||||||
|
$res_memory /=1024;
|
||||||
|
verb("Memory max : $res_memory");
|
||||||
|
}
|
||||||
|
if ($res_memory > $o_memL[1]) {
|
||||||
|
$final_status=2;
|
||||||
|
$memory_print=", Mem : ".sprintf("%.1f",$res_memory)."Mb > ".$o_memL[1]." CRITICAL";
|
||||||
|
} elsif ( $res_memory > $o_memL[0]) {
|
||||||
|
$final_status=1;
|
||||||
|
$memory_print=", Mem : ".sprintf("%.1f",$res_memory)."Mb > ".$o_memL[0]." WARNING";
|
||||||
|
} else {
|
||||||
|
$memory_print=", Mem : ".sprintf("%.1f",$res_memory)."Mb OK";
|
||||||
|
}
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
$perf_output= "'memory_usage'=".sprintf("%.1f",$res_memory) ."MB;".$o_memL[0].";".$o_memL[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
######## Checks CPU usage
|
||||||
|
|
||||||
|
if (defined ($o_cpu) ) {
|
||||||
|
my $timenow=time;
|
||||||
|
my $temp_file_name;
|
||||||
|
my ($return,@file_values)=(undef,undef);
|
||||||
|
my $n_rows=0;
|
||||||
|
my $n_items_check=2;
|
||||||
|
my $trigger=$timenow - ($o_delta - ($o_delta/10));
|
||||||
|
my $trigger_low=$timenow - 3*$o_delta;
|
||||||
|
my ($old_value,$old_time)=undef;
|
||||||
|
my $found_value=undef;
|
||||||
|
|
||||||
|
#### Get the current values
|
||||||
|
for (my $i=0; $i< $num_int; $i++) { $res_cpu += $result_cons{$proc_cpu_table . "." . $tindex[$i]};}
|
||||||
|
|
||||||
|
verb("Time: $timenow , cpu (centiseconds) : $res_cpu");
|
||||||
|
|
||||||
|
#### Read file
|
||||||
|
$temp_file_name=$o_descr;
|
||||||
|
$temp_file_name =~ s/ /_/g;
|
||||||
|
$temp_file_name = $o_base_dir . $o_host ."." . $temp_file_name;
|
||||||
|
# First, read entire file
|
||||||
|
my @ret_array=read_file($temp_file_name,$n_items_check);
|
||||||
|
$return = shift(@ret_array);
|
||||||
|
$n_rows = shift(@ret_array);
|
||||||
|
if ($n_rows != 0) { @file_values = @ret_array };
|
||||||
|
verb ("File read returns : $return with $n_rows rows");
|
||||||
|
#make the checks if the file is OK
|
||||||
|
if ($return ==0) {
|
||||||
|
my $j=$n_rows-1;
|
||||||
|
do {
|
||||||
|
if ($file_values[$j][0] < $trigger) {
|
||||||
|
if ($file_values[$j][0] > $trigger_low) {
|
||||||
|
# found value = centiseconds / seconds = %cpu
|
||||||
|
$found_value= ($res_cpu-$file_values[$j][1]) / ($timenow - $file_values[$j][0] );
|
||||||
|
if ($found_value <0) { # in case of program restart
|
||||||
|
$j=0;$found_value=undef; # don't look for more values
|
||||||
|
$n_rows=0; # reset file
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$j--;
|
||||||
|
} while ( ($j>=0) && (!defined($found_value)) );
|
||||||
|
}
|
||||||
|
###### Write file
|
||||||
|
$file_values[$n_rows][0]=$timenow;
|
||||||
|
$file_values[$n_rows][1]=$res_cpu;
|
||||||
|
$n_rows++;
|
||||||
|
$return=write_file($temp_file_name,$n_rows,$n_items_check,@file_values);
|
||||||
|
if ($return != 0) { $cpu_print.="! ERROR writing file $temp_file_name !";$final_status=3;}
|
||||||
|
##### Check values (if something to check...)
|
||||||
|
if (defined($found_value)) {
|
||||||
|
if ($found_value > $o_cpuL[1]) {
|
||||||
|
$final_status=2;
|
||||||
|
$cpu_print.=", Cpu : ".sprintf("%.0f",$found_value)."% > ".$o_cpuL[1]." CRITICAL";
|
||||||
|
} elsif ( $found_value > $o_cpuL[0]) {
|
||||||
|
$final_status=($final_status==2)?2:1;
|
||||||
|
$cpu_print.=", Cpu : ".sprintf("%.0f",$found_value)."% > ".$o_cpuL[0]." WARNING";
|
||||||
|
} else {
|
||||||
|
$cpu_print.=", Cpu : ".sprintf("%.0f",$found_value)."% OK";
|
||||||
|
}
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
if (!defined($perf_output)) {$perf_output="";} else {$perf_output.=" ";}
|
||||||
|
$perf_output.= "'cpu_usage'=". sprintf("%.0f",$found_value)."%;".$o_cpuL[0].";".$o_cpuL[1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($final_status==0) { $final_status=3 };
|
||||||
|
$cpu_print.=", No data for CPU (".$n_rows." line(s)):UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print $num_int_ok, " process ", (defined ($o_noreg)) ? "named " : "matching ", $o_descr, " ";
|
||||||
|
|
||||||
|
#### Check for min and max number of process
|
||||||
|
if ( $num_int_ok <= $o_critL[0] ) {
|
||||||
|
print "(<= ",$o_critL[0]," : CRITICAL)";
|
||||||
|
$final_status=2;
|
||||||
|
} elsif ( $num_int_ok <= $o_warnL[0] ) {
|
||||||
|
print "(<= ",$o_warnL[0]," : WARNING)";
|
||||||
|
$final_status=($final_status==2)?2:1;
|
||||||
|
} else {
|
||||||
|
print "(> ",$o_warnL[0],")";
|
||||||
|
}
|
||||||
|
if (defined($o_critL[1]) && ($num_int_ok > $o_critL[1])) {
|
||||||
|
print " (> ",$o_critL[1]," : CRITICAL)";
|
||||||
|
$final_status=2;
|
||||||
|
} elsif (defined($o_warnL[1]) && ($num_int_ok > $o_warnL[1])) {
|
||||||
|
print " (> ",$o_warnL[1]," : WARNING)";
|
||||||
|
$final_status=($final_status==2)?2:1;
|
||||||
|
} elsif (defined($o_warnL[1])) {
|
||||||
|
print " (<= ",$o_warnL[1],"):OK";
|
||||||
|
}
|
||||||
|
|
||||||
|
print $memory_print,$cpu_print;
|
||||||
|
|
||||||
|
if (defined($o_perf)) {
|
||||||
|
if (!defined($perf_output)) {$perf_output="";} else {$perf_output.=" ";}
|
||||||
|
$perf_output.= "'num_process'=". $num_int_ok.";".$o_warnL[0].";".$o_critL[0];
|
||||||
|
print " | ",$perf_output;
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
if ($final_status==2) { exit $ERRORS{"CRITICAL"};}
|
||||||
|
if ($final_status==1) { exit $ERRORS{"WARNING"};}
|
||||||
|
if ($final_status==3) { exit $ERRORS{"UNKNOWN"};}
|
||||||
|
exit $ERRORS{"OK"};
|
||||||
|
|
||||||
653
check_snmp_storage.pl
Executable file
653
check_snmp_storage.pl
Executable file
@@ -0,0 +1,653 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
############################## check_snmp_storage ##############
|
||||||
|
# Version : 1.3.3
|
||||||
|
# Date : Jun 1 2007
|
||||||
|
# Author : Patrick Proy ( patrick at proy.org)
|
||||||
|
# Help : http://nagios.manubulon.com
|
||||||
|
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||||
|
# TODO :
|
||||||
|
# Contribs : Dimo Velev, Makina Corpus, A. Greiner-B<>r
|
||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
# help : ./check_snmp_storage -h
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Net::SNMP;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
# Nagios specific
|
||||||
|
|
||||||
|
use lib "/usr/lib64/nagios/plugins";
|
||||||
|
use utils qw(%ERRORS $TIMEOUT);
|
||||||
|
#my $TIMEOUT = 15;
|
||||||
|
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||||
|
|
||||||
|
# SNMP Datas
|
||||||
|
my $storage_table= '1.3.6.1.2.1.25.2.3.1';
|
||||||
|
my $storagetype_table = '1.3.6.1.2.1.25.2.3.1.2';
|
||||||
|
my $index_table = '1.3.6.1.2.1.25.2.3.1.1';
|
||||||
|
my $descr_table = '1.3.6.1.2.1.25.2.3.1.3';
|
||||||
|
my $size_table = '1.3.6.1.2.1.25.2.3.1.5.';
|
||||||
|
my $used_table = '1.3.6.1.2.1.25.2.3.1.6.';
|
||||||
|
my $alloc_units = '1.3.6.1.2.1.25.2.3.1.4.';
|
||||||
|
|
||||||
|
#Storage types definition - from /usr/share/snmp/mibs/HOST-RESOURCES-TYPES.txt
|
||||||
|
my %hrStorage;
|
||||||
|
$hrStorage{"Other"} = '1.3.6.1.2.1.25.2.1.1';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.1"} = 'Other';
|
||||||
|
$hrStorage{"Ram"} = '1.3.6.1.2.1.25.2.1.2';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.2"} = 'Ram';
|
||||||
|
$hrStorage{"VirtualMemory"} = '1.3.6.1.2.1.25.2.1.3';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.3"} = 'VirtualMemory';
|
||||||
|
$hrStorage{"FixedDisk"} = '1.3.6.1.2.1.25.2.1.4';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.4"} = 'FixedDisk';
|
||||||
|
$hrStorage{"RemovableDisk"} = '1.3.6.1.2.1.25.2.1.5';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.5"} = 'RemovableDisk';
|
||||||
|
$hrStorage{"FloppyDisk"} = '1.3.6.1.2.1.25.2.1.6';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.6"} = 'FloppyDisk';
|
||||||
|
$hrStorage{"CompactDisk"} = '1.3.6.1.2.1.25.2.1.7';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.7"} = 'CompactDisk';
|
||||||
|
$hrStorage{"RamDisk"} = '1.3.6.1.2.1.25.2.1.8';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.8"} = 'RamDisk';
|
||||||
|
$hrStorage{"FlashMemory"} = '1.3.6.1.2.1.25.2.1.9';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.9"} = 'FlashMemory';
|
||||||
|
$hrStorage{"NetworkDisk"} = '1.3.6.1.2.1.25.2.1.10';
|
||||||
|
$hrStorage{"1.3.6.1.2.1.25.2.1.10"} = 'NetworkDisk';
|
||||||
|
|
||||||
|
# Globals
|
||||||
|
|
||||||
|
my $Name='check_snmp_storage';
|
||||||
|
my $Version='1.3.3';
|
||||||
|
|
||||||
|
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_storagetype = undef; # parse storage type also
|
||||||
|
my $o_warn = undef; # warning limit
|
||||||
|
my $o_crit= undef; # critical limit
|
||||||
|
my $o_help= undef; # wan't some help ?
|
||||||
|
my $o_type= undef; # pl, pu, mbl, mbu
|
||||||
|
my @o_typeok= ("pu","pl","bu","bl"); # valid values for o_type
|
||||||
|
my $o_verb= undef; # verbose mode
|
||||||
|
my $o_version= undef; # print version
|
||||||
|
my $o_noreg= undef; # Do not use Regexp for name
|
||||||
|
my $o_sum= undef; # add all storage before testing
|
||||||
|
my $o_index= undef; # Parse index instead of description
|
||||||
|
my $o_negate= undef; # Negate the regexp if set
|
||||||
|
my $o_timeout= 5; # Default 5s Timeout
|
||||||
|
my $o_perf= undef; # Output performance data
|
||||||
|
my $o_short= undef; # Short output parameters
|
||||||
|
my @o_shortL= undef; # output type,where,cut
|
||||||
|
my $o_reserve= 0; # % reserved blocks (A. Greiner-B<>r patch)
|
||||||
|
my $o_giga= undef; # output and levels in gigabytes instead of megabytes
|
||||||
|
# SNMPv3 specific
|
||||||
|
my $o_login= undef; # Login for snmpv3
|
||||||
|
my $o_passwd= undef; # Pass for snmpv3
|
||||||
|
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;
|
||||||
|
|
||||||
|
# functions
|
||||||
|
|
||||||
|
sub p_version { print "$Name version : $Version\n"; }
|
||||||
|
|
||||||
|
sub print_usage {
|
||||||
|
print "Usage: $Name [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -m <name in desc_oid> [-q storagetype] -w <warn_level> -c <crit_level> [-t <timeout>] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,<car>]] [-o <octet_length>] [-R <% reserved>]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub round ($$) {
|
||||||
|
sprintf "%.$_[1]f", $_[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_pattern_valid { # Test for things like "<I\s*[^>" or "+5-i"
|
||||||
|
my $pat = shift;
|
||||||
|
if (!defined($pat)) { $pat=" ";} # Just to get rid of compilation time warnings
|
||||||
|
return eval { "" =~ /$pat/; 1 } || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the alarm signal (just in case snmp timout screws up)
|
||||||
|
$SIG{'ALRM'} = sub {
|
||||||
|
print ("ERROR: General time-out (Alarm signal)\n");
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
};
|
||||||
|
|
||||||
|
sub isnnum { # Return true if arg is not a number
|
||||||
|
my $num = shift;
|
||||||
|
if ( $num =~ /^-?(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub help {
|
||||||
|
print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n";
|
||||||
|
print "(c)2004-2007 Patrick Proy\n\n";
|
||||||
|
print_usage();
|
||||||
|
print <<EOT;
|
||||||
|
By default, plugin will monitor %used on drives :
|
||||||
|
warn if %used > warn and critical if %used > crit
|
||||||
|
-v, --verbose
|
||||||
|
print extra debugging information (and lists all storages)
|
||||||
|
-h, --help
|
||||||
|
print this help message
|
||||||
|
-H, --hostname=HOST
|
||||||
|
name or IP address of host to check
|
||||||
|
-C, --community=COMMUNITY NAME
|
||||||
|
community name for the host's SNMP agent (implies SNMP v1)
|
||||||
|
-2, --v2c
|
||||||
|
Use snmp v2c
|
||||||
|
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||||
|
Login and auth password for snmpv3 authentication
|
||||||
|
If no priv password exists, implies AuthNoPriv
|
||||||
|
-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)
|
||||||
|
-x, --passwd=PASSWD
|
||||||
|
Password for snmpv3 authentication
|
||||||
|
-p, --port=PORT
|
||||||
|
SNMP port (Default 161)
|
||||||
|
-m, --name=NAME
|
||||||
|
Name in description OID (can be mounpoints '/home' or 'Swap Space'...)
|
||||||
|
This is treated as a regexp : -m /var will match /var , /var/log, /opt/var ...
|
||||||
|
Test it before, because there are known bugs (ex : trailling /)
|
||||||
|
No trailing slash for mountpoints !
|
||||||
|
-q, --storagetype=[Other|Ram|VirtualMemory|FixedDisk|RemovableDisk|FloppyDisk
|
||||||
|
CompactDisk|RamDisk|FlashMemory|NetworkDisk]
|
||||||
|
Also check the storage type in addition of the name
|
||||||
|
It is possible to use regular expressions ( "FixedDisk|FloppyDisk" )
|
||||||
|
-r, --noregexp
|
||||||
|
Do not use regexp to match NAME in description OID
|
||||||
|
-s, --sum
|
||||||
|
Add all storages that match NAME (used space and total space)
|
||||||
|
THEN make the tests.
|
||||||
|
-i, --index
|
||||||
|
Parse index table instead of description table to select storage
|
||||||
|
-e, --exclude
|
||||||
|
Select all storages except the one(s) selected by -m
|
||||||
|
No action on storage type selection
|
||||||
|
-T, --type=TYPE
|
||||||
|
pl : calculate percent left
|
||||||
|
pu : calculate percent used (Default)
|
||||||
|
bl : calculate MegaBytes left
|
||||||
|
bu : calculate MegaBytes used
|
||||||
|
-w, --warn=INTEGER
|
||||||
|
percent / MB of disk used to generate WARNING state
|
||||||
|
you can add the % sign
|
||||||
|
-c, --critical=INTEGER
|
||||||
|
percent / MB of disk used to generate CRITICAL state
|
||||||
|
you can add the % sign
|
||||||
|
-R, --reserved=INTEGER
|
||||||
|
% reserved blocks for superuser
|
||||||
|
For ext2/3 filesystems, it is 5% by default
|
||||||
|
-G, --gigabyte
|
||||||
|
output, warning & critical levels in gigabytes
|
||||||
|
-f, --perfparse
|
||||||
|
Perfparse compatible output
|
||||||
|
-S, --short=<type>[,<where>,<cut>]
|
||||||
|
<type>: Make the output shorter :
|
||||||
|
0 : only print the global result except the disk in warning or critical
|
||||||
|
ex: "< 80% : OK"
|
||||||
|
1 : Don't print all info for every disk
|
||||||
|
ex : "/ : 66 %used (< 80) : OK"
|
||||||
|
<where>: (optional) if = 1, put the OK/WARN/CRIT at the beginning
|
||||||
|
<cut>: take the <n> first caracters or <n> last if n<0
|
||||||
|
-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
|
||||||
|
timeout for SNMP in seconds (Default: 5)
|
||||||
|
-V, --version
|
||||||
|
prints version number
|
||||||
|
Note :
|
||||||
|
with T=pu or T=bu : OK < warn < crit
|
||||||
|
with T=pl ot T=bl : crit < warn < OK
|
||||||
|
|
||||||
|
If multiple storage are selected, the worse condition will be returned
|
||||||
|
i.e if one disk is critical, the return is critical
|
||||||
|
|
||||||
|
example :
|
||||||
|
Browse storage list : <script> -C <community> -H <host> -m <anything> -w 1 -c 2 -v
|
||||||
|
the -m option allows regexp in perl format :
|
||||||
|
Test drive C,F,G,H,I on Windows : -m ^[CFGHI]:
|
||||||
|
Test all mounts containing /var : -m /var
|
||||||
|
Test all mounts under /var : -m ^/var
|
||||||
|
Test only /var : -m /var -r
|
||||||
|
Test all swap spaces : -m ^Swap
|
||||||
|
Test all but swap spaces : -m ^Swap -e
|
||||||
|
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||||
|
|
||||||
|
sub check_options {
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
GetOptions(
|
||||||
|
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||||
|
'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,
|
||||||
|
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||||
|
'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,
|
||||||
|
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||||
|
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||||
|
'm:s' => \$o_descr, 'name:s' => \$o_descr,
|
||||||
|
'T:s' => \$o_type, 'type:s' => \$o_type,
|
||||||
|
'r' => \$o_noreg, 'noregexp' => \$o_noreg,
|
||||||
|
's' => \$o_sum, 'sum' => \$o_sum,
|
||||||
|
'i' => \$o_index, 'index' => \$o_index,
|
||||||
|
'e' => \$o_negate, 'exclude' => \$o_negate,
|
||||||
|
'V' => \$o_version, 'version' => \$o_version,
|
||||||
|
'q:s' => \$o_storagetype, 'storagetype:s'=> \$o_storagetype,
|
||||||
|
'S:s' => \$o_short, 'short:s' => \$o_short,
|
||||||
|
'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength,
|
||||||
|
'f' => \$o_perf, 'perfparse' => \$o_perf,
|
||||||
|
'R:i' => \$o_reserve, 'reserved:i' => \$o_reserve,
|
||||||
|
'G' => \$o_giga, 'gigabyte' => \$o_giga
|
||||||
|
);
|
||||||
|
if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if (defined($o_version) ) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# check mount point regexp
|
||||||
|
if (!is_pattern_valid($o_descr))
|
||||||
|
{ print "Bad pattern for mount point !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||||
|
# check snmp information
|
||||||
|
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||||
|
{ 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"}}
|
||||||
|
}
|
||||||
|
# Check types
|
||||||
|
if ( !defined($o_type) ) { $o_type="pu" ;}
|
||||||
|
if ( ! grep( /^$o_type$/ ,@o_typeok) ) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# Check compulsory attributes
|
||||||
|
if ( ! defined($o_descr) || ! defined($o_host) || !defined($o_warn) ||
|
||||||
|
!defined($o_crit)) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# Get rid of % sign if any
|
||||||
|
$o_warn =~ s/\%//;
|
||||||
|
$o_crit =~ s/\%//;
|
||||||
|
# Check for positive numbers
|
||||||
|
if (($o_warn < 0) || ($o_crit < 0)) { print " warn and critical > 0 \n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
# check if warn or crit in % and MB is tested
|
||||||
|
if ( ( ( $o_warn =~ /%/ ) || ($o_crit =~ /%/)) && ( ( $o_type eq 'bu' ) || ( $o_type eq 'bl' ) ) ) {
|
||||||
|
print "warning or critical cannot be in % when MB are tested\n";
|
||||||
|
print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
# Check warning and critical values
|
||||||
|
if ( ( $o_type eq 'pu' ) || ( $o_type eq 'bu' )) {
|
||||||
|
if ($o_warn >= $o_crit) { print " warn < crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
}
|
||||||
|
if ( ( $o_type eq 'pl' ) || ( $o_type eq 'bl' )) {
|
||||||
|
if ($o_warn <= $o_crit) { print " warn > crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
}
|
||||||
|
if ( ($o_warn < 0 ) || ($o_crit < 0 )) { print "warn and crit must be > 0\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
if ( ( $o_type eq 'pl' ) || ( $o_type eq 'pu' )) {
|
||||||
|
if ( ($o_warn > 100 ) || ($o_crit > 100 )) { print "percent must be < 100\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||||
|
}
|
||||||
|
# Check short values
|
||||||
|
if ( defined ($o_short)) {
|
||||||
|
@o_shortL=split(/,/,$o_short);
|
||||||
|
if ((isnnum($o_shortL[0])) || ($o_shortL[0] !=0) && ($o_shortL[0]!=1)) {
|
||||||
|
print "-S first option must be 0 or 1\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
if (defined ($o_shortL[1])&& $o_shortL[1] eq "") {$o_shortL[1]=undef};
|
||||||
|
if (defined ($o_shortL[2]) && isnnum($o_shortL[2]))
|
||||||
|
{print "-S last option must be an integer\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||||
|
}
|
||||||
|
#### octet length checks
|
||||||
|
if (defined ($o_octetlength) && (isnnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) {
|
||||||
|
print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
#### reserved blocks checks (A. Greiner-B<>r patch).
|
||||||
|
if (defined ($o_reserve) && (isnnum($o_reserve) || $o_reserve > 99 || $o_reserve < 0 )) {
|
||||||
|
print "reserved blocks must be < 100 and >= 0\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
########## MAIN #######
|
||||||
|
|
||||||
|
check_options();
|
||||||
|
|
||||||
|
# Check gobal timeout
|
||||||
|
if (defined($TIMEOUT)) {
|
||||||
|
verb("Alarm at $TIMEOUT");
|
||||||
|
alarm($TIMEOUT);
|
||||||
|
} else {
|
||||||
|
verb("no timeout defined : $o_timeout + 10");
|
||||||
|
alarm ($o_timeout+10);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Connect to host
|
||||||
|
my ($session,$error);
|
||||||
|
if ( defined($o_login) && defined($o_passwd)) {
|
||||||
|
# SNMPv3 login
|
||||||
|
verb("SNMPv3 login");
|
||||||
|
if (!defined ($o_privpass)) {
|
||||||
|
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-version => '3',
|
||||||
|
-username => $o_login,
|
||||||
|
-authpassword => $o_passwd,
|
||||||
|
-authprotocol => $o_authproto,
|
||||||
|
-port => $o_port,
|
||||||
|
-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,
|
||||||
|
-authpassword => $o_passwd,
|
||||||
|
-authprotocol => $o_authproto,
|
||||||
|
-privpassword => $o_privpass,
|
||||||
|
-privprotocol => $o_privproto,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (defined ($o_version2)) {
|
||||||
|
# SNMPv2 Login
|
||||||
|
verb("SNMP v2c login");
|
||||||
|
($session, $error) = Net::SNMP->session(
|
||||||
|
-hostname => $o_host,
|
||||||
|
-version => 2,
|
||||||
|
-community => $o_community,
|
||||||
|
-port => $o_port,
|
||||||
|
-timeout => $o_timeout
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
# SNMPV1 login
|
||||||
|
verb("SNMP v1 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");
|
||||||
|
}
|
||||||
|
|
||||||
|
my $resultat=undef;
|
||||||
|
my $stype=undef;
|
||||||
|
# Get rid of UTF8 translation in case of accentuated caracters (thanks to Dimo Velev).
|
||||||
|
$session->translate(Net::SNMP->TRANSLATE_NONE);
|
||||||
|
if (defined ($o_index)){
|
||||||
|
$resultat = $session->get_table(Baseoid => $index_table);
|
||||||
|
} else {
|
||||||
|
$resultat = $session->get_table(Baseoid => $descr_table);
|
||||||
|
}
|
||||||
|
#get storage typetable for reference
|
||||||
|
if (defined($o_storagetype)){
|
||||||
|
$stype = $session->get_table(Baseoid => $storagetype_table);
|
||||||
|
}
|
||||||
|
if (!defined($resultat) | (!defined($stype) && defined($o_storagetype))) {
|
||||||
|
printf("ERROR: Description/Type table : %s.\n", $session->error);
|
||||||
|
$session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
my @tindex = undef;
|
||||||
|
my @oids = undef;
|
||||||
|
my @descr = undef;
|
||||||
|
my $num_int = 0;
|
||||||
|
my $count_oid = 0;
|
||||||
|
my $test = undef;
|
||||||
|
my $perf_out= undef;
|
||||||
|
# Select storage by regexp of exact match
|
||||||
|
# and put the oid to query in an array
|
||||||
|
|
||||||
|
verb("Filter : $o_descr");
|
||||||
|
|
||||||
|
foreach my $key ( keys %$resultat) {
|
||||||
|
verb("OID : $key, Desc : $$resultat{$key}");
|
||||||
|
# test by regexp or exact match / include or exclude
|
||||||
|
if (defined($o_negate)) {
|
||||||
|
$test = defined($o_noreg)
|
||||||
|
? $$resultat{$key} ne $o_descr
|
||||||
|
: $$resultat{$key} !~ /$o_descr/;
|
||||||
|
} else {
|
||||||
|
$test = defined($o_noreg)
|
||||||
|
? $$resultat{$key} eq $o_descr
|
||||||
|
: $$resultat{$key} =~ /$o_descr/;
|
||||||
|
}
|
||||||
|
if ($test) {
|
||||||
|
# get the index number of the interface
|
||||||
|
my @oid_list = split (/\./,$key);
|
||||||
|
$tindex[$num_int] = pop (@oid_list);
|
||||||
|
# Check if storage type is OK
|
||||||
|
if (defined($o_storagetype)) {
|
||||||
|
my($skey)=$storagetype_table.".".$tindex[$num_int];
|
||||||
|
verb(" OID : $skey, Storagetype: $hrStorage{$$stype{$skey}} ?= $o_storagetype");
|
||||||
|
if ( $hrStorage{$$stype{$skey}} !~ $o_storagetype) {
|
||||||
|
$test=undef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($test) {
|
||||||
|
# get the full description
|
||||||
|
$descr[$num_int]=$$resultat{$key};
|
||||||
|
# put the oid in an array
|
||||||
|
$oids[$count_oid++]=$size_table . $tindex[$num_int];
|
||||||
|
$oids[$count_oid++]=$used_table . $tindex[$num_int];
|
||||||
|
$oids[$count_oid++]=$alloc_units . $tindex[$num_int];
|
||||||
|
|
||||||
|
verb(" Name : $descr[$num_int], Index : $tindex[$num_int]");
|
||||||
|
$num_int++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verb("storages selected : $num_int");
|
||||||
|
if ( $num_int == 0 ) { print "Unknown storage : $o_descr : ERROR\n" ; exit $ERRORS{"UNKNOWN"};}
|
||||||
|
|
||||||
|
my $result=undef;
|
||||||
|
|
||||||
|
if ($session->version == 0) {
|
||||||
|
# snmpv1
|
||||||
|
$result = $session->get_request(Varbindlist => \@oids);
|
||||||
|
} else {
|
||||||
|
# snmp v2c or v3 : get_bulk_request is not really good for this, so do simple get
|
||||||
|
$result = $session->get_request(Varbindlist => \@oids);
|
||||||
|
foreach my $key ( keys %$result) { verb("$key : $$result{$key}"); }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!defined($result)) { printf("ERROR: Size table :%s.\n", $session->error); $session->close;
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->close;
|
||||||
|
|
||||||
|
# Only a few ms left...
|
||||||
|
alarm(0);
|
||||||
|
|
||||||
|
# Sum everything if -s and more than one storage
|
||||||
|
if ( defined ($o_sum) && ($num_int > 1) ) {
|
||||||
|
verb("Adding all entries");
|
||||||
|
$$result{$size_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]};
|
||||||
|
$$result{$used_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]};
|
||||||
|
$$result{$alloc_units . $tindex[0]} = 1;
|
||||||
|
for (my $i=1;$i<$num_int;$i++) {
|
||||||
|
$$result{$size_table . $tindex[0]} += ($$result{$size_table . $tindex[$i]}
|
||||||
|
* $$result{$alloc_units . $tindex[$i]});
|
||||||
|
$$result{$used_table . $tindex[0]} += ($$result{$used_table . $tindex[$i]}
|
||||||
|
* $$result{$alloc_units . $tindex[$i]});
|
||||||
|
}
|
||||||
|
$num_int=1;
|
||||||
|
$descr[0]="Sum of all $o_descr";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $i=undef;
|
||||||
|
my $warn_state=0;
|
||||||
|
my $crit_state=0;
|
||||||
|
my ($p_warn,$p_crit);
|
||||||
|
my $output=undef;
|
||||||
|
my $output_metric_val = 1024**2;
|
||||||
|
my $output_metric = "M";
|
||||||
|
# Set the metric
|
||||||
|
if (defined($o_giga)) {
|
||||||
|
$output_metric_val *= 1024;
|
||||||
|
$output_metric='G';
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($i=0;$i<$num_int;$i++) {
|
||||||
|
verb("Descr : $descr[$i]");
|
||||||
|
verb("Size : $$result{$size_table . $tindex[$i]}");
|
||||||
|
verb("Used : $$result{$used_table . $tindex[$i]}");
|
||||||
|
verb("Alloc : $$result{$alloc_units . $tindex[$i]}");
|
||||||
|
if (!defined($$result{$size_table . $tindex[$i]}) ||
|
||||||
|
!defined($$result{$used_table . $tindex[$i]}) ||
|
||||||
|
!defined ($$result{$alloc_units . $tindex[$i]})) {
|
||||||
|
print "Data not fully defined for storage ",$descr[$i]," : UNKNOWN\n";
|
||||||
|
exit $ERRORS{"UNKNOWN"};
|
||||||
|
}
|
||||||
|
my $to = $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val;
|
||||||
|
my $pu=undef;
|
||||||
|
if ( $$result{$used_table . $tindex[$i]} != 0 ) {
|
||||||
|
$pu = $$result{$used_table . $tindex[$i]}* 100 / ( $$result{$size_table . $tindex[$i]} * ( 100 - $o_reserve ) / 100 );
|
||||||
|
}else {
|
||||||
|
$pu=0;
|
||||||
|
}
|
||||||
|
my $bu = $$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / $output_metric_val;
|
||||||
|
my $pl = 100 - $pu;
|
||||||
|
my $bl = ( ( $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) - ( $$result{$used_table . $tindex[$i]} ) ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val );
|
||||||
|
# add a ' ' if some data exists in $perf_out
|
||||||
|
$perf_out .= " " if (defined ($perf_out)) ;
|
||||||
|
##### Ouputs and checks
|
||||||
|
# Keep complete description fot performance output (in MB)
|
||||||
|
my $Pdescr=$descr[$i];
|
||||||
|
$Pdescr =~ s/[`~!\$%\^&\*'"<>|\?,\(= )]/_/g;
|
||||||
|
##### TODO : subs "," with something
|
||||||
|
if (defined($o_shortL[2])) {
|
||||||
|
if ($o_shortL[2] < 0) {$descr[$i]=substr($descr[$i],$o_shortL[2]);}
|
||||||
|
else {$descr[$i]=substr($descr[$i],0,$o_shortL[2]);}
|
||||||
|
}
|
||||||
|
if ($o_type eq "pu") { # Checks % used
|
||||||
|
my $locstate=0;
|
||||||
|
$p_warn=$o_warn*$to/100;$p_crit=$o_crit*$to/100;
|
||||||
|
(($pu >= $o_crit) && ($locstate=$crit_state=1))
|
||||||
|
|| (($pu >= $o_warn) && ($locstate=$warn_state=1));
|
||||||
|
if (defined($o_shortL[2])) {}
|
||||||
|
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||||
|
$output.=sprintf ("%s: %.0f%%used(%.0f%sB/%.0f%sB) ",$descr[$i],$pu,$bu,$output_metric,$to,$output_metric);
|
||||||
|
} elsif ($o_shortL[0] == 1) {
|
||||||
|
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($o_type eq 'bu') { # Checks MBytes used
|
||||||
|
my $locstate=0;
|
||||||
|
$p_warn=$o_warn;$p_crit=$o_crit;
|
||||||
|
( ($bu >= $o_crit) && ($locstate=$crit_state=1) )
|
||||||
|
|| ( ($bu >= $o_warn) && ($locstate=$warn_state=1) );
|
||||||
|
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||||
|
$output.=sprintf("%s: %.0f%sBused/%.0f%sB (%.0f%%) ",$descr[$i],$bu,$output_metric,$to,$output_metric,$pu);
|
||||||
|
} elsif ($o_shortL[0] == 1) {
|
||||||
|
$output.=sprintf("%s: %.0f%sB ",$descr[$i],$bu,$output_metric);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($o_type eq 'bl') {
|
||||||
|
my $locstate=0;
|
||||||
|
$p_warn=$to-$o_warn;$p_crit=$to-$o_crit;
|
||||||
|
( ($bl <= $o_crit) && ($locstate=$crit_state=1) )
|
||||||
|
|| ( ($bl <= $o_warn) && ($locstate=$warn_state=1) );
|
||||||
|
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||||
|
$output.=sprintf ("%s: %.0f%sBleft/%.0f%sB (%.0f%%) ",$descr[$i],$bl,$output_metric,$to,$output_metric,$pl);
|
||||||
|
} elsif ($o_shortL[0] == 1) {
|
||||||
|
$output.=sprintf ("%s: %.0f%sB ",$descr[$i],$bl,$output_metric);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($o_type eq 'pl') {
|
||||||
|
my $locstate=0;
|
||||||
|
$p_warn=(100-$o_warn)*$to/100;$p_crit=(100-$o_crit)*$to/100;
|
||||||
|
( ($pl <= $o_crit) && ($locstate=$crit_state=1) )
|
||||||
|
|| ( ($pl <= $o_warn) && ($locstate=$warn_state=1) );
|
||||||
|
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||||
|
$output.=sprintf ("%s: %.0f%%left(%.0f%sB/%.0f%sB) ",$descr[$i],$pl,$bl,$output_metric,$to,$output_metric);
|
||||||
|
} elsif ($o_shortL[0] == 1) {
|
||||||
|
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Performance output (in MB)
|
||||||
|
$perf_out .= "'".$Pdescr. "'=" . round($bu,0) . $output_metric ."B;" . round($p_warn,0)
|
||||||
|
. ";" . round($p_crit,0) . ";0;" . round($to,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
verb ("Perf data : $perf_out");
|
||||||
|
|
||||||
|
my $comp_oper=undef;
|
||||||
|
my $comp_unit=undef;
|
||||||
|
($o_type eq "pu") && ($comp_oper ="<") && ($comp_unit ="%");
|
||||||
|
($o_type eq "pl") && ($comp_oper =">") && ($comp_unit ="%");
|
||||||
|
($o_type eq "bu") && ($comp_oper ="<") && ($comp_unit = $output_metric."B");
|
||||||
|
($o_type eq 'bl') && ($comp_oper =">") && ($comp_unit =$output_metric."B");
|
||||||
|
|
||||||
|
if (!defined ($output)) { $output="All selected storages "; }
|
||||||
|
|
||||||
|
if ( $crit_state == 1) {
|
||||||
|
$comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator
|
||||||
|
if (defined($o_shortL[1])) {
|
||||||
|
print "CRITICAL : (",$comp_oper,$o_crit,$comp_unit,") ",$output;
|
||||||
|
} else {
|
||||||
|
print $output,"(",$comp_oper,$o_crit,$comp_unit,") : CRITICAL";
|
||||||
|
}
|
||||||
|
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||||
|
exit $ERRORS{"CRITICAL"};
|
||||||
|
}
|
||||||
|
if ( $warn_state == 1) {
|
||||||
|
$comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator
|
||||||
|
if (defined($o_shortL[1])) {
|
||||||
|
print "WARNING : (",$comp_oper,$o_warn,$comp_unit,") ",$output;
|
||||||
|
} else {
|
||||||
|
print $output,"(",$comp_oper,$o_warn,$comp_unit,") : WARNING";
|
||||||
|
}
|
||||||
|
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||||
|
exit $ERRORS{"WARNING"};
|
||||||
|
}
|
||||||
|
if (defined($o_shortL[1])) {
|
||||||
|
print "OK : (",$comp_oper,$o_warn,$comp_unit,") ",$output;
|
||||||
|
} else {
|
||||||
|
print $output,"(",$comp_oper,$o_warn,$comp_unit,") : OK";
|
||||||
|
}
|
||||||
|
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||||
|
|
||||||
|
exit $ERRORS{"OK"};
|
||||||
|
|
||||||
Reference in New Issue
Block a user