From 7ef7ed6177e39a43b25e0cfe382fe7351fbebe5d Mon Sep 17 00:00:00 2001 From: qgarnier Date: Fri, 30 Apr 2021 11:37:05 +0200 Subject: [PATCH] enh(equallogic/snmp): add storage extra informations (#2759) --- .../equallogic/snmp/mode/components/disk.pm | 25 +++-- .../equallogic/snmp/mode/components/fan.pm | 31 ++++-- .../equallogic/snmp/mode/components/health.pm | 59 +++++++--- .../equallogic/snmp/mode/components/psu.pm | 33 ++++-- .../equallogic/snmp/mode/components/raid.pm | 25 +++-- .../snmp/mode/components/temperature.pm | 31 ++++-- .../dell/equallogic/snmp/mode/diskusage.pm | 103 +++++++----------- storage/dell/equallogic/snmp/mode/hardware.pm | 21 ++-- 8 files changed, 187 insertions(+), 141 deletions(-) diff --git a/storage/dell/equallogic/snmp/mode/components/disk.pm b/storage/dell/equallogic/snmp/mode/components/disk.pm index c2000407d..a9e712691 100644 --- a/storage/dell/equallogic/snmp/mode/components/disk.pm +++ b/storage/dell/equallogic/snmp/mode/components/disk.pm @@ -33,12 +33,12 @@ my %map_disk_status = ( 7 => 'history-of-failures', 8 => 'unsupported-version', 9 => 'unhealthy', - 10 => 'replacement', + 10 => 'replacement' ); # In MIB 'eqldisk.mib' my $mapping = { - eqlDiskStatus => { oid => '.1.3.6.1.4.1.12740.3.1.1.1.8', map => \%map_disk_status }, + eqlDiskStatus => { oid => '.1.3.6.1.4.1.12740.3.1.1.1.8', map => \%map_disk_status } }; my $oid_eqlDiskStatus = '.1.3.6.1.4.1.12740.3.1.1.1.8'; @@ -64,16 +64,23 @@ sub check { next if ($self->check_filter(section => 'disk', instance => $member_instance . '.' . $instance)); $self->{components}->{disk}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Disk '%s/%s' status is %s [instance: %s].", - $member_name, $instance, $result->{eqlDiskStatus}, $member_instance . '.' . $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "disk '%s/%s' status is %s [instance: %s].", + $member_name, $instance, $result->{eqlDiskStatus}, $member_instance . '.' . $instance + ) + ); my $exit = $self->get_severity(section => 'disk', value => $result->{eqlDiskStatus}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Disk '%s/%s' status is %s", - $member_name, $instance, $result->{eqlDiskStatus})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Disk '%s/%s' status is %s", + $member_name, $instance, $result->{eqlDiskStatus} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/dell/equallogic/snmp/mode/components/fan.pm b/storage/dell/equallogic/snmp/mode/components/fan.pm index e216b5f43..1cd12a587 100644 --- a/storage/dell/equallogic/snmp/mode/components/fan.pm +++ b/storage/dell/equallogic/snmp/mode/components/fan.pm @@ -27,7 +27,7 @@ my %map_fan_status = ( 0 => 'unknown', 1 => 'normal', 2 => 'warning', - 3 => 'critical', + 3 => 'critical' ); # In MIB 'eqlcontroller.mib' @@ -38,7 +38,7 @@ my $mapping = { eqlMemberHealthDetailsFanHighCriticalThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.7.1.5' }, eqlMemberHealthDetailsFanHighWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.7.1.6' }, eqlMemberHealthDetailsFanLowCriticalThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.7.1.7' }, - eqlMemberHealthDetailsFanLowWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.7.1.8' }, + eqlMemberHealthDetailsFanLowWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.7.1.8' } }; my $oid_eqlMemberHealthDetailsFanEntry = '.1.3.6.1.4.1.12740.2.1.7.1'; @@ -64,15 +64,22 @@ sub check { next if ($self->check_filter(section => 'fan', instance => $member_instance . '.' . $instance)); $self->{components}->{fan}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Fan '%s/%s' status is %s [instance: %s].", - $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanCurrentState}, - $member_instance . '.' . $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "fan '%s/%s' status is %s [instance: %s].", + $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanCurrentState}, + $member_instance . '.' . $instance + ) + ); my $exit = $self->get_severity(section => 'fan', value => $result->{eqlMemberHealthDetailsFanCurrentState}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Fan '%s/%s' status is %s", - $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanCurrentState})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Fan '%s/%s' status is %s", + $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanCurrentState} + ) + ); } if (defined($result->{eqlMemberHealthDetailsFanValue})) { @@ -86,8 +93,10 @@ sub check { $crit = $self->{perfdata}->get_perfdata_for_output(label => 'critical-fan-instance-' . $instance); } if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit2, - short_msg => sprintf("Fan '%s/%s' speed is %s rpm", $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanValue})); + $self->{output}->output_add( + severity => $exit2, + short_msg => sprintf("Fan '%s/%s' speed is %s rpm", $member_name, $result->{eqlMemberHealthDetailsFanName}, $result->{eqlMemberHealthDetailsFanValue}) + ); } $self->{output}->perfdata_add( label => "fan", unit => 'rpm', diff --git a/storage/dell/equallogic/snmp/mode/components/health.pm b/storage/dell/equallogic/snmp/mode/components/health.pm index a935ed437..b88f4a496 100644 --- a/storage/dell/equallogic/snmp/mode/components/health.pm +++ b/storage/dell/equallogic/snmp/mode/components/health.pm @@ -27,19 +27,32 @@ my %map_health_status = ( 0 => 'unknown', 1 => 'normal', 2 => 'warning', - 3 => 'critical', + 3 => 'critical' ); -# In MIB 'eqlcontroller.mib' my $mapping = { - eqlMemberHealthStatus => { oid => '.1.3.6.1.4.1.12740.2.1.5.1.1', map => \%map_health_status }, + health_status => { oid => '.1.3.6.1.4.1.12740.2.1.5.1.1', map => \%map_health_status } # eqlMemberHealthStatus +}; +my $mapping_extra_info = { + major_version => { oid => '.1.3.6.1.4.1.12740.2.1.1.1.21' }, # eqlMemberControllerMajorVersion + minor_version => { oid => '.1.3.6.1.4.1.12740.2.1.1.1.22' }, # eqlMemberControllerMinorVersion + maintenance_version => { oid => '.1.3.6.1.4.1.12740.2.1.1.1.23' }, # eqlMemberControllerMaintenanceVersion + product_family => { oid => '.1.3.6.1.4.1.12740.2.1.11.1.9' } # eqlMemberProductFamily }; -my $oid_eqlMemberHealthStatus = '.1.3.6.1.4.1.12740.2.1.5.1.1'; sub load { my ($self) = @_; - push @{$self->{request}}, { oid => $oid_eqlMemberHealthStatus }; + push @{$self->{request}}, { oid => $mapping->{health_status}->{oid} }; +} + +sub get_extra_informations { + my ($self, %options) = @_; + + my $snmp_result = $self->{snmp}->get_leef( + oids => [ map($_->{oid} . '.' . $options{instance}, values(%$mapping_extra_info)) ], + ); + return $self->{snmp}->map_instance(mapping => $mapping_extra_info, results => $snmp_result, instance => $options{instance}); } sub check { @@ -49,26 +62,38 @@ sub check { $self->{components}->{health} = {name => 'health', total => 0, skip => 0}; return if ($self->check_filter(section => 'health')); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_eqlMemberHealthStatus}})) { - next if ($oid !~ /^$mapping->{eqlMemberHealthStatus}->{oid}\.(\d+\.\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{ $mapping->{health_status}->{oid} }})) { + next if ($oid !~ /^$mapping->{health_status}->{oid}\.(\d+\.\d+)$/); my ($member_instance) = ($1); my $member_name = $self->get_member_name(instance => $member_instance); - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_eqlMemberHealthStatus}, instance => $member_instance); + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{ $mapping->{health_status}->{oid} }, instance => $member_instance); next if ($self->check_filter(section => 'health', instance => $member_instance)); $self->{components}->{health}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Health '%s' status is %s [instance: %s].", - $member_name, $result->{eqlMemberHealthStatus}, - $member_instance - )); - my $exit = $self->get_severity(section => 'health', value => $result->{eqlMemberHealthStatus}); + my $extra_infos = get_extra_informations($self, instance => $member_instance); + + $self->{output}->output_add( + long_msg => sprintf( + "health '%s' status is %s [instance: %s, product: %s, version: %s].", + $member_name, + $result->{health_status}, + $member_instance, + $extra_infos->{product_family}, + $extra_infos->{major_version} . '.' . $extra_infos->{minor_version} . '.' . $extra_infos->{maintenance_version} + ) + ); + my $exit = $self->get_severity(section => 'health', value => $result->{health_status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Health '%s' status is %s", - $member_name, $result->{eqlMemberHealthStatus})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Health '%s' status is %s", + $member_name, $result->{health_status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/dell/equallogic/snmp/mode/components/psu.pm b/storage/dell/equallogic/snmp/mode/components/psu.pm index e8e974329..51410f7fa 100644 --- a/storage/dell/equallogic/snmp/mode/components/psu.pm +++ b/storage/dell/equallogic/snmp/mode/components/psu.pm @@ -64,25 +64,36 @@ sub check { next if ($self->check_filter(section => 'psu', instance => $member_instance . '.' . $instance)); $self->{components}->{psu}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Power supply '%s/%s' status is %s [instance: %s] [fan status: %s].", - $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyCurrentState}, - $member_instance . '.' . $instance, $result->{eqlMemberHealthDetailsPowerSupplyFanStatus} - )); + $self->{output}->output_add( + long_msg => sprintf( + "power supply '%s/%s' status is %s [instance: %s] [fan status: %s].", + $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyCurrentState}, + $member_instance . '.' . $instance, $result->{eqlMemberHealthDetailsPowerSupplyFanStatus} + ) + ); my $exit = $self->get_severity(section => 'psu', value => $result->{eqlMemberHealthDetailsPowerSupplyCurrentState}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Power supply '%s/%s' status is %s", - $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyCurrentState})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Power supply '%s/%s' status is %s", + $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyCurrentState} + ) + ); } next if ($self->check_filter(section => 'psu.fan', instance => $member_instance . '.' . $instance)); $exit = $self->get_severity(section => 'psu.fan', value => $result->{eqlMemberHealthDetailsPowerSupplyFanStatus}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Power supply '%s/%s' fan status is %s", - $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyFanStatus})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Power supply '%s/%s' fan status is %s", + $member_name, $result->{eqlMemberHealthDetailsPowerSupplyName}, $result->{eqlMemberHealthDetailsPowerSupplyFanStatus} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/dell/equallogic/snmp/mode/components/raid.pm b/storage/dell/equallogic/snmp/mode/components/raid.pm index 854c0ae07..6bf515d06 100644 --- a/storage/dell/equallogic/snmp/mode/components/raid.pm +++ b/storage/dell/equallogic/snmp/mode/components/raid.pm @@ -31,12 +31,12 @@ my %map_raid_status = ( 5 => 'failed', 6 => 'catastrophicLoss', 7 => 'expanding', - 8 => 'mirroring', + 8 => 'mirroring' ); # In MIB 'eqlcontroller.mib' my $mapping = { - eqlMemberRaidStatus => { oid => '.1.3.6.1.4.1.12740.2.1.13.1.1', map => \%map_raid_status }, + eqlMemberRaidStatus => { oid => '.1.3.6.1.4.1.12740.2.1.13.1.1', map => \%map_raid_status } }; my $oid_eqlMemberRAIDEntry = '.1.3.6.1.4.1.12740.2.1.13.1'; @@ -62,16 +62,23 @@ sub check { next if ($self->check_filter(section => 'raid', instance => $member_instance)); $self->{components}->{raid}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Raid '%s' status is %s [instance: %s].", - $member_name, $result->{eqlMemberRaidStatus}, $member_instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "raid '%s' status is %s [instance: %s].", + $member_name, $result->{eqlMemberRaidStatus}, $member_instance + ) + ); my $exit = $self->get_severity(section => 'raid', value => $result->{eqlMemberRaidStatus}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Raid '%s' status is %s", - $member_name, $result->{eqlMemberRaidStatus})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Raid '%s' status is %s", + $member_name, $result->{eqlMemberRaidStatus} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/dell/equallogic/snmp/mode/components/temperature.pm b/storage/dell/equallogic/snmp/mode/components/temperature.pm index 6afc21fc8..b3d7ad967 100644 --- a/storage/dell/equallogic/snmp/mode/components/temperature.pm +++ b/storage/dell/equallogic/snmp/mode/components/temperature.pm @@ -27,7 +27,7 @@ my %map_temperature_status = ( 0 => 'unknown', 1 => 'normal', 2 => 'warning', - 3 => 'critical', + 3 => 'critical' ); # In MIB 'eqlcontroller.mib' @@ -38,7 +38,7 @@ my $mapping = { eqlMemberHealthDetailsTemperatureHighCriticalThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.6.1.5' }, eqlMemberHealthDetailsTemperatureHighWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.6.1.6' }, eqlMemberHealthDetailsTemperatureLowCriticalThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.6.1.7' }, - eqlMemberHealthDetailsTemperatureLowWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.6.1.8' }, + eqlMemberHealthDetailsTemperatureLowWarningThreshold => { oid => '.1.3.6.1.4.1.12740.2.1.6.1.8' } }; my $oid_eqlMemberHealthDetailsTemperatureEntry = '.1.3.6.1.4.1.12740.2.1.6.1'; @@ -64,15 +64,22 @@ sub check { next if ($self->check_filter(section => 'temperature', instance => $member_instance . '.' . $instance)); $self->{components}->{temperature}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Temperature '%s/%s' status is %s [instance: %s].", - $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureCurrentState}, - $member_instance . '.' . $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "temperature '%s/%s' status is %s [instance: %s].", + $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureCurrentState}, + $member_instance . '.' . $instance + ) + ); my $exit = $self->get_severity(section => 'temperature', value => $result->{eqlMemberHealthDetailsTemperatureCurrentState}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Temperature '%s/%s' status is %s", - $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureCurrentState})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Temperature '%s/%s' status is %s", + $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureCurrentState} + ) + ); } if (defined($result->{eqlMemberHealthDetailsTemperatureValue})) { @@ -86,8 +93,10 @@ sub check { $crit = $self->{perfdata}->get_perfdata_for_output(label => 'critical-temperature-instance-' . $instance); } if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit2, - short_msg => sprintf("Temperature '%s/%s' is %s degree centigrade", $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureValue})); + $self->{output}->output_add( + severity => $exit2, + short_msg => sprintf("Temperature '%s/%s' is %s degree centigrade", $member_name, $result->{eqlMemberHealthDetailsTemperatureName}, $result->{eqlMemberHealthDetailsTemperatureValue}) + ); } $self->{output}->perfdata_add( label => "temp", unit => 'C', diff --git a/storage/dell/equallogic/snmp/mode/diskusage.pm b/storage/dell/equallogic/snmp/mode/diskusage.pm index f9d765f8a..b93de7324 100644 --- a/storage/dell/equallogic/snmp/mode/diskusage.pm +++ b/storage/dell/equallogic/snmp/mode/diskusage.pm @@ -24,23 +24,19 @@ use base qw(centreon::plugins::templates::counter); use strict; use warnings; -use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); use Digest::MD5 qw(md5_hex); sub custom_status_output { my ($self, %options) = @_; - my $msg = 'status : ' . $self->{result_values}->{status} . ' [smart health: ' . $self->{result_values}->{health} . ']'; - return $msg; + return 'status: ' . $self->{result_values}->{status} . ' [smart health: ' . $self->{result_values}->{health} . ']'; } -sub custom_status_calc { +sub prefix_disk_output { my ($self, %options) = @_; - $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_eqlDiskStatus'}; - $self->{result_values}->{health} = $options{new_datas}->{$self->{instance} . '_eqlDiskHealth'}; - $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; - return 0; + return "Disk '" . $options{instance_value}->{display} . "' "; } sub set_counters { @@ -51,92 +47,75 @@ sub set_counters { ]; $self->{maps_counters}->{disk} = [ - { label => 'status', threshold => 0, set => { - key_values => [ { name => 'eqlDiskHealth' }, { name => 'eqlDiskStatus' }, { name => 'display' } ], - closure_custom_calc => $self->can('custom_status_calc'), + { label => 'status', type => 2, critical_default => '%{status} !~ /on-line|spare|off-line/i', set => { + key_values => [ { name => 'health' }, { name => 'status' }, { name => 'display' } ], closure_custom_output => $self->can('custom_status_output'), closure_custom_perfdata => sub { return 0; }, - closure_custom_threshold_check => \&catalog_status_threshold, + closure_custom_threshold_check => \&catalog_status_threshold_ng } }, { label => 'read', set => { - key_values => [ { name => 'eqlDiskStatusBytesRead', per_second => 1 }, { name => 'display' } ], - output_template => 'read : %s %s/s', + key_values => [ { name => 'bytes_read', per_second => 1 }, { name => 'display' } ], + output_template => 'read: %s %s/s', output_change_bytes => 1, perfdatas => [ { label => 'read_iops', template => '%.2f', - unit => 'B/s', min => 0, label_extra_instance => 1, instance_use => 'display' }, - ], + unit => 'B/s', min => 0, label_extra_instance => 1, instance_use => 'display' } + ] } }, { label => 'write', set => { - key_values => [ { name => 'eqlDiskStatusBytesWritten', per_second => 1 }, { name => 'display' } ], - output_template => 'write : %s %s/s', + key_values => [ { name => 'bytes_written', per_second => 1 }, { name => 'display' } ], + output_template => 'write: %s %s/s', output_change_bytes => 1, perfdatas => [ { label => 'write', template => '%.2f', - unit => 'B/s', min => 0, label_extra_instance => 1, instance_use => 'display' }, - ], + unit => 'B/s', min => 0, label_extra_instance => 1, instance_use => 'display' } + ] } }, { label => 'busy-time', set => { - key_values => [ { name => 'eqlDiskStatusBusyTime', diff => 1 }, { name => 'display' } ], - output_template => 'time busy : %s sec', + key_values => [ { name => 'busy_time', diff => 1 }, { name => 'display' } ], + output_template => 'time busy: %s sec', perfdatas => [ { label => 'busy_time', template => '%s', - unit => 's', min => 0, label_extra_instance => 1, instance_use => 'display' }, - ], + unit => 's', min => 0, label_extra_instance => 1, instance_use => 'display' } + ] } - }, + } ]; } -sub prefix_disk_output { - my ($self, %options) = @_; - - return "Disk '" . $options{instance_value}->{display} . "' "; -} - sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); bless $self, $class; $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' }, - 'unknown-status:s' => { name => 'unknown_status', default => '' }, - 'warning-status:s' => { name => 'warning_status', default => '' }, - 'critical-status:s' => { name => 'critical_status', default => '%{status} !~ /on-line|spare|off-line/i' } + 'filter-name:s' => { name => 'filter_name' } }); return $self; } -sub check_options { - my ($self, %options) = @_; - $self->SUPER::check_options(%options); - - $self->change_macros(macros => ['warning_status', 'critical_status', 'unknown_status']); -} - my $map_disk_status = { 1 => 'on-line', 2 => 'spare', 3 => 'failed', 4 => 'off-line', 5 => 'alt-sig', 6 => 'too-small', 7 => 'history-of-failures', 8 => 'unsupported-version', 9 => 'unhealthy', 10 => 'replacement', - 11 => 'encrypted', 12 => 'notApproved', 13 => 'preempt-failed', + 11 => 'encrypted', 12 => 'notApproved', 13 => 'preempt-failed' }; my $map_disk_health = { 0 => 'smart-status-not-available', 1 => 'smart-ok', - 2 => 'smart-tripped', + 2 => 'smart-tripped' }; my $mapping = { - eqlDiskHealth => { oid => '.1.3.6.1.4.1.12740.3.1.1.1.17', map => $map_disk_health }, - eqlDiskStatusBytesRead => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.2' }, # MB - eqlDiskStatusBytesWritten => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.3' }, # MB - eqlDiskStatusBusyTime => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.4' }, # in seconds + health => { oid => '.1.3.6.1.4.1.12740.3.1.1.1.17', map => $map_disk_health }, # eqlDiskHealth + bytes_read => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.2' }, # eqlDiskStatusBytesRead [MB] + bytes_written => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.3' }, # eqlDiskStatusBytesWritten [MB] + busy_time => { oid => '.1.3.6.1.4.1.12740.3.1.2.1.4' }, # eqlDiskStatusBusyTime [seconds] }; sub manage_selection { @@ -164,31 +143,34 @@ sub manage_selection { next; } - $self->{disk}->{$instance} = { display => $name, eqlDiskStatus => $map_disk_status->{$snmp_result->{$oid}} }; + $self->{disk}->{$instance} = { display => $name, status => $map_disk_status->{ $snmp_result->{$oid} } }; } if (scalar(keys %{$self->{disk}}) <= 0) { $self->{output}->add_option_msg(short_msg => "No entry found."); $self->{output}->option_exit(); } - - $options{snmp}->load(oids => [ + + $options{snmp}->load( + oids => [ map($_->{oid}, values(%$mapping)) ], - instances => [keys %{$self->{disk}}], instance_regexp => '^(.*)$'); + instances => [keys %{$self->{disk}}], + instance_regexp => '^(.*)$' + ); $snmp_result = $options{snmp}->get_leef(nothing_quit => 1); foreach (keys %{$self->{disk}}) { my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $_); - $result->{eqlDiskStatusBytesRead} *= 1024 * 1024; - $result->{eqlDiskStatusBytesWritten} *= 1024 * 1024; - $result->{eqlDiskHealth} = 'n/a' if (!defined($result->{eqlDiskHealth})); + $result->{bytes_read} *= 1024 * 1024; + $result->{bytes_written} *= 1024 * 1024; + $result->{health} = 'n/a' if (!defined($result->{health})); $self->{disk}->{$_} = { %{$self->{disk}->{$_}}, %$result }; } - $self->{cache_name} = "dell_equallogic_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . + $self->{cache_name} = 'dell_equallogic_' . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } @@ -222,16 +204,11 @@ Can used special variables like: %{health}, %{status}, %{display} Set critical threshold for status (Default: '%{status} !~ /on-line|spare|off-line/i'). Can used special variables like: %{health}, %{status}, %{display} -=item B<--warning-*> +=item B<--warning-*> B<--critical-*> -Threshold warning. +Thresholds. Can be: 'busy-time' (s), 'read-iops' (iops), 'write-iops' (iops). -=item B<--critical-*> - -Threshold critical. -Can be: 'busy-time' (s), 'read-iops' (iops), 'write-iops' (iops). - =back =cut diff --git a/storage/dell/equallogic/snmp/mode/hardware.pm b/storage/dell/equallogic/snmp/mode/hardware.pm index d6cf2cb9a..5e5b27eb8 100644 --- a/storage/dell/equallogic/snmp/mode/hardware.pm +++ b/storage/dell/equallogic/snmp/mode/hardware.pm @@ -28,8 +28,9 @@ use warnings; sub set_system { my ($self, %options) = @_; - $self->{regexp_threshold_numeric_check_section_option} = '^(temperature|fan)$'; + $self->{regexp_threshold_numeric_check_section_option} = '^(?:temperature|fan)$'; + $self->{cb_hook1} = 'get_system_information'; $self->{cb_hook2} = 'snmp_execute'; $self->{thresholds} = { @@ -37,29 +38,29 @@ sub set_system { ['unknown', 'UNKNOWN'], ['normal', 'OK'], ['warning', 'WARNING'], - ['critical', 'CRITICAL'], + ['critical', 'CRITICAL'] ], temperature => [ ['unknown', 'UNKNOWN'], ['normal', 'OK'], ['warning', 'WARNING'], - ['critical', 'CRITICAL'], + ['critical', 'CRITICAL'] ], health => [ ['unknown', 'UNKNOWN'], ['normal', 'OK'], ['warning', 'WARNING'], - ['critical', 'CRITICAL'], + ['critical', 'CRITICAL'] ], psu => [ ['on-and-operating', 'OK'], ['no-ac-power', 'CRITICAL'], - ['failed-or-no-data', 'CRITICAL'], + ['failed-or-no-data', 'CRITICAL'] ], 'psu.fan' => [ ['not-applicable', 'OK'], ['fan-is-operational', 'OK'], - ['fan-not-operational', 'CRITICAL'], + ['fan-not-operational', 'CRITICAL'] ], raid => [ ['ok', 'OK'], @@ -69,7 +70,7 @@ sub set_system { ['failed', 'CRITICAL'], ['catastrophicLoss', 'CRITICAL'], ['expanding', 'OK'], - ['mirroring', 'OK'], + ['mirroring', 'OK'] ], disk => [ ['on-line', 'OK'], @@ -81,8 +82,8 @@ sub set_system { ['history-of-failures', 'WARNING'], ['unsupported-version', 'CRITICAL'], ['unhealthy', 'CRITICAL'], - ['replacement', 'CRITICAL'], - ], + ['replacement', 'CRITICAL'] + ] }; $self->{components_path} = 'storage::dell::equallogic::snmp::mode::components'; @@ -113,7 +114,7 @@ sub get_member_name { my ($self, %options) = @_; my $name = defined($self->{results}->{$oid_eqlMemberName}->{$oid_eqlMemberName . '.' . $options{instance}}) ? - $self->{results}->{$oid_eqlMemberName}->{$oid_eqlMemberName . '.' . $options{instance}} : 'unknown'; + $self->{results}->{$oid_eqlMemberName}->{$oid_eqlMemberName . '.' . $options{instance}} : 'unknown'; return $name; }