From e011249ad9de2fb4bb729c93b82dbd45711160dc Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Thu, 17 Nov 2016 15:01:47 +0100 Subject: [PATCH] + Refactor APC ATS plugin --- hardware/ats/apc/mode/entity.pm | 90 ------- hardware/ats/apc/mode/input.pm | 198 -------------- hardware/ats/apc/mode/psu.pm | 117 --------- hardware/ats/apc/mode/source.pm | 132 ---------- .../ats/apc/snmp/mode/components/entity.pm | 81 ++++++ hardware/ats/apc/snmp/mode/devicestatus.pm | 110 ++++++++ hardware/ats/apc/snmp/mode/inputlines.pm | 148 +++++++++++ hardware/ats/apc/snmp/mode/outputlines.pm | 248 ++++++++++++++++++ hardware/ats/apc/{ => snmp}/plugin.pm | 11 +- 9 files changed, 592 insertions(+), 543 deletions(-) delete mode 100644 hardware/ats/apc/mode/entity.pm delete mode 100644 hardware/ats/apc/mode/input.pm delete mode 100644 hardware/ats/apc/mode/psu.pm delete mode 100644 hardware/ats/apc/mode/source.pm create mode 100644 hardware/ats/apc/snmp/mode/components/entity.pm create mode 100644 hardware/ats/apc/snmp/mode/devicestatus.pm create mode 100644 hardware/ats/apc/snmp/mode/inputlines.pm create mode 100644 hardware/ats/apc/snmp/mode/outputlines.pm rename hardware/ats/apc/{ => snmp}/plugin.pm (73%) diff --git a/hardware/ats/apc/mode/entity.pm b/hardware/ats/apc/mode/entity.pm deleted file mode 100644 index d483d7d01..000000000 --- a/hardware/ats/apc/mode/entity.pm +++ /dev/null @@ -1,90 +0,0 @@ -# -# Copyright 2016 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 hardware::ats::apc::mode::entity; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -my %switch_states = ( - 1 => ['fail', 'CRITICAL'], - 2 => ['ok', 'OK'], -); - -my %hardware_states = ( - 1 => ['fail', 'CRITICAL'], - 2 => ['ok', 'OK'], -); - -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 => - { - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my $oid_atsStatusSwitchStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.10.0'; - my $oid_atsStatusHardwareStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.16.0'; - - $self->{results} = $self->{snmp}->get_leef(oids => [$oid_atsStatusSwitchStatus, $oid_atsStatusHardwareStatus], nothing_quit => 1); - - my $exit1 = ${$switch_states{$self->{results}->{$oid_atsStatusSwitchStatus}}}[1]; - my $exit2 = ${$hardware_states{$self->{results}->{$oid_atsStatusHardwareStatus}}}[1]; - my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2 ]); - - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Hardware state is '%s' , Switch state is '%s'", - ${$hardware_states{$self->{results}->{$oid_atsStatusHardwareStatus}}}[0], ${$switch_states{$self->{results}->{$oid_atsStatusSwitchStatus}}}[0])); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check APC ATS entity (hardware and switch state). - -=over 8 - -=back - -=cut - diff --git a/hardware/ats/apc/mode/input.pm b/hardware/ats/apc/mode/input.pm deleted file mode 100644 index 45b6d9f64..000000000 --- a/hardware/ats/apc/mode/input.pm +++ /dev/null @@ -1,198 +0,0 @@ -# -# Copyright 2016 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 hardware::ats::apc::mode::input; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -my %oids = ( - '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.3' => { counter => 'voltage', no_present => 0 }, # in mVolt outletVoltage - '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.6' => { counter => 'current', no_present => 0 }, # in mA outletCurrent - '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.9' => { counter => 'power', no_present => 0 }, # in Watt outletWatts -); - -my $oid_inputs = '.1.3.6.1.4.1.318.1.1.8.5.3.3.1'; - -my $maps_counters = { - voltage => { thresholds => { - warning_voltage => { label => 'warning-voltage', exit_value => 'warning' }, - critical_voltage => { label => 'critical-voltage', exit_value => 'critical' }, - }, - output_msg => 'Voltage : %d V', - factor => 1, unit => 'V', - }, - current => { thresholds => { - warning_current => { label => 'warning-current', exit_value => 'warning' }, - critical_current => { label => 'critical-current', exit_value => 'critical' }, - }, - output_msg => 'Current : %d A', - factor => 1, unit => 'A', - }, - power => { thresholds => { - warning_power => { label => 'warning-power', exit_value => 'warning' }, - critical_power => { label => 'critical-power', exit_value => 'critical' }, - }, - output_msg => 'Power : %d W', - factor => 1, unit => 'W', - }, -}; - -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 => - { - }); - foreach (keys %{$maps_counters}) { - foreach my $name (keys %{$maps_counters->{$_}->{thresholds}}) { - $options{options}->add_options(arguments => { - $maps_counters->{$_}->{thresholds}->{$name}->{label} . ':s' => { name => $name }, - }); - } - } - - $self->{counters_value} = {}; - $self->{instances_done} = {}; - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - foreach (keys %{$maps_counters}) { - foreach my $name (keys %{$maps_counters->{$_}->{thresholds}}) { - if (($self->{perfdata}->threshold_validate(label => $maps_counters->{$_}->{thresholds}->{$name}->{label}, value => $self->{option_results}->{$name})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong " . $maps_counters->{$_}->{thresholds}->{$name}->{label} . " threshold '" . $self->{option_results}->{$name} . "'."); - $self->{output}->option_exit(); - } - } - } -} - -sub build_values { - my ($self, %options) = @_; - my $counters_value = {}; - my $instance = undef; - - foreach my $oid (keys %oids) { - #if ($options{current} =~ /^$oid_inputs\.(.*)/) { - if ($options{current} =~ /^$oid\.(.*)/) { - $instance = $1; - #$instance =~ s/1\.1\.3\.//g; - last; - } - } - - # Skip already done - if (!defined($instance) || defined($self->{instances_done}->{$instance})) { - return 0; - } - - $self->{instances_done}->{$instance} = 1; - $self->{counters_value}->{$instance} = {}; - foreach my $oid (keys %oids) { - my $full_oid = $oid . '.' . $instance; - $self->{counters_value}->{$instance}->{$oids{$oid}->{counter}} = defined($options{result}->{$oid . '.' . $instance}) ? $options{result}->{$oid . '.' . $instance} : 0; - } -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my $result = $self->{snmp}->get_table(oid => $oid_inputs, nothing_quit => 1); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - $self->build_values(current => $key, result => $result); - } - - my $num = scalar(keys %{$self->{instances_done}}); - foreach my $instance (keys %{$self->{instances_done}}) { - my $instance_input = $instance; - $instance_input =~ s/(\d+)\.\d+\.\d+/#$1/g; - - my @exits; - foreach (keys %{$maps_counters}) { - foreach my $name (keys %{$maps_counters->{$_}->{thresholds}}) { - if (defined($self->{counters_value}->{$instance}->{$_}) && $self->{counters_value}->{$instance}->{$_} != 0) { - push @exits, $self->{perfdata}->threshold_check(value => $self->{counters_value}->{$instance}->{$_}*$maps_counters->{$_}->{factor}, threshold => [ { label => $maps_counters->{$_}->{thresholds}->{$name}->{label}, 'exit_litteral' => $maps_counters->{$_}->{thresholds}->{$name}->{exit_value} }]); - } - } - } - - my $exit = $self->{output}->get_most_critical(status => [ @exits ]); - my $extra_label = ''; - $extra_label = '_' . $instance_input if ($num > 1); - - my $str_input = "Input '$instance_input' "; - my $str_append = ''; - foreach (keys %{$maps_counters}) { - next if (!defined($self->{counters_value}->{$instance}->{$_}) || $self->{counters_value}->{$instance}->{$_} <= 0); - - $str_input .= $str_append . sprintf($maps_counters->{$_}->{output_msg}, $self->{counters_value}->{$instance}->{$_} * $maps_counters->{$_}->{factor}); - $str_append = ', '; - my ($warning, $critical); - foreach my $name (keys %{$maps_counters->{$_}->{thresholds}}) { - $warning = $self->{perfdata}->get_perfdata_for_output(label => $maps_counters->{$_}->{thresholds}->{$name}->{label}) if ($maps_counters->{$_}->{thresholds}->{$name}->{exit_value} eq 'warning'); - $critical = $self->{perfdata}->get_perfdata_for_output(label => $maps_counters->{$_}->{thresholds}->{$name}->{label}) if ($maps_counters->{$_}->{thresholds}->{$name}->{exit_value} eq 'critical'); - } - - $self->{output}->perfdata_add(label => $_ . $extra_label, unit => $maps_counters->{$_}->{unit}, - value => sprintf("%.2f", $self->{counters_value}->{$instance}->{$_} * $maps_counters->{$_}->{factor}), - warning => $warning, - critical => $critical); - } - $self->{output}->output_add(severity => $exit, - short_msg => $str_input); - } - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check Outlet metrics (voltage, current and power). - -=over 8 - -=item B<--warning-*> - -Threshold warning. -Can be: 'voltage', 'current', 'power'. - -=item B<--critical-*> - -Threshold critical. -Can be: 'voltage', 'current', 'power'. - -=back - -=cut diff --git a/hardware/ats/apc/mode/psu.pm b/hardware/ats/apc/mode/psu.pm deleted file mode 100644 index e6806803f..000000000 --- a/hardware/ats/apc/mode/psu.pm +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright 2016 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 hardware::ats::apc::mode::psu; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -my %states = ( - 1 => ['atsPowerSupplyFailure', 'CRITICAL'], - 2 => ['atsPowerSupplyOK', 'OK'], -); - - -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 => - { - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my $oid_atsStatus5VPowerSupply = '.1.3.6.1.4.1.318.1.1.8.5.1.5.0'; - my $oid_atsStatus24VPowerSupply = '.1.3.6.1.4.1.318.1.1.8.5.1.6.0'; - my $oid_atsStatus24VSourceBPowerSupply = '.1.3.6.1.4.1.318.1.1.8.5.1.7.0'; - my $oid_atsStatusPlus12VPowerSupply = '.1.3.6.1.4.1.318.1.1.8.5.1.8.0'; - my $oid_atsStatusMinus12VPowerSupply = '.1.3.6.1.4.1.318.1.1.8.5.1.9.0'; - - $self->{results} = $self->{snmp}->get_leef(oids => [$oid_atsStatus5VPowerSupply, $oid_atsStatus24VPowerSupply, $oid_atsStatus24VSourceBPowerSupply, $oid_atsStatusPlus12VPowerSupply, $oid_atsStatusMinus12VPowerSupply], nothing_quit => 1); - - my $exit1 = ${$states{$self->{results}->{$oid_atsStatus5VPowerSupply}}}[1]; - my $exit2 = ${$states{$self->{results}->{$oid_atsStatus24VPowerSupply}}}[1]; - my $exit3 = ${$states{$self->{results}->{$oid_atsStatus24VSourceBPowerSupply}}}[1]; - my $exit4 = ${$states{$self->{results}->{$oid_atsStatusPlus12VPowerSupply}}}[1]; - my $exit5 = ${$states{$self->{results}->{$oid_atsStatusMinus12VPowerSupply}}}[1]; - - $self->{output}->output_add(severity => 'OK', - short_msg => 'All power supplies are ok'); - - $self->{output}->output_add(long_msg => sprintf("Power supply 5V state is '%s'", ${$states{$self->{results}->{$oid_atsStatus5VPowerSupply}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Power supply 24V state for source A is '%s'", ${$states{$self->{results}->{$oid_atsStatus24VPowerSupply}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Power supply 24V state for source B is '%s'", ${$states{$self->{results}->{$oid_atsStatus24VSourceBPowerSupply}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Power supply +12V state is '%s'", ${$states{$self->{results}->{$oid_atsStatusPlus12VPowerSupply}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Power supply -12V state is '%s'", ${$states{$self->{results}->{$oid_atsStatusMinus12VPowerSupply}}}[0])); - - if (!$self->{output}->is_status(value => $exit1, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit1, - short_msg => sprintf("Power supply 5V state is '%s'", ${$states{$self->{results}->{$oid_atsStatus5VPowerSupply}}}[0])); - } - if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit2, - short_msg => sprintf("Power supply 24V state for source A is '%s'", ${$states{$self->{results}->{$oid_atsStatus24VPowerSupply}}}[0])); - } - if (!$self->{output}->is_status(value => $exit3, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit3, - short_msg => sprintf("Power supply 24V state for source B is '%s'", ${$states{$self->{results}->{$oid_atsStatus24VSourceBPowerSupply}}}[0])); - } - if (!$self->{output}->is_status(value => $exit4, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit4, - short_msg => sprintf("Power supply +12V state is '%s'", ${$states{$self->{results}->{$oid_atsStatusPlus12VPowerSupply}}}[0])); - } - if (!$self->{output}->is_status(value => $exit5, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit5, - short_msg => sprintf("Power supply -12V state is '%s'", ${$states{$self->{results}->{$oid_atsStatusMinus12VPowerSupply}}}[0])); - } - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check APC ATS power supplies. - -=over 8 - -=back - -=cut - diff --git a/hardware/ats/apc/mode/source.pm b/hardware/ats/apc/mode/source.pm deleted file mode 100644 index a621e8132..000000000 --- a/hardware/ats/apc/mode/source.pm +++ /dev/null @@ -1,132 +0,0 @@ -# -# Copyright 2016 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 hardware::ats::apc::mode::source; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -my %selected_source = ( - 1 => 'sourceA', - 2 => 'sourceB', -); - -my %redundancy_states = ( - 1 => ['atsRedundancyLost', 'CRITICAL'], - 2 => ['atsFullyRedundant', 'OK'], -); - -my %sourceA_states = ( - 1 => ['fail', 'CRITICAL'], - 2 => ['ok', 'OK'], -); - -my %sourceB_states = ( - 1 => ['fail', 'CRITICAL'], - 2 => ['ok', 'OK'], -); - -my %phaseSync_states = ( - 1 => ['inSync', 'OK'], - 2 => ['outOfSync', 'CRITICAL'], -); - - -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 => - { - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my $oid_atsStatusSelectedSource = '.1.3.6.1.4.1.318.1.1.8.5.1.2.0'; - my $oid_atsStatusRedundancyStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.3.0'; - my $oid_atsStatusSourceAStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.12.0'; - my $oid_atsStatusSourceBStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.13.0'; - my $oid_atsStatusPhaseSyncStatus = '.1.3.6.1.4.1.318.1.1.8.5.1.14.0'; - - $self->{results} = $self->{snmp}->get_leef(oids => [$oid_atsStatusSelectedSource, $oid_atsStatusSelectedSource, $oid_atsStatusRedundancyStatus, $oid_atsStatusSourceAStatus, $oid_atsStatusSourceBStatus, $oid_atsStatusPhaseSyncStatus], nothing_quit => 1); - - my $exit1 = ${$redundancy_states{$self->{results}->{$oid_atsStatusRedundancyStatus}}}[1]; - my $exit2 = ${$sourceA_states{$self->{results}->{$oid_atsStatusSourceAStatus}}}[1]; - my $exit3 = ${$sourceB_states{$self->{results}->{$oid_atsStatusSourceBStatus}}}[1]; - my $exit4 = ${$phaseSync_states{$self->{results}->{$oid_atsStatusPhaseSyncStatus}}}[1]; - - $self->{output}->output_add(severity => 'OK', - short_msg => 'All sources are ok'); - - $self->{output}->output_add(long_msg => sprintf("Selected source is '%s'", $selected_source{$self->{results}->{$oid_atsStatusSelectedSource}})); - $self->{output}->output_add(long_msg => sprintf("Redundancy state is '%s'", ${$redundancy_states{$self->{results}->{$oid_atsStatusRedundancyStatus}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Source A state is '%s'", ${$sourceA_states{$self->{results}->{$oid_atsStatusSourceAStatus}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Source B state is '%s'", ${$sourceB_states{$self->{results}->{$oid_atsStatusSourceBStatus}}}[0])); - $self->{output}->output_add(long_msg => sprintf("Phase sync is '%s'", ${$phaseSync_states{$self->{results}->{$oid_atsStatusPhaseSyncStatus}}}[0])); - - if (!$self->{output}->is_status(value => $exit1, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit1, - short_msg => sprintf("Redundancy state is '%s'", ${$redundancy_states{$self->{results}->{$oid_atsStatusRedundancyStatus}}}[0])); - } - if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit2, - short_msg => sprintf("Source A state is '%s'", ${$sourceA_states{$self->{results}->{$oid_atsStatusSourceAStatus}}}[0])); - } - if (!$self->{output}->is_status(value => $exit3, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit3, - short_msg => sprintf("Source B state is '%s'", ${$sourceB_states{$self->{results}->{$oid_atsStatusSourceBStatus}}}[0])); - } - if (!$self->{output}->is_status(value => $exit4, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit4, - short_msg => sprintf("Phase sync is '%s'", ${$phaseSync_states{$self->{results}->{$oid_atsStatusPhaseSyncStatus}}}[0])); - } - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check APC ATS sources. - -=over 8 - -=back - -=cut - diff --git a/hardware/ats/apc/snmp/mode/components/entity.pm b/hardware/ats/apc/snmp/mode/components/entity.pm new file mode 100644 index 000000000..d74f2bb6c --- /dev/null +++ b/hardware/ats/apc/snmp/mode/components/entity.pm @@ -0,0 +1,81 @@ +# +# Copyright 2016 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 hardware::ats::apc::snmp::mode::components::entity; + +use strict; +use warnings; + +my %map_com = (1 => 'atsNeverDiscovered', 2 => 'atsCommEstablished', 3 => 'atsCommLost'); +my %map_redunt = (1 => 'atsRedundancyLost', 2 => 'atsFullyRedundant'); +my %map_current = (1 => 'atsOverCurrent', 2 => 'atsCurrentOK'); +my %map_power = (1 => 'atsPowerSupplyFailure', 2 => 'atsPowerSupplyOK'); +my %map_fail = (1 => 'fail', 2 => 'ok'); +my %map_sync = (1 => 'inSync', 2 => 'outOfSync'); + +my $mapping = { + atsStatusCommStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.1', map => \%map_com, label => 'CommStatus' }, + atsStatusRedundancyState => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.3', map => \%map_redunt, label => 'RedundancyState' }, + atsStatusOverCurrentState => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.4', map => \%map_current, label => 'OverCurrentState' }, + atsStatus5VPowerSupply => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.5', map => \%map_power, label => '5VPowerSupply' }, + atsStatus24VPowerSupply => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.6', map => \%map_power, label => '24VPowerSupply' }, + atsStatus24VSourceBPowerSupply => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.7', map => \%map_power, label => '24VSourceBPowerSupply' }, + atsStatusPlus12VPowerSupply => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.8', map => \%map_power, label => 'Plus12VPowerSupply' }, + atsStatusMinus12VPowerSupply => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.9', map => \%map_power, label => 'Minus12VPowerSupply' }, + atsStatusSwitchStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.10', map => \%map_fail, label => 'SwitchStatus' }, + atsStatusSourceAStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.12', map => \%map_fail, label => 'SourceAStatus' }, + atsStatusSourceBStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.13', map => \%map_fail, label => 'SourceBStatus' }, + atsStatusPhaseSyncStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.14', map => \%map_sync, label => 'PhaseSyncStatus' }, + atsStatusVoltageOutStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.15', map => \%map_fail, label => 'VoltageOutStatus' }, + atsStatusHardwareStatus => { oid => '.1.3.6.1.4.1.318.1.1.8.5.1.16', map => \%map_fail, label => 'HardwareStatus' }, +}; + +my $oid_atsStatusDeviceStatus = '.1.3.6.1.4.1.318.1.1.8.5.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_atsStatusDeviceStatus }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking entities"); + $self->{components}->{entity} = {name => 'entities', total => 0, skip => 0}; + return if ($self->check_filter(section => 'entity')); + + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_atsStatusDeviceStatus}, instance => '0'); + foreach (sort keys %{$mapping}) { + next if ($self->check_filter(section => 'entity', instance => $mapping->{$_}->{label})); + $self->{components}->{entity}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("entity '%s' status is '%s' [instance = %s]", + $mapping->{$_}->{label}, $result->{$_}, $mapping->{$_}->{label})); + + my $exit = $self->get_severity(section => 'entity', instance => $mapping->{$_}->{label}, value => $result->{$_}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Entity '%s' status is '%s'", $mapping->{$_}->{label}, $result->{$_})); + } + } +} + +1; \ No newline at end of file diff --git a/hardware/ats/apc/snmp/mode/devicestatus.pm b/hardware/ats/apc/snmp/mode/devicestatus.pm new file mode 100644 index 000000000..0f885ecfe --- /dev/null +++ b/hardware/ats/apc/snmp/mode/devicestatus.pm @@ -0,0 +1,110 @@ +# +# Copyright 2016 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 hardware::ats::apc::snmp::mode::devicestatus; + +use base qw(centreon::plugins::templates::hardware); + +use strict; +use warnings; + +sub set_system { + my ($self, %options) = @_; + + $self->{regexp_threshold_overload_check_section_option} = '^(entity)$'; + + $self->{cb_hook2} = 'snmp_execute'; + + $self->{thresholds} = { + entity => [ + ['atsPowerSupplyFailure', 'CRITICAL'], + ['atsPowerSupplyOK', 'OK'], + ['atsOverCurrent', 'CRITICAL'], + ['atsCurrentOK', 'OK'], + ['atsRedundancyLost', 'CRITICAL'], + ['atsFullyRedundant', 'OK'], + ['atsNeverDiscovered', 'OK'], + ['atsCommEstablished', 'OK'], + ['atsCommLost', 'CRITICAL'], + ['fail', 'CRITICAL'], + ['ok', 'OK'], + ['inSync', 'OK'], + ['outOfSync', 'CRITICAL'], + ], + }; + + $self->{components_path} = 'hardware::ats::apc::snmp::mode::components'; + $self->{components_module} = ['entity']; +} + +sub snmp_execute { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_absent => 1, no_performance => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +1; + +__END__ + +=head1 MODE + +Check device status. + +=over 8 + +=item B<--component> + +Which component to check (Default: '.*'). +Can be: 'entity'. + +=item B<--filter> + +Exclude some parts (comma seperated list) (Example: --filter=entity) +Can also exclude specific instance: --filter=entity,CommStatus + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=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='entity,SourceBStatus,WARNING,fail' + +=back + +=cut \ No newline at end of file diff --git a/hardware/ats/apc/snmp/mode/inputlines.pm b/hardware/ats/apc/snmp/mode/inputlines.pm new file mode 100644 index 000000000..d03b10fd1 --- /dev/null +++ b/hardware/ats/apc/snmp/mode/inputlines.pm @@ -0,0 +1,148 @@ +# +# Copyright 2016 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 hardware::ats::apc::snmp::mode::inputlines; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'input', type => 1, cb_prefix_output => 'prefix_line_output', message_multiple => 'All input lines are ok', skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{input} = [ + { label => 'voltage', set => { + key_values => [ { name => 'atsInputVoltage' }, { name => 'display' } ], + output_template => 'Voltage : %.2f V', + perfdatas => [ + { label => 'voltage', value => 'atsInputVoltage_absolute', template => '%s', + unit => 'V', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'current', set => { + key_values => [ { name => 'atsInputCurrent' }, { name => 'display' } ], + output_template => 'Current : %.2f A', + perfdatas => [ + { label => 'current', value => 'atsInputCurrent_absolute', template => '%s', + unit => 'A', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'power', set => { + key_values => [ { name => 'atsInputPower' }, { name => 'display' } ], + output_template => 'Power : %.2f W', + perfdatas => [ + { label => 'power', value => 'atsInputPower_absolute', template => '%s', + unit => 'W', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_line_output { + my ($self, %options) = @_; + + return "Input Line '" . $options{instance_value}->{display} . "' "; +} + +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 => + { + }); + + return $self; +} + +my $mapping = { + atsInputVoltage => { oid => '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.3' }, + atsInputCurrent => { oid => '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.6' }, + atsInputPower => { oid => '.1.3.6.1.4.1.318.1.1.8.5.3.3.1.9' }, +}; +my $mapping2 = { + atsInputName => { oid => '.1.3.6.1.4.1.318.1.1.8.5.3.2.1.6' }, +}; +my $oid_atsInputPhaseEntry = '.1.3.6.1.4.1.318.1.1.8.5.3.3.1'; + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_atsInputPhaseEntry }, + { oid => $mapping2->{atsInputName}->{oid} }, + ], + nothing_quit => 1); + + $self->{input} = {}; + foreach my $oid (keys %{$results->{$oid_atsInputPhaseEntry}}) { + next if ($oid !~ /^$mapping->{atsInputVoltage}->{oid}\.(\d+)\.(.*)$/); + my ($input_index, $phase_index) = ($1, $2); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results->{$oid_atsInputPhaseEntry}, instance => $input_index . '.' . $phase_index); + my $result2 = $options{snmp}->map_instance(mapping => $mapping2, results => $results->{$mapping2->{atsInputName}->{oid}}, instance => $input_index); + + my $name = defined($result2->{atsInputName}) && $result2->{atsInputName} ne '' ? $result2->{atsInputName} : $input_index; + $name .= '.' . $phase_index; + $self->{input}->{$name} = { display => $name }; + foreach (keys %{$mapping}) { + $result->{$_} = undef if (defined($result->{$_}) && $result->{$_} == -1); + $self->{input}->{$name}->{$_} = $result->{$_}; + } + } +} + +1; + +__END__ + +=head1 MODE + +Check input phase metrics (voltage, current and power). + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^power$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'voltage', 'current', 'power'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'voltage', 'current', 'power'. + +=back + +=cut diff --git a/hardware/ats/apc/snmp/mode/outputlines.pm b/hardware/ats/apc/snmp/mode/outputlines.pm new file mode 100644 index 000000000..f21e76b65 --- /dev/null +++ b/hardware/ats/apc/snmp/mode/outputlines.pm @@ -0,0 +1,248 @@ +# +# Copyright 2016 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 hardware::ats::apc::snmp::mode::outputlines; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'oline', type => 1, cb_prefix_output => 'prefix_line_output', message_multiple => 'All output lines are ok', skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{oline} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'atsOutputPhaseState' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_threshold_output'), + } + }, + { label => 'voltage', set => { + key_values => [ { name => 'atsOutputVoltage' }, { name => 'display' } ], + output_template => 'Voltage : %.2f V', + perfdatas => [ + { label => 'voltage', value => 'atsOutputVoltage_absolute', template => '%s', + unit => 'V', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'current', set => { + key_values => [ { name => 'atsOutputCurrent' }, { name => 'display' } ], + output_template => 'Current : %.2f A', + perfdatas => [ + { label => 'current', value => 'atsOutputCurrent_absolute', template => '%s', + unit => 'A', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'power', set => { + key_values => [ { name => 'atsOutputPower' }, { name => 'display' } ], + output_template => 'Power : %.2f W', + perfdatas => [ + { label => 'power', value => 'atsOutputPower_absolute', template => '%s', + unit => 'W', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'load', set => { + key_values => [ { name => 'atsOutputLoad' }, { name => 'display' } ], + output_template => 'Load : %.2f VA', + perfdatas => [ + { label => 'load', value => 'atsOutputLoad_absolute', template => '%s', + unit => 'VA', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'load-capacity', set => { + key_values => [ { name => 'atsOutputPercentLoad' }, { name => 'display' } ], + output_template => 'Load capacity : %.2f %%', + perfdatas => [ + { label => 'load_capacity', value => 'atsOutputPercentLoad_absolute', template => '%s', + unit => '%', label_extra_instance => 1, instance_use => 'display_absolute', min => 0, max => 100 }, + ], + } + }, + ]; +} + +my $instance_mode; + +sub custom_threshold_output { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + my $msg = 'Status : ' . $self->{result_values}->{status}; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_atsOutputPhaseState'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub prefix_line_output { + my ($self, %options) = @_; + + return "Output Line '" . $options{instance_value}->{display} . "' "; +} + +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 => + { + "warning-status:s" => { name => 'warning_status', default => '%{status} =~ /nearoverload/' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /lowload|overload/' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +my %map_state = (1 => 'normal', 2 => 'lowload', 3 => 'nearoverload', 4 => 'overload'); + +my $mapping = { + atsOutputVoltage => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.3', factor => 1 }, + atsOutputCurrent => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.4', factor => 0.1 }, + atsOutputLoad => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.7', factor => 1 }, + atsOutputPercentLoad => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.10', factor => 1 }, + atsOutputPower => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.13', factor => 1 }, + atsOutputPhaseState => { oid => '.1.3.6.1.4.1.318.1.1.8.5.4.3.1.19', map => \%map_state }, +}; + +my $oid_atsOutputPhaseEntry = '.1.3.6.1.4.1.318.1.1.8.5.4.3.1'; + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_atsOutputPhaseEntry }, + ], + nothing_quit => 1); + + $self->{oline} = {}; + foreach my $oid (keys %{$results->{$oid_atsOutputPhaseEntry}}) { + next if ($oid !~ /^$mapping->{atsOutputVoltage}->{oid}\.(\d+)\.(.*)$/); + my ($output_index, $phase_index) = ($1, $2); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results->{$oid_atsOutputPhaseEntry}, instance => $output_index . '.' . $phase_index); + + my $name = $output_index . '.' . $phase_index; + $self->{oline}->{$name} = { display => $name }; + foreach (keys %{$mapping}) { + if (defined($mapping->{$_}->{factor})) { + $result->{$_} = undef if (defined($result->{$_}) && $result->{$_} == -1); + $result->{$_} *= $mapping->{$_}->{factor} if (defined($result->{$_})); + } + $self->{oline}->{$name}->{$_} = $result->{$_}; + } + } +} + +1; + +__END__ + +=head1 MODE + +Check output phase metrics. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^power$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'voltage', 'current', 'power', 'load', 'load-capacity'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'voltage', 'current', 'power', 'load', 'load-capacity'. + +=item B<--warning-status> + +Set warning threshold for status (Default: '%{status} =~ /nearoverload/'). +Can used special variables like: %{status}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /lowload|overload/'). +Can used special variables like: %{status}, %{display} + +=back + +=cut diff --git a/hardware/ats/apc/plugin.pm b/hardware/ats/apc/snmp/plugin.pm similarity index 73% rename from hardware/ats/apc/plugin.pm rename to hardware/ats/apc/snmp/plugin.pm index 4666c964b..33c6feca9 100644 --- a/hardware/ats/apc/plugin.pm +++ b/hardware/ats/apc/snmp/plugin.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package hardware::ats::apc::plugin; +package hardware::ats::apc::snmp::plugin; use strict; use warnings; @@ -31,10 +31,9 @@ sub new { $self->{version} = '0.1'; %{$self->{modes}} = ( - 'entity' => 'hardware::ats::apc::mode::entity', - 'source' => 'hardware::ats::apc::mode::source', - 'psu' => 'hardware::ats::apc::mode::psu', - 'input' => 'hardware::ats::apc::mode::input', + 'device-status' => 'hardware::ats::apc::snmp::mode::devicestatus', + 'input-lines' => 'hardware::ats::apc::snmp::mode::inputlines', + 'output-lines' => 'hardware::ats::apc::snmp::mode::outputlines', ); return $self; @@ -46,6 +45,6 @@ __END__ =head1 PLUGIN DESCRIPTION -Check APC ATS in SNMP (PowerNet-MIB). +Check APC ATS in SNMP. =cut