From e04c01b7b7cc8ee6de7cbfec4f229c13fc5d78bd Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Wed, 29 May 2019 10:38:08 +0200 Subject: [PATCH] add eaton ats snmp plugin --- hardware/ats/eaton/snmp/mode/inputlines.pm | 168 ++++++++++++++++++ hardware/ats/eaton/snmp/mode/outputline.pm | 135 ++++++++++++++ hardware/ats/eaton/snmp/mode/system.pm | 193 +++++++++++++++++++++ hardware/ats/eaton/snmp/plugin.pm | 50 ++++++ 4 files changed, 546 insertions(+) create mode 100644 hardware/ats/eaton/snmp/mode/inputlines.pm create mode 100644 hardware/ats/eaton/snmp/mode/outputline.pm create mode 100644 hardware/ats/eaton/snmp/mode/system.pm create mode 100644 hardware/ats/eaton/snmp/plugin.pm diff --git a/hardware/ats/eaton/snmp/mode/inputlines.pm b/hardware/ats/eaton/snmp/mode/inputlines.pm new file mode 100644 index 000000000..61bc33582 --- /dev/null +++ b/hardware/ats/eaton/snmp/mode/inputlines.pm @@ -0,0 +1,168 @@ +# +# Copyright 2019 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::eaton::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 => 'line', type => 1, cb_prefix_output => 'prefix_line_output', message_multiple => 'All input lines are ok', skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{line} = [ + { label => 'voltage', nlabel => 'line.input.voltage.volt', set => { + key_values => [ { name => 'voltage' }, { name => 'display' } ], + output_template => 'Voltage : %.2f V', + perfdatas => [ + { value => 'voltage_absolute', template => '%s', + unit => 'V', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'frequence', nlabel => 'line.input.frequence.hertz', set => { + key_values => [ { name => 'frequency', no_value => -1 } ], + output_template => 'Frequence : %.2f Hz', + perfdatas => [ + { value => 'frequency_absolute', template => '%.2f', + unit => 'Hz', label_extra_instance => 1 }, + ], + } + }, + ]; +} + +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, force_new_perfdata => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $map_input_name = { + 1 => 'source-1', + 2 => 'source-2', +}; + +sub check_ats { + my ($self, %options) = @_; + + return if (scalar(keys %{$self->{line}}) > 0); + + my $mapping = { + atsInputIndex => { oid => '.1.3.6.1.4.1.534.10.1.3.1.1.1', map => $map_input_name }, + atsInputVoltage => { oid => '.1.3.6.1.4.1.534.10.1.3.1.1.2' }, + atsInputFrequency => { oid => '.1.3.6.1.4.1.534.10.1.3.1.1.3' }, + }; + + my $oid_atsInputEntry = '.1.3.6.1.4.1.534.10.1.3.1.1'; + my $snmp_result = $options{snmp}->get_table(oid => $oid_atsInputEntry, nothing_quit => 1); + + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{atsInputIndex}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + $self->{line}->{$result->{atsInputIndex}} = { + display => $result->{atsInputIndex}, + voltage => $result->{atsInputVoltage} * 0.1, + frequency => $result->{atsInputFrequency} * 0.1, + }; + } +} + +sub check_ats2 { + my ($self, %options) = @_; + + my $mapping = { + ats2InputIndex => { oid => '.1.3.6.1.4.1.534.10.2.2.2.1.1', map => $map_input_name }, + ats2InputVoltage => { oid => '.1.3.6.1.4.1.534.10.2.2.2.1.2' }, + ats2InputFrequency => { oid => '.1.3.6.1.4.1.534.10.2.2.2.1.3' }, + }; + + my $oid_ats2InputEntry = '.1.3.6.1.4.1.534.10.2.2.2.1'; + my $snmp_result = $options{snmp}->get_table(oid => $oid_ats2InputEntry); + + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{ats2InputIndex}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + $self->{line}->{$result->{ats2InputIndex}} = { + display => $result->{ats2InputIndex}, + voltage => $result->{ats2InputVoltage} * 0.1, + frequency => $result->{ats2InputFrequency} * 0.1, + }; + } +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{line} = {}; + + $self->check_ats2(%options); + $self->check_ats(%options); + + if (scalar(keys %{$self->{line}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No line found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check input lines. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^voltage$' + +=item B<--warning-*> B<--critical-*> + +Threshold warning. +Can be: 'voltage', 'frequence'. + +=back + +=cut diff --git a/hardware/ats/eaton/snmp/mode/outputline.pm b/hardware/ats/eaton/snmp/mode/outputline.pm new file mode 100644 index 000000000..571b84f4c --- /dev/null +++ b/hardware/ats/eaton/snmp/mode/outputline.pm @@ -0,0 +1,135 @@ +# +# Copyright 2019 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::eaton::snmp::mode::outputline; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'oline', type => 0, cb_prefix_output => 'prefix_line_output', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{oline} = [ + { label => 'voltage', nlabel => 'line.output.voltage.volt', set => { + key_values => [ { name => 'voltage' } ], + output_template => 'Voltage : %.2f V', + perfdatas => [ + { value => 'voltage_absolute', template => '%s', + unit => 'V' }, + ], + } + }, + { label => 'current', nlabel => 'line.current.ampere', set => { + key_values => [ { name => 'current' } ], + output_template => 'current : %s A', + perfdatas => [ + { template => '%s', value => 'current_absolute', + unit => 'A', min => 0 }, + ], + } + }, + ]; +} + +sub prefix_line_output { + my ($self, %options) = @_; + + return "Output line "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $oid_atsOutputVoltage = '.1.3.6.1.4.1.534.10.1.3.2.1.0'; +my $oid_atsOutputCurrent = '.1.3.6.1.4.1.534.10.1.3.2.2.0'; +my $oid_ats2OutputVoltage = '.1.3.6.1.4.1.534.10.2.2.3.1.0'; +my $oid_ats2OutputCurrent = '.1.3.6.1.4.1.534.10.2.2.3.2.0'; + +sub check_ats2 { + my ($self, %options) = @_; + + return if (!defined($options{result}->{$oid_ats2OutputVoltage})); + + $self->{oline} = { + voltage => $options{result}->{$oid_ats2OutputVoltage} * 0.1, + current => $options{result}->{$oid_ats2OutputCurrent} * 0.1 + }; +} + +sub check_ats { + my ($self, %options) = @_; + + return if (defined($self->{oline})); + + $self->{oline} = { + voltage => $options{result}->{$oid_atsOutputVoltage} * 0.1, + current => $options{result}->{$oid_atsOutputCurrent} * 0.1 + }; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ + $oid_atsOutputVoltage, $oid_atsOutputCurrent, + $oid_ats2OutputVoltage, $oid_ats2OutputCurrent, + ], nothing_quit => 1); + $self->check_ats2(result => $snmp_result); + $self->check_ats(result => $snmp_result); +} + +1; + +__END__ + +=head1 MODE + +Check output line. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^voltage$' + +=item B<--warning-*> B<--critical-*> + +Threshold warning. +Can be: 'voltage', 'current'. + +=back + +=cut diff --git a/hardware/ats/eaton/snmp/mode/system.pm b/hardware/ats/eaton/snmp/mode/system.pm new file mode 100644 index 000000000..f9c132903 --- /dev/null +++ b/hardware/ats/eaton/snmp/mode/system.pm @@ -0,0 +1,193 @@ +# +# Copyright 2019 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::eaton::snmp::mode::system; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = 'operation mode : ' . $self->{result_values}->{operation_mode}; + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{operation_mode} = $options{new_datas}->{$self->{instance} . '_operation_mode'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'operation_mode' } ], + 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 => \&catalog_status_threshold, + } + }, + { label => 'temperature', nlabel => 'system.temperature.celsius', set => { + key_values => [ { name => 'temperature' } ], + output_template => 'temperature : %s C', + perfdatas => [ + { label => 'temperature', value => 'temperature_absolute', template => '%s', + unit => 'C' }, + ], + } + }, + { label => 'humidity', nlabel => 'system.humidity.percentage', set => { + key_values => [ { name => 'humidity' } ], + output_template => 'humidity : %s %%', + perfdatas => [ + { label => 'humidity', value => 'humidity_absolute', template => '%s', + unit => '%', min => 9, max => 100 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "unknown-status:s" => { name => 'unknown_status', default => '' }, + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '%{operation_mode} !~ /source1|source2/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => ['warning_status', 'critical_status', 'unknown_status']); +} + +my $map_opmode = { + 1 => 'initialization', + 2 => 'diagnosis', + 3 => 'off', + 4 => 'source1', + 5 => 'source2', + 6 => 'safe', + 7 => 'fault', +}; +my $oid_ats2OperationMode = '.1.3.6.1.4.1.534.10.2.2.4.0'; +my $oid_ats2EnvRemoteTemp = '.1.3.6.1.4.1.534.10.2.5.1.0'; +my $oid_ats2EnvRemoteHumidity = '.1.3.6.1.4.1.534.10.2.5.2.0'; +my $oid_atsMeasureTemperatureC = '.1.3.6.1.4.1.534.10.1.3.3.0'; +my $oid_atsMessureOperationMode = '.1.3.6.1.4.1.534.10.1.3.7.0'; + +sub check_ats2 { + my ($self, %options) = @_; + + return if (!defined($options{result}->{$oid_ats2OperationMode})); + + $self->{global} = { + operation_mode => $map_opmode->{$options{result}->{$oid_ats2OperationMode}}, + temperature => $options{result}->{$oid_ats2EnvRemoteTemp}, + humidity => $options{result}->{$oid_ats2EnvRemoteHumidity} + }; +} + +sub check_ats { + my ($self, %options) = @_; + + return if (defined($self->{global})); + + $self->{global} = { + operation_mode => $map_opmode->{$options{result}->{$oid_atsMessureOperationMode}}, + temperature => $options{result}->{$oid_atsMeasureTemperatureC}, + }; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ + $oid_ats2OperationMode, $oid_ats2EnvRemoteTemp, $oid_ats2EnvRemoteHumidity, + $oid_atsMeasureTemperatureC, $oid_atsMessureOperationMode, + ], nothing_quit => 1); + $self->check_ats2(result => $snmp_result); + $self->check_ats(result => $snmp_result); +} + +1; + +__END__ + +=head1 MODE + +Check system (operation mode, temperature). + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=item B<--unknown-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: operation_mode + +=item B<--warning-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: operation_mode + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{operation_mode} !~ /source1|source2/i'). +Can used special variables like: %{operation_mode} + +=item B<--warning-*> + +Threshold warning. +Can be: 'temperature', 'humidity'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'temperature', 'humidity'. + +=back + +=cut diff --git a/hardware/ats/eaton/snmp/plugin.pm b/hardware/ats/eaton/snmp/plugin.pm new file mode 100644 index 000000000..fe6b812aa --- /dev/null +++ b/hardware/ats/eaton/snmp/plugin.pm @@ -0,0 +1,50 @@ +# +# Copyright 2019 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::eaton::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '0.1'; + %{$self->{modes}} = ( + 'input-lines' => 'hardware::ats::eaton::snmp::mode::inputlines', + 'system' => 'hardware::ats::eaton::snmp::mode::system', + 'output-line' => 'hardware::ats::eaton::snmp::mode::outputline', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Eaton ATS in SNMP. + +=cut