[project @ peter@palfrader.org-20080722211715-69dsek1e30flwd1j]
[mirror/dsa-nagios.git] / dsa-nagios-nrpe-config / dsa-check-hpacucli
index c04e9ea..2bc260a 100755 (executable)
@@ -84,6 +84,7 @@ my @resultstr;
 
 for my $slot (sort @controllers) {
        my $pds = runcmd("controller slot=$slot pd all show");
+       my @drives;
        my $nodrives = 0;
        my %status;
        for (@$pds) {
@@ -93,23 +94,73 @@ for my $slot (sort @controllers) {
                next if (/^\S.*in Slot $slot/);
                if (/^Error: The specified controller does not have any physical drives on it.$/) {
                        $nodrives = 1;
-               } elsif (/^ *physicaldrive (\S+) .* (OK|Predictive Failure|Failed)(?:, spare)?\)$/) {
+               } elsif (/^ *physicaldrive (\S+) .* (OK|Predictive Failure|Failed|Rebuilding)(?:, spare)?\)$/) {
                        my $drive = $1;
                        my $status = $2;
                        push @{$status{$status}}, $drive;
                        if ($status eq 'OK') {
-                       } elsif ($status eq 'Predictive Failure') {
+                       } elsif ($status eq 'Predictive Failure' ||
+                                $status eq 'Rebuilding') {
                                record('WARNING');
                        } elsif ($status eq 'Failed') {
                                record('CRITICAL');
                        } else {
                                record('UNKNOWN');
                        };      
+                       push @drives, $drive;
                } else {
                        die ("Cannot read line '$_' gotten from hpacucli controller slot=$slot pd all show\n");
                };
        };
 
+       # Check that all drives have the proper transfer speed.
+       # sometimes stuff breaks and they fall back to 10mb/sec.
+       for my $drive (@drives) {
+               my $type;
+               if ($drive =~ /^[0-9]+:[0-9]+$/) { # scsi drives
+                       $type = 'SCSI';
+               } elsif ($drive =~ /^[0-9]+I:[0-9]+:[0-9]+$/) { # SAS
+                       $type = 'SAS';
+               } else {
+                       # I'm not going to run pass arguments of unknown form to the shell..
+                       warn ("Unknown diskdrive ID $drive\n");
+                       next;
+               }
+
+               my $pd = runcmd("controller slot=$slot pd $drive show");
+               while (defined $pd->[0] && !($pd->[0] =~ /physicaldrive/)) {
+                       shift @$pd;
+               };
+               shift @$pd;
+               my %value;
+               for (@$pd) {
+                       if (m/^\s*(.*?):\s*(.*?)\s*$/) {
+                               $value{$1} = $2;
+                       }
+               }
+
+               my $key;
+               my $expected;
+               if ($type eq 'SCSI') {
+                       $key = 'Transfer Speed';
+                       $expected = '320 MB/Sec';
+               } elsif ($type eq 'SAS') {
+                       $key = 'PHY Transfer Rate';
+                       $expected = '3.0GBPS';
+               } else {
+                       warn "Should not be here.  Do not know what to do with type '$type'\n";
+                       next;
+               }
+
+               if (!defined $value{$key}) {
+                       record('WARNING');
+                       push @{$status{'unknown transfer speed'}}, $drive;
+               } elsif ($value{$key} ne $expected) {
+                       record('WARNING');
+                       push @{$status{'bad transfer speed'}}, $drive."(".$value{$key}.")";
+               };
+       };
+
        if ($nodrives && scalar keys %status > 0) {
                push @resultstr, "Slot $slot: have no drives but status results?";
                record('UNKNOWN');