diff --git a/storage/netapp/snmp/mode/filesys.pm b/storage/netapp/snmp/mode/filesys.pm index 1dc9899bf..5afa3674b 100644 --- a/storage/netapp/snmp/mode/filesys.pm +++ b/storage/netapp/snmp/mode/filesys.pm @@ -167,10 +167,11 @@ sub new { $self->{version} = '1.0'; $options{options}->add_options(arguments => { - "units:s" => { name => 'units', default => '%' }, - "free" => { name => 'free' }, - "filter-name:s" => { name => 'filter_name' }, - "filter-type:s" => { name => 'filter_type' }, + 'units:s' => { name => 'units', default => '%' }, + 'free' => { name => 'free' }, + 'filter-name:s' => { name => 'filter_name' }, + 'filter-type:s' => { name => 'filter_type' }, + 'filter-vserver:s' => { name => 'filter_vserver' }, }); return $self; @@ -193,6 +194,7 @@ my $mapping2 = { dfPerCentInodeCapacity => { oid => '.1.3.6.1.4.1.789.1.5.4.1.9' }, df64TotalKBytes => { oid => '.1.3.6.1.4.1.789.1.5.4.1.29' }, df64UsedKBytes => { oid => '.1.3.6.1.4.1.789.1.5.4.1.30' }, + dfVserver => { oid => '.1.3.6.1.4.1.789.1.5.4.1.34' }, dfCompressSavedPercent => { oid => '.1.3.6.1.4.1.789.1.5.4.1.38' }, dfDedupeSavedPercent => { oid => '.1.3.6.1.4.1.789.1.5.4.1.40' }, }; @@ -206,6 +208,7 @@ sub manage_selection { $mapping2->{dfPerCentInodeCapacity}->{oid}, $mapping2->{dfCompressSavedPercent}->{oid}, $mapping2->{dfDedupeSavedPercent}->{oid}, + $mapping2->{dfVserver}->{oid}, ); if (!$options{snmp}->is_snmpv1()) { push @oids, $mapping2->{df64TotalKBytes}->{oid}; @@ -215,7 +218,14 @@ sub manage_selection { my $results; if (defined($self->{option_results}->{filter_type}) && $self->{option_results}->{filter_type} ne '') { - $results = $options{snmp}->get_multiple_table(oids => [{oid => $mapping->{dfType}->{oid}}, {oid => $mapping2->{dfFileSys}->{oid}}], return_type => 1, nothing_quit => 1); + $results = $options{snmp}->get_multiple_table( + oids => [ + { oid => $mapping->{dfType}->{oid} }, + { oid => $mapping2->{dfFileSys}->{oid} } + ], + return_type => 1, + nothing_quit => 1 + ); } else { $results = $options{snmp}->get_table(oid => $mapping2->{dfFileSys}->{oid}, nothing_quit => 1); } @@ -244,19 +254,25 @@ sub manage_selection { $self->{fs} = {}; $options{snmp}->load(oids => \@oids, instances => \@fs_selected); - my $result2 = $options{snmp}->get_leef(nothing_quit => 1); + my $snmp_result = $options{snmp}->get_leef(nothing_quit => 1); foreach my $instance (sort @fs_selected) { - $self->{fs}->{$instance} = { display => $results->{$mapping2->{dfFileSys}->{oid} . '.' . $instance}}; - $self->{fs}->{$instance}->{total} = $result2->{$mapping2->{dfKBytesTotal}->{oid} . '.' . $instance} * 1024; - $self->{fs}->{$instance}->{used} = $result2->{$mapping2->{dfKBytesUsed}->{oid} . '.' . $instance} * 1024; - if (defined($result2->{$mapping2->{df64TotalKBytes}->{oid} . '.' . $instance}) && $result2->{$mapping2->{df64TotalKBytes}->{oid} . '.' . $instance} > 0) { - $self->{fs}->{$instance}->{total} = $result2->{$mapping2->{df64TotalKBytes}->{oid} . '.' . $instance} * 1024; - $self->{fs}->{$instance}->{used} = $result2->{$mapping2->{df64UsedKBytes}->{oid} . '.' . $instance} * 1024; + my $result2 = $options{snmp}->map_instance(mapping => $mapping2, results => $snmp_result, instance => $instance); + + $self->{fs}->{$instance} = { + display => defined($result2->{dfVserver}) && $result2->{dfVserver} ne '' ? + $result2->{dfVserver} . ':' . $results->{$mapping2->{dfFileSys}->{oid} . '.' . $instance} : + $results->{$mapping2->{dfFileSys}->{oid} . '.' . $instance} + }; + $self->{fs}->{$instance}->{total} = $result2->{dfKBytesTotal} * 1024; + $self->{fs}->{$instance}->{used} = $result2->{dfKBytesUsed} * 1024; + if (defined($result2->{df64TotalKBytes}) && $result2->{df64TotalKBytes} > 0) { + $self->{fs}->{$instance}->{total} = $result2->{df64TotalKBytes} * 1024; + $self->{fs}->{$instance}->{used} = $result2->{df64UsedKBytes} * 1024; } - $self->{fs}->{$instance}->{dfCompressSavedPercent} = $result2->{$mapping2->{dfCompressSavedPercent}->{oid} . '.' . $instance}; - $self->{fs}->{$instance}->{dfDedupeSavedPercent} = $result2->{$mapping2->{dfDedupeSavedPercent}->{oid} . '.' . $instance}; + $self->{fs}->{$instance}->{dfCompressSavedPercent} = $result2->{dfCompressSavedPercent}; + $self->{fs}->{$instance}->{dfDedupeSavedPercent} = $result2->{dfDedupeSavedPercent}; if ($self->{fs}->{$instance}->{total} > 0) { - $self->{fs}->{$instance}->{dfPerCentInodeCapacity} = $result2->{$mapping2->{dfPerCentInodeCapacity}->{oid} . '.' . $instance}; + $self->{fs}->{$instance}->{dfPerCentInodeCapacity} = $result2->{dfPerCentInodeCapacity}; } } } @@ -293,6 +309,10 @@ Thresholds are on free space left. Filter by filesystem name (can be a regexp). +=item B<--filter-vserver> + +Filter by vserver name (can be a regexp). + =item B<--filter-type> Filter filesystem type (can be a regexp. Example: 'flexibleVolume|aggregate'). diff --git a/storage/netapp/snmp/mode/listfilesys.pm b/storage/netapp/snmp/mode/listfilesys.pm index c862d4944..3829e04e2 100644 --- a/storage/netapp/snmp/mode/listfilesys.pm +++ b/storage/netapp/snmp/mode/listfilesys.pm @@ -25,33 +25,17 @@ use base qw(centreon::plugins::mode); use strict; use warnings; -my $oid_dfFileSys = '.1.3.6.1.4.1.789.1.5.4.1.2'; -my $oid_dfType = '.1.3.6.1.4.1.789.1.5.4.1.23'; -my $oid_dfKBytesTotal = '.1.3.6.1.4.1.789.1.5.4.1.3'; -my $oid_df64TotalKBytes = '.1.3.6.1.4.1.789.1.5.4.1.29'; - -my %map_types = ( - 1 => 'traditionalVolume', - 2 => 'flexibleVolume', - 3 => 'aggregate', - 4 => 'stripedAggregate', - 5 => 'stripedVolume' -); - sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; $self->{version} = '1.0'; - $options{options}->add_options(arguments => - { - "name:s" => { name => 'name' }, - "regexp" => { name => 'use_regexp' }, - "type:s" => { name => 'type' }, - "skip-total-zero" => { name => 'skip_total_zero' }, - }); - $self->{filesys_id_selected} = []; + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' }, + 'filter-type:s' => { name => 'filter_type' }, + 'skip-total-zero' => { name => 'skip_total_zero' }, + }); return $self; } @@ -61,71 +45,75 @@ sub check_options { $self->SUPER::init(%options); } +my %map_types = ( + 1 => 'traditionalVolume', + 2 => 'flexibleVolume', + 3 => 'aggregate', + 4 => 'stripedAggregate', + 5 => 'stripedVolume' +); + +my $mapping = { + dfFileSys => { oid => '.1.3.6.1.4.1.789.1.5.4.1.2' }, + dfKBytesTotal => { oid => '.1.3.6.1.4.1.789.1.5.4.1.3' }, + dfType => { oid => '.1.3.6.1.4.1.789.1.5.4.1.23', map => \%map_types }, + df64TotalKBytes => { oid => '.1.3.6.1.4.1.789.1.5.4.1.29' }, + dfVserver => { oid => '.1.3.6.1.4.1.789.1.5.4.1.34' }, +}; + sub manage_selection { my ($self, %options) = @_; - $self->{result_names} = $self->{snmp}->get_table(oid => $oid_dfFileSys, nothing_quit => 1); - $self->{result_types} = $self->{snmp}->get_table(oid => $oid_dfType, nothing_quit => 1); - foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{result_names}})) { - next if ($oid !~ /\.([0-9]+)$/); + my $snmp_result = $options{snmp}->get_multiple_table( + oids => [ + { oid => $mapping->{dfFileSys}->{oid} }, + { oid => $mapping->{dfKBytesTotal}->{oid} }, + { oid => $mapping->{dfType}->{oid} }, + { oid => $mapping->{df64TotalKBytes}->{oid} }, + { oid => $mapping->{dfVserver}->{oid} }, + ], + return_type => 1, + nothing_quit => 1 + ); + + $self->{fs} = {}; + foreach my $oid (keys %$snmp_result) { + next if ($oid !~ /^$mapping->{dfFileSys}->{oid}\.(.*)$/); my $instance = $1; - my $type = $map_types{$self->{result_types}->{$oid_dfType . '.' . $instance}}; - - # Get all without a name - if (!defined($self->{option_results}->{name})) { - push @{$self->{filesys_id_selected}}, $instance; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{dfFileSys} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{dfFileSys} . "': no matching filter.", debug => 1); next; } - - if (defined($self->{option_results}->{type}) && $type !~ /$self->{option_results}->{type}/i) { - $self->{output}->output_add(long_msg => "Skipping filesys '" . $self->{result_names}->{$oid} . "': no matching filter type"); + if (defined($self->{option_results}->{filter_type}) && $self->{option_results}->{filter_type} ne '' && + $result->{dfType} !~ /$self->{option_results}->{filter_type}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{dfFileSys} . "': no matching filter.", debug => 1); next; } - if (!defined($self->{option_results}->{use_regexp}) && $self->{result_names}->{$oid} ne $self->{option_results}->{name}) { - $self->{output}->output_add(long_msg => "Skipping filesys '" . $self->{result_names}->{$oid} . "': no matching filter name"); - next; - } - if (defined($self->{option_results}->{use_regexp}) && $self->{result_names}->{$oid} !~ /$self->{option_results}->{name}/) { - $self->{output}->output_add(long_msg => "Skipping filesys '" . $self->{result_names}->{$oid} . "': no matching filter name (regexp)"); - next; - } - - push @{$self->{filesys_id_selected}}, $instance; + $self->{fs}->{$instance} = { + name => $result->{dfFileSys}, + total => defined($result->{df64TotalKBytes}) ? $result->{df64TotalKBytes} * 1024 : $result->{dfKBytesTotal} * 1024, + type => $result->{dfType}, + vserver => $result->{dfVserver} + }; } } -sub get_additional_information { - my ($self, %options) = @_; - - return if (scalar(@{$self->{filesys_id_selected}}) <= 0); - $self->{snmp}->load(oids => [$oid_dfKBytesTotal], instances => $self->{filesys_id_selected}); - if (!$self->{snmp}->is_snmpv1()) { - $self->{snmp}->load(oids => [$oid_df64TotalKBytes], instances => $self->{filesys_id_selected}); - } - return $self->{snmp}->get_leef(); -} - sub run { my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - $self->manage_selection(); - my $result = $self->get_additional_information(); - - foreach my $instance (sort @{$self->{filesys_id_selected}}) { - my $name = $self->{result_names}->{$oid_dfFileSys . '.' . $instance}; - my $type = $self->{result_types}->{$oid_dfType . '.' . $instance}; - my $total_size = $result->{$oid_dfKBytesTotal . '.' . $instance} * 1024; - if (defined($result->{$oid_df64TotalKBytes . '.' . $instance}) && $result->{$oid_df64TotalKBytes . '.' . $instance} != 0) { - $total_size = $result->{$oid_df64TotalKBytes . '.' . $instance} * 1024; - } - if (defined($self->{option_results}->{skip_total_zero}) && $total_size == 0) { - $self->{output}->output_add(long_msg => "Skipping filesys '" . $name . "': total size is 0 and option --skip-total-zero is set"); - next; - } - - $self->{output}->output_add(long_msg => "'" . $name . "' [total_size = $total_size B] [type = " . $map_types{$type} . "]"); + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{fs}}) { + next if (defined($self->{option_results}->{skip_total_zero}) && $self->{fs}->{$instance}->{total} == 0); + + $self->{output}->output_add(long_msg => '[instance = ' . $instance . '] ' . + "[name = '" . $self->{fs}->{$instance}->{name} . "'] " . + "[type = '" . $self->{fs}->{$instance}->{type} . "'] " . + "[vserver = '" . $self->{fs}->{$instance}->{vserver} . "'] " . + "[total = '" . $self->{fs}->{$instance}->{total} . "']"); } $self->{output}->output_add(severity => 'OK', @@ -137,27 +125,17 @@ sub run { sub disco_format { my ($self, %options) = @_; - $self->{output}->add_disco_format(elements => ['name', 'total', 'type']); + $self->{output}->add_disco_format(elements => ['name', 'total', 'type', 'vserver']); } sub disco_show { my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - $self->manage_selection(); - my $result = $self->get_additional_information(); - foreach my $instance (sort @{$self->{filesys_id_selected}}) { - my $name = $self->{result_names}->{$oid_dfFileSys . '.' . $instance}; - my $type = $self->{result_types}->{$oid_dfType . '.' . $instance}; - my $total_size = $result->{$oid_dfKBytesTotal . '.' . $instance} * 1024; - if (defined($result->{$oid_df64TotalKBytes . '.' . $instance}) && $result->{$oid_df64TotalKBytes . '.' . $instance} != 0) { - $total_size = $result->{$oid_df64TotalKBytes . '.' . $instance} * 1024; - } - next if (defined($self->{option_results}->{skip_total_zero}) && $total_size == 0); - - $self->{output}->add_disco_entry(name => $name, - total => $total_size, - type => $map_types{$type}); + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{fs}}) { + next if (defined($self->{option_results}->{skip_total_zero}) && $self->{fs}->{$instance}->{total} == 0); + + $self->{output}->add_disco_entry(%{$self->{fs}->{$instance}}); } } @@ -171,15 +149,11 @@ List filesystems (volumes and aggregates also). =over 8 -=item B<--name> +=item B<--filter-name> -Set the filesystem name. +Filter the filesystem name. -=item B<--regexp> - -Allows to use regexp to filter filesystem name (with option --name). - -=item B<--type> +=item B<--filter-type> Filter filesystem type (a regexp. Example: 'flexibleVolume|aggregate'). @@ -190,4 +164,4 @@ Don't display filesys with total equals 0. =back =cut - \ No newline at end of file +