diff --git a/centreon-plugins/storage/hp/storeonce/restapi/custom/api.pm b/centreon-plugins/storage/hp/storeonce/restapi/custom/api.pm index f14f72989..6cb495765 100644 --- a/centreon-plugins/storage/hp/storeonce/restapi/custom/api.pm +++ b/centreon-plugins/storage/hp/storeonce/restapi/custom/api.pm @@ -59,20 +59,15 @@ sub new { } -# Method to manage multiples sub set_options { my ($self, %options) = @_; - # options{options_result} $self->{option_results} = $options{option_results}; } -# Method to manage multiples sub set_defaults { my ($self, %options) = @_; - # options{default} - - # Manage default value + foreach (keys %{$options{default}}) { if ($_ eq $self->{mode}) { for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { @@ -88,8 +83,6 @@ sub set_defaults { sub check_options { my ($self, %options) = @_; - # return 1 = ok still hostname - # return 0 = no hostname left $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef; $self->{username} = (defined($self->{option_results}->{username})) ? shift(@{$self->{option_results}->{username}}) : ''; @@ -130,18 +123,15 @@ sub settings { $self->{http}->set_options(%{$self->{option_results}}); } -#my $xml = XMLin($biggest_reponse, ForceArray => 1); - sub get { my ($self, %options) = @_; $self->settings(); - my $response = $self->{http}->request(url_path => '/storeonceservices' . $options{path}, critical_status => '', warning_status => ''); my $content; eval { - $content = XMLin($response, ForceArray => $options{ForceArray}); + $content = XMLin($response, ForceArray => $options{ForceArray}, KeyAttr => []); }; if ($@) { $self->{output}->add_option_msg(short_msg => "Cannot decode xml response: $@"); diff --git a/centreon-plugins/storage/hp/storeonce/restapi/mode/nasusage.pm b/centreon-plugins/storage/hp/storeonce/restapi/mode/nasusage.pm new file mode 100644 index 000000000..a41d7c4e6 --- /dev/null +++ b/centreon-plugins/storage/hp/storeonce/restapi/mode/nasusage.pm @@ -0,0 +1,251 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package storage::hp::storeonce::restapi::mode::nasusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + my $label = $self->{label}; + $label =~ s/-/_/g; + if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'critical_' . $label}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'warning_' . $label}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_nas_status_output { + my ($self, %options) = @_; + + my $msg = sprintf('status : %s [replication health: %s]', + $self->{result_values}->{health}, $self->{result_values}->{replication_health}); + return $msg; +} + +sub custom_nas_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{health} = $options{new_datas}->{$self->{instance} . '_health'}; + $self->{result_values}->{replication_health} = $options{new_datas}->{$self->{instance} . '_replication_health'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub custom_share_status_output { + my ($self, %options) = @_; + + my $msg = sprintf('status : %s', $self->{result_values}->{health}); + return $msg; +} + +sub custom_share_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{health} = $options{new_datas}->{$self->{instance} . '_health'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'nas', type => 1, cb_prefix_output => 'prefix_nas_output', message_multiple => 'All nas are ok' }, + { name => 'share', type => 1, cb_prefix_output => 'prefix_share_output', message_multiple => 'All shares are ok' }, + ]; + + $self->{maps_counters}->{nas} = [ + { label => 'nas-status', threshold => 0, set => { + key_values => [ { name => 'replication_health' }, { name => 'health' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_nas_status_calc'), + closure_custom_output => $self->can('custom_nas_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; + + $self->{maps_counters}->{share} = [ + { label => 'share-status', threshold => 0, set => { + key_values => [ { name => 'health' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_share_status_calc'), + closure_custom_output => $self->can('custom_share_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; +} + +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 => + { + "filter-name:s" => { name => 'filter_name' }, + "warning-nas-status:s" => { name => 'warning_nas_status', default => '%{health} =~ /warning/i' }, + "critical-nas-status:s" => { name => 'critical_nas_status', default => '%{health} =~ /critical/i' }, + "warning-share-status:s" => { name => 'warning_share_status', default => '%{health} =~ /warning/i' }, + "critical-share-status:s" => { name => 'critical_share_status', default => '%{health} =~ /critical/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_nas_output { + my ($self, %options) = @_; + + return "NAS '" . $options{instance_value}->{display} . "' "; +} + +sub prefix_share_output { + my ($self, %options) = @_; + + return "Share '" . $options{instance_value}->{display} . "' "; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_nas_status', 'critical_nas_status', 'warning_share_status', 'critical_share_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +my %mapping_health_level = ( + 0 => 'unknown', + 1 => 'ok', + 2 => 'information', + 3 => 'warning', + 4 => 'critical', +); + +sub manage_selection { + my ($self, %options) = @_; + + $self->{nas} = {}; + $self->{share} = {}; + my $result = $options{custom}->get(path => '/cluster/servicesets/*all*/services/nas', ForceArray => ['service', 'item']); + if (defined($result->{services}->{service})) { + foreach my $entry (@{$result->{services}->{service}}) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $entry->{properties}->{ssid} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $entry->{properties}->{ssid} . "': no matching filter.", debug => 1); + next; + } + + $self->{nas}->{$entry->{properties}->{ssid}} = { + display => $entry->{properties}->{ssid}, + health => $mapping_health_level{$entry->{properties}->{nasHealthLevel}}, + replication_health => $mapping_health_level{$entry->{properties}->{repHealthLevel}}, + }; + + foreach my $item (@{$entry->{shares}->{item}}) { + $self->{share}->{$entry->{properties}->{ssid} . '.' . $item->{id}} = { + display => $entry->{properties}->{ssid} . '.' . $item->{id}, + health => $mapping_health_level{$item->{summaryHealthLevel}}, + }; + } + } + } + + if (scalar(keys %{$self->{nas}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No nas found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check NAS status. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^nas-status$' + +=item B<--filter-name> + +Filter nas name (can be a regexp). + +=item B<--warning-nas-status> + +Set warning threshold for status (Default: '%{health} =~ /warning/i'). +Can used special variables like: %{health}, %{replication_health}, %{display} + +=item B<--critical-nas-status> + +Set critical threshold for status (Default: '%{health} =~ /critical/i'). +Can used special variables like: %{health}, %{replication_health}, %{display} + +=item B<--warning-share-status> + +Set warning threshold for status (Default: '%{health} =~ /warning/i'). +Can used special variables like: %{health}, %{replication_health}, %{display} + +=item B<--critical-share-status> + +Set critical threshold for status (Default: '%{health} =~ /critical/i'). +Can used special variables like: %{health}, %{replication_health}, %{display} + +=back + +=cut diff --git a/centreon-plugins/storage/hp/storeonce/restapi/mode/servicesetusage.pm b/centreon-plugins/storage/hp/storeonce/restapi/mode/servicesetusage.pm index 5faa7790f..f387b79d6 100644 --- a/centreon-plugins/storage/hp/storeonce/restapi/mode/servicesetusage.pm +++ b/centreon-plugins/storage/hp/storeonce/restapi/mode/servicesetusage.pm @@ -54,7 +54,8 @@ sub custom_status_threshold { sub custom_status_output { my ($self, %options) = @_; - my $msg = 'status : ' . $self->{result_values}->{health}; + my $msg = sprintf('status : %s [replication health: %s] [housekeeping health: %s]', + $self->{result_values}->{health}, $self->{result_values}->{replication_health}, $self->{result_values}->{housekeeping_health}); return $msg; } @@ -63,6 +64,7 @@ sub custom_status_calc { $self->{result_values}->{health} = $options{new_datas}->{$self->{instance} . '_health'}; $self->{result_values}->{housekeeping_health} = $options{new_datas}->{$self->{instance} . '_housekeeping_health'}; + $self->{result_values}->{replication_health} = $options{new_datas}->{$self->{instance} . '_replication_health'}; $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; return 0; } @@ -140,7 +142,7 @@ sub set_counters { $self->{maps_counters}->{scs} = [ { label => 'status', threshold => 0, set => { - key_values => [ { name => 'health' }, { name => 'housekeeping_health' }, { name => 'display' } ], + key_values => [ { name => 'health' }, { name => 'replication_health' }, { name => 'housekeeping_health' }, { name => 'display' } ], closure_custom_calc => $self->can('custom_status_calc'), closure_custom_output => $self->can('custom_status_output'), closure_custom_perfdata => sub { return 0; }, @@ -235,6 +237,7 @@ sub manage_selection { display => $entry->{properties}->{alias}, health => $mapping_health_level{$entry->{properties}->{healthLevel}}, housekeeping_health => $mapping_health_level{$entry->{properties}->{housekeepingHealthLevel}}, + replication_health => $mapping_health_level{$entry->{properties}->{repHealthLevel}}, total => $entry->{properties}->{capacityBytes}, used => $entry->{properties}->{capacityBytes} - $entry->{properties}->{freeBytes}, dedup => $entry->{properties}->{dedupeRatio} }; diff --git a/centreon-plugins/storage/hp/storeonce/restapi/plugin.pm b/centreon-plugins/storage/hp/storeonce/restapi/plugin.pm index d3ae16bbc..7f457d8eb 100644 --- a/centreon-plugins/storage/hp/storeonce/restapi/plugin.pm +++ b/centreon-plugins/storage/hp/storeonce/restapi/plugin.pm @@ -33,6 +33,7 @@ sub new { %{$self->{modes}} = ( 'cluster-usage' => 'storage::hp::storeonce::restapi::mode::clusterusage', 'fcs-usage' => 'storage::hp::storeonce::restapi::mode::fcsusage', + 'nas-usage' => 'storage::hp::storeonce::restapi::mode::nasusage', 'serviceset-usage' => 'storage::hp::storeonce::restapi::mode::servicesetusage', );