diff --git a/storage/emc/vplex/restapi/custom/vplexapi.pm b/storage/emc/vplex/restapi/custom/vplexapi.pm index 3ea831f50..3a38b4653 100644 --- a/storage/emc/vplex/restapi/custom/vplexapi.pm +++ b/storage/emc/vplex/restapi/custom/vplexapi.pm @@ -184,53 +184,6 @@ sub get_items { return $items; } -sub get_param { - my ($self, %options) = @_; - - my $url = $options{url}; - my $obj = $options{obj}; - my $engine = $options{engine}; - my $item = $options{item}; - my $param = $options{param}; - - if ( (defined $engine) && (defined $obj) ) { - $url .= $engine.'/'.$obj.'/'.$item.'?'.$param; - } elsif (defined $engine) { - $url .= $engine.'/'.$item.'?'.$param; - } else { - $url .= '/'.$item.'?'.$param; - } - - my $response = $self->{http}->request(url_path => $url); - my $decoded = decode_json($response); - - return $decoded->{response}; - -} - -sub get_infos { - my ($self, %options) = @_; - - my $url = $options{url}; - my $obj = $options{obj}; - my $engine = $options{engine}; - my $item = $options{item}; - - if (defined $engine) { - $url .= $engine.'/'.$obj.'/'.$item; - } elsif (defined $obj) { - $url .= '/'.$obj; - } else { - $url .= '/'.$item; - } - - my $response = $self->{http}->request(url_path => $url); - my $decoded = decode_json($response); - - return $decoded->{response}; - -} - 1; __END__ diff --git a/storage/emc/vplex/restapi/mode/clustercommunication.pm b/storage/emc/vplex/restapi/mode/clustercommunication.pm index 4ff23824a..dece80664 100644 --- a/storage/emc/vplex/restapi/mode/clustercommunication.pm +++ b/storage/emc/vplex/restapi/mode/clustercommunication.pm @@ -25,6 +25,14 @@ use base qw(centreon::plugins::mode); use strict; use warnings; +my $thresholds = { + component_opstatus => [ + ['cluster-in-contact', 'OK'], + ['in-contact', 'OK'], + ['.*', 'CRITICAL'], + ], +}; + sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); @@ -33,8 +41,8 @@ sub new { $self->{version} = '1.1'; $options{options}->add_options(arguments => { - "cluster-nodes:s@" => { name => 'cluster_nodes', }, - "witness-name:s" => { name => 'witness_name', }, + "filter:s@" => { name => 'filter' }, + "threshold-overload:s@" => { name => 'threshold_overload' }, }); return $self; @@ -44,58 +52,108 @@ sub check_options { my ($self, %options) = @_; $self->SUPER::init(%options); - if ( !defined($self->{option_results}->{cluster_nodes}) || !defined($self->{option_results}->{witness_name}) ) { - $self->{output}->add_option_msg(short_msg => "You need to cluster-nodes AND witness-name options."); - $self->{output}->option_exit(); + $self->{filter} = []; + foreach my $val (@{$self->{option_results}->{filter}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + push @{$self->{filter}}, { filter => $values[0], instance => $values[1] }; + } + + $self->{overload_th} = {}; + foreach my $val (@{$self->{option_results}->{threshold_overload}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + if (scalar(@values) < 3) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); + $self->{output}->option_exit(); + } + my ($section, $instance, $status, $filter); + if (scalar(@values) == 3) { + ($section, $status, $filter) = @values; + $instance = '.*'; + } else { + ($section, $instance, $status, $filter) = @values; + } + if ($section !~ /^component/) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'."); + $self->{output}->option_exit(); + } + if ($self->{output}->is_litteral_status(status => $status) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'."); + $self->{output}->option_exit(); + } + $self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section})); + push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance }; } - } sub run { my ($self, %options) = @_; my $vplex = $options{custom}; - my $urlbase = '/vplex/cluster-witness/components/'; - my @nodes = split /,/, $self->{option_results}->{cluster_nodes}->[0]; + my $urlbase = '/vplex/cluster-witness/components/'; + my $items = $vplex->get_items(url => $urlbase); + foreach my $name (sort keys %{$items}) { + my $instance = $name; - $self->{output}->output_add(severity => 'OK', - short_msg => 'Cluster communication is OK'); - - $vplex->connect(); - - foreach my $node (@nodes) { - my $details = $vplex->get_param(url => $urlbase, - item => $node, - param => 'operational-state'); - - $self->{output}->output_add(long_msg => sprintf("Node '%s' is '%s'", $node, - $details->{context}->[0]->{attributes}->[0]->{value})); - - if ($details->{context}->[0]->{attributes}->[0]->{value} ne 'in-contact') { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Node '%s' is '%s'", - $node, $details->{context}->[0]->{attributes}->[0]->{value})); - } - - } + next if ($self->check_filter(section => 'component', instance => $instance)); - my $details = $vplex->get_param(url => $urlbase, - item => $self->{option_results}->{witness_name}, - param => 'operational-state'); + $self->{output}->output_add(long_msg => sprintf("Cluster Witness component '%s' state is '%s'", + $instance, + $items->{$name}->{'operational-state'})); - - if ($details->{context}->[0]->{attributes}->[0]->{value} ne 'clusters-in-contact') { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Witness '%s' see nodes as '%s'", - $self->{option_results}->{witness_name}, - $details->{context}->[0]->{attributes}->[0]->{value})); + my $exit = $self->get_severity(section => 'component_opstatus', instance => $instance, value => $items->{$name}->{'operational-state'}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Cluster Witness component '%s' state is '%s'", + $instance, $items->{$name}->{'operational-state'})); + } } + + $self->{output}->display(); + $self->{output}->exit(); +} - $self->{output}->output_add(long_msg => sprintf("Witness '%s' says '%s'", $self->{option_results}->{witness_name}, - $details->{context}->[0]->{attributes}->[0]->{value})); +sub check_filter { + my ($self, %options) = @_; - $self->{output}->display(); - $self->{output}->exit(); + foreach (@{$self->{filter}}) { + if ($options{section} =~ /$_->{filter}/) { + if (!defined($options{instance}) && !defined($_->{instance})) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section.")); + return 1; + } elsif (defined($options{instance}) && $options{instance} =~ /$_->{instance}/) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance.")); + return 1; + } + } + } + + return 0; +} + +sub get_severity { + my ($self, %options) = @_; + my $status = 'UNKNOWN'; # default + + if (defined($self->{overload_th}->{$options{section}})) { + foreach (@{$self->{overload_th}->{$options{section}}}) { + if ($options{value} =~ /$_->{filter}/i && + (!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) { + $status = $_->{status}; + return $status; + } + } + } + my $label = defined($options{label}) ? $options{label} : $options{section}; + foreach (@{$thresholds->{$label}}) { + if ($options{value} =~ /$$_[0]/i) { + $status = $$_[1]; + return $status; + } + } + + return $status; } 1; @@ -108,13 +166,16 @@ Check Cluster communication state for VPlex =over 8 -=item B<--cluster-nodes> +=item B<--filter> -Mandatory. Specify the name of your cluster nodes, as comma-separated list (EMC defaults are 'cluster-1', 'cluster-2', .. +Filter some parts (comma seperated list) +Can also exclude specific instance: --filter=component,cluster-1 -=item B<--cluster-nodes> +=item B<--threshold-overload> -Mandatory. Specify the name of your witness server (EMC default is 'server') +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='component_opstatus,CRITICAL,^(?!(in-contact|cluster-in-contact)$)' =back diff --git a/storage/emc/vplex/restapi/mode/clusterdevices.pm b/storage/emc/vplex/restapi/mode/clusterdevices.pm index a301c00a3..6d94d8179 100644 --- a/storage/emc/vplex/restapi/mode/clusterdevices.pm +++ b/storage/emc/vplex/restapi/mode/clusterdevices.pm @@ -25,6 +25,13 @@ use base qw(centreon::plugins::mode); use strict; use warnings; +my $thresholds = { + device_health => [ + ['ok', 'ok'], + ['.*', 'CRITICAL'], + ], +}; + sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); @@ -33,8 +40,9 @@ sub new { $self->{version} = '1.1'; $options{options}->add_options(arguments => { - "cluster:s" => { name => 'cluster', default => 'cluster-1' }, - "filter-name:s" => { name => 'filter_name' }, + "cluster:s" => { name => 'cluster' }, + "filter:s@" => { name => 'filter' }, + "threshold-overload:s@" => { name => 'threshold_overload' }, }); return $self; @@ -44,50 +52,117 @@ sub check_options { my ($self, %options) = @_; $self->SUPER::init(%options); + $self->{filter} = []; + foreach my $val (@{$self->{option_results}->{filter}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + push @{$self->{filter}}, { filter => $values[0], instance => $values[1] }; + } + + $self->{overload_th} = {}; + foreach my $val (@{$self->{option_results}->{threshold_overload}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + if (scalar(@values) < 3) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); + $self->{output}->option_exit(); + } + my ($section, $instance, $status, $filter); + if (scalar(@values) == 3) { + ($section, $status, $filter) = @values; + $instance = '.*'; + } else { + ($section, $instance, $status, $filter) = @values; + } + if ($section !~ /^device/) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'."); + $self->{output}->option_exit(); + } + if ($self->{output}->is_litteral_status(status => $status) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'."); + $self->{output}->option_exit(); + } + $self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section})); + push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance }; + } } sub run { my ($self, %options) = @_; my $vplex = $options{custom}; - - my $urlbase = '/vplex/clusters/'.$self->{option_results}->{cluster}.'/devices/'; - - $vplex->connect(); - - my @items = $vplex->get_items(url => $urlbase); + + my $urlbase = '/vplex/clusters/'; + my $items = $vplex->get_items(url => $urlbase, + parent => 'cluster', + engine => $self->{option_results}->{cluster}, + obj => 'devices'); $self->{output}->output_add(severity => 'OK', short_msg => 'All Cluster Devices are OK'); - foreach my $item (@items) { + + foreach my $cluster_name (sort keys %{$items}) { + foreach my $device_name (sort keys %{$items->{$cluster_name}}) { + my $instance = $cluster_name . '_' . $device_name; - 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 => sprintf("Skipping storage '%s'.", $item)); - next; + next if ($self->check_filter(section => 'device', instance => $instance)); + + $self->{output}->output_add(long_msg => sprintf("Device '%s' health state is '%s'", + $instance, + $items->{$cluster_name}->{$device_name}->{'health-state'})); + + my $exit = $self->get_severity(section => 'volume_health', instance => $instance, value => $items->{$cluster_name}->{$device_name}->{'health-state'}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Device '%s' health state is '%s'", + $instance, $items->{$cluster_name}->{$device_name}->{'health-state'})); + } } - - my $details = $vplex->get_param(url => $urlbase, - item => $item, - param => 'health-state'); - - $self->{output}->output_add(long_msg => sprintf("Device '%s' health state is '%s'", - $item, - $details->{context}->[0]->{attributes}->[0]->{value} - )); - - if ($details->{context}->[0]->{attributes}->[0]->{value} ne 'ok') { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Storage '%s' service is '%s'", - $item, - $details->{context}->[0]->{attributes}->[0]->{value} - )); - } - } - + $self->{output}->display(); $self->{output}->exit(); +} +sub check_filter { + my ($self, %options) = @_; + + foreach (@{$self->{filter}}) { + if ($options{section} =~ /$_->{filter}/) { + if (!defined($options{instance}) && !defined($_->{instance})) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section.")); + return 1; + } elsif (defined($options{instance}) && $options{instance} =~ /$_->{instance}/) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance.")); + return 1; + } + } + } + + return 0; +} + +sub get_severity { + my ($self, %options) = @_; + my $status = 'UNKNOWN'; # default + + if (defined($self->{overload_th}->{$options{section}})) { + foreach (@{$self->{overload_th}->{$options{section}}}) { + if ($options{value} =~ /$_->{filter}/i && + (!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) { + $status = $_->{status}; + return $status; + } + } + } + my $label = defined($options{label}) ? $options{label} : $options{section}; + foreach (@{$thresholds->{$label}}) { + if ($options{value} =~ /$$_[0]/i) { + $status = $$_[1]; + return $status; + } + } + + return $status; } 1; @@ -102,11 +177,18 @@ Check Cluster devices health for VPlex =item B<--cluster> -Set cluster name to check (cluster-1 and cluster-2) +Set cluster name to check (Example: '1') -=item B<--filter-name> +=item B<--filter> -Filter some elements by name (can be a regexp) +Filter some parts (comma seperated list) +Can also exclude specific instance: --filter=device,cluster-1_xxxx + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='device_health,CRITICAL,^(?!(ok)$)' =back diff --git a/storage/emc/vplex/restapi/mode/distribueddevices.pm b/storage/emc/vplex/restapi/mode/distribueddevices.pm deleted file mode 100644 index fa1b8a5e1..000000000 --- a/storage/emc/vplex/restapi/mode/distribueddevices.pm +++ /dev/null @@ -1,123 +0,0 @@ -# -# Copyright 2015 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::vplex::restapi::mode::distribueddevices; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $self->{version} = '1.1'; - $options{options}->add_options(arguments => - { - "engine:s" => { name => 'engine' }, - "filter-name:s" => { name => 'filter_name' }, - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - if (!defined($self->{option_results}->{engine})) { - $self->{output}->add_option_msg(short_msg => "You need to specify engine number."); - $self->{output}->option_exit(); - } - -} - -sub run { - my ($self, %options) = @_; - my $vplex = $options{custom}; - - my $urlbase = '/vplex/distributed-storage/distributed-devices'; - - $vplex->connect(); - - my @items = $vplex->get_items(url => $urlbase); - - $self->{output}->output_add(severity => 'OK', - short_msg => 'All Distribued storages are OK'); - - 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 => sprintf("Skipping storage '%s'.", $item)); - next; - } - - my $details = $vplex->get_infos(url => $urlbase, - item => $item); - - $self->{output}->output_add(long_msg => sprintf("Storage '%s' operational state is '%s', health-state is '%s', and service is '%s'", - $item, - $details->{context}->[0]->{attributes}->[9]->{value}, - $details->{context}->[0]->{attributes}->[12]->{value}, - $details->{context}->[0]->{attributes}->[19]->{value})); - - if ($details->{context}->[0]->{attributes}->[19]->{value} ne 'running') { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Storage '%s' service is '%s'", $details->{context}->[0]->{attributes}->[19]->{value})); - - } elsif ($details->{context}->[0]->{attributes}->[12]->{value} ne 'ok') { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Problem on '%s' [health-state='%s'][operationnal-state='%s']", - $item, - $details->{context}->[0]->{attributes}->[12]->{value}, - $details->{context}->[0]->{attributes}->[9]->{value})); - } - - } - - $self->{output}->display(); - $self->{output}->exit(); - -} - -1; - -__END__ - -=head1 MODE - -Check Disks health for VPlex - -=over 8 - -=item B<--engine> - -Set engine number (usually 1-1 or 1-2) - -=item B<--filter-name> - -Filter by name - can be a regexp - -=back - -=cut diff --git a/storage/emc/vplex/restapi/mode/distributeddevices.pm b/storage/emc/vplex/restapi/mode/distributeddevices.pm new file mode 100644 index 000000000..c82583c9d --- /dev/null +++ b/storage/emc/vplex/restapi/mode/distributeddevices.pm @@ -0,0 +1,207 @@ +# +# Copyright 2015 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::vplex::restapi::mode::distributeddevices; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my $thresholds = { + device_health => [ + ['ok', 'OK'], + ['.*', 'CRITICAL'], + ], + device_opstatus => [ + ['ok', 'OK'], + ['.*', 'CRITICAL'], + ], + device_service => [ + ['running', 'OK'], + ['.*', 'CRITICAL'], + ], +}; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.1'; + $options{options}->add_options(arguments => + { + "filter:s@" => { name => 'filter' }, + "threshold-overload:s@" => { name => 'threshold_overload' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + $self->{filter} = []; + foreach my $val (@{$self->{option_results}->{filter}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + push @{$self->{filter}}, { filter => $values[0], instance => $values[1] }; + } + + $self->{overload_th} = {}; + foreach my $val (@{$self->{option_results}->{threshold_overload}}) { + next if (!defined($val) || $val eq ''); + my @values = split (/,/, $val); + if (scalar(@values) < 3) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); + $self->{output}->option_exit(); + } + my ($section, $instance, $status, $filter); + if (scalar(@values) == 3) { + ($section, $status, $filter) = @values; + $instance = '.*'; + } else { + ($section, $instance, $status, $filter) = @values; + } + if ($section !~ /^device/) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'."); + $self->{output}->option_exit(); + } + if ($self->{output}->is_litteral_status(status => $status) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'."); + $self->{output}->option_exit(); + } + $self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section})); + push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance }; + } +} + +sub run { + my ($self, %options) = @_; + my $vplex = $options{custom}; + + $self->{output}->output_add(severity => 'OK', + short_msg => 'All Distributed devices are OK'); + + my $urlbase = '/vplex/distributed-storage/distributed-devices/'; + my $items = $vplex->get_items(url => $urlbase); + foreach my $name (sort keys %{$items}) { + my $instance = $name; + + next if ($self->check_filter(section => 'device', instance => $instance)); + + $self->{output}->output_add(long_msg => sprintf("Distributed device '%s' health state is '%s' [service status: %s, operational status: %s]", + $instance, + $items->{$name}->{'health-state'}, + $items->{$name}->{'service-status'}, + $items->{$name}->{'operational-status'}, + )); + + my $exit = $self->get_severity(section => 'device_health', instance => $instance, value => $items->{$name}->{'health-state'}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Distributed device '%s' health state is %s", + $instance, $items->{$name}->{'health-state'})); + } + $exit = $self->get_severity(section => 'device_service', value => $items->{$name}->{'service-status'}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Distributed device '%s' service status is %s", + $instance, $items->{$name}->{'service-status'})); + } + $exit = $self->get_severity(section => 'device_opstatus', value => $items->{$name}->{'operational-status'}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Distributed device '%s' operational status is %s", + $instance, $items->{$name}->{'operational-status'})); + } + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +sub check_filter { + my ($self, %options) = @_; + + foreach (@{$self->{filter}}) { + if ($options{section} =~ /$_->{filter}/) { + if (!defined($options{instance}) && !defined($_->{instance})) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section.")); + return 1; + } elsif (defined($options{instance}) && $options{instance} =~ /$_->{instance}/) { + $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance.")); + return 1; + } + } + } + + return 0; +} + +sub get_severity { + my ($self, %options) = @_; + my $status = 'UNKNOWN'; # default + + if (defined($self->{overload_th}->{$options{section}})) { + foreach (@{$self->{overload_th}->{$options{section}}}) { + if ($options{value} =~ /$_->{filter}/i && + (!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) { + $status = $_->{status}; + return $status; + } + } + } + my $label = defined($options{label}) ? $options{label} : $options{section}; + foreach (@{$thresholds->{$label}}) { + if ($options{value} =~ /$$_[0]/i) { + $status = $$_[1]; + return $status; + } + } + + return $status; +} + +1; + +__END__ + +=head1 MODE + +Check distributed devices for VPlex + +=over 8 + +=item B<--filter> + +Filter some parts (comma seperated list) +Can also exclude specific instance: --filter=component,cluster-1 + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='component_opstatus,CRITICAL,^(?!(in-contact|cluster-in-contact)$)' + +=back + +=cut diff --git a/storage/emc/vplex/restapi/mode/storagevolumes.pm b/storage/emc/vplex/restapi/mode/storagevolumes.pm index 94c088073..fd6a0f01a 100644 --- a/storage/emc/vplex/restapi/mode/storagevolumes.pm +++ b/storage/emc/vplex/restapi/mode/storagevolumes.pm @@ -27,7 +27,7 @@ use warnings; my $thresholds = { volume_health => [ - ['online', 'ok'], + ['ok', 'ok'], ['.*', 'CRITICAL'], ], }; diff --git a/storage/emc/vplex/restapi/plugin.pm b/storage/emc/vplex/restapi/plugin.pm index 1784dc390..40e3e3ab9 100644 --- a/storage/emc/vplex/restapi/plugin.pm +++ b/storage/emc/vplex/restapi/plugin.pm @@ -34,7 +34,7 @@ sub new { %{$self->{modes}} = ( 'psus' => 'storage::emc::vplex::restapi::mode::psus', 'fans' => 'storage::emc::vplex::restapi::mode::fans', - 'distribued-devices' => 'storage::emc::vplex::restapi::mode::distribueddevices', + 'distributed-devices' => 'storage::emc::vplex::restapi::mode::distributeddevices', 'cluster-devices' => 'storage::emc::vplex::restapi::mode::clusterdevices', 'storage-volumes' => 'storage::emc::vplex::restapi::mode::storagevolumes', 'directors' => 'storage::emc::vplex::restapi::mode::directors',