From c74315dc2808891e3105c9e6921be2577dd6aa17 Mon Sep 17 00:00:00 2001 From: Quentin Garnier Date: Tue, 23 Dec 2014 16:48:10 +0100 Subject: [PATCH] Fix storage issue if we use mount point value --- .../snmp_standard/mode/liststorages.pm | 51 +++++++++++---- .../snmp_standard/mode/storage.pm | 63 +++++++++++-------- 2 files changed, 76 insertions(+), 38 deletions(-) diff --git a/centreon-plugins/snmp_standard/mode/liststorages.pm b/centreon-plugins/snmp_standard/mode/liststorages.pm index 843baf1b3..aeb99c976 100644 --- a/centreon-plugins/snmp_standard/mode/liststorages.pm +++ b/centreon-plugins/snmp_standard/mode/liststorages.pm @@ -41,9 +41,10 @@ use strict; use warnings; my %oids_hrStorageTable = ( - 'hrstoragedescr' => '.1.3.6.1.2.1.25.2.3.1.3', - 'hrfsmountpoint' => '.1.3.6.1.2.1.25.3.8.1.2', - 'hrstoragetype' => '.1.3.6.1.2.1.25.2.3.1.2', + 'hrstoragedescr' => '.1.3.6.1.2.1.25.2.3.1.3', + 'hrfsmountpoint' => '.1.3.6.1.2.1.25.3.8.1.2', + 'hrfsstorageindex' => '.1.3.6.1.2.1.25.3.8.1.7', + 'hrstoragetype' => '.1.3.6.1.2.1.25.2.3.1.2', ); my $oid_hrStorageAllocationUnits = '.1.3.6.1.2.1.25.2.3.1.4'; @@ -176,12 +177,35 @@ sub manage_selection { $self->{datas} = {}; $self->{datas}->{oid_filter} = $self->{option_results}->{oid_filter}; $self->{datas}->{oid_display} = $self->{option_results}->{oid_display}; - my $result = $self->{snmp}->get_table(oid => $oids_hrStorageTable{$self->{option_results}->{oid_filter}}); - my $total_storage = 0; - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /\.([0-9]+)$/); - $self->{datas}->{$self->{option_results}->{oid_filter} . "_" . $1} = $self->{output}->to_utf8($result->{$key}); - $total_storage = $1; + $self->{datas}->{all_ids} = []; + + my $request = []; + my $added = {}; + foreach (($self->{option_results}->{oid_filter}, $self->{option_results}->{oid_display} )) { + next if (defined($added->{$_})); + $added->{$_} = 1; + if (/hrFSMountPoint/i) { + push @{$request}, ({ oid => $oids_hrStorageTable{hrfsmountpoint} }, { oid => $oids_hrStorageTable{hrfsstorageindex} }); + } else { + push @{$request}, { oid => $oids_hrStorageTable{hrstoragedescr} }; + } + } + + my $result = $self->{snmp}->get_multiple_table(oids => $request); + foreach ((['filter', $self->{option_results}->{oid_filter}], ['display', $self->{option_results}->{oid_display}])) { + foreach my $key ($self->{snmp}->oid_lex_sort(keys %{$result->{ $oids_hrStorageTable{$$_[1]} }})) { + next if ($key !~ /\.([0-9]+)$/); + # get storage index + my $storage_index = $1; + if ($$_[1] =~ /hrFSMountPoint/i) { + $storage_index = $result->{ $oids_hrStorageTable{hrfsstorageindex} }->{$oids_hrStorageTable{hrfsstorageindex} . '.' . $storage_index}; + } + if ($$_[0] eq 'filter') { + push @{$self->{datas}->{all_ids}}, $storage_index; + } + + $self->{datas}->{$$_[1] . "_" . $storage_index} = $self->{output}->to_utf8($result->{ $oids_hrStorageTable{$$_[1]} }->{$key}); + } } if (scalar(keys %{$self->{datas}}) <= 0) { @@ -201,12 +225,12 @@ sub manage_selection { # get by ID push @{$self->{storage_id_selected}}, $self->{option_results}->{storage}; my $name = $self->{datas}->{$self->{option_results}->{oid_display} . "_" . $self->{option_results}->{storage}}; - if (!defined($name)) { + if (!defined($name) && !defined($options{disco})) { $self->{output}->add_option_msg(short_msg => "No storage found for id '" . $self->{option_results}->{storage} . "'."); $self->{output}->option_exit(); } } else { - for (my $i = 0; $i <= $total_storage; $i++) { + foreach my $i (@{$self->{datas}->{all_ids}}) { my $filter_name = $self->{datas}->{$self->{option_results}->{oid_filter} . "_" . $i}; next if (!defined($filter_name)); if (!defined($self->{option_results}->{storage})) { @@ -247,7 +271,10 @@ sub disco_show { $self->{snmp} = $options{snmp}; $self->manage_selection(disco => 1); - my $result = $self->get_additional_information(); + my $result; + if (scalar(@{$self->{storage_id_selected}}) > 0) { + $result = $self->get_additional_information() + } foreach (sort @{$self->{storage_id_selected}}) { my $display_value = $self->get_display_value(id => $_); my $storage_type = $result->{$oid_hrStorageType . "." . $_}; diff --git a/centreon-plugins/snmp_standard/mode/storage.pm b/centreon-plugins/snmp_standard/mode/storage.pm index 8f06c90cf..be8cc7169 100644 --- a/centreon-plugins/snmp_standard/mode/storage.pm +++ b/centreon-plugins/snmp_standard/mode/storage.pm @@ -43,9 +43,10 @@ use centreon::plugins::statefile; use Digest::MD5 qw(md5_hex); my %oids_hrStorageTable = ( - 'hrstoragedescr' => '.1.3.6.1.2.1.25.2.3.1.3', - 'hrfsmountpoint' => '.1.3.6.1.2.1.25.3.8.1.2', - 'hrstoragetype' => '.1.3.6.1.2.1.25.2.3.1.2', + 'hrstoragedescr' => '.1.3.6.1.2.1.25.2.3.1.3', + 'hrfsmountpoint' => '.1.3.6.1.2.1.25.3.8.1.2', + 'hrfsstorageindex' => '.1.3.6.1.2.1.25.3.8.1.7', + 'hrstoragetype' => '.1.3.6.1.2.1.25.2.3.1.2', ); my %storage_types_manage = ( '.1.3.6.1.2.1.25.2.1.1' => 'hrStorageOther', @@ -173,7 +174,7 @@ sub run { my $num_disk_check = 0; foreach (sort @{$self->{storage_id_selected}}) { # Skipped disks - my $storage_type = $self->{statefile_cache}->get(name => "type_" . $_); + my $storage_type = $self->{statefile_cache}->get(name => "hrstoragetype_" . $_); next if (!defined($storage_type) || ($storage_types_manage{$storage_type} !~ /$self->{option_results}->{filter_storage_type}/i)); @@ -267,32 +268,41 @@ sub reload_cache { $datas->{oid_display} = $self->{option_results}->{oid_display}; $datas->{last_timestamp} = time(); $datas->{all_ids} = []; - my $result = $self->{snmp}->get_table(oid => $oids_hrStorageTable{$self->{option_results}->{oid_filter}}); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /\.([0-9]+)$/); - push @{$datas->{all_ids}}, $1; - $datas->{$self->{option_results}->{oid_filter} . "_" . $1} = $self->{output}->to_utf8($result->{$key}); - } + my $request = [ { oid => $oids_hrStorageTable{hrstoragetype} } ]; + my $added = {}; + foreach (($self->{option_results}->{oid_filter}, $self->{option_results}->{oid_display} )) { + next if (defined($added->{$_})); + $added->{$_} = 1; + if (/hrFSMountPoint/i) { + push @{$request}, ({ oid => $oids_hrStorageTable{hrfsmountpoint} }, { oid => $oids_hrStorageTable{hrfsstorageindex} }); + } else { + push @{$request}, { oid => $oids_hrStorageTable{hrstoragedescr} }; + } + } + + my $result = $self->{snmp}->get_multiple_table(oids => $request); + foreach ((['filter', $self->{option_results}->{oid_filter}], ['display', $self->{option_results}->{oid_display}], ['type', 'hrstoragetype'])) { + foreach my $key ($self->{snmp}->oid_lex_sort(keys %{$result->{ $oids_hrStorageTable{$$_[1]} }})) { + next if ($key !~ /\.([0-9]+)$/); + # get storage index + my $storage_index = $1; + if ($$_[1] =~ /hrFSMountPoint/i) { + $storage_index = $result->{ $oids_hrStorageTable{hrfsstorageindex} }->{$oids_hrStorageTable{hrfsstorageindex} . '.' . $storage_index}; + } + if ($$_[0] eq 'filter') { + push @{$datas->{all_ids}}, $storage_index; + } + + $datas->{$$_[1] . "_" . $storage_index} = $self->{output}->to_utf8($result->{ $oids_hrStorageTable{$$_[1]} }->{$key}); + } + } + if (scalar(@{$datas->{all_ids}}) <= 0) { $self->{output}->add_option_msg(short_msg => "Can't construct cache..."); $self->{output}->option_exit(); } - if ($self->{option_results}->{oid_filter} ne $self->{option_results}->{oid_display}) { - $result = $self->{snmp}->get_table(oid => $oids_hrStorageTable{$self->{option_results}->{oid_display}}); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /\.([0-9]+)$/); - $datas->{$self->{option_results}->{oid_display} . "_" . $1} = $self->{output}->to_utf8($result->{$key}); - } - } - - $result = $self->{snmp}->get_table(oid => $oids_hrStorageTable{hrstoragetype}); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /\.([0-9]+)$/); - $datas->{"type_" . $1} = $result->{$key}; - } - $self->{statefile_cache}->write(data => $datas); } @@ -329,6 +339,7 @@ sub manage_selection { foreach my $i (@{$all_ids}) { my $filter_name = $self->{statefile_cache}->get(name => $self->{option_results}->{oid_filter} . "_" . $i); next if (!defined($filter_name)); + if (!defined($self->{option_results}->{storage})) { push @{$self->{storage_id_selected}}, $i; next; @@ -352,13 +363,13 @@ sub manage_selection { } $self->{output}->option_exit(); } - } + } } sub get_display_value { my ($self, %options) = @_; my $value = $self->{statefile_cache}->get(name => $self->{option_results}->{oid_display} . "_" . $options{id}); - + if (defined($self->{option_results}->{display_transform_src})) { $self->{option_results}->{display_transform_dst} = '' if (!defined($self->{option_results}->{display_transform_dst})); eval "\$value =~ s{$self->{option_results}->{display_transform_src}}{$self->{option_results}->{display_transform_dst}}";