X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=dsa-nagios-checks%2Fchecks%2Fdsa-check-hpacucli;h=243d45c220afba5044d927042e8af3e41f7ea1ff;hb=ba5730514e2f8bb27cb7746a00af7314dc8f67d9;hp=2d02f59903d5c9c012172283ac3ae915b63be67d;hpb=8a0b69628b3bf77fb2675cba99990e3f82ccad1d;p=mirror%2Fdsa-nagios.git diff --git a/dsa-nagios-checks/checks/dsa-check-hpacucli b/dsa-nagios-checks/checks/dsa-check-hpacucli index 2d02f59..243d45c 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,2009 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 @@ -41,7 +41,7 @@ my %CODE = ( my $EXITCODE = 'OK'; $SIG{'__DIE__'} = sub { - print STDERR @_; + print @_; exit $CODE{'UNKNOWN'}; }; @@ -64,11 +64,14 @@ sub record($) { }; } -my $usage = "$PROGRAM_NAME: Usage: $PROGRAM_NAME [--ignore-transfer-speed= [--ignore-transfer-speed= ...]]\n"; +my $usage = "$PROGRAM_NAME: Usage: $PROGRAM_NAME [--no-battery] [--ignore-controller=] [--no-controller-ok] [--ignore-transfer-speed= [--ignore-transfer-speed= ...]]\n"; my $params; Getopt::Long::Configure('bundling'); if (!GetOptions ( '--help' => \$params->{'help'}, + '--no-battery' => \$params->{'no-battery'}, + '--no-controller-ok' => \$params->{'no-controller-ok'}, + '--ignore-controller=s' => \$params->{'ignore-controller'}, '--ignore-transfer-speed=s@' => \$params->{'ignore-transfer-speed'}, )) { die ($usage); @@ -84,6 +87,7 @@ my @controllers; for (@$ctrlallshow) { chomp; next if /^$/; + next if ($params->{'ignore-controller'} && /$params->{'ignore-controller'}/); if (/in Slot ([0-9a-z]+)/) { push @controllers, $1; next; @@ -92,17 +96,75 @@ for (@$ctrlallshow) { }; if (scalar @controllers == 0) { - print "UNKNONW: No smartarray controllers found with hpacucli\n"; - exit $CODE{'UNKNOWN'} + if ($params->{'no-controller-ok'}) { + print "No smartarray controllers found with hpacucli\n"; + exit $CODE{'OK'} + } else { + print "UNKNOWN: No smartarray controllers found with hpacucli\n"; + exit $CODE{'UNKNOWN'} + } }; my @resultstr; for my $slot (sort @controllers) { - my $pds = runcmd("controller slot=$slot pd all show"); my @drives; my $nodrives = 0; my %status; + + my $ldallshow = runcmd("controller slot=$slot ld all show"); + my @logicaldrives; + for (@$ldallshow) { + chomp; + next if /^$/; + next if (/^\S.*in Slot $slot/); + next if /^ *array [A-Z]$/; + if (/logicaldrive ([0-9a-z]+)/) { + push @logicaldrives, $1; + next; + } elsif (/^Error: The specified device does not have any logical drives.$/) { + $nodrives = 1; + } else { + die ("Cannot read line '$_' gotten from hpacucli controller slot = $slot logicaldrive all show\n"); + } + }; + + # check logicaldrives + for my $logicaldrive (sort @logicaldrives) { + my $lds = runcmd("controller slot=$slot ld $logicaldrive show"); + for (@$lds) { + chomp; + next if /^$/; + if (/^ *Parity Initialization Status: (Initialization Completed|Initialization Failed|Rebuilding)$/) { + my $status = $1; + if ($status eq 'Initialization Completed') { + push @{$status{'OK'}}, "Parity LD$logicaldrive"; + } elsif ($status eq 'Rebuilding') { + push @{$status{'Failed'}}, "Parity LD$logicaldrive"; + record('WARNING'); + } elsif ($status eq 'Initialization Failed') { + push @{$status{'Failed'}}, "Parity LD$logicaldrive"; + record('CRITICAL'); + } else { + record('UNKNOWN'); + } + } + } + } + + if (!$nodrives && scalar @logicaldrives == 0) { + push @resultstr, "Slot $slot: unexpectedly, found no logical drives in list."; + record('UNKNOWN'); + } elsif ($nodrives && scalar keys %status > 0) { + push @resultstr, "Slot $slot: have no logical drives but status results?"; + record('UNKNOWN'); + next; + } elsif ($nodrives) { + push @resultstr, "Slot $slot: no logical drives"; + }; + + + my $pds = runcmd("controller slot=$slot pd all show"); for (@$pds) { chomp; next if /^$/; @@ -180,44 +242,40 @@ 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') { + if ($value{'Interface Type'} eq 'SATA') { + $expected = [ '1.5Gbps', '3.0Gbps' ]; + } elsif ($value{'PHY Count'} eq '2') { if (defined($value{'Redundant Path(s)'})) { - $expected = '3.0GBPS, 3.0GBPS'; + $expected = [ '3.0GBPS, 3.0GBPS', '6.0GBPS, 6.0GBPS' ]; } else { - $expected = [ '3.0GBPS, Unknown', 'Unknown, 3.0GBPS' ]; + $expected = [ '3.0GBPS, Unknown', 'Unknown, 3.0GBPS', + '6.0GBPS, Unknown', 'Unknown, 6.0GBPS' ]; } } else { - $expected = '3.0GBPS'; - } - } elsif ($type eq 'SAS+') { - $key = 'PHY Transfer Rate'; - if ($value{'PHY Count'} eq '2') { - $expected = '6.0GBPS, Unknown'; - } else { - $expected = '6.0GBPS'; + $expected = [ '3.0GBPS', '6.0GBPS' ]; } } else { warn "Should not be here. Do not know what to do with type '$type'\n"; next; } - if (exists $params->{'ignore-transfer-speed'}) { + if ($params->{'ignore-transfer-speed'}) { if (grep { $drive eq $_ } @{$params->{'ignore-transfer-speed'}}) { push @{$status{'ignored transfer speed'}}, $drive."(".$value{$key}.")"; + next; }; - next; }; if (!defined $value{$key}) { record('WARNING'); push @{$status{'unknown transfer speed'}}, $drive; } elsif (ref($expected) eq 'ARRAY') { - if (scalar(grep { $value{$key} eq $_ } @$expected) == 0) { + if (scalar(grep { uc($value{$key}) eq uc($_) } @$expected) == 0) { record('WARNING'); push @{$status{'bad transfer speed'}}, $drive."(".$value{$key}.")"; }; - } elsif ($value{$key} ne $expected) { + } elsif (uc($value{$key}) ne uc($expected)) { record('WARNING'); push @{$status{'bad transfer speed'}}, $drive."(".$value{$key}.")"; }; @@ -242,6 +300,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 {