mirror of
https://github.com/thomas-krenn/check_lsi_raid.git
synced 2026-03-02 23:52:39 +01:00
Parse PD devices
This commit is contained in:
195
check_lsi_raid
195
check_lsi_raid
@@ -48,7 +48,7 @@ use constant {
|
||||
};
|
||||
|
||||
our @ldmap_a = ('DG/VD','TYPE','State','Access','Consist','Cache','Cac','sCC','Size');
|
||||
|
||||
our @pdmap_a = ('EID:Slt','DID','State','DG','Size','Intf','Med','SED','PI','SeSz','Model','Sp');
|
||||
|
||||
# Always return the highest state level
|
||||
sub getExitState {
|
||||
@@ -409,16 +409,14 @@ sub getLogicalDeviceStatus {
|
||||
# Returns information about:
|
||||
# - Physical device status
|
||||
sub getPhysDeviceStatus {
|
||||
my $sudo = $_[0];
|
||||
my $storcli = $_[1];
|
||||
my $controller = $_[2];
|
||||
my @enclosures = @{($_[3])};
|
||||
my @physDevices = @{($_[4])};
|
||||
my @physicalDeviceTemperature_w = @{($_[5])};
|
||||
my @physicalDeviceTemperature_c = @{($_[6])};
|
||||
my $action = $_[7];
|
||||
|
||||
my $command = "$sudo $storcli /c$controller";
|
||||
my $command = $storcli;
|
||||
my $status = 0;
|
||||
my $statusMessage = '';
|
||||
|
||||
@@ -435,184 +433,33 @@ sub getPhysDeviceStatus {
|
||||
$command .= " show $action";
|
||||
my @output = `$command`;
|
||||
|
||||
my @physDevs;
|
||||
if(checkCommandStatus(\@output)) {
|
||||
if($action eq "all") {
|
||||
my $output_enc = -1;
|
||||
my $output_dev = -1;
|
||||
my $flag = -1;
|
||||
foreach my $line (@output) {
|
||||
if($flag > 0) {
|
||||
$flag--;
|
||||
} elsif($line =~ /^Drive\s\/c$controller\/e([0-9]*)\/s([0-9]*)\s\:/) {
|
||||
# Check the overall drive state
|
||||
$output_enc = $1;
|
||||
$output_dev = $2;
|
||||
$flag = 5;
|
||||
} elsif($line =~ /^Drive\s\/c$controller\/e([0-9]*)\/s([0-9]*)\sState\s\:/) {
|
||||
# Check the drive state in block Detailed information
|
||||
$output_enc = $1;
|
||||
$output_dev = $2;
|
||||
$flag = 1;
|
||||
} elsif($flag eq 0 && ($line =~ /^\-{5,}$/ || $line =~ /^\s*$/)) {
|
||||
# Detect the end of the block which was last checked
|
||||
$flag = -1;
|
||||
} elsif($flag eq 0) {
|
||||
my @values = split(' ',$line);
|
||||
if($values[0] =~ /^[0-9]*:[0-9]*/) {
|
||||
# Check the overall drive state
|
||||
if($values[2] eq "Offln") {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Physical drive is offline, "; }
|
||||
if ($VERBOSITY >= 1) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc is offline, "; }
|
||||
} elsif($values[2] eq "UBad") {
|
||||
$status = getExitState($status, STATE_CRITICAL);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Physical drive state is Unconfigured Bad, "; }
|
||||
if ($VERBOSITY >= 1) {$statusMessage .= "Physical drive $output_dev state in enclosure $output_enc is Unconfigured Bad, "; }
|
||||
}
|
||||
} elsif($values[0] =~ /^[a-zA-Z\.]*/) {
|
||||
# Check the drive state in block Detailed information
|
||||
if($values[0] eq "Shield") {
|
||||
if($values[3] > $ignerr_s) {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Shield counter (phys. drive) $values[3] (>$ignerr_s), "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: shield counter $values[3] (>$ignerr_s), "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: shield counter $values[3] (>$ignerr_s), "; }
|
||||
}
|
||||
}
|
||||
elsif($values[0] eq "Media") {
|
||||
if($values[4] > $ignerr_m) {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Media error count (phys. drive) $values[4] (>$ignerr_m), "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: media error count $values[4] (>$ignerr_m), "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: media error count $values[4] (>$ignerr_m), "; }
|
||||
}
|
||||
}
|
||||
elsif($values[0] eq "Other") {
|
||||
if($values[4] > $ignerr_o) {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Other error count (phys. drive) $values[4] (>$ignerr_o), "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: other error count $values[4] (>$ignerr_o), "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: other error count $values[4] (>$ignerr_o), "; }
|
||||
}
|
||||
}
|
||||
elsif($values[0] eq "Drive") {
|
||||
chop($values[3]);
|
||||
# check if temp is really a number, could be N/A also
|
||||
if($values[3] =~ /^[-+]?[0-9]*\.?[0-9]+$/){
|
||||
my $temp = $values[3];
|
||||
my $crit = 0;
|
||||
# check for warn range
|
||||
if($physicalDeviceTemperature_w[0] eq "in") {
|
||||
if(($temp >= $physicalDeviceTemperature_w[1]) && ($temp <= $physicalDeviceTemperature_w[2])) {
|
||||
# is in warn range, so also check if in critical error range
|
||||
if($physicalDeviceTemperature_c[0] eq "in") {
|
||||
if(($temp >= $physicalDeviceTemperature_c[1]) && ($temp <= $physicalDeviceTemperature_c[2])) {
|
||||
# critical error
|
||||
$crit = 1;
|
||||
$status = getExitState($status, STATE_CRITICAL);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature critical, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
} else {
|
||||
if(($temp < $physicalDeviceTemperature_c[1]) || ($temp > $physicalDeviceTemperature_c[2])) {
|
||||
# critical error
|
||||
$crit = 1;
|
||||
$status = getExitState($status, STATE_CRITICAL);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature critical, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
}
|
||||
if($crit eq 0) { # only warn if not already given a critical error
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature warning, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(($temp < $physicalDeviceTemperature_w[1]) || ($temp > $physicalDeviceTemperature_w[2])) {
|
||||
# is in warn range, so also check if in critical error range
|
||||
if($physicalDeviceTemperature_c[0] eq "in") {
|
||||
if(($temp >= $physicalDeviceTemperature_c[1]) && ($temp <= $physicalDeviceTemperature_c[2])) {
|
||||
# critical error
|
||||
$crit = 1;
|
||||
$status = getExitState($status, STATE_CRITICAL);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature critical, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
} else {
|
||||
if(($temp < $physicalDeviceTemperature_c[1]) || ($temp > $physicalDeviceTemperature_c[2])) {
|
||||
# critical error
|
||||
$crit = 1;
|
||||
$status = getExitState($status, STATE_CRITICAL);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature critical, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
}
|
||||
if($crit eq 0) { # only warn if not already given a critical error
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive temperature warning, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: temperature is ${temp}C, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: temperature is ${temp}C, "; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif($values[0] eq "Predictive") {
|
||||
if($values[4] > $ignerr_p) {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive Predictive Fail Count $values[4] (>$ignerr_p), "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: Predictive Fail Count $values[4] (>$ignerr_p), "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: Predictive Fail Count $values[4] (>$ignerr_p), "; }
|
||||
}
|
||||
}
|
||||
elsif($values[0] eq "S.M.A.R.T") {
|
||||
if($values[6] ne "No") {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "S.M.A.R.T alert flagged by drive, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: S.M.A.R.T alert flagged, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: S.M.A.R.T alert flagged, "; }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$flag = -1;
|
||||
}
|
||||
my $currBlock;
|
||||
foreach my $line(@output){
|
||||
my @splittedLine;
|
||||
if($line =~ /^Drive \/(c[0-9]*\/e[0-9]*\/s[0-9]*) \:$/){
|
||||
$currBlock = $1;
|
||||
next;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
# Check initialization or rebuild output
|
||||
my $output_enc = -1;
|
||||
my $output_dev = -1;
|
||||
foreach my $line (@output) {
|
||||
if($line =~ /^\/c$controller\/e([0-9]*)\/s([0-9]*)/) {
|
||||
$output_enc = $1;
|
||||
$output_dev = $2;
|
||||
}
|
||||
if(($output_enc ne -1) && ($output_dev ne -1)) {
|
||||
#grep for status and floating point number
|
||||
if($line =~ /^\/c$controller\/e$output_enc\/s$output_dev\s*([\-]{1}|[0-9]*\.?[0-9]*)\s*([\w\s]*)$/){
|
||||
my $inProgress = $1;
|
||||
my $state = $2;
|
||||
if($state =~ m/^In progress/) {
|
||||
$status = getExitState($status, STATE_WARNING);
|
||||
if ($VERBOSITY == 0) {$statusMessage .= "Phys. drive: $action in progress, "; }
|
||||
if ($VERBOSITY == 1) {$statusMessage .= "Physical drive $output_dev: $action in progress, "; }
|
||||
if ($VERBOSITY >= 2) {$statusMessage .= "Physical drive $output_dev in enclosure $output_enc: $action in progress (percentage: $inProgress), "; }
|
||||
}
|
||||
if(defined($currBlock)){
|
||||
if($line =~ /^\d+\:\d+\s+\d+\s+\w+\s+\d+.*/){
|
||||
@splittedLine = map { s/^\s*//; s/\s*$//; $_; } split(/\s+/,$line);
|
||||
my %lineValues_h;
|
||||
# The current block is the c0/e252/s0 name
|
||||
$lineValues_h{'pd'} = $currBlock;
|
||||
for(my $i = 0; $i < @ldmap_a; $i++){
|
||||
$lineValues_h{$ldmap_a[$i]} = $splittedLine[$i];
|
||||
}
|
||||
push @physDevs, \%lineValues_h;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ($status, $statusMessage);
|
||||
} else {
|
||||
print "Invalid StorCLI command! ($command)\n";
|
||||
exit(STATE_UNKNOWN);
|
||||
}
|
||||
use Data::Dumper;
|
||||
print Dumper(@physDevs);
|
||||
}
|
||||
|
||||
# Returns information about:
|
||||
|
||||
Reference in New Issue
Block a user