From ad5ff802a3223a2d5e2df03f4fc117fc65a3ab19 Mon Sep 17 00:00:00 2001 From: qgarnier Date: Mon, 28 Aug 2017 14:26:06 +0200 Subject: [PATCH] wip on isam alcatel --- .../alcatel/isam/snmp/mode/hubsapusage.pm | 374 ++++++++++++++++++ .../alcatel/isam/snmp/mode/listhubsap.pm | 124 ++++++ .../alcatel/isam/snmp/mode/vlantraffic.pm | 337 ---------------- .../network/alcatel/isam/snmp/plugin.pm | 3 +- 4 files changed, 500 insertions(+), 338 deletions(-) create mode 100644 centreon-plugins/network/alcatel/isam/snmp/mode/hubsapusage.pm create mode 100644 centreon-plugins/network/alcatel/isam/snmp/mode/listhubsap.pm delete mode 100644 centreon-plugins/network/alcatel/isam/snmp/mode/vlantraffic.pm diff --git a/centreon-plugins/network/alcatel/isam/snmp/mode/hubsapusage.pm b/centreon-plugins/network/alcatel/isam/snmp/mode/hubsapusage.pm new file mode 100644 index 000000000..43c1e0503 --- /dev/null +++ b/centreon-plugins/network/alcatel/isam/snmp/mode/hubsapusage.pm @@ -0,0 +1,374 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::alcatel::isam::snmp::mode::hubsapusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'sap', type => 1, cb_prefix_output => 'prefix_sap_output', message_multiple => 'All SAP are ok', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{sap} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'status' }, { name => 'admin' }, { 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_status_threshold'), + } + }, + { label => 'in-traffic', set => { + key_values => [ { name => 'in', diff => 1 }, { name => 'display' } ], + per_second => 1, + closure_custom_calc => $self->can('custom_sap_calc'), closure_custom_calc_extra_options => { label_ref => 'in' }, + closure_custom_output => $self->can('custom_sap_output'), + closure_custom_perfdata => $self->can('custom_sap_perfdata'), + closure_custom_threshold_check => $self->can('custom_qsap_threshold'), + } + }, + { label => 'out-traffic', set => { + key_values => [ { name => 'out', diff => 1 }, { name => 'display' } ], + per_second => 1, + closure_custom_calc => $self->can('custom_sap_calc'), closure_custom_calc_extra_options => { label_ref => 'out' }, + closure_custom_output => $self->can('custom_sap_output'), + closure_custom_perfdata => $self->can('custom_sap_perfdata'), + closure_custom_threshold_check => $self->can('custom_sap_threshold'), + } + }, + ]; +} + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + my $label = $self->{label}; + $label =~ s/-/_/g; + if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'critical_' . $label}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'warning_' . $label}") { + $status = 'warning'; + } + + $instance_mode->{last_status} = 0; + if ($self->{result_values}->{admin} eq 'up') { + $instance_mode->{last_status} = 1; + } + }; + 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} . ' (admin: ' . $self->{result_values}->{admin} . ')'; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{admin} = $options{new_datas}->{$self->{instance} . '_admin'}; + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub custom_sap_perfdata { + my ($self, %options) = @_; + + my $extra_label = ''; + if (!defined($options{extra_instance}) || $options{extra_instance} != 0) { + $extra_label .= '_' . $self->{result_values}->{display}; + } + + my ($warning, $critical); + if ($instance_mode->{option_results}->{units_traffic} eq '%' && defined($self->{result_values}->{speed})) { + $warning = $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{speed}, cast_int => 1); + $critical = $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{speed}, cast_int => 1); + } elsif ($instance_mode->{option_results}->{units_traffic} eq 'b/s') { + $warning = $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}); + $critical = $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}); + } + + $self->{output}->perfdata_add(label => 'traffic_' . $self->{result_values}->{label} . $extra_label, unit => 'b/s', + value => sprintf("%.2f", $self->{result_values}->{traffic}), + warning => $warning, + critical => $critical, + min => 0, max => $self->{result_values}->{speed}); +} + +sub custom_sap_threshold { + my ($self, %options) = @_; + + my $exit = 'ok'; + if ($instance_mode->{option_results}->{units_traffic} eq '%' && defined($self->{result_values}->{speed})) { + $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{traffic_prct}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + } elsif ($instance_mode->{option_results}->{units_traffic} eq 'b/s') { + $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{traffic}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + } + return $exit; +} + +sub custom_sap_output { + my ($self, %options) = @_; + + my ($traffic_value, $traffic_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{traffic}, network => 1); + my ($total_value, $total_unit); + if (defined($self->{result_values}->{speed}) && $self->{result_values}->{speed} =~ /[0-9]/) { + ($total_value, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{speed}, network => 1); + } + + my $msg = sprintf("Traffic %s : %s/s (%s on %s)", + ucfirst($self->{result_values}->{label}), $traffic_value . $traffic_unit, + defined($self->{result_values}->{traffic_prct}) ? sprintf("%.2f%%", $self->{result_values}->{traffic_prct}) : '-', + defined($total_value) ? $total_value . $total_unit : '-'); + return $msg; +} + +sub custom_sap_calc { + my ($self, %options) = @_; + + return -10 if (defined($instance_mode->{last_status}) && $instance_mode->{last_status} == 0); + $self->{result_values}->{label} = $options{extra_options}->{label_ref}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{traffic} = ($options{new_datas}->{$self->{instance} . '_' . $self->{result_values}->{label}} - $options{old_datas}->{$self->{instance} . '_' . $self->{result_values}->{label}}) / $options{delta_time}; + if (defined($instance_mode->{option_results}->{'speed_' . $self->{result_values}->{label}}) && $instance_mode->{option_results}->{'speed_' . $self->{result_values}->{label}} =~ /[0-9]/) { + $self->{result_values}->{traffic_prct} = $self->{result_values}->{traffic} * 100 / ($instance_mode->{option_results}->{'speed_' . $self->{result_values}->{label}} * 1000 * 1000); + $self->{result_values}->{speed} = $instance_mode->{option_results}->{'speed_' . $self->{result_values}->{label}} * 1000 * 1000; + } + return 0; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "display-name:s" => { name => 'display_name', default => '%{SvcName}.%{IfName}.%{SapEncapName}' }, + "filter-name:s" => { name => 'filter_name' }, + "speed-in:s" => { name => 'speed_in' }, + "speed-out:s" => { name => 'speed_out' }, + "units-traffic:s" => { name => 'units_traffic', default => '%' }, + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '%{admin} =~ /up/i and %{status} !~ /up/i' }, + }); + + 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; + } + } +} + +sub prefix_sap_output { + my ($self, %options) = @_; + + return "SAP '" . $options{instance_value}->{display} . "' "; +} + +sub get_display_name { + my ($self, %options) = @_; + + my $display_name = $self->{option_results}->{display_name}; + $display_name =~ s/%\{(.*?)\}/$options{$1}/ge; + return $display_name; +} + +my %map_admin = (1 => 'up', 2 => 'down'); +my %map_oper = (1 => 'up', 2 => 'down', 3 => 'ingressQosMismatch', + 4 => 'egressQosMismatch', 5 => 'portMtuTooSmall', 6 => 'svcAdminDown', + 7 => 'iesIfAdminDown' +); + +my $mapping = { + sapAdminStatus => { oid => '.1.3.6.1.4.1.6527.3.1.2.4.3.2.1.6', map => \%map_admin }, + sapOperStatus => { oid => '.1.3.6.1.4.1.6527.3.1.2.4.3.2.1.7', map => \%map_oper }, + fadSapStatsIngressOctets => { oid => '.1.3.6.1.4.1.637.61.1.85.17.2.2.1.2' }, + fadSapStatsEgressOctets => { oid => '.1.3.6.1.4.1.637.61.1.85.17.2.2.1.4' }, +}; + +my $oid_sapDescription = '.1.3.6.1.4.1.6527.3.1.2.4.3.2.1.5'; +my $oid_svcName = '.1.3.6.1.4.1.6527.3.1.2.4.2.2.1.29'; +my $oid_ifName = '.1.3.6.1.2.1.31.1.1.1.2'; + +sub manage_selection { + my ($self, %options) = @_; + + if ($options{snmp}->is_snmpv1()) { + $self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3."); + $self->{output}->option_exit(); + } + + $self->{sap} = {}; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_sapDescription }, + { oid => $oid_svcName }, + { oid => $oid_ifName }, + ], + nothing_quit => 1); + + foreach my $oid (keys %{$snmp_result->{$oid_sapDescription}}) { + next if ($oid !~ /^$oid_sapDescription\.(.*?)\.(.*?)\.(.*?)$/); + # $SvcId and $SapEncapValue is the same. We use service table + my ($SvcId, $SapPortId, $SapEncapValue) = ($1, $2, $3); + my $instance = $SvcId . '.' . $SapPortId . '.' . $SapEncapValue; + + my $SapDescription = $snmp_result->{$oid_sapDescription}->{$oid} ne '' ? + $snmp_result->{$oid_sapDescription}->{$oid} : 'unknown'; + my $SvcName = defined($snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SvcId}) && $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SvcId} ne '' ? + $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SvcId} : $SvcId; + my $IfName = defined($snmp_result->{$oid_ifName}->{$oid_ifName . '.' . $SapPortId}) && $snmp_result->{$oid_ifName}->{$oid_ifName . '.' . $SapPortId} ne '' ? + $snmp_result->{$oid_ifName}->{$oid_ifName . '.' . $SapPortId} : $SapPortId; + my $SapEncapName = defined($snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SapEncapValue}) && $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SapEncapValue} ne '' ? + $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SapEncapValue} : $SapEncapValue; + + my $name = $self->get_display_name( + SapDescription => $SapDescription, + SvcName => $SvcName, + SapEncapName => $SapEncapName, + IfName => $IfName, + SvcId => $SvcId, + SapPortId => $SapPortId, + SapEncapValue => $SapEncapValue); + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{sap}->{$instance} = { display => $name }; + } + + $options{snmp}->load(oids => [$mapping->{fadSapStatsIngressOctets}->{oid}, + $mapping->{fadSapStatsEgressOctets}->{oid}, + $mapping->{sapAdminStatus}->{oid}, $mapping->{sapOperStatus}->{oid}], + instances => [keys %{$self->{sap}}], instance_regexp => '(\d+\.\d+\.\d+)$'); + $snmp_result = $options{snmp}->get_leef(nothing_quit => 1); + foreach (keys %{$self->{sap}}) { + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $_); + $self->{sap}->{$_}->{in} = $result->{fadSapStatsIngressOctets} * 8; + $self->{sap}->{$_}->{out} = $result->{fadSapStatsEgressOctets} * 8; + $self->{sap}->{$_}->{status} = $result->{sapOperStatus}; + $self->{sap}->{$_}->{admin} = $result->{sapAdminStatus}; + } + + if (scalar(keys %{$self->{sap}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No SAP found."); + $self->{output}->option_exit(); + } + + $self->{cache_name} = "alcatel_isam_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check SAP QoS usage. + +=over 8 + +=item B<--display-name> + +Display name (Default: '%{SvcName}.%{IfName}.%{SapEncapName}'). +Can also be: %{SapDescription}, %{SapPortId} + +=item B<--filter-name> + +Filter by SAP name (can be a regexp). + +=item B<--speed-in> + +Set interface speed for incoming traffic (in Mb). + +=item B<--speed-out> + +Set interface speed for outgoing traffic (in Mb). + +=item B<--units-traffic> + +Units of thresholds for the traffic (Default: '%') ('%', 'b/s'). + +=item B<--warning-status> + +Set warning threshold for ib status. +Can used special variables like: %{admin}, %{status}, %{display} + +=item B<--critical-status> + +Set critical threshold for ib status (Default: '%{admin} =~ /up/i and %{status} !~ /up/i'). +Can used special variables like: %{admin}, %{status}, %{display} + +=item B<--warning-*> + +Threshold warning. +Can be: 'in-traffic', 'out-traffic', 'in-drop-packets'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'in-traffic', 'out-traffic', 'in-drop-packets'. + +=back + +=cut diff --git a/centreon-plugins/network/alcatel/isam/snmp/mode/listhubsap.pm b/centreon-plugins/network/alcatel/isam/snmp/mode/listhubsap.pm new file mode 100644 index 000000000..4d9438f75 --- /dev/null +++ b/centreon-plugins/network/alcatel/isam/snmp/mode/listhubsap.pm @@ -0,0 +1,124 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::alcatel::isam::snmp::mode::listhubsap; + +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.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +my $oid_sapDescription = '.1.3.6.1.4.1.6527.3.1.2.4.3.2.1.5'; +my $oid_svcName = '.1.3.6.1.4.1.6527.3.1.2.4.2.2.1.29'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{sap} = {}; + my $snmp_result = $self->{snmp}->get_multiple_table(oids => [ { oid => $oid_sapDescription }, { oid => $oid_svcName } ], + nothing_quit => 1); + foreach my $oid (keys %{$snmp_result->{$oid_sapDescription}}) { + next if ($oid !~ /^$oid_tnSapDescription\.(.*?)\.(.*?)\.(.*?)$/); + my ($SvcId, $SapPortId, $SapEncapValue) = ($1, $2, $3); + + $self->{sap}->{$SvcId . '.' . $SapPortId . '.' . $SapEncapValue} = { + SvcId => $SvcId, + SapPortId => $SapPortId, + SapEncapValue => $SapEncapValue, + SapDescription => $snmp_result->{$oid_sapDescription}->{$oid}, + SvcName => defined($snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SvcId}) ? + $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SvcId} : $SvcId, + SapEncapName => defined($snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SapEncapValue}) ? + $snmp_result->{$oid_svcName}->{$oid_svcName . '.' . $SapEncapValue} : $SapEncapValue, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; + $self->manage_selection(); + foreach my $instance (sort keys %{$self->{sap}}) { + my $msg = ''; + $self->{output}->output_add(long_msg => + "[SvcId = " . $self->{sap}->{$instance}->{SvcId} . "]" . + "[SapPortId = " . $self->{sap}->{$instance}->{SapPortId} . "]" . + "[SapEncapValue = " . $self->{sap}->{$instance}->{SapEncapValue} . "]" . + "[SapDescription = " . $self->{sap}->{$instance}->{SapDescription} . "]" . + "[SvcName = " . $self->{sap}->{$instance}->{SvcName} . "]" . + "[SapEncapName = " . $self->{sap}->{$instance}->{SapEncapName} . "]" + ); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List SAP:'); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['SvcId', 'SapPortId', 'SapEncapValue', 'SapDescription', 'SvcName', 'SapEncapName']); +} + +sub disco_show { + my ($self, %options) = @_; + $self->{snmp} = $options{snmp}; + + $self->manage_selection(disco => 1); + foreach my $instance (sort keys %{$self->{sap}}) { + $self->{output}->add_disco_entry(%{$self->{sap}->{$instance}}); + } +} + +1; + +__END__ + +=head1 MODE + +List SAP. + +=over 8 + +=back + +=cut + diff --git a/centreon-plugins/network/alcatel/isam/snmp/mode/vlantraffic.pm b/centreon-plugins/network/alcatel/isam/snmp/mode/vlantraffic.pm deleted file mode 100644 index 522888b28..000000000 --- a/centreon-plugins/network/alcatel/isam/snmp/mode/vlantraffic.pm +++ /dev/null @@ -1,337 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package network::alcatel::isam::snmp::mode::vlantraffic; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::values; -use centreon::plugins::statefile; -use Digest::MD5 qw(md5_hex); - -my $maps_counters = { - vlan => { - '001_in' => { - set => { - key_values => [ { name => 'in', diff => 1 }, { name => 'display' } ], - output_template => 'In : %s %s/s', output_change_bytes => 2, - perfdatas => [ - { label => 'in', value => 'in_absolute', template => '%d', - unit => 'b/s', min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, - ], - }, - }, - '001_out' => { - set => { - key_values => [ { name => 'out', diff => 1 }, { name => 'display' } ], - output_template => 'Out : %s %s/s', output_change_bytes => 2, - perfdatas => [ - { label => 'out', value => 'out_absolute', template => '%d', - unit => 'b/s', min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, - ], - }, - }, - } -}; - -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 => - { - "no-component:s" => { name => 'no_component' }, - "filter-interface:s" => { name => 'filter_interface' }, - "filter-vlan:s" => { name => 'filter_vlan' }, - "show-cache" => { name => 'show_cache' }, - "reload-cache-time:s" => { name => 'reload_cache_time', default => 180 }, - }); - $self->{statefile_value} = centreon::plugins::statefile->new(%options); - $self->{statefile_cache} = centreon::plugins::statefile->new(%options); - - foreach my $key (('vlan')) { - foreach (keys %{$maps_counters->{$key}}) { - my ($id, $name) = split /_/; - if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) { - $options{options}->add_options(arguments => { - 'warning-' . $name . ':s' => { name => 'warning-' . $name }, - 'critical-' . $name . ':s' => { name => 'critical-' . $name }, - }); - } - $maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(statefile => $self->{statefile_value}, - output => $self->{output}, perfdata => $self->{perfdata}, - label => $name); - $maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}}); - } - } - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - foreach my $key (('vlan')) { - foreach (keys %{$maps_counters->{$key}}) { - $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); - } - } - - if (defined($self->{option_results}->{no_component})) { - if ($self->{option_results}->{no_component} ne '') { - $self->{no_components} = $self->{option_results}->{no_component}; - } else { - $self->{no_components} = 'critical'; - } - } - - $self->{statefile_cache}->check_options(%options); - $self->{statefile_value}->check_options(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - $self->{hostname} = $self->{snmp}->get_hostname(); - $self->{snmp_port} = $self->{snmp}->get_port(); - - $self->manage_selection(); - - my $multiple = 1; - if (scalar(keys %{$self->{vlan}}) == 1) { - $multiple = 0; - } - - if ($multiple == 1) { - $self->{output}->output_add(severity => 'OK', - short_msg => 'All VLAN usages are ok'); - } - $self->{new_datas} = {}; - $self->{statefile_value}->read(statefile => "alcatel_isam_" . $self->{hostname} . '_' . $self->{snmp_port} . '_' . $self->{mode} . '_' . - (defined($self->{option_results}->{filter_vlan}) ? md5_hex($self->{option_results}->{filter_vlan}) : md5_hex('all')) . '_' . - (defined($self->{option_results}->{filter_interface}) ? md5_hex($self->{option_results}->{filter_interface}) : md5_hex('all'))); - $self->{new_datas}->{last_timestamp} = time(); - - foreach my $id (sort keys %{$self->{vlan}}) { - my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); - my @exits = (); - foreach (sort keys %{$maps_counters->{vlan}}) { - my $obj = $maps_counters->{vlan}->{$_}->{obj}; - $obj->set(instance => $id); - - my ($value_check) = $obj->execute(values => $self->{vlan}->{$id}, - new_datas => $self->{new_datas}); - - if ($value_check != 0) { - $long_msg .= $long_msg_append . $obj->output_error(); - $long_msg_append = ', '; - next; - } - my $exit2 = $obj->threshold_check(); - push @exits, $exit2; - - my $output = $obj->output(); - $long_msg .= $long_msg_append . $output; - $long_msg_append = ', '; - - if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) { - $short_msg .= $short_msg_append . $output; - $short_msg_append = ', '; - } - - $obj->perfdata(extra_instance => $multiple); - } - - $self->{output}->output_add(long_msg => "VLAN '$self->{vlan}->{$id}->{display}' Traffic $long_msg"); - my $exit = $self->{output}->get_most_critical(status => [ @exits ]); - if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { - $self->{output}->output_add(severity => $exit, - short_msg => "VLAN '$self->{vlan}->{$id}->{display}' Traffic $short_msg" - ); - } - - if ($multiple == 0) { - $self->{output}->output_add(short_msg => "VLAN '$self->{vlan}->{$id}->{display}' Traffic $long_msg"); - } - } - - $self->{statefile_value}->write(data => $self->{new_datas}); - $self->{output}->display(); - $self->{output}->exit(); -} - -my $oid_extendVlanStaticName = '.1.3.6.1.4.1.637.61.1.31.2.4.1.6'; -my $oid_extendPortVlanVlanIndex = '.1.3.6.1.4.1.637.61.1.31.2.12.1.1'; -my $oid_dot1dBasePortIfIndex = '.1.3.6.1.2.1.17.1.4.1.2'; -my $oid_ifDescr = '.1.3.6.1.2.1.2.2.1.2'; -my $oid_extendPortVlanCurrent1DayUpFwdByteCounter = '.1.3.6.1.4.1.637.61.1.31.9.3.1.5'; -my $oid_extendPortVlanCurrent1DayDnFwdByteCounter = '.1.3.6.1.4.1.637.61.1.31.9.3.1.7'; - -sub reload_cache { - my ($self) = @_; - my $datas = {}; - - my $result = $self->{snmp}->get_multiple_table(oids => [ - { oid => $oid_extendVlanStaticName }, - { oid => $oid_extendPortVlanVlanIndex }, - { oid => $oid_dot1dBasePortIfIndex }, - { oid => $oid_ifDescr }, - ], nothing_quit => 1); - $result->{last_timestamp} = time(); - - if (scalar(keys %{$result->{$oid_extendVlanStaticName}}) <= 0) { - $self->{output}->add_option_msg(short_msg => "Can't construct cache..."); - $self->{output}->option_exit(); - } - - $self->{statefile_cache}->write(data => $result); -} - -sub get_big_counter { - my ($self, %options) = @_; - - my $hex = unpack('H*', $options{value}); - $hex =~ /^(.){8}(.){8}$/; - return (hex($1) << 32) + hex($2); -} - -sub manage_selection { - my ($self, %options) = @_; - - # init cache file - my $has_cache_file = $self->{statefile_cache}->read(statefile => 'cache_alcatel_isam_' . $self->{hostname} . '_' . $self->{snmp_port} . '_' . $self->{mode}); - if (defined($self->{option_results}->{show_cache})) { - $self->{output}->add_option_msg(long_msg => $self->{statefile_cache}->get_string_content()); - $self->{output}->option_exit(); - } - - my $timestamp_cache = $self->{statefile_cache}->get(name => 'last_timestamp'); - if ($has_cache_file == 0 || - !defined($timestamp_cache) || ((time() - $timestamp_cache) > (($self->{option_results}->{reload_cache_time}) * 60))) { - $self->reload_cache(); - $self->{statefile_cache}->read(); - } - - $self->{vlan} = {}; - my $value = $self->{statefile_cache}->get(name => $oid_extendVlanStaticName); - my $port_vlan_result = $self->{statefile_cache}->get(name => $oid_extendPortVlanVlanIndex); - my $dot1base_result = $self->{statefile_cache}->get(name => $oid_dot1dBasePortIfIndex); - my $ifdescr_result = $self->{statefile_cache}->get(name => $oid_ifDescr); - foreach ($self->{snmp}->oid_lex_sort(keys %{$value})) { - /^$oid_extendVlanStaticName\.(.*)$/; - my $vlan_index = $1; - my $vlan_name = $value->{$_}; - if (defined($self->{option_results}->{filter_vlan}) && $self->{option_results}->{filter_vlan} ne '' && - $vlan_name !~ /$self->{option_results}->{filter_vlan}/) { - $self->{output}->output_add(long_msg => "Skipping '" . $vlan_name . "': no matching filter.", debug => 1); - next; - } - # we look for the interface description - #extendPortVlanVlanIndex.(dot1dBasePort).(VlanIndex) - foreach ($self->{snmp}->oid_lex_sort(keys %{$port_vlan_result})) { - next if ($_ !~ /^$oid_extendPortVlanVlanIndex\.(\d+)\.$vlan_index$/); - my $dot1dBasePort = $1; - next if (!defined($dot1base_result->{$oid_dot1dBasePortIfIndex . '.' . $dot1dBasePort})); - my $ifIndex = $dot1base_result->{$oid_dot1dBasePortIfIndex . '.' . $dot1dBasePort}; - next if (!defined($ifdescr_result->{$oid_ifDescr . '.' . $ifIndex})); - - my $ifDescr = $ifdescr_result->{$oid_ifDescr . '.' . $ifIndex}; - if (defined($self->{option_results}->{filter_interface}) && $self->{option_results}->{filter_interface} ne '' && - $ifDescr !~ /$self->{option_results}->{filter_interface}/) { - $self->{output}->output_add(long_msg => "Skipping '" . $ifDescr . "': no matching filter.", debug => 1); - next; - } - - $self->{snmp}->load(oids => [$oid_extendPortVlanCurrent1DayUpFwdByteCounter, $oid_extendPortVlanCurrent1DayDnFwdByteCounter], - instances => [$dot1dBasePort . '.' . $vlan_index], instance_regexp => '(.*)'); - } - - $self->{vlan}->{$vlan_index} = { display => $vlan_name, in => 0, out => 0 }; - } - - $self->{results} = $self->{snmp}->get_leef(); - - foreach (keys %{$self->{results}}) { - next if ($_ !~ /^$oid_extendPortVlanCurrent1DayUpFwdByteCounter\.(\d+)\.(\d+)$/); - my $vlan_index = $2; - - my $in = defined($self->{results}->{$oid_extendPortVlanCurrent1DayDnFwdByteCounter . '.' . $1 . '.' . $vlan_index}) ? - $self->get_big_counter(value => $self->{results}->{$oid_extendPortVlanCurrent1DayDnFwdByteCounter . '.' . $1 . '.' . $vlan_index}) : 0; - my $out = defined($self->{results}->{$_}) ? - $self->get_big_counter(value => $self->{results}->{$_}) : 0; - - $self->{vlan}->{$vlan_index}->{in} += $in * 8; - $self->{vlan}->{$vlan_index}->{out} += $out * 8; - } - - if (scalar(keys %{$self->{vlan}}) <= 0) { - $self->{output}->output_add(severity => defined($self->{no_components}) ? $self->{no_components} : 'unknown', - short_msg => 'No components are checked.'); - } -} - -1; - -__END__ - -=head1 MODE - -Check traffic by VLAN. - -=over 8 - -=item B<--filter-vlan> - -Filter by vlan name (regexp can be used). - -=item B<--filter-interface> - -Filter by interface description (regexp can be used). - -=item B<--warning-*> - -Threshold warning. -Can be: 'cac-usage' (%), 'conference-usage' (%). - -=item B<--critical-*> - -Threshold critical. -Can be: 'cac-usage' (%), 'conference-usage' (%). - -=item B<--no-component> - -Set the threshold where no components (Default: 'unknown' returns). - -=item B<--reload-cache-time> - -Time in minutes before reloading cache file (default: 180). - -=item B<--show-cache> - -Display cache datas. - -=back - -=cut diff --git a/centreon-plugins/network/alcatel/isam/snmp/plugin.pm b/centreon-plugins/network/alcatel/isam/snmp/plugin.pm index c066bb53e..0709ec2e9 100644 --- a/centreon-plugins/network/alcatel/isam/snmp/plugin.pm +++ b/centreon-plugins/network/alcatel/isam/snmp/plugin.pm @@ -34,9 +34,10 @@ sub new { 'cpu' => 'network::alcatel::isam::snmp::mode::cpu', 'hardware' => 'network::alcatel::isam::snmp::mode::hardware', 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-hub-sap' => 'network::alcatel::isam::snmp::mode::listhubsap', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'memory' => 'network::alcatel::isam::snmp::mode::memory', - 'vlan-traffic' => 'network::alcatel::isam::snmp::mode::vlantraffic', + 'hub-sap-usage' => 'network::alcatel::isam::snmp::mode::hubsapusage', ); return $self;