From fb38819daf529b7e33ee5ada3a4b91bc2c32c1f2 Mon Sep 17 00:00:00 2001 From: Alexandre Rigaud Date: Tue, 15 Mar 2016 14:53:52 +0100 Subject: [PATCH] Update check-netapp-ng.pl updated by X. Franco & A. Rigaud 20160211 : Added FSSTATUS/SNAPSHOTAGE --- nagios/check-netapp-ng.pl | 910 ++++++++++++++++++++++---------------- 1 file changed, 536 insertions(+), 374 deletions(-) diff --git a/nagios/check-netapp-ng.pl b/nagios/check-netapp-ng.pl index 8e2d651..cb72d8c 100755 --- a/nagios/check-netapp-ng.pl +++ b/nagios/check-netapp-ng.pl @@ -15,6 +15,8 @@ ## ran.leibman@gmail.com ## Additionial checks code written ## by laurent.dufour@havas.com +## updated by X. Franco & A. Rigaud +## 20160211 : Added FSSTATUS/SNAPSHOTAGE ## ## the following parameters has ## been tested against a @@ -40,14 +42,16 @@ use utils qw($TIMEOUT %ERRORS); use Net::SNMP; use File::Basename; use Getopt::Long; +use Time::Local; +use IPC::Cmd qw(run_forked); Getopt::Long::Configure('bundling'); my $stat = 0; my $msg; my $perf; -my $script_name = "check-netapp-ng.pl"; -my $script_version = 1.2; +my $script_name = basename($0); +my $script_version = 1.3; my $counterFilePath="/tmp"; my $counterFile; @@ -154,6 +158,10 @@ my $snmp_netapp_volume_id_table_df_free = "$snmp_netapp_volume_id_table_df.5"; my $snmp_netapp_volume_id_table_df_used_prec = "$snmp_netapp_volume_id_table_df.6"; my $snmp_netapp_volume_id_table_df_used_high = "$snmp_netapp_volume_id_table_df.16"; my $snmp_netapp_volume_id_table_df_used_low = "$snmp_netapp_volume_id_table_df.17"; + +my $snmpfsOverallStatus = '1.3.6.1.4.1.789.1.5.7.1.0'; +my $snmpfsOverallStatus_text = '1.3.6.1.4.1.789.1.5.7.2.0'; + # 64bit values for SNMP v2c my $snmp_netapp_volume_id_table_df64_total = "$snmp_netapp_volume_id_table_df.29"; my $snmp_netapp_volume_id_table_df64_used = "$snmp_netapp_volume_id_table_df.30"; @@ -199,35 +207,44 @@ my $snmp_netapp_blocks_fcp64Ops = "$snmp_netapp_blocks.25.0"; my $snmp_netapp_blocks_fcp64ReadBytes = "$snmp_netapp_blocks.20.0"; my $snmp_netapp_blocks_fcp64WriteBytes = "$snmp_netapp_blocks.21.0"; +### SNAPSHOT OIDs +### You can browse at http://www.oidview.com/mibs/789/NETWORK-APPLIANCE-MIB.html +############### + +my $snmp_filesys_snapshot_slVTable_slVEntry = '.1.3.6.1.4.1.789.1.5.5.2.1'; +my $snmp_filesys_snapshot_slVTable_slVEntry_index = "$snmp_filesys_snapshot_slVTable_slVEntry.1"; +my $snmp_filesys_snapshot_slVTable_slVEntry_number = "$snmp_filesys_snapshot_slVTable_slVEntry.8"; +my $snmp_filesys_snapshot_slVTable_slVEntry_Vname = "$snmp_filesys_snapshot_slVTable_slVEntry.9"; + # SNMP Status Codes my %nvramBatteryStatus = ( - 1 => 'ok', - 2 => 'partially discharged', - 3 => 'fully discharged', - 4 => 'not present', - 5 => 'near end of life', - 6 => 'at end of life', - 7 => 'unknown', + 1 => 'ok', + 2 => 'partially discharged', + 3 => 'fully discharged', + 4 => 'not present', + 5 => 'near end of life', + 6 => 'at end of life', + 7 => 'unknown', ); my %GlobalStatusIndex = ( - 1 => 'other', - 2 => 'unknown', - 3 => 'ok', - 4 => 'nonCritical', - 5 => 'critical', - 6 => 'nonRecoverable', + 1 => 'other', + 2 => 'unknown', + 3 => 'ok', + 4 => 'nonCritical', + 5 => 'critical', + 6 => 'nonRecoverable', ); my %AutoSupportStatusIndex = ( - 1 => 'ok', + 1 => 'ok', 2 => 'smtpFailure', 3 => 'postFailure', 4 => 'smtpPostFailure', - 5 => 'unknown', + 5 => 'unknown', ); my %cfSettingsIndex = ( - 1 => 'notConfigured', + 1 => 'notConfigured', 2 => 'enabled', 3 => 'disabled', 4 => 'takeoverByPartnerDisabled', @@ -236,14 +253,14 @@ my %cfSettingsIndex = ( my %cfStateIndex = ( - 1 => 'dead', + 1 => 'dead', 2 => 'canTakeover', 3 => 'cannotTakeover', 4 => 'takeover', ); my %cfCannotTakeoverCauseIndex = ( - 1 => 'ok', + 1 => 'ok', 2 => 'unknownReason', 3 => 'disabledByOperator', 4 => 'interconnectOffline', @@ -264,43 +281,61 @@ my %cfCannotTakeoverCauseIndex = ( ); my %cfPartnerStatusIndex = ( - 1 => 'maybeDown', + 1 => 'maybeDown', 2 => 'ok', 3 => 'dead', ); my %cfInterconnectStatusIndex = ( - 1 => 'notPresent', + 1 => 'notPresent', 2 => 'down', 3 => 'partialFailure', 4 => 'up', ); my %EcnlStatusIndex = ( - 1 => 'initializing', - 2 => 'transitioning', - 3 => 'active', - 4 => 'inactive', - 5 => 'reconfiguring', - 6 => 'nonexistent', + 1 => 'initializing', + 2 => 'transitioning', + 3 => 'active', + 4 => 'inactive', + 5 => 'reconfiguring', + 6 => 'nonexistent', ); + +my %fsOverallStatusIndex = ( + 1 => 'ok', + 2 => 'Nearly Full', + 3 => 'Full', +); + ### Functions ############### +sub uniq(@) { + my @array = @_; + my @unique = (); + my %seen = (); + + foreach my $elem ( @array ) { + next if $seen{ $elem }++; + push @unique, $elem; + } + return @unique; +} sub _create_session(@) { - my ($server, $comm, $version, $timeout) = @_; - my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm, -timeout => $timeout); - if (!defined($sess)) { - print "Can't create SNMP session to $server\n"; - exit(1); - } - return $sess; + my ($server, $comm, $version, $timeout) = @_; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm, -timeout => $timeout); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; } sub FSyntaxError($) { - my $err = shift; - print < Timeout to SNMP session in seconds (default 5) -w Warning Value (default 500) -c Critical Value (default 500) - -v Volume Name in format /vol/volname/ + -v Volume Name in format /vol/volname/ or aggregate name (not available in 7.x ONTAP) For available values use any word, such as \'-v whatever\' - -e Exclude volumes from snap check (SNAPSHOT) + -e Exclude volumes from snap check (SNAPSHOT/SNAPSHOTAGE) -I Inform only, return OK every time (ignore -w and -c values) -h This help @@ -328,6 +363,7 @@ This is $script_name in version $script_version. NVRAM - NVram Battery Status DISKUSED - Usage Percentage of volume or aggregate (-w -c -v) SNAPSHOT - Snapshot Config (-e volname,volname2,volname3) + SNAPSHOTAGE - Check the age of volume snapshot which are older than x days (-w -c -v -e) SHELF - Shelf Health SHELFINFO - Shelf Model & Temperature Information NFSOPS - Nfs Ops per seconds (-w -c) @@ -343,6 +379,7 @@ This is $script_name in version $script_version. FAILEDDISK - Number of failed disks UPTIME - Only show\'s uptime CACHEAGE - Cache Age (-w -c) + FSSTATUS - Overall file system health Examples: $script_name -H netapp.mydomain -C public -T UPTIME @@ -353,98 +390,98 @@ This is $script_name in version $script_version. $script_name -H netapp.mydomain -C public -T GLOBALSTATUS CRIT: GLOBALSTATUS nonCritical 4 Disk on adapter 1a, shelf 1, bay 9, failed. | globalstatus=4 - + $script_name -H netapp.mydomain -C public -T DISKUSED -v wtf WARN: Unknown volume path or aggregate name 'wtf'. Available values: aggr_p1a_sas2_mirror /vol/vol0/ /vol/esx/ /vol/xen_a/ EOU - exit($ERRORS{'UNKNOWN'}); + exit($ERRORS{'UNKNOWN'}); } sub _get_oid_value(@) { - my $sess = shift; - my $local_oid = shift; - my $r_return = $sess->get_request(-varbindlist => [$local_oid]); - return($r_return->{$local_oid}); + my $sess = shift; + my $local_oid = shift; + my $r_return = $sess->get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); } sub _clac_generic_err_stat(@) { - my $value = shift; - my $value_type = shift; - my $tmp_warn = shift; - my $tmp_crit = shift; - my $scale = shift; - my $r_msg; - my $r_stat; - if($opt{'inform'} or ($value <= $tmp_warn)) { - $r_stat = $ERRORS{'OK'}; - $r_msg = "OK: $value_type $value $scale"; - } elsif($value > $tmp_warn and $value < $tmp_crit) { - $r_stat = $ERRORS{'WARNING'}; - $r_msg = "WARN: $value_type $value $scale"; - } elsif($value >= $tmp_crit) { - $r_stat = $ERRORS{'CRITICAL'}; - $r_msg = "CRIT: $value_type $value $scale"; - } - return($r_msg,$r_stat); + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $scale = shift; + my $r_msg; + my $r_stat; + if($opt{'inform'} or ($value <= $tmp_warn)) { + $r_stat = $ERRORS{'OK'}; + $r_msg = "OK: $value_type $value $scale"; + } elsif($value > $tmp_warn and $value < $tmp_crit) { + $r_stat = $ERRORS{'WARNING'}; + $r_msg = "WARN: $value_type $value $scale"; + } elsif($value >= $tmp_crit) { + $r_stat = $ERRORS{'CRITICAL'}; + $r_msg = "CRIT: $value_type $value $scale"; + } + return($r_msg,$r_stat); } sub _clac_err_stat(@) { - my $value = shift; - my $value_type = shift; - my $tmp_warn = shift; - my $tmp_crit = shift; - my $r_msg; - my $r_stat; - if($value <= $tmp_warn) { - $r_stat = $ERRORS{'OK'}; - $r_msg = "OK: $value_type $value%"; - } elsif($value > $tmp_warn and $value < $tmp_crit) { - $r_stat = $ERRORS{'WARNING'}; - $r_msg = "WARN: $value_type $value%"; - } elsif($value >= $tmp_crit) { - $r_stat = $ERRORS{'CRITICAL'}; - $r_msg = "CRIT: $value_type $value%"; - } - return($r_msg,$r_stat); + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $r_msg; + my $r_stat; + if($value <= $tmp_warn) { + $r_stat = $ERRORS{'OK'}; + $r_msg = "OK: $value_type $value%"; + } elsif($value > $tmp_warn and $value < $tmp_crit) { + $r_stat = $ERRORS{'WARNING'}; + $r_msg = "WARN: $value_type $value%"; + } elsif($value >= $tmp_crit) { + $r_stat = $ERRORS{'CRITICAL'}; + $r_msg = "CRIT: $value_type $value%"; + } + return($r_msg,$r_stat); } sub _clac_absolute_err_stat(@) { - my $value = shift; - my $value_type = shift; - my $tmp_warn = shift; - my $tmp_crit = shift; - my $r_msg; - my $r_stat; - ($r_msg,$r_stat) = _clac_generic_err_stat($value,$value_type,$tmp_warn,$tmp_crit,""); - return($r_msg,$r_stat); + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $r_msg; + my $r_stat; + ($r_msg,$r_stat) = _clac_generic_err_stat($value,$value_type,$tmp_warn,$tmp_crit,""); + return($r_msg,$r_stat); } sub _clac_minutes_err_stat(@) { - my $value = shift; - my $value_type = shift; - my $tmp_warn = shift; - my $tmp_crit = shift; - my $r_msg; - my $r_stat; - ($r_msg,$r_stat) = _clac_generic_err_stat($value,$value_type,$tmp_warn,$tmp_crit,"minutes"); - return($r_msg,$r_stat); + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $r_msg; + my $r_stat; + ($r_msg,$r_stat) = _clac_generic_err_stat($value,$value_type,$tmp_warn,$tmp_crit,"minutes"); + return($r_msg,$r_stat); } sub _ulong64(@) { my $high = shift; my $low = shift; - if ($low < 0) { - $low = $low & 0x00000000FFFFFFFF; - $low = $low | 0x0000000080000000; - } - if ($high < 0) { - $high = $high & 0x00000000FFFFFFFF; - $high = $high | 0x0000000080000000; - } - return ($high<<32)|$low; + if ($low < 0) { + $low = $low & 0x00000000FFFFFFFF; + $low = $low | 0x0000000080000000; + } + if ($high < 0) { + $high = $high & 0x00000000FFFFFFFF; + $high = $high | 0x0000000080000000; + } + return ($high<<32)|$low; } @@ -452,35 +489,35 @@ sub _ulong64(@) { ############################# $opt{'crit'} = 500; $opt{'warn'} = 500; -$opt{'version'} = 1; -$opt{'timeout'} = 5; +$opt{'version'} = 2; +$opt{'timeout'} = 60; my $result = GetOptions(\%opt, - 'filer|H=s', - 'community|C=s', + 'filer|H=s', + 'community|C=s', 'version|V=s', - 'check_type|T=s', - 'warn|w=i', - 'crit|c=i', - 'vol|v=s', - 'exclude|e=s', + 'check_type|T=s', + 'warn|w=i', + 'crit|c=i', + 'vol|v=s', + 'exclude|e=s', 'inform|I', 'timeout|t=i', "help|h", - ); + ); FSyntaxError("") if defined $opt{'help'}; FSyntaxError("Missing -H") unless defined $opt{'filer'}; FSyntaxError("Missing -C") unless defined $opt{'community'}; FSyntaxError("Missing -T") unless defined $opt{'check_type'}; if($opt{'vol'}) { - if ( !( ($opt{'vol'} =~ m#^/vol/.*/$#) or ($opt{'vol'} =~ m#^[^/]*$#) ) ) { - FSyntaxError("$opt{'vol'} format is '/vol/volname/' or 'aggregate_name'! For listing available names use any text such as '-v whatever'."); - } + if ( !( ($opt{'vol'} =~ m#^/vol/.*/$#) or ($opt{'vol'} =~ m#^[^/]*$#) ) ) { + FSyntaxError("$opt{'vol'} format is '/vol/volname/' or 'aggregate_name'! For listing available names use any text such as '-v whatever'."); + } } if($opt{'crit'} and $opt{'warn'}) { - if($opt{'warn'} > $opt{'crit'}) { - FSyntaxError("Warning can't be larger then Critical: $opt{'warn'} > $opt{'crit'}"); - } + if($opt{'warn'} > $opt{'crit'}) { + FSyntaxError("Warning can't be larger then Critical: $opt{'warn'} > $opt{'crit'}"); + } } if( ($opt{'check_type'} eq 'ISCSIOPS') or ($opt{'check_type'} eq 'FCPOPS') ) { @@ -498,7 +535,7 @@ if (!defined($counterFilePath)) { -# Starting Alaram +# Starting Alarm alarm($TIMEOUT); # Establish SNMP Session @@ -613,107 +650,107 @@ if (("$opt{'check_type'}" eq "CIFSOPS") or ("$opt{'check_type'}" eq "NFSOPS") or ### Temperature ### if("$opt{'check_type'}" eq "TEMP") { - my $check = _get_oid_value($snmp_session,$snmpenvOverTemperature); - if($check == 1) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} is ok"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: Over $opt{'check_type'} !"; - } - $perf = "overtemperature=$check"; + my $check = _get_oid_value($snmp_session,$snmpenvOverTemperature); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} is ok"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: Over $opt{'check_type'} !"; + } + $perf = "overtemperature=$check"; ### Fan ### } elsif("$opt{'check_type'}" eq "FAN") { - my $check = _get_oid_value($snmp_session,$snmpFailedFanCount); - if($check == 0) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} $check"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} $check !"; - } - $perf = "failedfans=$check"; + my $check = _get_oid_value($snmp_session,$snmpFailedFanCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $check !"; + } + $perf = "failedfans=$check"; ### PS ### } elsif("$opt{'check_type'}" eq "PS") { - my $check = _get_oid_value($snmp_session,$snmpFailPowerSupplyCount); - if($check == 0) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} Fail $check"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} Fail $check !"; - } - $perf = "failedpowersupplies=$check"; + my $check = _get_oid_value($snmp_session,$snmpFailPowerSupplyCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} Fail $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} Fail $check !"; + } + $perf = "failedpowersupplies=$check"; ### CPULOAD ### } elsif("$opt{'check_type'}" eq "CPULOAD") { - my $check = _get_oid_value($snmp_session,$snmpcpuBusyTimePerCent); - ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "cpuload=$check\%;$opt{'warn'};$opt{'crit'};;"; + my $check = _get_oid_value($snmp_session,$snmpcpuBusyTimePerCent); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cpuload=$check\%;$opt{'warn'};$opt{'crit'};;"; ### NFSOPS ### } elsif("$opt{'check_type'}" eq "NFSOPS") { - my $nfsops_per_seconds=floor ( ($total_nfs_ops-$fileNfsOps)/$elapsedtime ); + my $nfsops_per_seconds=floor ( ($total_nfs_ops-$fileNfsOps)/$elapsedtime ); - my $check=$nfsops_per_seconds; + my $check=$nfsops_per_seconds; - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "nfsops=$check"; + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "nfsops=$check"; ### CIFSOPS ### } elsif("$opt{'check_type'}" eq "CIFSOPS") { - my $cifsops_per_seconds=floor ( ($total_cifs_ops-$fileCifsOps)/$elapsedtime ); + my $cifsops_per_seconds=floor ( ($total_cifs_ops-$fileCifsOps)/$elapsedtime ); - my $check=$cifsops_per_seconds; + my $check=$cifsops_per_seconds; - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "cifsops=$check"; + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cifsops=$check"; ### ISCSIOPS ### } elsif("$opt{'check_type'}" eq "ISCSIOPS") { - my $iscsiops_per_seconds=floor ( ($blocks_iscsi_ops-$fileIscsiOps)/$elapsedtime ); + my $iscsiops_per_seconds=floor ( ($blocks_iscsi_ops-$fileIscsiOps)/$elapsedtime ); my $iscsiread_per_seconds=floor ( ($blocks_iscsi_read-$fileIscsi64ReadBytes)/$elapsedtime ); my $iscsiwrite_per_seconds=floor ( ($blocks_iscsi_write-$fileIscsi64WriteBytes)/$elapsedtime ); my $diskread_per_seconds=floor ( ($total_disk_read-$fileDisk64ReadBytes)/$elapsedtime ); my $diskwrite_per_seconds=floor ( ($total_disk_write-$fileDisk64WriteBytes)/$elapsedtime ); - my $check=$iscsiops_per_seconds; + my $check=$iscsiops_per_seconds; - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); $msg = "$msg ops/s (iscsi read=$iscsiread_per_seconds B/s, iscsi write=$iscsiwrite_per_seconds B/s, disk read=$diskread_per_seconds B/s, disk write=$diskwrite_per_seconds B/s)"; - $perf = "iscsiops=$check iscsiread=$iscsiread_per_seconds iscsiwrite=$iscsiwrite_per_seconds diskread=$diskread_per_seconds diskwrite=$diskwrite_per_seconds"; + $perf = "iscsiops=$check iscsiread=$iscsiread_per_seconds iscsiwrite=$iscsiwrite_per_seconds diskread=$diskread_per_seconds diskwrite=$diskwrite_per_seconds"; ### FCPOPS ### } elsif("$opt{'check_type'}" eq "FCPOPS") { - my $fcpops_per_seconds=floor ( ($blocks_fcp_ops-$fileFcpOps)/$elapsedtime ); + my $fcpops_per_seconds=floor ( ($blocks_fcp_ops-$fileFcpOps)/$elapsedtime ); my $fcpread_per_seconds=floor ( ($blocks_fcp_read-$fileFcp64ReadBytes)/$elapsedtime ); my $fcpwrite_per_seconds=floor ( ($blocks_fcp_write-$fileFcp64WriteBytes)/$elapsedtime ); my $diskread_per_seconds=floor ( ($total_disk_read-$fileDisk64ReadBytes)/$elapsedtime ); my $diskwrite_per_seconds=floor ( ($total_disk_write-$fileDisk64WriteBytes)/$elapsedtime ); - my $check=$fcpops_per_seconds; + my $check=$fcpops_per_seconds; - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); $msg = "$msg ops/s (fcp read=$fcpread_per_seconds B/s, fcp write=$fcpwrite_per_seconds B/s, disk read=$diskread_per_seconds B/s, disk write=$diskwrite_per_seconds B/s)"; - $perf = "fcpops=$check fcpread=$fcpread_per_seconds fcpwrite=$fcpwrite_per_seconds diskread=$diskread_per_seconds diskwrite=$diskwrite_per_seconds"; + $perf = "fcpops=$check fcpread=$fcpread_per_seconds fcpwrite=$fcpwrite_per_seconds diskread=$diskread_per_seconds diskwrite=$diskwrite_per_seconds"; ### NVRAM ### } elsif("$opt{'check_type'}" eq "NVRAM") { - my $check = _get_oid_value($snmp_session,$snmpnvramBatteryStatus); - if($check == 1) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} $nvramBatteryStatus{$check}"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} $nvramBatteryStatus{$check}"; - } - $perf = "nvrambatterystatus=$check"; + my $check = _get_oid_value($snmp_session,$snmpnvramBatteryStatus); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $nvramBatteryStatus{$check}"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $nvramBatteryStatus{$check}"; + } + $perf = "nvrambatterystatus=$check"; ### DISKUSED ### } elsif("$opt{'check_type'}" eq "DISKUSED") { - FSyntaxError("Missing -v") unless defined $opt{'vol'}; + FSyntaxError("Missing -v") unless defined $opt{'vol'}; - my $r_vol_tbl = $snmp_session->get_table($snmp_netapp_volume_id_table_df_name); - foreach my $key ( keys %$r_vol_tbl) { - if("$$r_vol_tbl{$key}" eq "$opt{'vol'}") { - my @tmp_arr = split(/\./, $key); - my $oid = pop(@tmp_arr); + my $r_vol_tbl = $snmp_session->get_table($snmp_netapp_volume_id_table_df_name); + foreach my $key ( keys %$r_vol_tbl) { + if("$$r_vol_tbl{$key}" eq "$opt{'vol'}") { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); my $used = ""; my $capacity = ""; - if ($opt{'version'} eq '2c') { + if ($opt{'version'} eq '2c') { $used = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df64_used.$oid"); $capacity = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df64_total.$oid"); } @@ -722,16 +759,16 @@ if("$opt{'check_type'}" eq "TEMP") { my $used_low = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df_used_low.$oid"); $used = _ulong64($used_high, $used_low); } - my $used_prec = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df_used_prec.$oid"); + my $used_prec = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df_used_prec.$oid"); - ($msg,$stat) = _clac_err_stat($used_prec,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + ($msg,$stat) = _clac_err_stat($used_prec,"$opt{'check_type'} $opt{'vol'}",$opt{'warn'},$opt{'crit'}); # https://nagios-plugins.org/doc/guidelines.html # 'label'=value[UOM];[warn];[crit];[min];[max] - $perf = "$$r_vol_tbl{$key}=$used\KB;" .floor($capacity*$opt{'warn'}/100) .";" .floor($capacity*$opt{'crit'}/100) .";;$capacity"; - $perf .= " $$r_vol_tbl{$key}:perc=$used_prec\%;" .floor($opt{'warn'}) .";" .floor($opt{'crit'}) .";;100"; - } - } + $perf = "$$r_vol_tbl{$key}=$used\KB;" .floor($capacity*$opt{'warn'}/100) .";" .floor($capacity*$opt{'crit'}/100) .";;$capacity"; + $perf .= " $$r_vol_tbl{$key}:perc=$used_prec\%;" .floor($opt{'warn'}) .";" .floor($opt{'crit'}) .";;100"; + } + } if ($msg =~ /^$/) { $stat = $ERRORS{'WARNING'}; $msg = "WARN: Unknown volume path or aggregate name '$opt{'vol'}'. Available values:"; @@ -739,249 +776,374 @@ if("$opt{'check_type'}" eq "TEMP") { next if ( !( ($$r_vol_tbl{$key} =~ m#^/vol/.*/$#) or ($$r_vol_tbl{$key} =~ m#^[^/]*$#) ) ); $msg .= " $$r_vol_tbl{$key}" } - } + } +### SNAPSHOTAGE ### +} elsif("$opt{'check_type'}" eq "SNAPSHOTAGE") { + + my @exc_list = split(',',$opt{'exclude'}); + my @vol_list; + my @vol_id; + my @vol_err_ok; + my @vol_err_war; + my @vol_err_cri; + my $loc_mon=(localtime(time()))[4]+1; + my $loc_year=(localtime(time()))[5]+1900; + my $loc_time = time(); + my $badcount = 0; + my $r_snap_tbl = $snmp_session->get_table($snmp_filesys_snapshot_slVTable_slVEntry); + my $r_vol_tbl = $snmp_session->get_table($snmp_filesys_snapshot_slVTable_slVEntry_number); + foreach my $key ( keys %$r_vol_tbl) { + my @tmp_oid = split(/\./, $key); + my $nb_col = scalar @tmp_oid; + push(@vol_list,"$tmp_oid[$nb_col-2]"); + } + @vol_id = uniq(@vol_list); + foreach my $vol_id (@vol_id) { + my $Snap_year; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry_number.$vol_id.1"; + my $Nb_Snap = "$$r_vol_tbl{$key_tmp}"; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry.9.$vol_id.$Nb_Snap"; + my $Vol_Name = "$$r_snap_tbl{$key_tmp}"; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry.2.$vol_id.$Nb_Snap"; + my $Snap_mon = "$$r_snap_tbl{$key_tmp}"; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry.3.$vol_id.$Nb_Snap"; + my $Snap_day = "$$r_snap_tbl{$key_tmp}"; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry.4.$vol_id.$Nb_Snap"; + my $Snap_hour = "$$r_snap_tbl{$key_tmp}"; + my $key_tmp = "$snmp_filesys_snapshot_slVTable_slVEntry.5.$vol_id.$Nb_Snap"; + my $Snap_min = "$$r_snap_tbl{$key_tmp}"; + if ( $loc_mon >= $Snap_mon ) { + $Snap_year = $loc_year; + } else { + $Snap_year = $loc_year-1; + } + my $Snap_time = timelocal(0,$Snap_min,$Snap_hour,$Snap_day,$Snap_mon-1,$Snap_year); + my $Snap_delta = sprintf("%.2f", ($loc_time-$Snap_time)/86400); + + #print "Localtime : ".localtime($loc_time)." \n"; + #print "Localtime : ".localtime($Snap_time)." \n"; + #print "Vol_id=$vol_id Nb_Snap=$Nb_Snap Vol_Name=$Vol_Name Snap_mon=$Snap_mon Snap_day=$Snap_day Snap_hour=$Snap_hour Snap_min=$Snap_min localtime=$loc_time snap_time=$Snap_time Snap_delta=$Snap_delta War=$opt{'warn'} Crit=$opt{'crit'}\n"; + + if (defined $opt{'vol'}) { + if ($opt{'vol'} eq "/vol/$Vol_Name/") { + if($Snap_delta > $opt{'warn'} and $Snap_delta < $opt{'crit'}) { + push(@vol_err_war, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } elsif($Snap_delta >= $opt{'crit'}) { + push(@vol_err_cri, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } else { + push(@vol_err_ok, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } + } + } elsif (defined $opt{'exclude'}) { + my $volcheck = 0; + foreach my $exvol (@exc_list) { + if ($exvol eq "/vol/$Vol_Name/") { + $volcheck++; + #print "Exclude\n"; + } + } + if($volcheck == 0) { + if($Snap_delta > $opt{'warn'} and $Snap_delta < $opt{'crit'}) { + push(@vol_err_war, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } elsif($Snap_delta >= $opt{'crit'}) { + push(@vol_err_cri, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } else { + push(@vol_err_ok, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } + } + } else { + if($Snap_delta > $opt{'warn'} and $Snap_delta < $opt{'crit'}) { + push(@vol_err_war, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } elsif($Snap_delta >= $opt{'crit'}) { + push(@vol_err_cri, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } else { + push(@vol_err_ok, "/vol/".$Vol_Name."/ : ".$Snap_delta.""); + } + } + } + my $err_ok = $#vol_err_ok + 1; + my $err_war = $#vol_err_war + 1; + my $err_cri = $#vol_err_cri + 1; + $badcount += ($err_war+$err_cri); + + if (($err_cri == 0) && ($err_war == 0) && ($err_ok != 0)) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} @vol_err_ok "; + } elsif ($err_cri != 0) { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT : $opt{'check_type'} $badcount outdated snapshots found, @vol_err_cri days old (> $opt{'crit'} d)"; + } elsif ($err_war != 0) { + $stat = $ERRORS{'WARNING'}; + $msg = "WARN: $opt{'check_type'} $badcount outdated snapshots found, @vol_err_war days old (> $opt{'warn'} d)"; + } elsif (defined $opt{'vol'}) { + $err_war = 1; + $stat = $ERRORS{'WARNING'}; + $msg = "WARN: $opt{'check_type'} Unknown volume path name '$opt{'vol'}'. example \"/vol/vol0/\""; + } else { + $stat = $ERRORS{'UNKNOWN'}; + $msg = "UNKNOW Errors"; + } +$perf = "outdated_snapshots=$badcount"; + ### SNAPSHOT ### } elsif("$opt{'check_type'}" eq "SNAPSHOT") { - my @exc_list = split(',',$opt{'exclude'}); - my @vol_err; - my $r_vol_tbl = $snmp_session->get_table($snmpfilesysvolTablevolEntryvolName); - foreach my $key ( keys %$r_vol_tbl) { - my @tmp_arr = split(/\./, $key); - my $oid = pop(@tmp_arr); - my $vol_tmp = "$$r_vol_tbl{$key}"; + my @exc_list = split(',',$opt{'exclude'}); + my @vol_err; + my $r_vol_tbl = $snmp_session->get_table($snmpfilesysvolTablevolEntryvolName); + foreach my $key ( keys %$r_vol_tbl) { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); + my $vol_tmp = "$$r_vol_tbl{$key}"; - my $volopt = _get_oid_value($snmp_session,"$snmpfilesysvolTablevolEntryOptions.$oid"); + my $volopt = _get_oid_value($snmp_session,"$snmpfilesysvolTablevolEntryOptions.$oid"); - if($volopt !~ /nosnap=off/) { - my $volcheck = 0; - foreach my $exvol (@exc_list) { - if($exvol eq $vol_tmp) { - $volcheck++; - last; - } - } - if($volcheck == 0) { - push(@vol_err,"$vol_tmp"); - } - } - } + if($volopt !~ /nosnap=off/) { + my $volcheck = 0; + foreach my $exvol (@exc_list) { + if($exvol eq $vol_tmp) { + $volcheck++; + last; + } + } + if($volcheck == 0) { + push(@vol_err,"$vol_tmp"); + } + } + } + + my $err_count = $#vol_err + 1; + if($err_count == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} all ok"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} @vol_err not configured"; + } + $perf = "snapoff=$err_count"; - my $err_count = $#vol_err + 1; - if($err_count == 0) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} all ok"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} @vol_err not configured"; - } - $perf = "snapoff=$err_count"; ### FAILEDDISK ### } elsif("$opt{'check_type'}" eq "FAILEDDISK") { - my $check = _get_oid_value($snmp_session,$snmpFailedDiskCount); - if($check == 0) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} $check"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} $check"; - } - $perf = "faileddisks=$check"; + my $check = _get_oid_value($snmp_session,$snmpFailedDiskCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $check"; + } + $perf = "faileddisks=$check"; ### DISKSUMMARY ### } elsif("$opt{'check_type'}" eq "DISKSUMMARY") { - my $diskTotal = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskTotalCount); - my $diskActive = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskActiveCount); - my $diskFailed = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskFailedCount); - my $diskReconstructing = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskReconstructingCount); - my $diskSpare = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskSpareCount); - my $diskMessage = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskFailedMessage); + my $diskTotal = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskTotalCount); + my $diskActive = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskActiveCount); + my $diskFailed = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskFailedCount); + my $diskReconstructing = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskReconstructingCount); + my $diskSpare = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskSpareCount); + my $diskMessage = _get_oid_value($snmp_session,$snmp_netapp_disksummary_diskFailedMessage); - my $check=$diskFailed; + my $check=$diskFailed; - if($check == 0) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; - } elsif ($diskSpare>0) { - $stat = $ERRORS{'WARNING'}; - $msg = "WARN: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; - } - $perf = "faileddisks=$check total=$diskTotal active=$diskActive spare=$diskSpare reconstructing=$diskReconstructing"; + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; + } elsif ($diskSpare>0) { + $stat = $ERRORS{'WARNING'}; + $msg = "WARN: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} (".$diskMessage.") Disk Summary : Total->".$diskTotal." Active->".$diskActive." Spare->".$diskSpare." Failed ->".$diskFailed. " Reconstructing ->".$diskReconstructing; + } + $perf = "faileddisks=$check total=$diskTotal active=$diskActive spare=$diskSpare reconstructing=$diskReconstructing"; ### HA ### } elsif("$opt{'check_type'}" eq "HA") { - my $cfSettings = _get_oid_value($snmp_session,$snmp_netapp_cfSettings); - my $cfState = _get_oid_value($snmp_session,$snmp_netapp_cfState); - my $cfCannotTakeoverCause = _get_oid_value($snmp_session,$snmp_netapp_cfCannotTakeoverCause); - my $cfPartnerStatus = _get_oid_value($snmp_session,$snmp_netapp_cfPartnerStatus); - my $cfPartnerName = _get_oid_value($snmp_session,$snmp_netapp_cfPartnerName); - my $cfInterconnectStatus = _get_oid_value($snmp_session,$snmp_netapp_cfInterconnectStatus); + my $cfSettings = _get_oid_value($snmp_session,$snmp_netapp_cfSettings); + my $cfState = _get_oid_value($snmp_session,$snmp_netapp_cfState); + my $cfCannotTakeoverCause = _get_oid_value($snmp_session,$snmp_netapp_cfCannotTakeoverCause); + my $cfPartnerStatus = _get_oid_value($snmp_session,$snmp_netapp_cfPartnerStatus); + my $cfPartnerName = _get_oid_value($snmp_session,$snmp_netapp_cfPartnerName); + my $cfInterconnectStatus = _get_oid_value($snmp_session,$snmp_netapp_cfInterconnectStatus); - my $check=$cfSettings; + my $check=$cfSettings; - if($cfSettings == 2) { + if($cfSettings == 2) { - if ( ($cfPartnerStatus != 2) or ($cfState != 2) or ($cfInterconnectStatus != 4) ) { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Cannot Takeover Cause->".$cfCannotTakeoverCauseIndex{$cfCannotTakeoverCause}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; - } else { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; - } + if ( ($cfPartnerStatus != 2) or ($cfState != 2) or ($cfInterconnectStatus != 4) ) { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Cannot Takeover Cause->".$cfCannotTakeoverCauseIndex{$cfCannotTakeoverCause}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; + } else { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; + } - } elsif ( ($cfSettings == 3) or ($cfSettings == 1) ) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} HA Summary : Settings ->".$cfSettingsIndex{$cfSettings}; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; - } - $perf = "hasettings=$check"; + } elsif ( ($cfSettings == 3) or ($cfSettings == 1) ) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} HA Summary : Settings ->".$cfSettingsIndex{$cfSettings}; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} HA Summary : Settings->".$cfSettingsIndex{$cfSettings}." State->".$cfStateIndex{$cfState}." Partner->".$cfPartnerName." Partner Status ->".$cfPartnerStatusIndex{$cfPartnerStatus}." Interconnection State->".$cfInterconnectStatusIndex{$cfInterconnectStatus}; + } + $perf = "hasettings=$check"; ### UPTIME ### } elsif("$opt{'check_type'}" eq "UPTIME") { - my $check = _get_oid_value($snmp_session,$snmpUpTime); - $msg = "$opt{'check_type'}: $check"; - $check =~ m/^\s*(\d+)\s+days,\s+(\d+):(\d+):(\d+).*$/; - $perf = "uptime=" . ($1*86400 + $2*3600 + $3*60 + $4) . "s"; + my $check = _get_oid_value($snmp_session,$snmpUpTime); + $msg = "$opt{'check_type'}: $check"; + $check =~ m/^\s*(\d+)\s+days,\s+(\d+):(\d+):(\d+).*$/; + $perf = "uptime=" . ($1*86400 + $2*3600 + $3*60 + $4) . "s"; ### CACHEAGE ### } elsif("$opt{'check_type'}" eq "CACHEAGE") { - my $check = _get_oid_value($snmp_session,$snmpCacheAge); - ($msg,$stat) = _clac_minutes_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "cache_age=$check"; + my $check = _get_oid_value($snmp_session,$snmpCacheAge); + ($msg,$stat) = _clac_minutes_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cache_age=$check"; ### GLOBALSTATUS ### } elsif("$opt{'check_type'}" eq "GLOBALSTATUS") { - my $check = _get_oid_value($snmp_session,$snmpGlobalStatus); - my $global_stat_txt = _get_oid_value($snmp_session,$snmpGlobalStatus_text); - if($check == 3) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; - } - $perf = "globalstatus=$check"; + my $check = _get_oid_value($snmp_session,$snmpGlobalStatus); + my $global_stat_txt = _get_oid_value($snmp_session,$snmpGlobalStatus_text); + if($check == 3) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; + } + $perf = "globalstatus=$check"; ### AUTOSUPPORTSTATUS ### } elsif("$opt{'check_type'}" eq "AUTOSUPPORTSTATUS") { - my $check = _get_oid_value($snmp_session,$snmpAutoSupportStatus); - my $autosupport_stat_txt = _get_oid_value($snmp_session,$snmpAutoSupportStatus_text); - if($check == 1) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} $AutoSupportStatusIndex{$check} $check $autosupport_stat_txt"; - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} $AutoSupportStatusIndex{$check} $check $autosupport_stat_txt"; - } - $perf = "autosupportstatus=$check"; + my $check = _get_oid_value($snmp_session,$snmpAutoSupportStatus); + my $autosupport_stat_txt = _get_oid_value($snmp_session,$snmpAutoSupportStatus_text); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $AutoSupportStatusIndex{$check} $check $autosupport_stat_txt"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $AutoSupportStatusIndex{$check} $check $autosupport_stat_txt"; + } + $perf = "autosupportstatus=$check"; ### NDMPSESSIONS ### } elsif("$opt{'check_type'}" eq "NDMPSESSIONS") { - my $check = _get_oid_value($snmp_session,$snmpNdmpSessions); - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "ndmpsess=$check"; + my $check = _get_oid_value($snmp_session,$snmpNdmpSessions); + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "ndmpsess=$check"; ### CIFSSESSIONS ### } elsif("$opt{'check_type'}" eq "CIFSSESSIONS") { - my $check = _get_oid_value($snmp_session,$snmpCifsSessions); - ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); - $perf = "cifssess=$check"; + my $check = _get_oid_value($snmp_session,$snmpCifsSessions); + ($msg,$stat) = _clac_absolute_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cifssess=$check"; ### SHELF ### } elsif ( ("$opt{'check_type'}" eq "SHELF") or ("$opt{'check_type'}" eq "SHELFINFO") ) { - my @errs; - my $r_shelf = $snmp_session->get_table($snmpEnclTableIndex); - my $perf_temp = ""; - foreach my $key ( sort keys %$r_shelf) { - my @tmp_arr = split(/\./, $key); - my $oid = pop(@tmp_arr); + my @errs; + my $r_shelf = $snmp_session->get_table($snmpEnclTableIndex); + my $perf_temp = ""; + foreach my $key ( sort keys %$r_shelf) { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); - my %shelf; - my @shelf_err; - my $addr = _get_oid_value($snmp_session,"$snmpEnclTableShelfAddr.$oid"); + my %shelf; + my @shelf_err; + my $addr = _get_oid_value($snmp_session,"$snmpEnclTableShelfAddr.$oid"); - my $shelf_state = _get_oid_value($snmp_session,"$snmpEnclTableState.$oid"); + my $shelf_state = _get_oid_value($snmp_session,"$snmpEnclTableState.$oid"); - if($shelf_state != 3) { - push(@shelf_err,"$addr state $EcnlStatusIndex{$shelf_state},"); - } + if($shelf_state != 3) { + push(@shelf_err,"$addr state $EcnlStatusIndex{$shelf_state},"); + } - if ("$opt{'check_type'}" eq "SHELFINFO") { + if ("$opt{'check_type'}" eq "SHELFINFO") { + + my $shelf_temp = _get_oid_value($snmp_session,"$snmpEnclTableCurrentTemp.$oid"); - my $shelf_temp = _get_oid_value($snmp_session,"$snmpEnclTableCurrentTemp.$oid"); - my @current_temp = split(/\,/, $shelf_temp ); - $shelf{'ShelfNumber'} = $oid; + $shelf{'ShelfNumber'} = $oid; $shelf{'CurrentTemp'} = shift(@current_temp); - $shelf{'ProductID'} = _get_oid_value($snmp_session,"$snmpEnclTableProductID.$oid"); - $shelf{'ProductVendor'} = _get_oid_value($snmp_session,"$snmpEnclTableProductVendor.$oid"); - $shelf{'ProductModel'} = _get_oid_value($snmp_session,"$snmpEnclTableProductModel.$oid"); - $shelf{'ProductRevision'} = _get_oid_value($snmp_session,"$snmpEnclTableProductRevision.$oid"); - $shelf{'ProductSerial'} = _get_oid_value($snmp_session,"$snmpEnclTableProductSerial.$oid"); - } else { - $shelf{'PsFail'} = _get_oid_value($snmp_session,"$snmpEnclTablePsFailed.$oid"); - $shelf{'FanFail'} = _get_oid_value($snmp_session,"$snmpEnclTableFanFailed.$oid"); - $shelf{'ElectFail'} = _get_oid_value($snmp_session,"$snmpEnclTableElectronicFailed.$oid"); - $shelf{'TempOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverFail.$oid"); - $shelf{'TempOver'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverWarn.$oid"); - $shelf{'TempUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderFail.$oid"); - $shelf{'TempUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderWarn.$oid"); - $shelf{'VoltOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverFail.$oid"); - $shelf{'VoltOverWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverWarn.$oid"); - $shelf{'VoltUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderFail.$oid"); - $shelf{'VoltUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderWarn.$oid"); - } + $shelf{'ProductID'} = _get_oid_value($snmp_session,"$snmpEnclTableProductID.$oid"); + $shelf{'ProductVendor'} = _get_oid_value($snmp_session,"$snmpEnclTableProductVendor.$oid"); + $shelf{'ProductModel'} = _get_oid_value($snmp_session,"$snmpEnclTableProductModel.$oid"); + $shelf{'ProductRevision'} = _get_oid_value($snmp_session,"$snmpEnclTableProductRevision.$oid"); + $shelf{'ProductSerial'} = _get_oid_value($snmp_session,"$snmpEnclTableProductSerial.$oid"); + } else { + $shelf{'PsFail'} = _get_oid_value($snmp_session,"$snmpEnclTablePsFailed.$oid"); + $shelf{'FanFail'} = _get_oid_value($snmp_session,"$snmpEnclTableFanFailed.$oid"); + $shelf{'ElectFail'} = _get_oid_value($snmp_session,"$snmpEnclTableElectronicFailed.$oid"); + $shelf{'TempOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverFail.$oid"); + $shelf{'TempOver'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverWarn.$oid"); + $shelf{'TempUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderFail.$oid"); + $shelf{'TempUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderWarn.$oid"); + $shelf{'VoltOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverFail.$oid"); + $shelf{'VoltOverWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverWarn.$oid"); + $shelf{'VoltUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderFail.$oid"); + $shelf{'VoltUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderWarn.$oid"); + } - foreach my $subkey ( keys %shelf) { - if ( ($shelf{$subkey} ne "") and ($shelf{$subkey} ne "noSuchInstance") ) { + foreach my $subkey ( keys %shelf) { + if ( ($shelf{$subkey} ne "") and ($shelf{$subkey} ne "noSuchInstance") ) { if ( "$subkey" eq "CurrentTemp" ) { $shelf{$subkey} =~ m/^([0-9]+)C.*$/; $perf_temp = "$perf_temp, temp_$shelf{'ShelfNumber'}=$1"; } - } - #else { print "$subkey->"; print "None "; } - - if ("$opt{'check_type'}" eq "SHELF") { - if(($shelf{$subkey} ne "") and ($shelf{$subkey} ne "noSuchInstance")) { push(@shelf_err,"$addr $subkey,") } - } - } + } + #else { print "$subkey->"; print "None "; } - #{ print "\n"; } - #if ("$opt{'check_type'}" eq "SHELF") { print "\n"; } + if ("$opt{'check_type'}" eq "SHELF") { + if(($shelf{$subkey} ne "") and ($shelf{$subkey} ne "noSuchInstance")) { push(@shelf_err,"$addr $subkey,") } + } + } - if($#shelf_err != -1) { - push(@errs,@shelf_err) - } - } + #{ print "\n"; } + #if ("$opt{'check_type'}" eq "SHELF") { print "\n"; } + + if($#shelf_err != -1) { + push(@errs,@shelf_err) + } + } + + if($#errs == -1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} ok"; + if ("$opt{'check_type'}" eq "SHELFINFO") + { $perf = "shelfinfo=0$perf_temp"; } + else + { $perf = "shelf=0"; } + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} Errors -"; + foreach(@errs) { + $msg = "$msg $_"; + } + if ("$opt{'check_type'}" eq "SHELFINFO") + { $perf = "shelfinfo=1$perf_temp"; } + else + { $perf = "shelf=1"; } + } +### FSSTATUS ### +} elsif("$opt{'check_type'}" eq "FSSTATUS") { + my $check = _get_oid_value($snmp_session,$snmpfsOverallStatus); + my $global_stat_txt = _get_oid_value($snmp_session,$snmpfsOverallStatus_text); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $fsOverallStatusIndex{$check} $check $global_stat_txt"; + }elsif($check == 2) { + $stat = $ERRORS{'WARNING'}; + $msg = "WARN: $opt{'check_type'} $fsOverallStatusIndex{$check} $check $global_stat_txt"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $fsOverallStatusIndex{$check} $check $global_stat_txt"; + } + $perf = "fsstatus=$check"; - if($#errs == -1) { - $stat = $ERRORS{'OK'}; - $msg = "OK: $opt{'check_type'} ok"; - if ("$opt{'check_type'}" eq "SHELFINFO") - { $perf = "shelfinfo=0$perf_temp"; } - else - { $perf = "shelf=0"; } - } else { - $stat = $ERRORS{'CRITICAL'}; - $msg = "CRIT: $opt{'check_type'} Errors -"; - foreach(@errs) { - $msg = "$msg $_"; - } - if ("$opt{'check_type'}" eq "SHELFINFO") - { $perf = "shelfinfo=1$perf_temp"; } - else - { $perf = "shelf=1"; } - } ### Syntax Error ### } else { - FSyntaxError("$opt{'check_type'} invalid parameter !"); + FSyntaxError("$opt{'check_type'} invalid parameter !"); } +$msg =~ s/\n//g; $perf ? print "$msg | $perf\n" : print "$msg\n"; exit($stat); -