X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=dsa-nagios-checks%2Fchecks%2Fdsa-check-hpacucli;h=755a40604ad9c74d267bf8b1a20025d309ad2c47;hb=f295d1e8f6e63e63cac4802dff5087e8a699790e;hp=a34738897ac81903992fd2c34e983426310c4e95;hpb=42e99da9d896a33803e763c746e9a103183b6b34;p=mirror%2Fdsa-nagios.git diff --git a/dsa-nagios-checks/checks/dsa-check-hpacucli b/dsa-nagios-checks/checks/dsa-check-hpacucli index a347388..755a406 100755 --- a/dsa-nagios-checks/checks/dsa-check-hpacucli +++ b/dsa-nagios-checks/checks/dsa-check-hpacucli @@ -5,7 +5,7 @@ # # does _not_ check raid status. use arrayprobe for that. -# Copyright (c) 2008 Peter Palfrader +# Copyright (c) 2008,2009,2010,2011 Peter Palfrader # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,6 +27,8 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. use strict; +use English; +use Getopt::Long; # nagios exit codes my %CODE = ( @@ -39,7 +41,7 @@ my %CODE = ( my $EXITCODE = 'OK'; $SIG{'__DIE__'} = sub { - print STDERR @_; + print @_; exit $CODE{'UNKNOWN'}; }; @@ -62,13 +64,28 @@ sub record($) { }; } +my $usage = "$PROGRAM_NAME: Usage: $PROGRAM_NAME [--no-battery] [--ignore-transfer-speed= [--ignore-transfer-speed= ...]]\n"; +my $params; +Getopt::Long::Configure('bundling'); +if (!GetOptions ( + '--help' => \$params->{'help'}, + '--no-battery' => \$params->{'no-battery'}, + '--ignore-transfer-speed=s@' => \$params->{'ignore-transfer-speed'}, + )) { + die ($usage); +}; +if ($params->{'help'}) { + print $usage; + exit (0); +}; +die ($usage) unless (scalar @ARGV == 0); my $ctrlallshow = runcmd("controller all show"); my @controllers; for (@$ctrlallshow) { chomp; next if /^$/; - if (/in Slot ([0-9]+) /) { + if (/in Slot ([0-9a-z]+)/) { push @controllers, $1; next; }; @@ -92,12 +109,13 @@ for my $slot (sort @controllers) { next if /^$/; next if (/^\S.*in Slot $slot/); next if /^ *array [A-Z]$/; + next if /^ *unassigned/; 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|Rebuilding)(?:, spare)?\)$/) { + } elsif (/^ *physicaldrive (\S+) .* (OK|Predictive Failure|Failed|Rebuilding)(?:, (?:active )?spare)?\)$/) { my $drive = $1; my $status = $2; push @{$status{$status}}, $drive; @@ -124,8 +142,10 @@ for my $slot (sort @controllers) { my $type; if ($drive =~ /^[0-9]+:[0-9]+$/) { # scsi drives $type = 'SCSI'; - } elsif ($drive =~ /^[0-9]+I:[0-9]+:[0-9]+$/) { # SAS + } elsif ($drive =~ /^[0-9]+[EI]:[0-9]+:[0-9]+$/) { # SAS $type = 'SAS'; + } elsif ($drive =~ /^[0-9]+[C]:[0-9]+:[0-9]+$/) { # New 6GBPS SAS + $type = 'SAS+'; } else { # I'm not going to run pass arguments of unknown form to the shell.. warn ("Unknown diskdrive ID $drive\n"); @@ -161,22 +181,38 @@ for my $slot (sort @controllers) { push @{$status{'unknown transfer mode'}}, $drive."(".$value{'Transfer Mode'}.")"; next; }; - } elsif ($type eq 'SAS') { + } elsif ($type eq 'SAS' || $type eq 'SAS+') { $key = 'PHY Transfer Rate'; if ($value{'PHY Count'} eq '2') { - $expected = '3.0GBPS, Unknown'; + if (defined($value{'Redundant Path(s)'})) { + $expected = [ '3.0GBPS, 3.0GBPS', '6.0GBPS, 6.0GBPS' ]; + } else { + $expected = [ '3.0GBPS, Unknown', 'Unknown, 3.0GBPS', + '6.0GBPS, Unknown', 'Unknown, 6.0GBPS' ]; + } } else { - $expected = '3.0GBPS'; + $expected = [ '3.0GBPS', '6.0GBPS' ]; } } else { warn "Should not be here. Do not know what to do with type '$type'\n"; next; } + if ($params->{'ignore-transfer-speed'}) { + if (grep { $drive eq $_ } @{$params->{'ignore-transfer-speed'}}) { + push @{$status{'ignored transfer speed'}}, $drive."(".$value{$key}.")"; + next; + }; + }; if (!defined $value{$key}) { record('WARNING'); push @{$status{'unknown transfer speed'}}, $drive; - } elsif ($value{$key} ne $expected) { + } elsif (ref($expected) eq 'ARRAY') { + if (scalar(grep { uc($value{$key}) eq uc($_) } @$expected) == 0) { + record('WARNING'); + push @{$status{'bad transfer speed'}}, $drive."(".$value{$key}.")"; + }; + } elsif (uc($value{$key}) ne uc($expected)) { record('WARNING'); push @{$status{'bad transfer speed'}}, $drive."(".$value{$key}.")"; }; @@ -201,6 +237,8 @@ for my $slot (sort @controllers) { my $status = $2; push @{$status{$status}}, $system; if ($status ne 'OK') { + next if ($params->{'no-battery'} && $system eq 'Cache'); + next if ($params->{'no-battery'} && $system eq 'Battery/Capacitor'); record('WARNING'); }; } else {