dsa-check-hpasm: Incorporate patch from Jan Wagner to ignore "N/A" DIMM status.
[mirror/dsa-nagios.git] / dsa-nagios-checks / checks / dsa-check-hpasm
index e732d84..fc98866 100755 (executable)
@@ -2,6 +2,8 @@
 
 use strict;
 use warnings;
+use English;
+use Getopt::Long;
 
 # check status of various hardware devices (fans, temp, dimms, powersupply)
 # requires hpasmcli
@@ -35,8 +37,6 @@ SHOW TEMP
 QUIT
 EOF
 
-$ENV{'LD_LIBRARY_PATH'} = '/home/sgran/lib';
-
 my %callbacks = (
   'SHOW DIMM'        => \&do_dimm,
   'SHOW FANS'        => \&do_fans,
@@ -44,6 +44,27 @@ my %callbacks = (
   'SHOW TEMP'        => \&do_temp,
 );
 
+
+my $params = {};
+
+my $USAGE = "PROGRAM_NAME: Usage: $PROGRAM_NAME [--help] [--ps-no-redundant] [--fan-no-redundant] [--fan-high] [--dimm-na]\n";
+Getopt::Long::config('bundling');
+if (!GetOptions (
+        '--help'                => \$params->{'help'},
+        '--ps-no-redundant'     => \$params->{'ps-no-redundant'},
+        '--fan-no-redundant'    => \$params->{'fan-no-redundant'},
+        '--fan-high'            => \$params->{'fan-high'},
+        '--dimm-na'             => \$params->{'dimm-na'},
+        )) {
+        die ("$USAGE");
+};
+if ($params->{'help'}) {
+        print "$USAGE";
+        print "Checks hp hardware health.\n";
+        exit (0);
+};
+
+
 my $prompt = "hpasmcli>";
 my $exit_status = 0;
 my $ret = '';
@@ -63,7 +84,8 @@ sub do_dimm {
 
     if ($line =~ /(^\s*$|-----)/) {
       if ($in_block) {
-        if ($status ne 'Ok') {
+        unless (($status eq 'Ok') ||
+                ($params->{'dimm-na'} && $status eq 'N/A')) {
           $message = sprintf("DIMM%d: %s ", $dimm_num, $status);
           $exit_status |= 2;
         }
@@ -85,7 +107,7 @@ sub do_dimm {
   }
 
   if ($return eq '') {
-    return "All DIMMS OK ($num_dimms)";
+    return "DIMMS OK ($num_dimms) ";
   } else {
     return $return;
   }
@@ -114,15 +136,20 @@ sub do_fans {
       $num_fans++;
       my @line = split /\s+/, $line;
 
+      if ($line[1] eq 'VIRTUAL') { # blade, etc
+        $message = 'FAN1: (virtual) OK ';
+        last;
+      }
+
       if ($line[2] ne 'Yes') {
         $message = sprintf("FAN%d: status=%s ", $fan_num, $line[2]);
         $exit_status |= 2;
       } elsif ($line[3] ne 'NORMAL') {
         $message = sprintf("FAN%d: speed=%s ", $fan_num, $line[3]);
-        $exit_status |= 1;
+        $exit_status |= 1 unless ($line[3] eq 'HIGH' && $params->{'fan-high'});
       } elsif ($line[5] ne 'Yes') {
         $message = sprintf("FAN%d: redundant=%s ",$fan_num, $line[5]);
-        $exit_status |= 1;
+        $exit_status |= 1 unless ($params->{'fan-no-redundant'});
       }
     } elsif ($line =~ /($prompt|^\s*$)/) {
       last;
@@ -173,7 +200,7 @@ sub do_powersupply {
       my $redundant = $1;
       if ($redundant ne 'Yes') {
         $message = sprintf("PS%d not redundant ", $ps_num);
-        $exit_status |= 1;
+        $exit_status |= 1 unless ($params->{'ps-no-redundant'});
       }
     } elsif ($line =~ /($prompt|^\s*$)/) {
       last;
@@ -208,7 +235,6 @@ sub do_temp {
       }
 
       $temp_num = $1;
-      $num_temp++;
       my @line = split /\s+/, $line;
 
       my $zone = $line[1];
@@ -217,14 +243,18 @@ sub do_temp {
 
       $current_temp =~ s/(.*)C.*/$1/;
       $threshold =~ s/(.*)C.*/$1/;
+      next if ($threshold eq '-');
+      $num_temp++;
 
-      my $off = $threshold - $current_temp;
-      if ($off <= 0) {
-        $message = sprintf("TEMP zone=%s %sC/%sC ", $zone, $current_temp, $threshold);
-        $exit_status |= 2;
-      } elsif ($off < ($threshold/10)) {
-        $message = sprintf("TEMP zone=%s %sC/%sC ", $zone, $current_temp, $threshold);
-        $exit_status |= 1;
+      if ($current_temp ne '-') {
+        my $off = $threshold - $current_temp;
+        if ($off <= 0) {
+          $message = sprintf("TEMP zone=%s %sC/%sC ", $zone, $current_temp, $threshold);
+          $exit_status |= 2;
+        } elsif ($off < ($threshold/10)) {
+          $message = sprintf("TEMP zone=%s %sC/%sC ", $zone, $current_temp, $threshold);
+          $exit_status |= 1;
+        }
       }
     } elsif ($line =~ /($prompt|^\s*$)/) {
       last;
@@ -238,7 +268,7 @@ sub do_temp {
   }
 }
 
-my @output = `echo "$command"|hpasmcli 2>&1`;
+my @output = `echo "$command"|sudo hpasmcli 2>&1`;
 if (($? >> 8) != 0) {
   print "UNKNOWN: Can't exec hpasmcli: @output\n";
   exit 3;