diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/apconnections.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/apconnections.pm new file mode 100644 index 000000000..7a3650a0b --- /dev/null +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/apconnections.pm @@ -0,0 +1,357 @@ +################################################################################ +# Copyright 2005-2014 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package centreon::common::aruba::snmp::mode::apconnections; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::values; + +my $maps_counters = { + ap => { + '000_total-time' => { set => { + key_values => [ { name => 'apTotalTime' }, { name => 'bssid' }, ], + output_template => 'Current total connection time : %.3f s', + perfdatas => [ + { label => 'total_time', value => 'apTotalTime_absolute', template => '%.3f', + min => 0, unit => 's', label_extra_instance => 1, instance_use => 'bssid_absolute' }, + ], + } + }, + '001_inactive-time' => { set => { + key_values => [ { name => 'apInactiveTime' }, { name => 'bssid' }, ], + output_template => 'Current inactive time : %.3f s', + perfdatas => [ + { label => 'inactive_time', value => 'apInactiveTime_absolute', template => '%.3f', + min => 0, unit => 's', label_extra_instance => 1, instance_use => 'bssid_absolute' }, + ], + } + }, + '002_channel-noise' => { set => { + key_values => [ { name => 'apChannelNoise' }, { name => 'bssid' }, ], + output_template => 'Channel noise : %d', + perfdatas => [ + { label => 'cpu_30secs', value => 'apChannelNoise_absolute', template => '%d', + label_extra_instance => 1, instance_use => 'bssid_absolute' }, + ], + } + }, + '003_nsr' => { set => { + key_values => [ { name => 'apSignalToNoiseRatio' }, { name => 'bssid' }, ], + output_template => 'Signal to noise ratio : %d', + perfdatas => [ + { label => 'cpu_1min', value => 'apSignalToNoiseRatio_absolute', template => '%d', + label_extra_instance => 1, instance_use => 'bssid_absolute' }, + ], + } + }, + }, + total => { + '000_total' => { set => { + key_values => [ { name => 'total' } ], + output_template => 'AP connected : %d %%', + perfdatas => [ + { label => 'total', value => 'total_absolute', template => '%d', min => 0 }, + ], + } + }, + } +}; + +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 => + { + "filter-bssid:s" => { name => 'filter_bssid' }, + "filter-essid:s" => { name => 'filter_essid' }, + "filter-type:s" => { name => 'filter_type', default => 'ap' }, + "skip-total" => { name => 'skip_total' }, + }); + + foreach my $key (('ap', 'total')) { + 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(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 (('ap', 'total')) { + foreach (keys %{$maps_counters->{$key}}) { + $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); + } + } +} + +sub check_total { + my ($self, %options) = @_; + + my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); + my @exits = (); + foreach (sort keys %{$maps_counters->{total}}) { + my $obj = $maps_counters->{total}->{$_}->{obj}; + $obj->set(instance => 'global'); + + my ($value_check) = $obj->execute(values => $self->{global}); + + 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(); + } + + 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 => "Total $short_msg" + ); + } else { + $self->{output}->output_add(short_msg => "Total $long_msg"); + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + $self->manage_selection(); + + my $multiple = 1; + if (scalar(keys %{$self->{ap}}) == 1) { + $multiple = 0; + } + + if (!defined($self->{option_results}->{skip_total})) { + $self->check_total(); + } + + #### + # By AP + if ($multiple == 1) { + $self->{output}->output_add(severity => 'OK', + short_msg => 'All AP are ok'); + } + + foreach my $id (sort keys %{$self->{ap}}) { + my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); + my @exits = (); + foreach (sort keys %{$maps_counters->{ap}}) { + my $obj = $maps_counters->{ap}->{$_}->{obj}; + $obj->set(instance => $id); + + my ($value_check) = $obj->execute(values => $self->{ap}->{$id}); + + 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 = ', '; + } + + $maps_counters->{ap}->{$_}->{obj}->perfdata(extra_instance => $multiple); + } + + $self->{output}->output_add(long_msg => "BSSID '" . $self->{ap}->{$id}->{bssid} . "' Usage $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 => "BSSID '" . $self->{ap}->{$id}->{bssid} . "' Usage $short_msg" + ); + } + + if ($multiple == 0) { + $self->{output}->output_add(short_msg => "BSSID '" . $self->{ap}->{$id}->{bssid} . "' Usage $long_msg"); + } + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +my %map_role = ( + 1 => 'master', + 2 => 'local', + 3 => 'standbymaster', +); +my %map_type = ( + 1 => 'ap', + 2 => 'am', +); + +my $mapping = { + apESSID => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.2' }, + apType => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.7', map => \%map_type }, + apTotalTime => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.10' }, + apInactiveTime => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.11' }, + apChannelNoise => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.13' }, + apSignalToNoiseRatio => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.14' }, +}; + +my $oid_wlsxSwitchRole = '.1.3.6.1.4.1.14823.2.2.1.1.1.4'; +my $oid_wlsxSwitchAccessPointEntry = '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1'; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_extremeCpuMonitorSystemEntry = '.1.3.6.1.4.1.1916.1.32.1.4.1'; + my $oid_extremeCpuMonitorTotalUtilization = '.1.3.6.1.4.1.1916.1.32.1.2'; # without .0 + $self->{results} = $self->{snmp}->get_multiple_table(oids => [ + { oid => $oid_wlsxSwitchRole }, + { oid => $oid_wlsxSwitchAccessPointEntry }, + ], + , nothing_quit => 1); + my $role = $map_role{$self->{results}->{$oid_wlsxSwitchRole}->{$oid_wlsxSwitchRole . '.0'}}; + if ($role =~ /standbymaster/) { + $self->{output}->output_add(severity => 'OK', + short_msg => "Cannot get information. Switch role is '" . $role . "'."); + $self->{output}->display(); + $self->{output}->exit(); + } + + $self->{ap} = {}; + $self->{global} = { total => 0 }; + foreach my $oid (keys %{$self->{results}->{$oid_wlsxSwitchAccessPointEntry}}) { + next if ($oid !~ /^$mapping->{apESSID}->{oid}\.(.*)$/); + my $bssid = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSwitchAccessPointEntry}, instance => $bssid); + + if (defined($self->{option_results}->{filter_bssid}) && $self->{option_results}->{filter_bssid} ne '' && + $bssid !~ /$self->{option_results}->{filter_bssid}/) { + $self->{output}->output_add(long_msg => "Skipping '" . $bssid . "': no matching filter bssid."); + next; + } + if (defined($self->{option_results}->{filter_essid}) && $self->{option_results}->{filter_essid} ne '' && + $result->{apESSID} !~ /$self->{option_results}->{filter_essid}/) { + $self->{output}->output_add(long_msg => "Skipping '" . $result->{apESSID} . "': no matching filter essid."); + next; + } + if (defined($self->{option_results}->{filter_type}) && $self->{option_results}->{filter_type} ne '' && + $result->{apType} !~ /$self->{option_results}->{filter_type}/) { + $self->{output}->output_add(long_msg => "Skipping '" . $result->{apType} . "': no matching filter type."); + next; + } + + $self->{ap}->{$bssid} = {bssid => $bssid, %$result}; + $self->{ap}->{$bssid}->{apInactiveTime} *= 0.01 if (defined($self->{ap}->{$bssid}->{apInactiveTime})); + $self->{ap}->{$bssid}->{apTotalTime} *= 0.01 if (defined($self->{ap}->{$bssid}->{apTotalTime})); + + $self->{global}->{total} += 1; + } +} + +1; + +__END__ + +=head1 MODE + +Check AP connections. + +=over 8 + +=item B<--warning-*> + +Threshold warning. +Can be: 'total', 'total-time', 'inactive-time', 'channel-noise', 'snr'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'total', 'total-time', 'inactive-time', 'channel-noise', 'snr'. + +=item B<--filter-bssid> + +Filter by physical address (regexp can be used). + +=item B<--filter-essid> + +Filter by ESSID (regexp can be used). + +=item B<--filter-type> + +Filter by type (regexp can be used. Can be: 'ap' or 'am'. Default: 'ap'). + +=item B<--skip-total> + +Don't display total AP connected (useful when you check each AP). + +=back + +=cut diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/apusers.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/apusers.pm new file mode 100644 index 000000000..5cfbb885c --- /dev/null +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/apusers.pm @@ -0,0 +1,281 @@ +################################################################################ +# Copyright 2005-2014 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package centreon::common::aruba::snmp::mode::apusers; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::values; + +my $maps_counters = { + '000_total' => { set => { + key_values => [ { name => 'total' } ], + output_template => 'Total Users : %s', + perfdatas => [ + { label => 'total', value => 'total_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '001_total-none' => { set => { + key_values => [ { name => 'total_none' } ], + output_template => 'Total Auth None : %s', + perfdatas => [ + { label => 'total_none', value => 'total_none_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '002_total-other' => { set => { + key_values => [ { name => 'total_other' } ], + output_template => 'Total Auth Other : %s', + perfdatas => [ + { label => 'total_other', value => 'total_other_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '003_total-web' => { set => { + key_values => [ { name => 'total_web' } ], + output_template => 'Total Auth Web : %s', + perfdatas => [ + { label => 'total_web', value => 'total_web_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '004_total-dot1x' => { set => { + key_values => [ { name => 'total_dot1x' } ], + output_template => 'Total Auth Dot1x : %s', + perfdatas => [ + { label => 'total_dot1x', value => 'total_dot1x', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '005_total-vpn' => { set => { + key_values => [ { name => 'total_vpn' } ], + output_template => 'Total Auth Vpn : %s', + perfdatas => [ + { label => 'total_vpn', value => 'total_vpn_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '006_total-mac' => { set => { + key_values => [ { name => 'total_mac' } ], + output_template => 'Total Auth Mac : %s', + perfdatas => [ + { label => 'total_mac', value => 'total_mac_absolute', template => '%s', + unit => 'users', min => 0 }, + ], + } + }, + '007_avg-connection-time' => { set => { + key_values => [ { name => 'avg_connection_time' } ], + output_template => 'Users average connection time : %.3f seconds', + perfdatas => [ + { label => 'avg_connection_time', value => 'avg_connection_time_absolute', template => '%.3f', + unit => 's', min => 0 }, + ], + } + }, +}; + +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}) { + my ($id, $name) = split /_/; + if (!defined($maps_counters->{$_}->{threshold}) || $maps_counters->{$_}->{threshold} != 0) { + $options{options}->add_options(arguments => { + 'warning-' . $name . ':s' => { name => 'warning-' . $name }, + 'critical-' . $name . ':s' => { name => 'critical-' . $name }, + }); + } + $maps_counters->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata}, + label => $name); + $maps_counters->{$_}->{obj}->set(%{$maps_counters->{$_}->{set}}); + } + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + foreach (keys %{$maps_counters}) { + $maps_counters->{$_}->{obj}->init(option_results => $self->{option_results}); + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + $self->manage_selection(); + + my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); + my @exits; + foreach (sort keys %{$maps_counters}) { + $maps_counters->{$_}->{obj}->set(instance => 'global'); + + my ($value_check) = $maps_counters->{$_}->{obj}->execute(values => $self->{global}); + + if ($value_check != 0) { + $long_msg .= $long_msg_append . $maps_counters->{$_}->{obj}->output_error(); + $long_msg_append = ', '; + next; + } + my $exit2 = $maps_counters->{$_}->{obj}->threshold_check(); + push @exits, $exit2; + + my $output = $maps_counters->{$_}->{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 = ', '; + } + + $maps_counters->{$_}->{obj}->perfdata(); + } + + 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 => "$short_msg" + ); + } else { + $self->{output}->output_add(short_msg => "$long_msg"); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +my %map_auth_method = ( + 1 => 'none', + 2 => 'other', + 3 => 'web', + 4 => 'dot1x', + 5 => 'vpn', + 6 => 'mac', +); +my %map_role = ( + 1 => 'master', + 2 => 'local', + 3 => 'standbymaster', +); +my $mapping = { + userUpTime => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.2.1.1.5' }, + userAuthenticationMethod => { oid => '.1.3.6.1.4.1.14823.2.2.1.1.2.1.1.6', map => \%map_auth_method }, +}; + +my $oid_wlsxSwitchUserEntry = '.1.3.6.1.4.1.14823.2.2.1.1.2.1.1'; +my $oid_wlsxSwitchRole = '.1.3.6.1.4.1.14823.2.2.1.1.1.4'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{global} = { total => 0, total_none => 0, total_other => 0, total_web => 0, + total_dot1x => 0, total_vpn => 0, total_mac => 0}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => [ + { oid => $oid_wlsxSwitchRole }, + { oid => $oid_wlsxSwitchUserEntry, start => $mapping->{userUpTime}->{oid}, end => $mapping->{userAuthenticationMethod}->{oid} }, + ], + nothing_quit => 1); + + my $role = $map_role{$self->{results}->{$oid_wlsxSwitchRole}->{$oid_wlsxSwitchRole . '.0'}}; + if ($role =~ /standbymaster/) { + $self->{output}->output_add(severity => 'OK', + short_msg => "Cannot get information. Switch role is '" . $role . "'."); + $self->{output}->display(); + $self->{output}->exit(); + } + + my $total_timeticks = 0; + foreach my $oid (keys %{$self->{results}->{$oid_wlsxSwitchUserEntry}}) { + $oid =~ /^$mapping->{userAuthenticationMethod}->{oid}\.(.*)$/; + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSwitchUserEntry}, instance => $instance); + + $self->{global}->{total}++; + $self->{global}->{'total_' . $result->{userAuthenticationMethod}}++; + $total_timeticks += $result->{userUpTime}; + } + + if ($self->{global}->{total} > 0) { + $self->{global}->{avg_connection_time} = $total_timeticks / $self->{global}->{total} * 0.01; + } +} + +1; + +__END__ + +=head1 MODE + +Check total users connected. + +=over 8 + +=item B<--warning-*> + +Threshold warning. +Can be: 'total', 'total-none', 'total-other', 'total-web', +'total-dot1x', 'total-vpn', 'total-mac', 'avg-connection-time' (seconds). + +=item B<--critical-*> + +Threshold critical. +Can be: 'total', 'total-none', 'total-other', 'total-web', +'total-dot1x', 'total-vpn', 'total-mac', 'avg-connection-time' (seconds). + +=back + +=cut diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/components/fan.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/components/fan.pm index 83f611483..ecf395460 100644 --- a/centreon-plugins/centreon/common/aruba/snmp/mode/components/fan.pm +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/components/fan.pm @@ -38,39 +38,47 @@ package centreon::common::aruba::snmp::mode::components::fan; use strict; use warnings; -my %map_status = ( - 1 => 'active', - 2 => 'inactive' +my %map_fan_status = ( + 1 => 'active', + 2 => 'inactive', ); +# In MIB 'aruba-systemext' +my $mapping = { + sysExtFanStatus => { oid => '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1.2', map => \%map_fan_status }, +}; +my $oid_wlsxSysExtFanEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1'; + +sub load { + my (%options) = @_; + + push @{$options{request}}, { oid => $oid_wlsxSysExtFanEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{fans} = {name => 'fans', total => 0}; $self->{output}->output_add(long_msg => "Checking fans"); - return if ($self->check_exclude(section => 'fans')); - - my $oid_wlsxSysExtFanEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1'; - my $oid_sysExtFanStatus = '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1.2'; - - my $result = $self->{snmp}->get_table(oid => $oid_wlsxSysExtFanEntry); - return if (scalar(keys %$result) <= 0); + $self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; + return if ($self->check_exclude(section => 'fan')); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_sysExtFanStatus\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtFanEntry}})) { + next if ($oid !~ /^$mapping->{sysExtFanStatus}->{oid}\.(.*)$/); my $instance = $1; - - next if ($self->check_exclude(section => 'fans', instance => $instance)); - - my $status = $result->{$oid_sysExtFanStatus . '.' . $instance}; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtFanEntry}, instance => $instance); - $self->{components}->{fans}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Fan '%s' status is %s.", - $instance, $map_status{$status})); - if ($status != 1) { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Fan '%s' status is %s", - $instance, $map_status{$status})); + next if ($self->check_exclude(section => 'fan', instance => $instance)); + $self->{components}->{fan}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("Fan '%s' status is %s [instance: %s].", + $instance, $result->{sysExtFanStatus}, + $instance + )); + my $exit = $self->get_severity(section => 'fan', value => $result->{sysExtFanStatus}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' status is %s", + $instance, $result->{sysExtFanStatus})); } } } diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/components/module.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/components/module.pm index 7d66ad17f..86c2841a8 100644 --- a/centreon-plugins/centreon/common/aruba/snmp/mode/components/module.pm +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/components/module.pm @@ -57,42 +57,48 @@ my %map_card_type = ( 16 => 'sw620', 17 => 'sw3500' ); - -my %map_status = ( - 1 => 'active', - 2 => 'inactive' +my %map_module_status = ( + 1 => 'active', + 2 => 'inactive', ); +# In MIB 'aruba-systemext' +my $mapping = { + sysExtCardType => { oid => '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1.2', map => \%map_card_type }, + sysExtCardStatus => { oid => '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1.12', map => \%map_module_status }, +}; +my $oid_wlsxSysExtCardEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1'; + +sub load { + my (%options) = @_; + + push @{$options{request}}, { oid => $oid_wlsxSysExtCardEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{modules} = {name => 'modules', total => 0}; $self->{output}->output_add(long_msg => "Checking modules"); - return if ($self->check_exclude(section => 'modules')); - - my $oid_wlsxSysExtCardEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1'; - my $oid_sysExtCardType = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1.2'; - my $oid_sysExtCardStatus = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1.12'; - - my $result = $self->{snmp}->get_table(oid => $oid_wlsxSysExtCardEntry); - return if (scalar(keys %$result) <= 0); + $self->{components}->{module} = {name => 'modules', total => 0, skip => 0}; + return if ($self->check_exclude(section => 'module')); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_sysExtCardStatus\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtCardEntry}})) { + next if ($oid !~ /^$mapping->{sysExtCardStatus}->{oid}\.(.*)$/); my $instance = $1; - - next if ($self->check_exclude(section => 'modules', instance => $instance)); - - my $type = $result->{$oid_sysExtCardType . '.' . $instance}; - my $status = $result->{$oid_sysExtCardStatus . '.' . $instance}; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtCardEntry}, instance => $instance); - $self->{components}->{modules}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Module '%s' status is %s [instance: %s].", - $map_card_type{$type}, $map_status{$status}, $instance)); - if ($status != 1) { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Module '%s' status is %s", - $map_card_type{$type}, $map_status{$status})); + next if ($self->check_exclude(section => 'module', instance => $instance)); + $self->{components}->{module}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("Module '%s/%s' status is %s [instance: %s].", + $result->{sysExtCardType}, $instance, $result->{sysExtCardStatus}, + $instance + )); + my $exit = $self->get_severity(section => 'module', value => $result->{sysExtCardStatus}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Module '%s/%s' status is %s", + $result->{sysExtCardType}, $instance, $result->{sysExtCardStatus})); } } } diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/components/psu.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/components/psu.pm index a0f757bda..a8b326a49 100644 --- a/centreon-plugins/centreon/common/aruba/snmp/mode/components/psu.pm +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/components/psu.pm @@ -38,39 +38,47 @@ package centreon::common::aruba::snmp::mode::components::psu; use strict; use warnings; -my %map_status = ( - 1 => 'active', - 2 => 'inactive' +my %map_psu_status = ( + 1 => 'active', + 2 => 'inactive', ); +# In MIB 'aruba-systemext' +my $mapping = { + sysExtPowerSupplyStatus => { oid => '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1.2', map => \%map_psu_status }, +}; +my $oid_wlsxSysExtPowerSupplyEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1.2'; + +sub load { + my (%options) = @_; + + push @{$options{request}}, { oid => $oid_wlsxSysExtPowerSupplyEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{psus} = {name => 'psus', total => 0}; $self->{output}->output_add(long_msg => "Checking power supplies"); - return if ($self->check_exclude(section => 'psus')); - - my $oid_wlsxSysExtPowerSupplyEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1'; - my $oid_sysExtPowerSupplyStatus = '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1.2'; - - my $result = $self->{snmp}->get_table(oid => $oid_wlsxSysExtPowerSupplyEntry); - return if (scalar(keys %$result) <= 0); + $self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0}; + return if ($self->check_exclude(section => 'psu')); - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_sysExtPowerSupplyStatus\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}})) { + next if ($oid !~ /^$mapping->{sysExtPowerSupplyStatus}->{oid}\.(.*)$/); my $instance = $1; - - next if ($self->check_exclude(section => 'psus', instance => $instance)); - - my $status = $result->{$oid_sysExtPowerSupplyStatus . '.' . $instance}; - - $self->{components}->{psus}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Power Supply '%s' status is %s.", - $instance, $map_status{$status})); - if ($status != 1) { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => sprintf("Power Supply '%s' status is %s", - $instance, $map_status{$status})); + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}, instance => $instance); + + next if ($self->check_exclude(section => 'psu', instance => $instance)); + $self->{components}->{psu}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is %s [instance: %s].", + $instance, $result->{sysExtPowerSupplyStatus}, + $instance + )); + my $exit = $self->get_severity(section => 'psu', value => $result->{sysExtPowerSupplyStatus}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Power supply '%s' status is %s", + $instance, $result->{sysExtPowerSupplyStatus})); } } } diff --git a/centreon-plugins/centreon/common/aruba/snmp/mode/hardware.pm b/centreon-plugins/centreon/common/aruba/snmp/mode/hardware.pm index 5eddd1dca..524946829 100644 --- a/centreon-plugins/centreon/common/aruba/snmp/mode/hardware.pm +++ b/centreon-plugins/centreon/common/aruba/snmp/mode/hardware.pm @@ -40,9 +40,20 @@ use base qw(centreon::plugins::mode); use strict; use warnings; -use centreon::common::aruba::snmp::mode::components::fan; -use centreon::common::aruba::snmp::mode::components::module; -use centreon::common::aruba::snmp::mode::components::psu; +my $thresholds = { + fan => [ + ['active', 'OK'], + ['inactive', 'CRITICAL'], + ], + psu => [ + ['active', 'OK'], + ['inactive', 'CRITICAL'], + ], + module => [ + ['active', 'OK'], + ['inactive', 'CRITICAL'], + ], +}; sub new { my ($class, %options) = @_; @@ -53,61 +64,97 @@ sub new { $options{options}->add_options(arguments => { "exclude:s" => { name => 'exclude' }, - "component:s" => { name => 'component', default => 'all' }, + "component:s" => { name => 'component', default => '.*' }, + "no-component:s" => { name => 'no_component' }, + "threshold-overload:s@" => { name => 'threshold_overload' }, }); $self->{components} = {}; + $self->{no_components} = undef; return $self; } sub check_options { my ($self, %options) = @_; $self->SUPER::init(%options); -} - -sub global { - my ($self, %options) = @_; - - centreon::common::aruba::snmp::mode::components::fan::check($self); - centreon::common::aruba::snmp::mode::components::module::check($self); - centreon::common::aruba::snmp::mode::components::psu::check($self); + + 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->{overload_th} = {}; + foreach my $val (@{$self->{option_results}->{threshold_overload}}) { + if ($val !~ /^(.*?),(.*?),(.*)$/) { + $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); + $self->{output}->option_exit(); + } + my ($section, $status, $filter) = ($1, $2, $3); + 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}; + } } sub run { my ($self, %options) = @_; # $options{snmp} = snmp object $self->{snmp} = $options{snmp}; + + my $snmp_request = []; + my @components = ('fan', 'psu', 'module'); + foreach (@components) { + if (/$self->{option_results}->{component}/) { + my $mod_name = "centreon::common::aruba::snmp::mode::components::$_"; + centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name, + error_msg => "Cannot load module '$mod_name'."); + my $func = $mod_name->can('load'); + $func->(request => $snmp_request); + } + } - if ($self->{option_results}->{component} eq 'all') { - $self->global(); - } elsif ($self->{option_results}->{component} eq 'fan') { - centreon::common::aruba::snmp::mode::components::fan::check($self); - } elsif ($self->{option_results}->{component} eq 'module') { - centreon::common::aruba::snmp::mode::components::module::check($self); - } elsif ($self->{option_results}->{component} eq 'psu') { - centreon::common::aruba::snmp::mode::components::psu::check($self); - } else { + if (scalar(@{$snmp_request}) == 0) { $self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'."); $self->{output}->option_exit(); } + $self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request); + + foreach (@components) { + if (/$self->{option_results}->{component}/) { + my $mod_name = "centreon::common::aruba::snmp::mode::components::$_"; + my $func = $mod_name->can('check'); + $func->($self); + } + } my $total_components = 0; my $display_by_component = ''; my $display_by_component_append = ''; foreach my $comp (sort(keys %{$self->{components}})) { # Skipping short msg when no components - next if ($self->{components}->{$comp}->{total} == 0); - $total_components += $self->{components}->{$comp}->{total}; - $display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . ' ' . $self->{components}->{$comp}->{name}; + next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0); + $total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip}; + my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip}; + $display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name}; $display_by_component_append = ', '; } $self->{output}->output_add(severity => 'OK', - short_msg => sprintf("All %s components [%s] are ok.", + short_msg => sprintf("All %s components are ok [%s].", $total_components, - $display_by_component - ) + $display_by_component) ); - + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + $self->{output}->display(); $self->{output}->exit(); } @@ -116,7 +163,8 @@ sub check_exclude { my ($self, %options) = @_; if (defined($options{instance})) { - if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#$options{instance}#/) { + if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) { + $self->{components}->{$options{section}}->{skip}++; $self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance.")); return 1; } @@ -127,6 +175,28 @@ sub check_exclude { 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) { + $status = $_->{status}; + return $status; + } + } + } + foreach (@{$thresholds->{$options{section}}}) { + if ($options{value} =~ /$$_[0]/i) { + $status = $$_[1]; + return $status; + } + } + + return $status; +} + 1; __END__ @@ -139,13 +209,24 @@ Check hardware (modules, fans, power supplies). =item B<--component> -Which component to check (Default: 'all'). +Which component to check (Default: '.*'). Can be: 'fan', 'psu', 'module'. =item B<--exclude> -Exclude some parts (comma seperated list) (Example: --exclude=fans,modules) -Can also exclude specific instance: --exclude=fans#1#2#,modules#1#,psus +Exclude some parts (comma seperated list) (Example: --exclude=fan,module) +Can also exclude specific instance: --exclude=fan#1#2#,module#1#,psu + +=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,status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='fan,OK,inactive' =back diff --git a/centreon-plugins/network/aruba/standard/snmp/plugin.pm b/centreon-plugins/network/aruba/standard/snmp/plugin.pm index 4555725c0..3a261d162 100644 --- a/centreon-plugins/network/aruba/standard/snmp/plugin.pm +++ b/centreon-plugins/network/aruba/standard/snmp/plugin.pm @@ -47,6 +47,8 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( + 'ap-connections' => 'centreon::common::aruba::snmp::mode::apconnections', + 'ap-users' => 'centreon::common::aruba::snmp::mode::apusers', 'cpu' => 'centreon::common::aruba::snmp::mode::cpu', 'hardware' => 'centreon::common::aruba::snmp::mode::hardware', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', diff --git a/centreon-plugins/network/redback/snmp/mode/hardware.pm b/centreon-plugins/network/redback/snmp/mode/hardware.pm index 03550c029..28f54d8e9 100644 --- a/centreon-plugins/network/redback/snmp/mode/hardware.pm +++ b/centreon-plugins/network/redback/snmp/mode/hardware.pm @@ -77,9 +77,6 @@ sub new { "critical:s@" => { name => 'critical' }, }); - $self->{product_name} = undef; - $self->{serial} = undef; - $self->{romversion} = undef; $self->{components} = {}; $self->{no_components} = undef;