You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
6.8 KiB
Perl
227 lines
6.8 KiB
Perl
#!/usr/bin/perl -wT
|
|
# check_netapp
|
|
#
|
|
# Copyright (C) 2000 Leland E. Vandervort <leland@mmania.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# you should have received a copy of the GNU General Public License
|
|
# along with this program (or with Nagios); if not, write to the
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA
|
|
####################################
|
|
# checks for overtemperature, fans, psu, and nfs operations/second on
|
|
# Network Appliance Filers.
|
|
# Returns:
|
|
# OK if temp, fans, psu OK and Ops/Sec below warning and critical
|
|
# Thresholds (default is warning=3500, critical=5000)
|
|
# ** Note: See the specifications for your Filer model for
|
|
# the thresholds !
|
|
# Returns Warning if NFS Ops/Sec is above warning threshold
|
|
# (default 3500, or specified by -o command line option)
|
|
# Returns Critical if NFS Ops/Sec is above critical threshold
|
|
# ( -m option, or default 5000), or if overtem, psufault, or
|
|
# fanfault detected.
|
|
#
|
|
####################################
|
|
# Notes on operational limits for NetApp Filers:
|
|
# Platform Maximum Ops/Second (recommended)
|
|
# -------------------------------------------------------------
|
|
# F230 1000
|
|
# F740 5500
|
|
# F760 9000
|
|
####################################
|
|
|
|
use Net::SNMP;
|
|
use Getopt::Long;
|
|
&Getopt::Long::config('auto_abbrev');
|
|
|
|
my $status;
|
|
my $response = "";
|
|
my $TIMEOUT = 10;
|
|
my $community = "public";
|
|
my $port = 161;
|
|
my $opsthresh = "3500";
|
|
my $critical = "5000";
|
|
my @excludevols = ();
|
|
|
|
my $status_string = "";
|
|
|
|
my %OIDLIST = (
|
|
overtemp => '1.3.6.1.4.1.789.1.2.4.1.0',
|
|
failedfan => '1.3.6.1.4.1.789.1.2.4.2.0',
|
|
failedpsu => '1.3.6.1.4.1.789.1.2.4.4.0',
|
|
nfsops => '1.3.6.1.4.1.789.1.2.2.1.0',
|
|
miscGlobalStatus => '1.3.6.1.4.1.789.1.2.2.4.0',
|
|
miscGlobalStatusMessage => '1.3.6.1.4.1.789.1.2.2.25.0'
|
|
);
|
|
|
|
|
|
|
|
my %STATUSCODE = ( 'UNKNOWN' => '-1',
|
|
'OK' => '0',
|
|
'WARNING' => '1',
|
|
'CRITICAL' => '2');
|
|
|
|
my $state = "UNKNOWN";
|
|
|
|
|
|
$SIG{'ALRM'} = sub {
|
|
print "ERROR: No snmp response from $hostname (sigALRM)\n";
|
|
exit($STATUSCODE{"UNKNOWN"});
|
|
};
|
|
|
|
alarm($TIMEOUT);
|
|
|
|
sub get_nfsops {
|
|
my $nfsops_start = &SNMPGET($OIDLIST{nfsops});
|
|
sleep(1);
|
|
my $nfsops_end = &SNMPGET($OIDLIST{nfsops});
|
|
my $nfsopspersec = $nfsops_end - $nfsops_start;
|
|
return($nfsopspersec);
|
|
}
|
|
|
|
|
|
sub show_help {
|
|
printf("\nPerl NetApp filer plugin for Nagios\n");
|
|
printf("Usage:\n");
|
|
printf("
|
|
check_netapp [options] <hostname>
|
|
Options:
|
|
-c snmp-community
|
|
-p snmp-port
|
|
-o Operations per second warning threshold
|
|
-m Operations per second critical threshold
|
|
-e Exclude volumes to check
|
|
|
|
");
|
|
printf("Copyright (C)2000 Leland E. Vandervort\n");
|
|
printf("check_netapp comes with absolutely NO WARRANTY either implied or explicit\n");
|
|
printf("This program is licensed under the terms of the\n");
|
|
printf("GNU General Public License\n(check source code for details)\n\n\n");
|
|
exit($STATUSCODE{"UNKNOWN"});
|
|
}
|
|
|
|
|
|
$status = GetOptions( "community=s", \$community,
|
|
"port=i", \$port,
|
|
"opsthresh=i", \$opsthresh,
|
|
"maxops=i", \$critical,
|
|
"exclude=s", \@excludevols );
|
|
|
|
if($status == 0) {
|
|
&show_help;
|
|
}
|
|
|
|
sub SNMPGET {
|
|
$OID = shift;
|
|
($session,$error) = Net::SNMP->session(
|
|
Hostname => $hostname,
|
|
Community => $community,
|
|
Port => $port
|
|
);
|
|
if(!defined($session)) {
|
|
printf("$state %s\n", $error);
|
|
exit($STATUSCODE{$state});
|
|
}
|
|
if(!defined($response = $session->get_request($OID))) {
|
|
printf("$state %s\n", $session->error());
|
|
$session->close();
|
|
exit($STATUSCODE{$state});
|
|
}
|
|
$session->close();
|
|
return($response->{$OID});
|
|
}
|
|
|
|
$hostname = shift || &show_help;
|
|
|
|
my $tempcheck = &SNMPGET($OIDLIST{overtemp});
|
|
|
|
if($tempcheck == 1) {
|
|
$state = "OK";
|
|
$status_string .= "Temp OK ";
|
|
}
|
|
else {
|
|
$state = "CRITICAL";
|
|
$status_string .= "Temp CRIT";
|
|
}
|
|
|
|
foreach $element ('failedfan','failedpsu') {
|
|
my $my_return = &SNMPGET($OIDLIST{$element});
|
|
if(($my_return =~ /no/) || ($my_return == 0)) {
|
|
$status_string .= "$element = $my_return ";
|
|
$state = "OK" unless ($state eq "CRITICAL");
|
|
}
|
|
else {
|
|
$status_string .= "$element = $my_return ";
|
|
$state = "CRITICAL";
|
|
}
|
|
}
|
|
|
|
my $tmp_opssec = &get_nfsops();
|
|
|
|
if ($tmp_opssec >= $critical) {
|
|
$state = "CRITICAL";
|
|
}
|
|
elsif ($tmp_opssec >= $opsthresh) {
|
|
$state = "WARNING" unless ($state eq "CRITICAL");
|
|
}
|
|
|
|
$status_string .= "Ops\/Sec = $tmp_opssec ";
|
|
|
|
my $globalstatus = &SNMPGET($OIDLIST{'miscGlobalStatus'});
|
|
if ($globalstatus != 3) { # not "ok"
|
|
my $globalstatusmessage = &SNMPGET($OIDLIST{'miscGlobalStatusMessage'});
|
|
$globalstatusmessage =~ s/\n//gs;
|
|
my $eglobalstatusmessage = $globalstatusmessage;
|
|
if ($#excludevols >= 0) { # Strip volumes from message
|
|
# Special case for excludevols == all
|
|
if ($excludevols[0] eq "all") {
|
|
while ($eglobalstatusmessage =~ /is full/) {
|
|
$eglobalstatusmessage =~ s/\S+ is full \([^\)]+\)\.\s*//;
|
|
# Catch truncated message
|
|
$eglobalstatusmessage =~ s/\S+ is full \([^\)]+$//;
|
|
}
|
|
} else {
|
|
foreach my $vol (@excludevols) {
|
|
$eglobalstatusmessage =~ s/$vol is full \([^\)]+\)\.\s*//;
|
|
# Catch truncated message
|
|
$eglobalstatusmessage =~ s/$vol is full \([^\)]+$//;
|
|
}
|
|
}
|
|
}
|
|
if ($eglobalstatusmessage ne $globalstatusmessage) {
|
|
# We found disks to exclude, check to see if we need to
|
|
# update globalstatus to "OK"
|
|
$globalstatusmessage = $eglobalstatusmessage;
|
|
if ($globalstatus == 4) { # Vol full is a warning
|
|
$eglobalstatusmessage =~ s/Temp OK failedfan = 0 failed psu = 0 Ops\/Sec = \d+\s*//;
|
|
$globalstatus = 3 if ($eglobalstatusmessage =~ /^\s*$/);
|
|
$state = "OK" unless ($state eq "CRITICAL" or $state eq "WARNING");
|
|
}
|
|
}
|
|
if ($globalstatus == 2 or $globalstatus == 1) {
|
|
$state = "UNKNOWN" unless ($state eq "CRITICAL" or $state eq "WARNING");
|
|
$status_string .= " $globalstatusmessage";
|
|
}
|
|
if ($globalstatus == 4) {
|
|
$state = "WARNING" unless ($state eq "CRITICAL");
|
|
$status_string .= " $globalstatusmessage";
|
|
}
|
|
if ($globalstatus == 5 or $globalstatus == 6) {
|
|
$state = "CRITICAL";
|
|
$status_string .= " $globalstatusmessage";
|
|
}
|
|
}
|
|
|
|
print "$state $status_string\n";
|
|
exit($STATUSCODE{$state});
|