[project @ peter@palfrader.org-20080809094038-47w9c4sxk38twte0]
[mirror/dsa-nagios.git] / dsa-nagios-nrpe-config / dsa-check-hpacucli
index c04e9ea..a3c42c7 100755 (executable)
@@ -84,32 +84,98 @@ 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) {
                chomp;
                next if /^$/;
-               next if /^ *array [A-Z]$/;
                next if (/^\S.*in Slot $slot/);
-               if (/^Error: The specified controller does not have any physical drives on it.$/) {
+               next if /^ *array [A-Z]$/;
+               if (/^ *(array [A-Z]) \(Failed\)$/) {
+                       record('CRITICAL');
+                       push @{$status{'Failed'}}, $1;
+               } elsif (/^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';
+                       if (!defined $value{'Transfer Mode'}) {
+                               record('WARNING');
+                               push @{$status{'unknown transfer mode'}}, $drive;
+                               next;
+                       } elsif ($value{'Transfer Mode'} eq 'Ultra 3 Wide') {
+                               $expected = '160 MB/Sec';
+                       } elsif ($value{'Transfer Mode'} eq 'Ultra 320 Wide') {
+                               $expected = '320 MB/Sec';
+                       } else {
+                               record('WARNING');
+                               push @{$status{'unknown transfer mode'}}, $drive."(".$value{'Transfer Mode'}.")";
+                               next;
+                       };
+               } 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');