diff --git a/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm b/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm index 856d504a9..65bd73e9e 100644 --- a/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm +++ b/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm @@ -42,10 +42,10 @@ sub new { if (!defined($options{noptions})) { $options{options}->add_options(arguments => { - 'hostname:s@' => { name => 'hostname' }, - 'xtremio-username:s@' => { name => 'xtremio_username' }, - 'xtremio-password:s@' => { name => 'xtremio_password' }, - 'timeout:s@' => { name => 'timeout' }, + 'hostname:s' => { name => 'hostname' }, + 'xtremio-username:s' => { name => 'xtremio_username' }, + 'xtremio-password:s' => { name => 'xtremio_password' }, + 'timeout:s' => { name => 'timeout' }, 'reload-cache-time:s' => { name => 'reload_cache_time' } }); } @@ -69,31 +69,26 @@ sub set_defaults {} sub check_options { my ($self, %options) = @_; - $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef; - $self->{xtremio_username} = (defined($self->{option_results}->{xtremio_username})) ? shift(@{$self->{option_results}->{xtremio_username}}) : ''; - $self->{xtremio_password} = (defined($self->{option_results}->{xtremio_password})) ? shift(@{$self->{option_results}->{xtremio_password}}) : ''; - $self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10; - $self->{reload_cache_time} = (defined($self->{option_results}->{reload_cache_time})) ? shift(@{$self->{option_results}->{reload_cache_time}}) : 180; + $self->{hostname} = defined($self->{option_results}->{hostname}) ? $self->{option_results}->{hostname} : ''; + $self->{xtremio_username} = defined($self->{option_results}->{xtremio_username}) ? $self->{option_results}->{xtremio_username} : ''; + $self->{xtremio_password} = defined($self->{option_results}->{xtremio_password}) ? $self->{option_results}->{xtremio_password} : ''; + $self->{timeout} = defined($self->{option_results}->{timeout}) ? $self->{option_results}->{timeout} : 10; + $self->{reload_cache_time} = defined($self->{option_results}->{reload_cache_time}) ? $self->{option_results}->{reload_cache_time} : 180; - if (!defined($self->{hostname})) { + if ($self->{hostname} eq '') { $self->{output}->add_option_msg(short_msg => "Need to specify hostname option."); $self->{output}->option_exit(); } - if (!defined($self->{xtremio_username}) || !defined($self->{xtremio_password})) { + if ($self->{xtremio_username} eq '' || $self->{xtremio_password} eq '') { $self->{output}->add_option_msg(short_msg => "Need to specify --xtremio-username and --xtremio-password options."); $self->{output}->option_exit(); } - if (!defined($self->{hostname}) || - scalar(@{$self->{option_results}->{hostname}}) == 0) { - $self->{statefile_cache_cluster}->check_options(option_results => $self->{option_results}); - return 0; - } - return 1; + $self->{statefile_cache_cluster}->check_options(option_results => $self->{option_results}); + return 0; } - sub build_options_for_httplib { my ($self, %options) = @_; @@ -119,8 +114,10 @@ sub cache_clusters { if ($has_cache_file == 0 || !defined($timestamp_cache) || ((time() - $timestamp_cache) > (($self->{reload_cache_time}) * 60))) { $clusters = {}; my $datas = { last_timestamp => time(), clusters => $clusters }; - my @items = $self->get_items(url => '/api/json/types/', - obj => 'clusters'); + my @items = $self->get_items( + url => '/api/json/types/', + obj => 'clusters' + ); foreach (@items) { $clusters->{$_} = 1; } @@ -140,6 +137,7 @@ sub get_items { } my $response = $self->{http}->request(url_path => $options{url}); + my $decoded; eval { $decoded = decode_json($response); @@ -159,9 +157,12 @@ sub get_items { sub get_details_data { my ($self, %options) = @_; - - my $response = $self->{http}->request(url_path => $options{url}, - critical_status => '', warning_status => '', unknown_status => ''); + + my $response = $self->{http}->request( + url_path => $options{url}, + critical_status => '', warning_status => '', unknown_status => '' + ); + my $decoded; eval { $decoded = decode_json($response); diff --git a/centreon-plugins/storage/emc/xtremio/restapi/mode/dpg.pm b/centreon-plugins/storage/emc/xtremio/restapi/mode/dpg.pm new file mode 100644 index 000000000..527a2c7f7 --- /dev/null +++ b/centreon-plugins/storage/emc/xtremio/restapi/mode/dpg.pm @@ -0,0 +1,163 @@ +# +# Copyright 2022 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::emc::xtremio::restapi::mode::dpg; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub custom_service_status_output { + my ($self, %options) = @_; + + return sprintf( + "health: %s", + $self->{result_values}->{health} + ); +} + +sub dpg_long_output { + my ($self, %options) = @_; + + return "checking data protection group '" . $options{instance} . "'"; +} + +sub prefix_dpg_output { + my ($self, %options) = @_; + + return "data protection group '" . $options{instance} . "' "; +} + +sub prefix_indicator_output { + my ($self, %options) = @_; + + return "indicator '" . $options{instance_value}->{indicator} . "' "; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'dpg', type => 3, cb_prefix_output => 'prefix_dpg_output', cb_long_output => 'dpg_long_output', + indent_long_output => ' ', message_multiple => 'All data protection groups are ok', + group => [ + { name => 'indicators', display_long => 1, cb_prefix_output => 'prefix_indicator_output', message_multiple => 'All health indicators are ok', type => 1, skipped_code => { -10 => 1 } } + ] + } + ]; + + $self->{maps_counters}->{indicators} = [ + { + label => 'health-indicator', + type => 2, + critical_default => '%{health} !~ /done|normal|null/i', + set => { + key_values => [ { name => 'health' }, { name => 'indicator' } ], + closure_custom_output => $self->can('custom_service_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' } + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $urlbase = '/api/json/types/'; + my @items = $options{custom}->get_items( + url => $urlbase, + obj => 'data-protection-groups' + ); + + my @indicators = ('dpg-state', 'protection-state', 'rebuild-in-progress', 'ssd-preparation-in-progress', 'rebalance-progress'); + + $self->{dpg} = {}; + foreach my $item (@items) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $item !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping dpg '" . $item . "'.", debug => 1); + next; + } + + my $details = $options{custom}->get_details( + url => $urlbase, + obj => 'data-protection-groups', + name => $item + ); + + $self->{dpg}->{$item} = { indicators => {} }; + foreach (@indicators) { + next if (!defined($details->{$_})); + + $self->{dpg}->{$item}->{indicators}->{$_} = { + indicator => $_, + health => $details->{$_} + }; + } + } +} + +1; + +__END__ + +=head1 MODE + +Check data protection groups. + +=over 8 + +=item B<--filter-name> + +Filter data protection groups by name (can be a regexp). + +=item B<--unknown-health-indicator> + +Set unknown threshold for status. +Can used special variables like: %{health}, %{indicator} + +=item B<--warning-health-indicator> + +Set warning threshold for status. +Can used special variables like: %{health}, %{indicator} + +=item B<--critical-health-indicator> + +Set critical threshold for status (Default: '%{health} !~ /done|normal|null/i'). +Can used special variables like: %{health}, %{indicator} + +=back + +=cut diff --git a/centreon-plugins/storage/emc/xtremio/restapi/mode/storagecontrollers.pm b/centreon-plugins/storage/emc/xtremio/restapi/mode/storagecontrollers.pm new file mode 100644 index 000000000..90acd07c3 --- /dev/null +++ b/centreon-plugins/storage/emc/xtremio/restapi/mode/storagecontrollers.pm @@ -0,0 +1,166 @@ +# +# Copyright 2022 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::emc::xtremio::restapi::mode::storagecontrollers; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub custom_service_status_output { + my ($self, %options) = @_; + + return sprintf( + "health: %s", + $self->{result_values}->{health} + ); +} + +sub sc_long_output { + my ($self, %options) = @_; + + return "checking storage controller '" . $options{instance} . "'"; +} + +sub prefix_sc_output { + my ($self, %options) = @_; + + return "storage controller '" . $options{instance} . "' "; +} + +sub prefix_indicator_output { + my ($self, %options) = @_; + + return "indicator '" . $options{instance_value}->{indicator} . "' "; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'sc', type => 3, cb_prefix_output => 'prefix_sc_output', cb_long_output => 'sc_long_output', + indent_long_output => ' ', message_multiple => 'All storage controllers are ok', + group => [ + { name => 'indicators', display_long => 1, cb_prefix_output => 'prefix_indicator_output', message_multiple => 'All health indicators are ok', type => 1, skipped_code => { -10 => 1 } } + ] + } + ]; + + $self->{maps_counters}->{indicators} = [ + { + label => 'health-indicator', + type => 2, + critical_default => '%{health} !~ /healthy|normal|level_1_clear/i', + set => { + key_values => [ { name => 'health' }, { name => 'indicator' } ], + closure_custom_output => $self->can('custom_service_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' } + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $urlbase = '/api/json/types/'; + my @items = $options{custom}->get_items( + url => $urlbase, + obj => 'storage-controllers' + ); + + my @indicators = ( + 'dimm-health-state','node-health-state','current-health-state', 'journal-state', 'temperature-health-state', 'fan-health-state', + 'node-fp-temperature-state', 'sas1-port-health-state', 'sas2-port-health-state' + ); + + $self->{sc} = {}; + foreach my $item (@items) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $item !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping storage controller '" . $item . "'.", debug => 1); + next; + } + + my $details = $options{custom}->get_details( + url => $urlbase, + obj => 'storage-controllers', + name => $item + ); + + $self->{sc}->{$item} = { indicators => {} }; + foreach (@indicators) { + next if (!defined($details->{$_})); + + $self->{sc}->{$item}->{indicators}->{$_} = { + indicator => $_, + health => $details->{$_} + }; + } + } +} + +1; + +__END__ + +=head1 MODE + +Check storage controllers. + +=over 8 + +=item B<--filter-name> + +Filter storage controllers by name (can be a regexp). + +=item B<--unknown-health-indicator> + +Set unknown threshold for status. +Can used special variables like: %{health}, %{indicator} + +=item B<--warning-health-indicator> + +Set warning threshold for status. +Can used special variables like: %{health}, %{indicator} + +=item B<--critical-health-indicator> + +Set critical threshold for status (Default: '%{health} !~ /done|normal|null/i'). +Can used special variables like: %{health}, %{indicator} + +=back + +=cut diff --git a/centreon-plugins/storage/emc/xtremio/restapi/plugin.pm b/centreon-plugins/storage/emc/xtremio/restapi/plugin.pm index 360ca464a..0f94bb3f0 100644 --- a/centreon-plugins/storage/emc/xtremio/restapi/plugin.pm +++ b/centreon-plugins/storage/emc/xtremio/restapi/plugin.pm @@ -29,16 +29,17 @@ sub new { my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - $self->{version} = '1.0'; - %{$self->{modes}} = ( - 'xenvs-cpu' => 'storage::emc::xtremio::restapi::mode::xenvscpu', - 'xenvs-state' => 'storage::emc::xtremio::restapi::mode::xenvsstate', - 'ssds-endurance' => 'storage::emc::xtremio::restapi::mode::ssdendurance', - 'ssds-iops' => 'storage::emc::xtremio::restapi::mode::ssdiops', - 'cluster-health' => 'storage::emc::xtremio::restapi::mode::clusterhealth', - ); + $self->{modes} = { + 'cluster-health' => 'storage::emc::xtremio::restapi::mode::clusterhealth', + 'dpg' => 'storage::emc::xtremio::restapi::mode::dpg', + 'ssds-endurance' => 'storage::emc::xtremio::restapi::mode::ssdendurance', + 'ssds-iops' => 'storage::emc::xtremio::restapi::mode::ssdiops', + 'storage-controllers' => 'storage::emc::xtremio::restapi::mode::storagecontrollers', + 'xenvs-cpu' => 'storage::emc::xtremio::restapi::mode::xenvscpu', + 'xenvs-state' => 'storage::emc::xtremio::restapi::mode::xenvsstate' + }; - $self->{custom_modes}{xtremioapi} = 'storage::emc::xtremio::restapi::custom::xtremioapi'; + $self->{custom_modes}->{xtremioapi} = 'storage::emc::xtremio::restapi::custom::xtremioapi'; return $self; } @@ -49,3 +50,5 @@ __END__ =head1 PLUGIN DESCRIPTION Check EMC Xtremio through HTTP/REST API. + +=cut