git-svn-id: http://svn.centreon.com/trunk/plugins-2.x@3670 6bcd3966-0018-0410-8128-fd23d134de7e

This commit is contained in:
Sylvestre Ho 2008-01-03 17:43:47 +00:00
parent f1256d969e
commit 90dbaa2e38
8 changed files with 1199 additions and 1067 deletions

View File

@ -27,7 +27,8 @@ use strict;
use Net::SNMP qw(:snmp); use Net::SNMP qw(:snmp);
use FindBin; use FindBin;
use lib "$FindBin::Bin"; use lib "$FindBin::Bin";
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
#use lib "@NAGIOS_PLUGINS@";
use utils qw($TIMEOUT %ERRORS &print_revision &support); use utils qw($TIMEOUT %ERRORS &print_revision &support);
if (eval "require centreon" ) { if (eval "require centreon" ) {

View File

@ -28,7 +28,8 @@ use strict;
use Net::SNMP qw(:snmp); use Net::SNMP qw(:snmp);
use FindBin; use FindBin;
use lib "$FindBin::Bin"; use lib "$FindBin::Bin";
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
#use lib "@NAGIOS_PLUGINS@";
use utils qw($TIMEOUT %ERRORS &print_revision &support); use utils qw($TIMEOUT %ERRORS &print_revision &support);
if (eval "require centreon" ) { if (eval "require centreon" ) {

View File

@ -28,7 +28,8 @@ use strict;
use Net::SNMP qw(:snmp oid_lex_sort); use Net::SNMP qw(:snmp oid_lex_sort);
use FindBin; use FindBin;
use lib "$FindBin::Bin"; use lib "$FindBin::Bin";
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
#use lib "@NAGIOS_PLUGINS@";
use utils qw($TIMEOUT %ERRORS &print_revision &support); use utils qw($TIMEOUT %ERRORS &print_revision &support);
if (eval "require centreon" ) { if (eval "require centreon" ) {
@ -152,8 +153,8 @@ foreach my $err (oid_lex_sort(keys %$result_out)) {
# ## # ##
for (my $i = 0; $i < scalar(@nb_in_errors); $i++) { for (my $i = 0; $i < scalar(@nb_in_errors); $i++) {
if (-e "/tmp/packet_errors_if".$i."_".$opt_H.".tmp") { if (-e "/usr/local/centreon/temp/packet_errors_if".$i."_".$opt_H.".tmp") {
open(FILE,"<"."/tmp/packet_errors_if".$i."_".$opt_H.".tmp"); open(FILE,"<"."/usr/local/centreon/temp/packet_errors_if".$i."_".$opt_H.".tmp");
while($row = <FILE>){ while($row = <FILE>){
my @last_values = split(":",$row); my @last_values = split(":",$row);
$last_check_time[$i] = $last_values[0]; $last_check_time[$i] = $last_values[0];
@ -167,8 +168,8 @@ for (my $i = 0; $i < scalar(@nb_in_errors); $i++) {
} }
$update_time = time; $update_time = time;
unless (open(FILE,">"."/tmp/packet_errors_if".$i."_".$opt_H.".tmp")){ unless (open(FILE,">"."/usr/local/centreon/temp/packet_errors_if".$i."_".$opt_H.".tmp")){
print "Unknown - /tmp/tmp/packet_errors_if".$i."_".$opt_H.".tmp!\n"; print "Unknown - /usr/local/centreon/temp/packet_errors_if".$i."_".$opt_H.".tmp!\n";
exit $ERRORS{"UNKNOWN"}; exit $ERRORS{"UNKNOWN"};
} }
print FILE "$update_time:$nb_in_errors[$i]:$nb_out_errors[$i]"; print FILE "$update_time:$nb_in_errors[$i]:$nb_out_errors[$i]";

View File

@ -28,7 +28,8 @@ use strict;
use Net::SNMP qw(:snmp); use Net::SNMP qw(:snmp);
use FindBin; use FindBin;
use lib "$FindBin::Bin"; use lib "$FindBin::Bin";
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
#use lib "@NAGIOS_PLUGINS@";
use utils qw($TIMEOUT %ERRORS &print_revision &support); use utils qw($TIMEOUT %ERRORS &print_revision &support);
if (eval "require centreon" ) { if (eval "require centreon" ) {
@ -208,9 +209,8 @@ if ($opt_s) {
# Get description table # Get description table
my $result = $session->get_table( my $result = $session->get_table(
Baseoid => $OID_hrStorageDescr Baseoid => $OID_hrStorageDescr
);
if (!defined($result)) { if (!defined($result)) {
);
printf("ERROR: hrStorageDescr Table : %s.\n", $session->error); printf("ERROR: hrStorageDescr Table : %s.\n", $session->error);
$session->close; $session->close;
exit $ERRORS{'UNKNOWN'}; exit $ERRORS{'UNKNOWN'};
@ -219,12 +219,11 @@ if ($opt_s) {
foreach my $key ( oid_lex_sort(keys %$result)) { foreach my $key ( oid_lex_sort(keys %$result)) {
my @oid_list = split (/\./,$key); my @oid_list = split (/\./,$key);
my $index = pop (@oid_list) ; my $index = pop (@oid_list) ;
print "hrStorage $index :: $$result{$key}\n"; print "hrStorage $index :: @$result{$key}\n";
} }
exit $ERRORS{'OK'}; exit $ERRORS{'OK'};
} }
my $result = $session->get_request( my $result = $session->get_request(
-varbindlist => [$OID_hrStorageDescr.".".$partition , -varbindlist => [$OID_hrStorageDescr.".".$partition ,
$OID_hrStorageAllocationUnits.".".$partition , $OID_hrStorageAllocationUnits.".".$partition ,

View File

@ -28,7 +28,8 @@ use strict;
use Net::SNMP qw(:snmp oid_lex_sort); use Net::SNMP qw(:snmp oid_lex_sort);
use FindBin; use FindBin;
use lib "$FindBin::Bin"; use lib "$FindBin::Bin";
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
#use lib "@NAGIOS_LIBEXEC@";
use utils qw($TIMEOUT %ERRORS &print_revision &support); use utils qw($TIMEOUT %ERRORS &print_revision &support);
if (eval "require centreon" ) { if (eval "require centreon" ) {
use centreon qw(get_parameters); use centreon qw(get_parameters);
@ -307,8 +308,8 @@ $last_out_bits = 0;
my $flg_created = 0; my $flg_created = 0;
if (-e "/tmp/centreon_traffic_if".$interface."_".$opt_H) { if (-e "/usr/local/centreon/temp/traffic_if".$interface."_".$opt_H) {
open(FILE,"<"."/tmp/centreon_traffic_if".$interface."_".$opt_H); open(FILE,"<"."/usr/local/centreon/temp/traffic_if".$interface."_".$opt_H);
while($row = <FILE>){ while($row = <FILE>){
@last_values = split(":",$row); @last_values = split(":",$row);
$last_check_time = $last_values[0]; $last_check_time = $last_values[0];
@ -323,8 +324,8 @@ if (-e "/tmp/centreon_traffic_if".$interface."_".$opt_H) {
$update_time = time(); $update_time = time();
unless (open(FILE,">"."/tmp/centreon_traffic_if".$interface."_".$opt_H)){ unless (open(FILE,">"."/usr/local/centreon/temp/traffic_if".$interface."_".$opt_H)){
print "Unknown - /tmp/centreon_traffic_if".$interface."_".$opt_H. " !\n"; print "Unknown - /usr/local/centreon/temp/traffic_if".$interface."_".$opt_H. " !\n";
exit $ERRORS{"UNKNOWN"}; exit $ERRORS{"UNKNOWN"};
} }
print FILE "$update_time:$in_bits:$out_bits"; print FILE "$update_time:$in_bits:$out_bits";

View File

@ -1,12 +1,11 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
############################## check_snmp_load ################# ############################## check_snmp_load #################
# Version : 1.2 / BETA my $Version='1.12';
# Date : Aug 27 2005 # Date : Oct 12 2007
# Author : Patrick Proy ( patrick at proy.org) # Author : Patrick Proy ( patrick at proy.org)
# Help : http://www.manubulon.com/nagios/ # Help : http://nagios.manubulon.com/
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt # Licence : GPL - http://www.fsf.org/licenses/gpl.txt
# Changelog : HP Procurve # Contributors : F. Lacroix and many others !!!
# TODO :
################################################################# #################################################################
# #
# Help : ./check_snmp_load.pl -h # Help : ./check_snmp_load.pl -h
@ -18,24 +17,8 @@ use Getopt::Long;
# Nagios specific # Nagios specific
use lib "@NAGIOS_PLUGINS@"; my $TIMEOUT = 15;
use utils qw(%ERRORS $TIMEOUT); my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
#my $TIMEOUT = 15;
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
# Oreon specific
if (eval "require centreon" ) {
use centreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid);
use vars qw($VERSION %centreon);
%centreon=get_parameters();
} else {
print "Unable to load centreon perl module\n";
exit $ERRORS{'UNKNOWN'};
}
my $pathtorrdbase = $centreon{GLOBAL}{DIR_RRDTOOL};
# SNMP Datas # SNMP Datas
@ -56,6 +39,18 @@ 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_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 %) 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 # AS/400 CPU
my $as400_cpu = "1.3.6.1.4.1.2.6.4.5.1.0"; # AS400 CPU load (10000=100%); my $as400_cpu = "1.3.6.1.4.1.2.6.4.5.1.0"; # AS400 CPU load (10000=100%);
@ -75,17 +70,27 @@ my $nokia_cpu = "1.3.6.1.4.1.94.1.21.1.7.1.0"; # Nokia CPU % usage
# Bluecoat Appliance # Bluecoat Appliance
my $bluecoat_cpu = "1.3.6.1.4.1.3417.2.4.1.1.1.4.1"; # Bluecoat %cpu usage. 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 # Linkproof Appliance
my $linkproof_cpu= "1.3.6.1.4.1.89.35.1.53.0"; # Ressource utilisation (%) Considers network utilization and internal CPU utilization 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.54 : CPU only (%)
# 1.3.6.1.4.1.89.35.1.55 : network 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 # 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); 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 # Globals
my $Version='1.2';
my $o_host = undef; # hostname my $o_host = undef; # hostname
my $o_community = undef; # community my $o_community = undef; # community
@ -93,38 +98,30 @@ my $o_port = 161; # port
my $o_help= undef; # wan't some help ? my $o_help= undef; # wan't some help ?
my $o_verb= undef; # verbose mode my $o_verb= undef; # verbose mode
my $o_version= undef; # print version my $o_version= undef; # print version
my $o_check_type= "stand"; # check type : stand | netsc | netsl | as400 | cisco | bc | nokia | hp | lp # check type : stand | netsc | netsl | as400 | cisco | cata | nsc | fg | bc | nokia | hp | lp | hpux
# For backward compatibility my $o_check_type= "stand";
my $o_linux= undef; # Check linux load instead of CPU
my $o_linuxC= undef; # Check Net-SNMP CPU
my $o_as400= undef; # Check for AS 400 load
my $o_cisco= undef; # Check for Cisco CPU
# End compatibility # End compatibility
my $o_warn= undef; # warning level my $o_warn= undef; # warning level
my @o_warnL= undef; # warning levels for Linux Load or Cisco CPU my @o_warnL= undef; # warning levels for Linux Load or Cisco CPU
my $o_crit= undef; # critical level my $o_crit= undef; # critical level
my @o_critL= undef; # critical level for Linux Load or Cisco CPU my @o_critL= undef; # critical level for Linux Load or Cisco CPU
my $o_timeout= 5; # Default 5s Timeout my $o_timeout= undef; # Timeout (Default 5)
my $o_perf= undef; # Output performance data my $o_perf= undef; # Output performance data
my $o_version2= undef; # use snmp v2c my $o_version2= undef; # use snmp v2c
# SNMPv3 specific # SNMPv3 specific
my $o_login= undef; # Login for snmpv3 my $o_login= undef; # Login for snmpv3
my $o_passwd= undef; # Pass for snmpv3 my $o_passwd= undef; # Pass for snmpv3
# centreon specific my $v3protocols=undef; # V3 protocol list.
my $o_step= undef; my $o_authproto='md5'; # Auth protocol
my $o_g= undef; my $o_privproto='des'; # Priv protocol
my $o_S= undef; my $o_privpass= undef; # priv password
my $step= undef;
my $rrd= undef;
my $start= undef;
my $ServiceId= undef;
# functions # functions
sub p_version { print "check_snmp_load version : $Version\n"; } sub p_version { print "check_snmp_load version : $Version\n"; }
sub print_usage { sub print_usage {
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd) [-p <port>] -w <warn level> -c <crit level> -T=[stand|netsl|netsc|as400|cisco|bc|nokia|hp|lp] [-f] [-t <timeout>] [-V]\n"; 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 sub isnnum { # Return true if arg is not a number
@ -135,7 +132,7 @@ sub isnnum { # Return true if arg is not a number
sub help { sub help {
print "\nSNMP Load & CPU Monitor for Nagios version ",$Version,"\n"; print "\nSNMP Load & CPU Monitor for Nagios version ",$Version,"\n";
print "(c)2004 to my cat Ratoune - Author : Patrick Proy\n\n"; print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
print_usage(); print_usage();
print <<EOT; print <<EOT;
-v, --verbose -v, --verbose
@ -148,43 +145,45 @@ sub help {
community name for the host's SNMP agent (implies v1 protocol) community name for the host's SNMP agent (implies v1 protocol)
-2, --v2c -2, --v2c
Use snmp v2c Use snmp v2c
-l, --login=LOGIN -l, --login=LOGIN ; -x, --passwd=PASSWD
Login for snmpv3 authentication (implies v3 protocol with MD5) Login and auth password for snmpv3 authentication
-x, --passwd=PASSWD If no priv password exists, implies AuthNoPriv
Password for snmpv3 authentication -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 -P, --port=PORT
SNMP port (Default 161) SNMP port (Default 161)
-w, --warn=INTEGER | INT,INT,INT -w, --warn=INTEGER | INT,INT,INT
warning level for cpu in percent (on one minute) 1 value check : warning level for cpu in percent (on one minute)
if -L switch then comma separated level for load-1,load-5,load-15 3 value check : comma separated level for load or cpu for 1min, 5min, 15min
if -I switch then comma separated level for cpu 5s,cpu 1m,cpu 5m
-c, --crit=INTEGER | INT,INT,INT -c, --crit=INTEGER | INT,INT,INT
critical level for cpu in percent (on one minute) critical level for cpu in percent (on one minute)
if -L switch then comma separated level for load-1,load-5,load-15 1 value check : critical level for cpu in percent (on one minute)
if -I switch then comma separated level for cpu 5s,cpu 1m,cpu 5m 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 -T, --type=stand|netsl|netsc|as400|cisco|bc|nokia|hp|lp
CPU check : CPU check :
stand : standard MIBII (works with Windows), stand : standard MIBII (works with Windows),
can handle multiple CPU. can handle multiple CPU.
netsl : check linux load provided by Net SNMP netsl : linux load provided by Net SNMP (1,5 & 15 minutes values)
netsc : check cpu usage given by net-snmp (100-idle) netsc : cpu usage given by net-snmp (100-idle)
as400 : check as400 CPU usage as400 : as400 CPU usage
cisco : check cisco CPU usage cisco : Cisco CPU usage
bc : check bluecoat CPU usage cata : Cisco catalyst CPU usage
nokia : check nokia CPU usage nsc : NetScreen CPU usage
hp : check HP procurve switch CPU usage fg : Fortigate CPU usage
bc : Bluecoat CPU usage
nokia : Nokia CPU usage
hp : HP procurve switch CPU usage
lp : Linkproof CPU usage lp : Linkproof CPU usage
hpux : HP-UX load (1,5 & 15 minutes values)
-f, --perfparse -f, --perfparse
Perfparse compatible output Perfparse compatible output
-t, --timeout=INTEGER -t, --timeout=INTEGER
timeout for SNMP in seconds (Default: 5) timeout for SNMP in seconds (Default: 5)
-V, --version -V, --version
prints version number prints version number
-L, --linux, -A, --as400, -I, --cisco, -N, --netsnmp
These options are for backward compatibility (version<1.2)
-g (--rrdgraph) Create a rrd base if necessary and add datas into this one
--rrd_step Specifies the base interval in seconds with which data will be fed into the RRD (300 by default)
-S (--ServiceId) centreon Service Id
EOT EOT
} }
@ -201,30 +200,25 @@ sub check_options {
'C:s' => \$o_community, 'community:s' => \$o_community, 'C:s' => \$o_community, 'community:s' => \$o_community,
'l:s' => \$o_login, 'login:s' => \$o_login, 'l:s' => \$o_login, 'login:s' => \$o_login,
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd, '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, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
'V' => \$o_version, 'version' => \$o_version, 'V' => \$o_version, 'version' => \$o_version,
'2' => \$o_version2, 'v2c' => \$o_version2, '2' => \$o_version2, 'v2c' => \$o_version2,
'c:s' => \$o_crit, 'critical:s' => \$o_crit, 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
'w:s' => \$o_warn, 'warn:s' => \$o_warn, 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
'f' => \$o_perf, 'perfparse' => \$o_perf, 'f' => \$o_perf, 'perfparse' => \$o_perf,
'T:s' => \$o_check_type, 'type:s' => \$o_check_type, 'T:s' => \$o_check_type, 'type:s' => \$o_check_type
# For backward compatibility
'L' => \$o_linux, 'linux' => \$o_linux,
'A' => \$o_as400, 'as400' => \$o_as400,
'I' => \$o_cisco, 'cisco' => \$o_cisco,
'N' => \$o_linuxC, 'netsnmp' => \$o_linuxC,
# For centreon rrdtool graph
"rrd_step:s" => \$o_step,
"g" => \$o_g, "rrdgraph" => \$o_g,
"S=s" => \$o_S, "ServiceId=s" => \$o_S
); );
# For backward compat # check the -T option
if (defined($o_linux)) { $o_check_type="netsl" } my $T_option_valid=0;
if (defined($o_linuxC)) { $o_check_type="netsc" } foreach (@valid_types) { if ($_ eq $o_check_type) {$T_option_valid=1} };
if (defined($o_as400)) { $o_check_type="as400"} if ( $T_option_valid == 0 )
if (defined($o_cisco)) { $o_check_type="cisco"} {print "Invalid check type (-T)!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
# TODO : check the -T option # 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_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
if ( ! defined($o_host) ) # check host and filter if ( ! defined($o_host) ) # check host and filter
@ -232,6 +226,16 @@ sub check_options {
# check snmp information # check snmp information
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ) if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { 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 # Check warnings and critical
if (!defined($o_warn) || !defined($o_crit)) if (!defined($o_warn) || !defined($o_crit))
{ print "put warning and critical info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { print "put warning and critical info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
@ -239,8 +243,8 @@ sub check_options {
$o_warn =~ s/\%//g; $o_warn =~ s/\%//g;
$o_crit =~ s/\%//g; $o_crit =~ s/\%//g;
# Check for multiple warning and crit in case of -L # Check for multiple warning and crit in case of -L
if (($o_warn =~ /,/) || ($o_crit =~ /,/)) { if (($o_check_type eq "netsl") || ($o_check_type eq "cisco") || ($o_check_type eq "cata") ||
if (($o_check_type ne "netsl") && ($o_check_type ne "cisco")) { print "Multiple warning without -L or -I switch\n";print_usage(); exit $ERRORS{"UNKNOWN"}} ($o_check_type eq "nsc") || ($o_check_type eq "hpux")) {
@o_warnL=split(/,/ , $o_warn); @o_warnL=split(/,/ , $o_warn);
@o_critL=split(/,/ , $o_crit); @o_critL=split(/,/ , $o_crit);
if (($#o_warnL != 2) || ($#o_critL != 2)) if (($#o_warnL != 2) || ($#o_critL != 2))
@ -252,56 +256,66 @@ sub check_options {
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}} { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
} }
} else { } else {
if (($o_check_type eq "netsl") || ($o_check_type eq "cisco")) { print "Multiple warn and crit levels needed with -L or -I switch\n";print_usage(); exit $ERRORS{"UNKNOWN"}} 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) ) if ( isnnum($o_warn) || isnnum($o_crit) )
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}} { print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
if ($o_warn > $o_crit) if ($o_warn > $o_crit)
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}} { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
} }
###### centreon #######
if (!defined($o_S)) { $o_S="1_1" }
$ServiceId = is_valid_serviceid($o_S);
if (!defined($o_step)) { $o_step="300" }
$step = $1 if ($o_step =~ /(\d+)/);
} }
########## MAIN ####### ########## MAIN #######
check_options(); check_options();
$rrd = $pathtorrdbase.$ServiceId.".rrd";
$start=time;
# Check gobal timeout if snmp screws up # Check gobal timeout if snmp screws up
if (defined($TIMEOUT)) { if (defined($TIMEOUT)) {
verb("Alarm at $TIMEOUT + 5"); verb("Alarm at $TIMEOUT + 5");
alarm($TIMEOUT+5); alarm($TIMEOUT+5);
} else { } else {
verb("no timeout defined : $o_timeout + 10"); verb("no global timeout defined : $o_timeout + 10");
alarm ($o_timeout+10); alarm ($o_timeout+10);
} }
$SIG{'ALRM'} = sub {
print "No answer from host\n";
exit $ERRORS{"UNKNOWN"};
};
# Connect to host # Connect to host
my ($session,$error); my ($session,$error);
if ( defined($o_login) && defined($o_passwd)) { if ( defined($o_login) && defined($o_passwd)) {
# SNMPv3 login # SNMPv3 login
verb("SNMPv3 login"); verb("SNMPv3 login");
if (!defined ($o_privpass)) {
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => '3', -version => '3',
-username => $o_login, -username => $o_login,
-authpassword => $o_passwd, -authpassword => $o_passwd,
-authprotocol => 'md5', -authprotocol => $o_authproto,
-privpassword => $o_passwd,
-timeout => $o_timeout -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 { } else {
if (defined ($o_version2)) { if (defined ($o_version2)) {
# SNMPv2 Login # SNMPv2 Login
verb("SNMP v2c login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => 2, -version => 2,
@ -311,6 +325,7 @@ if ( defined($o_login) && defined($o_passwd)) {
); );
} else { } else {
# SNMPV1 login # SNMPV1 login
verb("SNMP v1 login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-community => $o_community, -community => $o_community,
@ -345,6 +360,7 @@ $session->close;
my @load = undef; my @load = undef;
my @iload = undef; my @iload = undef;
my @oid=undef; my @oid=undef;
my $exist=0;
foreach my $key ( keys %$resultat) { foreach my $key ( keys %$resultat) {
verb("OID : $key, Desc : $$resultat{$key}"); verb("OID : $key, Desc : $$resultat{$key}");
if ( $key =~ /$linload_name/ ) { if ( $key =~ /$linload_name/ ) {
@ -352,24 +368,17 @@ foreach my $key ( keys %$resultat) {
$iload[0]= pop(@oid) if ($$resultat{$key} eq "Load-1"); $iload[0]= pop(@oid) if ($$resultat{$key} eq "Load-1");
$iload[1]= pop(@oid) if ($$resultat{$key} eq "Load-5"); $iload[1]= pop(@oid) if ($$resultat{$key} eq "Load-5");
$iload[2]= pop(@oid) if ($$resultat{$key} eq "Load-15"); $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]}}; for (my $i=0;$i<3;$i++) { $load[$i] = $$resultat{$linload_load . "." . $iload[$i]}};
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,3,$start,$step,0,"U","GAUGE");
}
update_rrd($rrd,$start, $load[0] ,$load[1], $load[2]);
}
print "Load : $load[0] $load[1] $load[2] :"; print "Load : $load[0] $load[1] $load[2] :";
$exit_val=$ERRORS{"OK"}; $exit_val=$ERRORS{"OK"};
@ -388,8 +397,8 @@ for (my $i=0;$i<3;$i++) {
} }
print " OK" if ($exit_val eq $ERRORS{"OK"}); print " OK" if ($exit_val eq $ERRORS{"OK"});
if (defined($o_perf)) { if (defined($o_perf)) {
print " | load_1_min=$load[0];$o_warnL[0];$o_critL[0],"; 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_5_min=$load[1];$o_warnL[1];$o_critL[1] ";
print "load_15_min=$load[2];$o_warnL[2];$o_critL[2]\n"; print "load_15_min=$load[2];$o_warnL[2];$o_critL[2]\n";
} else { } else {
print "\n"; print "\n";
@ -424,17 +433,60 @@ $load[0]=$$resultat{$cisco_cpu_5s};
$load[1]=$$resultat{$cisco_cpu_1m}; $load[1]=$$resultat{$cisco_cpu_1m};
$load[2]=$$resultat{$cisco_cpu_5m}; $load[2]=$$resultat{$cisco_cpu_5m};
## print "CPU : $load[0] $load[1] $load[2] :";
## RRD management
##
if ($o_g) { $exit_val=$ERRORS{"OK"};
$start=time; for (my $i=0;$i<3;$i++) {
if (! -e $rrd) { if ( $load[$i] > $o_critL[$i] ) {
create_rrd($rrd,3,$start,$step,0,"U","GAUGE"); print " $load[$i] > $o_critL[$i] : CRITICAL";
$exit_val=$ERRORS{"CRITICAL"};
} }
update_rrd($rrd,$start,$load[0] ,$load[1], $load[2]); 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 = (Net::SNMP->VERSION < 4) ?
$session->get_request(@oidlists)
: $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] :"; print "CPU : $load[0] $load[1] $load[2] :";
@ -454,8 +506,8 @@ for (my $i=0;$i<3;$i++) {
} }
print " OK" if ($exit_val eq $ERRORS{"OK"}); print " OK" if ($exit_val eq $ERRORS{"OK"});
if (defined($o_perf)) { if (defined($o_perf)) {
print " | load_5_sec=$load[0]%;$o_warnL[0];$o_critL[0],"; 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_1_min=$load[1]%;$o_warnL[1];$o_critL[1] ";
print "load_5_min=$load[2]%;$o_warnL[2];$o_critL[2]\n"; print "load_5_min=$load[2]%;$o_warnL[2];$o_critL[2]\n";
} else { } else {
print "\n"; print "\n";
@ -464,8 +516,63 @@ if (defined($o_perf)) {
exit $exit_val; exit $exit_val;
} }
################## CPU for : AS/400 , Netsnmp, HP, Bluecoat, linkproof ########### ############## Netscreen CPU check ################
if ( $o_check_type =~ /netsc|as400|bc|nokia|hp|lp/ ) {
if ($o_check_type eq "nsc") {
my @oidlists = ($nsc_cpu_5m, $nsc_cpu_1m, $nsc_cpu_5s);
my $resultat = (Net::SNMP->VERSION < 4) ?
$session->get_request(@oidlists)
: $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 # Get load table
my @oidlist = $cpu_oid{$o_check_type}; my @oidlist = $cpu_oid{$o_check_type};
@ -492,19 +599,6 @@ if ($o_check_type eq "as400") {$load /= 100; };
# for Net-snmp : oid returned idle time so load = 100-idle. # for Net-snmp : oid returned idle time so load = 100-idle.
if ($o_check_type eq "netsc") {$load = 100 - $load; }; if ($o_check_type eq "netsc") {$load = 100 - $load; };
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,1,$start,$step,0,"U","GAUGE");
}
update_rrd($rrd,$start,$load);
}
printf("CPU used %.1f%% (",$load); printf("CPU used %.1f%% (",$load);
$exit_val=$ERRORS{"OK"}; $exit_val=$ERRORS{"OK"};
@ -525,6 +619,63 @@ 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 = (Net::SNMP->VERSION < 4) ?
$session->get_request(@oidlists)
: $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 ############ ########## Standard cpu usage check ############
# Get desctiption table # Get desctiption table
my $resultat = (Net::SNMP->VERSION < 4) ? my $resultat = (Net::SNMP->VERSION < 4) ?
@ -555,32 +706,20 @@ if ($ncpu==0) {
$cpu_used /= $ncpu; $cpu_used /= $ncpu;
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,1,$start,$step,0,"U","GAUGE");
}
update_rrd($rrd,$start,$cpu_used);
}
print "$ncpu CPU, ", $ncpu==1 ? "load" : "average load"; print "$ncpu CPU, ", $ncpu==1 ? "load" : "average load";
printf(" %.1f",$cpu_used); printf(" %.1f%%",$cpu_used);
$exit_val=$ERRORS{"OK"}; $exit_val=$ERRORS{"OK"};
if ($cpu_used > $o_crit) { if ($cpu_used > $o_crit) {
print " > $o_crit : CRITICAL"; print " > $o_crit% : CRITICAL";
$exit_val=$ERRORS{"CRITICAL"}; $exit_val=$ERRORS{"CRITICAL"};
} else { } else {
if ($cpu_used > $o_warn) { if ($cpu_used > $o_warn) {
print " > $o_warn : WARNING"; print " > $o_warn% : WARNING";
$exit_val=$ERRORS{"WARNING"}; $exit_val=$ERRORS{"WARNING"};
} }
} }
print " < $o_warn : OK" if ($exit_val eq $ERRORS{"OK"}); print " < $o_warn% : OK" if ($exit_val eq $ERRORS{"OK"});
(defined($o_perf)) ? (defined($o_perf)) ?
print " | cpu_prct_used=$cpu_used%;$o_warn;$o_crit\n" print " | cpu_prct_used=$cpu_used%;$o_warn;$o_crit\n"
: print "\n"; : print "\n";

View File

@ -1,11 +1,12 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
############################## check_snmp_mem ############## ############################## check_snmp_mem ##############
# Version : 0.9 # Version : 1.1
# Date : Jul 20 2005 # Date : Jul 09 2006
# Author : Patrick Proy (patrick at proy.org) # Author : Patrick Proy (nagios at proy.org)
# Help : http://www.manubulon.com/nagios/ # Help : http://www.manubulon.com/nagios/
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt # Licence : GPL - http://www.fsf.org/licenses/gpl.txt
# TODO : snmpv3 # Contrib : Jan Jungmann
# TODO :
################################################################# #################################################################
# #
# Help : ./check_snmp_mem.pl -h # Help : ./check_snmp_mem.pl -h
@ -17,33 +18,21 @@ use Getopt::Long;
# Nagios specific # Nagios specific
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
use utils qw(%ERRORS $TIMEOUT); use utils qw(%ERRORS $TIMEOUT);
#my $TIMEOUT = 15; #my $TIMEOUT = 15;
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); #my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
# Oreon specific
if (eval "require centreon" ) {
use centreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid);
use vars qw($VERSION %centreon);
%centreon=get_parameters();
} else {
print "Unable to load centreon perl module\n";
exit $ERRORS{'UNKNOWN'};
}
my $pathtorrdbase = $centreon{GLOBAL}{DIR_RRDTOOL};
# SNMP Datas # SNMP Datas
# Net-snmp memory # Net-snmp memory
my $nets_ram_free = "1.3.6.1.4.1.2021.4.6.0"; # Real memory free 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_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_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_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); my @nets_oids = ($nets_ram_free,$nets_ram_total,$nets_swap_free,$nets_swap_total,$nets_ram_cache);
# Cisco # Cisco
@ -51,7 +40,7 @@ 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_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_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_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"; # 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 # .1 : type, .2 : name, .3 : alternate, .4 : valid, .5 : used, .6 : free, .7 : max free
# HP Procurve # HP Procurve
@ -71,7 +60,7 @@ 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
# Globals # Globals
my $Version='0.9'; my $Version='1.1';
my $o_host = undef; # hostname my $o_host = undef; # hostname
my $o_community = undef; # community my $o_community = undef; # community
@ -89,28 +78,23 @@ my $o_crit= undef; # Critical level option
my $o_critR= undef; # critical level for Real memory my $o_critR= undef; # critical level for Real memory
my $o_critS= undef; # critical level for swap my $o_critS= undef; # critical level for swap
my $o_perf= undef; # Performance data option my $o_perf= undef; # Performance data option
my $o_timeout= 5; # Default 5s Timeout my $o_cache= undef; # Include cached memory as used memory
my $o_timeout= undef; # Timeout (Default 5)
my $o_version2= undef; # use snmp v2c my $o_version2= undef; # use snmp v2c
# SNMPv3 specific # SNMPv3 specific
my $o_login= undef; # Login for snmpv3 my $o_login= undef; # Login for snmpv3
my $o_passwd= undef; # Pass for snmpv3 my $o_passwd= undef; # Pass for snmpv3
my $v3protocols=undef; # V3 protocol list.
# Oreon specific my $o_authproto='md5'; # Auth protocol
my $o_step= undef; my $o_privproto='des'; # Priv protocol
my $o_g= undef; my $o_privpass= undef; # priv password
my $o_S= undef;
my $step= undef;
my $rrd= undef;
my $start= undef;
my $ServiceId= undef;
# functions # functions
sub p_version { print "check_snmp_mem version : $Version\n"; } sub p_version { print "check_snmp_mem version : $Version\n"; }
sub print_usage { sub print_usage {
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd) [-p <port>] -w <warn level> -c <crit level> [-I|-N|-E] [-f] [-t <timeout>] [-V]\n"; 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 sub isnnum { # Return true if arg is not a number
@ -125,7 +109,7 @@ sub round ($$) {
sub help { sub help {
print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n"; print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n";
print "(c)2004 to my cat Ratoune - Author: Patrick Proy\n\n"; print "(c)2004-2006 to my cat Ratoune - Author: Patrick Proy\n\n";
print_usage(); print_usage();
print <<EOT; print <<EOT;
-v, --verbose -v, --verbose
@ -138,10 +122,14 @@ sub help {
community name for the host's SNMP agent (implies SNMP v1 or v2c with option) community name for the host's SNMP agent (implies SNMP v1 or v2c with option)
-2, --v2c -2, --v2c
Use snmp v2c Use snmp v2c
-l, --login=LOGIN -l, --login=LOGIN ; -x, --passwd=PASSWD
Login for snmpv3 authentication (implies v3 protocol with MD5) Login and auth password for snmpv3 authentication
-x, --passwd=PASSWD If no priv password exists, implies AuthNoPriv
Password for snmpv3 authentication -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 -P, --port=PORT
SNMP port (Default 161) SNMP port (Default 161)
-w, --warn=INTEGER | INT,INT -w, --warn=INTEGER | INT,INT
@ -154,6 +142,8 @@ sub help {
-I switch : critical level -I switch : critical level
-N, --netsnmp (default) -N, --netsnmp (default)
check linux memory & swap provided by Net SNMP check linux memory & swap provided by Net SNMP
-m, --memcache
include cached memory in used memory (only with Net-SNMP)
-I, --cisco -I, --cisco
check cisco memory (sum of all memory pools) check cisco memory (sum of all memory pools)
-E, --hp -E, --hp
@ -164,9 +154,6 @@ sub help {
timeout for SNMP in seconds (Default: 5) timeout for SNMP in seconds (Default: 5)
-V, --version -V, --version
prints version number prints version number
-g (--rrdgraph) Create a rrd base if necessary and add datas into this one
--rrd_step Specifies the base interval in seconds with which data will be fed into the RRD (300 by default)
-S (--ServiceId) Oreon Service Id
EOT EOT
} }
@ -189,6 +176,8 @@ sub check_options {
'C:s' => \$o_community, 'community:s' => \$o_community, 'C:s' => \$o_community, 'community:s' => \$o_community,
'l:s' => \$o_login, 'login:s' => \$o_login, 'l:s' => \$o_login, 'login:s' => \$o_login,
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd, '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, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
'V' => \$o_version, 'version' => \$o_version, 'V' => \$o_version, 'version' => \$o_version,
'I' => \$o_cisco, 'cisco' => \$o_cisco, 'I' => \$o_cisco, 'cisco' => \$o_cisco,
@ -197,11 +186,8 @@ sub check_options {
'2' => \$o_version2, 'v2c' => \$o_version2, '2' => \$o_version2, 'v2c' => \$o_version2,
'c:s' => \$o_crit, 'critical:s' => \$o_crit, 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
'w:s' => \$o_warn, 'warn:s' => \$o_warn, 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
'f' => \$o_perf, 'perfdata' => \$o_perf, 'm' => \$o_cache, 'memcache' => \$o_cache,
# For Oreon rrdtool graph 'f' => \$o_perf, 'perfdata' => \$o_perf
"rrd_step:s" => \$o_step,
"g" => \$o_g, "rrdgraph" => \$o_g,
"S=s" => \$o_S, "ServiceId=s" => \$o_S
); );
if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}}; if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
@ -210,6 +196,19 @@ sub check_options {
# check snmp information # check snmp information
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ) if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { 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 #Check Warning and crit are present
if ( ! defined($o_warn) || ! defined($o_crit)) if ( ! defined($o_warn) || ! defined($o_crit))
{ print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
@ -241,23 +240,12 @@ sub check_options {
$o_critR=$o_critL[0];$o_critS=$o_critL[1]; $o_critR=$o_critL[0];$o_critS=$o_critL[1];
} }
###### Oreon #######
if (!defined($o_S)) { $o_S="1_1" }
$ServiceId = is_valid_serviceid($o_S);
if (!defined($o_step)) { $o_step="300" }
$step = $1 if ($o_step =~ /(\d+)/);
} }
########## MAIN ####### ########## MAIN #######
check_options(); check_options();
$rrd = $pathtorrdbase.$ServiceId.".rrd";
$start=time;
# Check gobal timeout if snmp screws up # Check gobal timeout if snmp screws up
if (defined($TIMEOUT)) { if (defined($TIMEOUT)) {
verb("Alarm at $TIMEOUT"); verb("Alarm at $TIMEOUT");
@ -271,19 +259,33 @@ if (defined($TIMEOUT)) {
my ($session,$error); my ($session,$error);
if ( defined($o_login) && defined($o_passwd)) { if ( defined($o_login) && defined($o_passwd)) {
# SNMPv3 login # SNMPv3 login
verb("SNMPv3 login"); if (!defined ($o_privpass)) {
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => '3', -version => '3',
-username => $o_login, -username => $o_login,
-authpassword => $o_passwd, -authpassword => $o_passwd,
-authprotocol => 'md5', -authprotocol => $o_authproto,
-privpassword => $o_passwd,
-timeout => $o_timeout -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 { } else {
if (defined ($o_version2)) { if (defined ($o_version2)) {
# SNMPv2 Login # SNMPv2 Login
verb("SNMP v2c login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => 2, -version => 2,
@ -292,8 +294,8 @@ if ( defined($o_login) && defined($o_passwd)) {
-timeout => $o_timeout -timeout => $o_timeout
); );
} else { } else {
# SNMPV1 login # SNMPV1 login
verb("SNMP v1 login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-community => $o_community, -community => $o_community,
@ -340,42 +342,37 @@ if (defined ($o_cisco)) {
exit $ERRORS{"UNKNOWN"}; exit $ERRORS{"UNKNOWN"};
} }
# Consolidate the datas # Test every memory pool
my ($used,$free)=(0,0);
my ($c_output,$prct_free)=(undef,undef); my ($c_output,$prct_free)=(undef,undef);
my ($warn_s,$crit_s)=(0,0);
my ($used,$free)=(0,0);
foreach (@index) { foreach (@index) {
if ( $$resultat{$cisco_valid . "." . $_} == 1 ) {
$c_output .="," if defined ($c_output); $c_output .="," if defined ($c_output);
if ( $$resultat{$cisco_valid . "." . $_} == 1 ) {
$used += $$resultat{$cisco_used . "." . $_}; $used += $$resultat{$cisco_used . "." . $_};
$free += $$resultat{$cisco_free . "." . $_}; $free += $$resultat{$cisco_free . "." . $_};
$c_output .= $$resultat{$cisco_index . "." . $_} . ":" $prct_free=round($$resultat{$cisco_used . "." . $_}*100/($$resultat{$cisco_free . "." . $_}+$$resultat{$cisco_used . "." . $_}) ,0);
.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; my $total=$used+$free;
$prct_free=round($used*100/($total),0); $prct_free=round($used*100/($total),0);
verb("Used : $used, Free: $free, Output : $c_output"); verb("Total used : $used, free: $free, output : $c_output");
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,1,$start,$step,0,100,"GAUGE");
}
update_rrd($rrd,$start,$prct_free);
}
my $c_status="OK"; my $c_status="OK";
$c_output .=" : " . $prct_free ."% : "; $c_output .=" : " . $prct_free ."% : ";
if (($o_crit!=0)&&($o_crit <= $prct_free)) { if ($crit_s == 1 ) {
$c_output .= " > " . $o_crit ; $c_output .= " > " . $o_crit ;
$c_status="CRITICAL"; $c_status="CRITICAL";
} else { } else {
if (($o_warn!=0)&&($o_warn <= $prct_free)) { if ($warn_s == 1 ) {
$c_output.=" > " . $o_warn; $c_output.=" > " . $o_warn;
$c_status="WARNING"; $c_status="WARNING";
} }
@ -438,19 +435,6 @@ if (defined ($o_hp)) {
my $used = $total - $free; my $used = $total - $free;
$prct_free=round($used*100/($total),0); $prct_free=round($used*100/($total),0);
verb("Used : $used, Free: $free, Output : $c_output"); verb("Used : $used, Free: $free, Output : $c_output");
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,1,$start,$step,0,100,"GAUGE");
}
update_rrd($rrd,$start,$prct_free);
}
my $c_status="OK"; my $c_status="OK";
$c_output .=" : " . $prct_free ."% : "; $c_output .=" : " . $prct_free ."% : ";
if (($o_crit!=0)&&($o_crit <= $prct_free)) { if (($o_crit!=0)&&($o_crit <= $prct_free)) {
@ -490,29 +474,23 @@ if (defined ($o_netsnmp)) {
my ($realused,$swapused)=(undef,undef); my ($realused,$swapused)=(undef,undef);
$realused= ($$resultat{$nets_ram_total} == 0) ? 0 : $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_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 : $swapused= ($$resultat{$nets_swap_total} == 0) ? 0 :
($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free})/$$resultat{$nets_swap_total}; ($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free})/$$resultat{$nets_swap_total};
$realused=round($realused*100,0); $realused=round($realused*100,0);
$swapused=round($swapused*100,0); $swapused=round($swapused*100,0);
verb ("Ram : $$resultat{$nets_ram_free} / $$resultat{$nets_ram_total} : $realused"); 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"); verb ("Swap : $$resultat{$nets_swap_free} / $$resultat{$nets_swap_total} : $swapused");
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,2,$start,$step,0,100,"GAUGE");
}
update_rrd($rrd,$start,$realused, $swapused );
}
my $n_status="OK"; my $n_status="OK";
my $n_output="Ram : " . $realused . "%, Swap : " . $swapused . "% :"; my $n_output="Ram : " . $realused . "%, Swap : " . $swapused . "% :";
if ((($o_critR!=0)&&($o_critR <= $realused)) || (($o_critS!=0)&&($o_critS <= $swapused))) { if ((($o_critR!=0)&&($o_critR <= $realused)) || (($o_critS!=0)&&($o_critS <= $swapused))) {
@ -526,7 +504,12 @@ if (defined ($o_netsnmp)) {
} }
$n_output .= " ; ".$n_status; $n_output .= " ; ".$n_status;
if (defined ($o_perf)) { if (defined ($o_perf)) {
if (defined ($o_cache)) {
$n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}).";"; $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_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 .= ($o_critR ==0)? ";" : round($o_critR * $$resultat{$nets_ram_total}/100,0).";";
$n_output .= "0;" . $$resultat{$nets_ram_total}. " "; $n_output .= "0;" . $$resultat{$nets_ram_total}. " ";

View File

@ -1,11 +1,12 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
############################## check_snmp_storage ############## ############################## check_snmp_storage ##############
# Version : 1.1.1.4 - DEV # Version : 1.3.3
# Date : Aug 2 2005 # Date : Jun 1 2007
# Author : Patrick Proy ( patrick at proy.org) # Author : Patrick Proy ( patrick at proy.org)
# Help : http://www.manubulon.com/nagios/ # Help : http://nagios.manubulon.com
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt # Licence : GPL - http://www.fsf.org/licenses/gpl.txt
# TODO : better options in snmpv3 # TODO :
# Contribs : Dimo Velev, Makina Corpus, A. Greiner-Bär
################################################################# #################################################################
# #
# help : ./check_snmp_storage -h # help : ./check_snmp_storage -h
@ -16,25 +17,11 @@ use Getopt::Long;
# Nagios specific # Nagios specific
use lib "@NAGIOS_PLUGINS@"; use lib "/usr/local/nagios/libexec";
use utils qw(%ERRORS $TIMEOUT); use utils qw(%ERRORS $TIMEOUT);
#my $TIMEOUT = 15; #my $TIMEOUT = 15;
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); #my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
# Oreon specific
#use lib "@NAGIOS_PLUGINS@";
if (eval "require centreon" ) {
use centreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid);
use vars qw($VERSION %centreon);
%centreon=get_parameters();
} else {
print "Unable to load centreon perl module\n";
exit $ERRORS{'UNKNOWN'};
}
my $pathtorrdbase = $centreon{GLOBAL}{DIR_RRDTOOL};
# SNMP Datas # SNMP Datas
my $storage_table= '1.3.6.1.2.1.25.2.3.1'; 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 $storagetype_table = '1.3.6.1.2.1.25.2.3.1.2';
@ -70,7 +57,7 @@ $hrStorage{"1.3.6.1.2.1.25.2.1.10"} = 'NetworkDisk';
# Globals # Globals
my $Name='check_snmp_storage'; my $Name='check_snmp_storage';
my $Version='1.1.1.3'; my $Version='1.3.3';
my $o_host = undef; # hostname my $o_host = undef; # hostname
my $o_community = undef; # community my $o_community = undef; # community
@ -93,26 +80,24 @@ my $o_timeout= 5; # Default 5s Timeout
my $o_perf= undef; # Output performance data my $o_perf= undef; # Output performance data
my $o_short= undef; # Short output parameters my $o_short= undef; # Short output parameters
my @o_shortL= undef; # output type,where,cut my @o_shortL= undef; # output type,where,cut
# SNMP V3 specific my $o_reserve= 0; # % reserved blocks (A. Greiner-Bär patch)
my $o_login= undef; # snmp v3 login my $o_giga= undef; # output and levels in gigabytes instead of megabytes
my $o_passwd= undef; # snmp v3 passwd # SNMPv3 specific
# centreon specific my $o_login= undef; # Login for snmpv3
my $o_step= undef; my $o_passwd= undef; # Pass for snmpv3
my $o_g= undef; my $v3protocols=undef; # V3 protocol list.
my $o_S= undef; my $o_authproto='md5'; # Auth protocol
my $step= undef; my $o_privproto='des'; # Priv protocol
my $rrd= undef; my $o_privpass= undef; # priv password
my $rrd_max= undef; # SNMP Message size parameter (Makina Corpus contrib)
my $start= undef; my $o_octetlength=undef;
my $ServiceId= undef;
my @rrd_data= undef;
# functions # functions
sub p_version { print "$Name version : $Version\n"; } sub p_version { print "$Name version : $Version\n"; }
sub print_usage { sub print_usage {
print "Usage: $Name [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd) [-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] [-e] [-S 0|1[,1,<car>]]\n"; 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 ($$) { sub round ($$) {
@ -139,7 +124,7 @@ sub isnnum { # Return true if arg is not a number
sub help { sub help {
print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n"; print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n";
print "(c)2004 to my cat Ratoune - Author : Patrick Proy\n\n"; print "(c)2004-2007 Patrick Proy\n\n";
print_usage(); print_usage();
print <<EOT; print <<EOT;
By default, plugin will monitor %used on drives : By default, plugin will monitor %used on drives :
@ -154,8 +139,14 @@ warn if %used > warn and critical if %used > crit
community name for the host's SNMP agent (implies SNMP v1) community name for the host's SNMP agent (implies SNMP v1)
-2, --v2c -2, --v2c
Use snmp v2c Use snmp v2c
-l, --login=LOGIN -l, --login=LOGIN ; -x, --passwd=PASSWD
Login for snmpv3 authentication (implies v3 protocol with MD5) 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 -x, --passwd=PASSWD
Password for snmpv3 authentication Password for snmpv3 authentication
-p, --port=PORT -p, --port=PORT
@ -190,6 +181,11 @@ warn if %used > warn and critical if %used > crit
-c, --critical=INTEGER -c, --critical=INTEGER
percent / MB of disk used to generate CRITICAL state percent / MB of disk used to generate CRITICAL state
you can add the % sign 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 -f, --perfparse
Perfparse compatible output Perfparse compatible output
-S, --short=<type>[,<where>,<cut>] -S, --short=<type>[,<where>,<cut>]
@ -200,14 +196,14 @@ warn if %used > warn and critical if %used > crit
ex : "/ : 66 %used (< 80) : OK" ex : "/ : 66 %used (< 80) : OK"
<where>: (optional) if = 1, put the OK/WARN/CRIT at the beginning <where>: (optional) if = 1, put the OK/WARN/CRIT at the beginning
<cut>: take the <n> first caracters or <n> last if n<0 <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 -t, --timeout=INTEGER
timeout for SNMP in seconds (Default: 5) timeout for SNMP in seconds (Default: 5)
-V, --version -V, --version
prints version number prints version number
-g (--rrdgraph) Create a rrd base if necessary and add datas into this one
--rrd_step Specifies the base interval in seconds with which data will be fed into the RRD (300 by default)
-S (--ServiceId) centreon Service Id
Note : Note :
with T=pu or T=bu : OK < warn < crit with T=pu or T=bu : OK < warn < crit
with T=pl ot T=bl : crit < warn < OK with T=pl ot T=bl : crit < warn < OK
@ -238,8 +234,11 @@ sub check_options {
'H:s' => \$o_host, 'hostname:s' => \$o_host, 'H:s' => \$o_host, 'hostname:s' => \$o_host,
'p:i' => \$o_port, 'port:i' => \$o_port, 'p:i' => \$o_port, 'port:i' => \$o_port,
'C:s' => \$o_community, 'community:s' => \$o_community, 'C:s' => \$o_community, 'community:s' => \$o_community,
'2' => \$o_version2, 'v2c' => \$o_version2,
'l:s' => \$o_login, 'login:s' => \$o_login, 'l:s' => \$o_login, 'login:s' => \$o_login,
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd, 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
'c:s' => \$o_crit, 'critical:s' => \$o_crit, 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
'w:s' => \$o_warn, 'warn:s' => \$o_warn, 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
@ -251,14 +250,11 @@ sub check_options {
'e' => \$o_negate, 'exclude' => \$o_negate, 'e' => \$o_negate, 'exclude' => \$o_negate,
'V' => \$o_version, 'version' => \$o_version, 'V' => \$o_version, 'version' => \$o_version,
'q:s' => \$o_storagetype, 'storagetype:s'=> \$o_storagetype, 'q:s' => \$o_storagetype, 'storagetype:s'=> \$o_storagetype,
'2' => \$o_version2, 'v2c' => \$o_version2,
'S:s' => \$o_short, 'short:s' => \$o_short, 'S:s' => \$o_short, 'short:s' => \$o_short,
'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength,
'f' => \$o_perf, 'perfparse' => \$o_perf, 'f' => \$o_perf, 'perfparse' => \$o_perf,
# For centreon rrdtool graph 'R:i' => \$o_reserve, 'reserved:i' => \$o_reserve,
"rrd_step:s" => \$o_step, 'G' => \$o_giga, 'gigabyte' => \$o_giga
"g" => \$o_g, "rrdgraph" => \$o_g,
# "S=s" => \$o_S,
"ServiceId=s" => \$o_S
); );
if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
if (defined($o_version) ) { p_version(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_version) ) { p_version(); exit $ERRORS{"UNKNOWN"}};
@ -268,23 +264,32 @@ sub check_options {
# check snmp information # check snmp information
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ) if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} { 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 # Check types
if ( !defined($o_type) ) { $o_type="pu" ;} if ( !defined($o_type) ) { $o_type="pu" ;}
if ( ! grep( /^$o_type$/ ,@o_typeok) ) { print_usage(); exit $ERRORS{"UNKNOWN"}}; if ( ! grep( /^$o_type$/ ,@o_typeok) ) { print_usage(); exit $ERRORS{"UNKNOWN"}};
# Check compulsory attributes # Check compulsory attributes
if ( ! defined($o_descr) || ! defined($o_host) || !defined($o_warn) || if ( ! defined($o_descr) || ! defined($o_host) || !defined($o_warn) ||
!defined($o_crit)) { print_usage(); exit $ERRORS{"UNKNOWN"}}; !defined($o_crit)) { print_usage(); exit $ERRORS{"UNKNOWN"}};
# Get rid of % sign if any
$o_warn =~ s/\%//;
$o_crit =~ s/\%//;
# Check for positive numbers # 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 # check if warn or crit in % and MB is tested
if ( ( ( $o_warn =~ /%/ ) || ($o_crit =~ /%/)) && ( ( $o_type eq 'bu' ) || ( $o_type eq 'bl' ) ) ) { 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 "warning or critical cannot be in % when MB are tested\n";
print_usage(); exit $ERRORS{"UNKNOWN"}; print_usage(); exit $ERRORS{"UNKNOWN"};
} }
# Get rid of % sign
$o_warn =~ s/\%//;
$o_crit =~ s/\%//;
if (($o_warn < 0) || ($o_crit < 0)) { print " warn and critical > 0 \n";print_usage(); exit $ERRORS{"UNKNOWN"}};
# Check warning and critical values # Check warning and critical values
if ( ( $o_type eq 'pu' ) || ( $o_type eq 'bu' )) { 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_warn >= $o_crit) { print " warn < crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
@ -306,24 +311,20 @@ sub check_options {
if (defined ($o_shortL[2]) && isnnum($o_shortL[2])) if (defined ($o_shortL[2]) && isnnum($o_shortL[2]))
{print "-S last option must be an integer\n";print_usage(); exit $ERRORS{"UNKNOWN"};} {print "-S last option must be an integer\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
} }
###### centreon ####### #### octet length checks
if (defined ($o_octetlength) && (isnnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) {
if (!defined($o_S)) { $o_S="1_1" } print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"};
$ServiceId = is_valid_serviceid($o_S); }
#### reserved blocks checks (A. Greiner-Bär patch).
if (!defined($o_step)) { $o_step="300" } if (defined ($o_reserve) && (isnnum($o_reserve) || $o_reserve > 99 || $o_reserve < 0 )) {
$step = $1 if ($o_step =~ /(\d+)/); print "reserved blocks must be < 100 and >= 0\n";print_usage(); exit $ERRORS{"UNKNOWN"};
}
} }
########## MAIN ####### ########## MAIN #######
check_options(); check_options();
$rrd = $pathtorrdbase.$ServiceId.".rrd";
$start=time;
# Check gobal timeout # Check gobal timeout
if (defined($TIMEOUT)) { if (defined($TIMEOUT)) {
verb("Alarm at $TIMEOUT"); verb("Alarm at $TIMEOUT");
@ -338,18 +339,35 @@ my ($session,$error);
if ( defined($o_login) && defined($o_passwd)) { if ( defined($o_login) && defined($o_passwd)) {
# SNMPv3 login # SNMPv3 login
verb("SNMPv3 login"); verb("SNMPv3 login");
if (!defined ($o_privpass)) {
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => '3', -version => '3',
-username => $o_login, -username => $o_login,
-authpassword => $o_passwd, -authpassword => $o_passwd,
-authprotocol => 'md5', -authprotocol => $o_authproto,
-privpassword => $o_passwd, -port => $o_port,
-timeout => $o_timeout -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 { } else {
if (defined ($o_version2)) { if (defined ($o_version2)) {
# SNMPv2 Login # SNMPv2 Login
verb("SNMP v2c login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-version => 2, -version => 2,
@ -357,7 +375,9 @@ if ( defined($o_login) && defined($o_passwd)) {
-port => $o_port, -port => $o_port,
-timeout => $o_timeout -timeout => $o_timeout
); );
} else { # SNMPV1 login } else {
# SNMPV1 login
verb("SNMP v1 login");
($session, $error) = Net::SNMP->session( ($session, $error) = Net::SNMP->session(
-hostname => $o_host, -hostname => $o_host,
-community => $o_community, -community => $o_community,
@ -372,8 +392,24 @@ if (!defined($session)) {
exit $ERRORS{"UNKNOWN"}; 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 $resultat=undef;
my $stype=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)){ if (defined ($o_index)){
if (Net::SNMP->VERSION < 4) { if (Net::SNMP->VERSION < 4) {
$resultat = $session->get_table($index_table); $resultat = $session->get_table($index_table);
@ -498,27 +534,41 @@ my $warn_state=0;
my $crit_state=0; my $crit_state=0;
my ($p_warn,$p_crit); my ($p_warn,$p_crit);
my $output=undef; 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++) { for ($i=0;$i<$num_int;$i++) {
verb("Descr : $descr[$i]"); verb("Descr : $descr[$i]");
verb("Size : $$result{$size_table . $tindex[$i]}"); verb("Size : $$result{$size_table . $tindex[$i]}");
verb("Used : $$result{$used_table . $tindex[$i]}"); verb("Used : $$result{$used_table . $tindex[$i]}");
verb("Alloc : $$result{$alloc_units . $tindex[$i]}"); verb("Alloc : $$result{$alloc_units . $tindex[$i]}");
my $to = $$result{$size_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / 1024**2; 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; my $pu=undef;
if ( $$result{$used_table . $tindex[$i]} != 0 ) { if ( $$result{$used_table . $tindex[$i]} != 0 ) {
$pu = $$result{$used_table . $tindex[$i]}*100 / $$result{$size_table . $tindex[$i]}; $pu = $$result{$used_table . $tindex[$i]}* 100 / ( $$result{$size_table . $tindex[$i]} * ( 100 - $o_reserve ) / 100 );
}else { }else {
$pu=0; $pu=0;
} }
my $bu = $$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / 1024**2; my $bu = $$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / $output_metric_val;
my $pl = 100 - $pu; my $pl = 100 - $pu;
my $bl = ($$result{$size_table . $tindex[$i]}- $$result{$used_table . $tindex[$i]}) * $$result{$alloc_units . $tindex[$i]} / 1024**2; 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 # add a ' ' if some data exists in $perf_out
$perf_out .= " " if (defined ($perf_out)) ; $perf_out .= " " if (defined ($perf_out)) ;
##### Ouputs and checks ##### Ouputs and checks
# Keep complete description fot performance output (in MB) # Keep complete description fot performance output (in MB)
my $Pdescr=$descr[$i]; my $Pdescr=$descr[$i];
$Pdescr =~ s/'/_/g; $Pdescr =~ s/[`~!\$%\^&\*'"<>|\?,\(= )]/_/g;
##### TODO : subs "," with something ##### TODO : subs "," with something
if (defined($o_shortL[2])) { if (defined($o_shortL[2])) {
if ($o_shortL[2] < 0) {$descr[$i]=substr($descr[$i],$o_shortL[2]);} if ($o_shortL[2] < 0) {$descr[$i]=substr($descr[$i],$o_shortL[2]);}
@ -531,16 +581,10 @@ for ($i=0;$i<$num_int;$i++) {
|| (($pu >= $o_warn) && ($locstate=$warn_state=1)); || (($pu >= $o_warn) && ($locstate=$warn_state=1));
if (defined($o_shortL[2])) {} if (defined($o_shortL[2])) {}
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
$output.=sprintf ("%s: %.0f%%used(%.0fMB/%.0fMB) ",$descr[$i],$pu,$bu,$to); $output.=sprintf ("%s: %.0f%%used(%.0f%sB/%.0f%sB) ",$descr[$i],$pu,$bu,$output_metric,$to,$output_metric);
} elsif ($o_shortL[0] == 1) { } elsif ($o_shortL[0] == 1) {
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pu); $output.=sprintf ("%s: %.0f%% ",$descr[$i],$pu);
} }
$rrd_max = 100;
if (defined($rrd_data[0])) {
push @rrd_data, $pu;
} else {
$rrd_data[0]= $pu ;
}
} }
if ($o_type eq 'bu') { # Checks MBytes used if ($o_type eq 'bu') { # Checks MBytes used
@ -549,17 +593,10 @@ for ($i=0;$i<$num_int;$i++) {
( ($bu >= $o_crit) && ($locstate=$crit_state=1) ) ( ($bu >= $o_crit) && ($locstate=$crit_state=1) )
|| ( ($bu >= $o_warn) && ($locstate=$warn_state=1) ); || ( ($bu >= $o_warn) && ($locstate=$warn_state=1) );
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
$output.=sprintf("%s: %.0fMBused/%.0fMB (%.0f%%) ",$descr[$i],$bu,$to,$pu); $output.=sprintf("%s: %.0f%sBused/%.0f%sB (%.0f%%) ",$descr[$i],$bu,$output_metric,$to,$output_metric,$pu);
} elsif ($o_shortL[0] == 1) { } elsif ($o_shortL[0] == 1) {
$output.=sprintf("%s: %.0fMB ",$descr[$i],$bu); $output.=sprintf("%s: %.0f%sB ",$descr[$i],$bu,$output_metric);
} }
$rrd_max = "U";
if (defined($rrd_data[0])) {
push @rrd_data, $bu;
} else {
$rrd_data[0]= $bu ;
}
} }
if ($o_type eq 'bl') { if ($o_type eq 'bl') {
@ -568,66 +605,36 @@ for ($i=0;$i<$num_int;$i++) {
( ($bl <= $o_crit) && ($locstate=$crit_state=1) ) ( ($bl <= $o_crit) && ($locstate=$crit_state=1) )
|| ( ($bl <= $o_warn) && ($locstate=$warn_state=1) ); || ( ($bl <= $o_warn) && ($locstate=$warn_state=1) );
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
$output.=sprintf ("%s: %.0fMBleft/%.0fMB (%.0f%%) ",$descr[$i],$bl,$to,$pl); $output.=sprintf ("%s: %.0f%sBleft/%.0f%sB (%.0f%%) ",$descr[$i],$bl,$output_metric,$to,$output_metric,$pl);
} elsif ($o_shortL[0] == 1) { } elsif ($o_shortL[0] == 1) {
$output.=sprintf ("%s: %.0fMB ",$descr[$i],$bl); $output.=sprintf ("%s: %.0f%sB ",$descr[$i],$bl,$output_metric);
}
$rrd_max = "U";
if (defined($rrd_data[0])) {
push @rrd_data, $pl;
} else {
$rrd_data[0]= $pl ;
} }
} }
if ($o_type eq 'pl') { # Checks % left if ($o_type eq 'pl') {
my $locstate=0; my $locstate=0;
$p_warn=(100-$o_warn)*$to/100;$p_crit=(100-$o_crit)*$to/100; $p_warn=(100-$o_warn)*$to/100;$p_crit=(100-$o_crit)*$to/100;
( ($pl <= $o_crit) && ($locstate=$crit_state=1) ) ( ($pl <= $o_crit) && ($locstate=$crit_state=1) )
|| ( ($pl <= $o_warn) && ($locstate=$warn_state=1) ); || ( ($pl <= $o_warn) && ($locstate=$warn_state=1) );
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
$output.=sprintf ("%s: %.0f%%left(%.0fMB/%.0fMB) ",$descr[$i],$pl,$bl,$to); $output.=sprintf ("%s: %.0f%%left(%.0f%sB/%.0f%sB) ",$descr[$i],$pl,$bl,$output_metric,$to,$output_metric);
} elsif ($o_shortL[0] == 1) { } elsif ($o_shortL[0] == 1) {
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pl); $output.=sprintf ("%s: %.0f%% ",$descr[$i],$pl);
} }
$rrd_max = 100;
if (defined($rrd_data[0])) {
push @rrd_data, $pl;
} else {
$rrd_data[0]= $pl ;
} }
}
# Performance output (in MB) # Performance output (in MB)
$perf_out .= "'".$Pdescr. "'=" . round($bu,0) . "MB;" . round($p_warn,0) $perf_out .= "'".$Pdescr. "'=" . round($bu,0) . $output_metric ."B;" . round($p_warn,0)
. ";" . round($p_crit,0) . ";0;" . round($to,0); . ";" . round($p_crit,0) . ";0;" . round($to,0);
} }
##
## RRD management
##
if ($o_g) {
$start=time;
if (! -e $rrd) {
create_rrd($rrd,$#rrd_data+1,$start,$step,0,$rrd_max,"GAUGE");
}
update_rrd($rrd,$start,@rrd_data);
}
verb ("Perf data : $perf_out"); verb ("Perf data : $perf_out");
my $comp_oper=undef; my $comp_oper=undef;
my $comp_unit=undef; my $comp_unit=undef;
($o_type eq "pu") && ($comp_oper ="<") && ($comp_unit ="%"); ($o_type eq "pu") && ($comp_oper ="<") && ($comp_unit ="%");
($o_type eq "pl") && ($comp_oper =">") && ($comp_unit ="%"); ($o_type eq "pl") && ($comp_oper =">") && ($comp_unit ="%");
($o_type eq "bu") && ($comp_oper ="<") && ($comp_unit ="MB"); ($o_type eq "bu") && ($comp_oper ="<") && ($comp_unit = $output_metric."B");
($o_type eq 'bl') && ($comp_oper =">") && ($comp_unit ="MB"); ($o_type eq 'bl') && ($comp_oper =">") && ($comp_unit =$output_metric."B");
if (!defined ($output)) { $output="All selected storages "; } if (!defined ($output)) { $output="All selected storages "; }