#!/usr/bin/perl -wT # check_netapp # # Copyright (C) 2000 Leland E. Vandervort # # 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] 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});