From 406bb609cbd118d47f81fbba9df3a79ba1a2de65 Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Mon, 10 Aug 2015 16:31:56 +0200 Subject: [PATCH] + Enhance aruba ap-users --- centreon/common/aruba/snmp/mode/apusers.pm | 426 +++++++++++++++------ 1 file changed, 309 insertions(+), 117 deletions(-) diff --git a/centreon/common/aruba/snmp/mode/apusers.pm b/centreon/common/aruba/snmp/mode/apusers.pm index a185146b6..621e99e34 100644 --- a/centreon/common/aruba/snmp/mode/apusers.pm +++ b/centreon/common/aruba/snmp/mode/apusers.pm @@ -26,79 +26,103 @@ 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_absolute', 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 }, - ], - } - }, +my $maps_counters = { + global => { + '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_absolute', 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 }, + ], + } + }, + }, + total_ap => { + '000_total-ap' => { set => { + key_values => [ { name => 'users' }, { name => 'bssid' } ], + output_template => 'Users : %s', + perfdatas => [ + { label => 'total', value => 'users_absolute', template => '%s', + unit => 'users', min => 0, label_extra_instance => 1, instance_use => 'bssid_absolute' }, + ], + } + }, + }, + total_essid => { + '000_total-essid' => { set => { + key_values => [ { name => 'users' }, { name => 'essid' } ], + output_template => 'Users : %s', + perfdatas => [ + { label => 'total', value => 'users_absolute', template => '%s', + unit => 'users', min => 0, label_extra_instance => 1, instance_use => 'essid_absolute' }, + ], + } + }, + } }; sub new { @@ -108,20 +132,25 @@ sub new { $self->{version} = '1.0'; $options{options}->add_options(arguments => - { + { + "filter-ip-address:s" => { name => 'filter_ip_address' }, + "filter-essid:s" => { name => 'filter_essid' }, }); - 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 }, - }); + foreach my $key (('global', 'total_ap', 'total_essid')) { + 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}}); } - $maps_counters->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata}, - label => $name); - $maps_counters->{$_}->{obj}->set(%{$maps_counters->{$_}->{set}}); } return $self; @@ -131,34 +160,34 @@ sub check_options { my ($self, %options) = @_; $self->SUPER::init(%options); - foreach (keys %{$maps_counters}) { - $maps_counters->{$_}->{obj}->init(option_results => $self->{option_results}); - } + foreach my $key (('global', 'total_ap', 'total_essid')) { + foreach (keys %{$maps_counters->{$key}}) { + $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); + } + } } -sub run { +sub run_total { 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'); + foreach (sort keys %{$maps_counters->{global}}) { + my $obj = $maps_counters->{global}->{$_}->{obj}; + + $obj->set(instance => 'global'); - my ($value_check) = $maps_counters->{$_}->{obj}->execute(values => $self->{global}); + my ($value_check) = $obj->execute(values => $self->{global}); if ($value_check != 0) { - $long_msg .= $long_msg_append . $maps_counters->{$_}->{obj}->output_error(); + $long_msg .= $long_msg_append . $obj->output_error(); $long_msg_append = ', '; next; } - my $exit2 = $maps_counters->{$_}->{obj}->threshold_check(); + my $exit2 = $obj->threshold_check(); push @exits, $exit2; - my $output = $maps_counters->{$_}->{obj}->output(); + my $output = $obj->output(); $long_msg .= $long_msg_append . $output; $long_msg_append = ', '; @@ -167,7 +196,7 @@ sub run { $short_msg_append = ', '; } - $maps_counters->{$_}->{obj}->perfdata(); + $obj->perfdata(); } my $exit = $self->{output}->get_most_critical(status => [ @exits ]); @@ -178,18 +207,142 @@ sub run { } else { $self->{output}->output_add(short_msg => "$long_msg"); } +} + +sub run_ap { + my ($self, %options) = @_; + + my $multiple = 1; + if (scalar(keys %{$self->{ap_selected}}) == 1) { + $multiple = 0; + } + + if ($multiple == 1) { + $self->{output}->output_add(severity => 'OK', + short_msg => 'All users by AP are ok'); + } + + foreach my $id (sort keys %{$self->{ap_selected}}) { + my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); + my @exits = (); + foreach (sort keys %{$maps_counters->{total_ap}}) { + my $obj = $maps_counters->{total_ap}->{$_}->{obj}; + $obj->set(instance => $id); + + my ($value_check) = $obj->execute(values => $self->{ap_selected}->{$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 = ', '; + } + + $obj->perfdata(extra_instance => $multiple); + } + + $self->{output}->output_add(long_msg => "AP '$id' $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 => "AP '$id' $short_msg" + ); + } + + if ($multiple == 0) { + $self->{output}->output_add(short_msg => "AP '$id' $long_msg"); + } + } +} + +sub run_essid { + my ($self, %options) = @_; + + my $multiple = 1; + if (scalar(keys %{$self->{essid_selected}}) == 1) { + $multiple = 0; + } + + if ($multiple == 1) { + $self->{output}->output_add(severity => 'OK', + short_msg => 'All users by ESSID are ok'); + } + + foreach my $id (sort keys %{$self->{essid_selected}}) { + my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); + my @exits = (); + foreach (sort keys %{$maps_counters->{total_essid}}) { + my $obj = $maps_counters->{total_essid}->{$_}->{obj}; + $obj->set(instance => $id); + + my ($value_check) = $obj->execute(values => $self->{essid_selected}->{$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 = ', '; + } + + $obj->perfdata(extra_instance => $multiple); + } + + $self->{output}->output_add(long_msg => "ESSID '$id' $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 => "ESSID '$id' $short_msg" + ); + } + + if ($multiple == 0) { + $self->{output}->output_add(short_msg => "ESSID '$id' $long_msg"); + } + } +} + +sub run { + my ($self, %options) = @_; + $self->{snmp} = $options{snmp}; + + $self->manage_selection(); + $self->run_total(); + $self->run_ap(); + $self->run_essid(); $self->{output}->display(); $self->{output}->exit(); } my %map_auth_method = ( - 1 => 'none', - 2 => 'other', - 3 => 'web', - 4 => 'dot1x', - 5 => 'vpn', - 6 => 'mac', + 0 => 'none', 1 => 'web', + 2 => 'mac', 3 => 'vpn', + 4 => 'dot1x', 5 => 'kerberos', + 7 => 'secureId', + 15 => 'pubcookie', 16 => 'xSec', + 17 => 'xSecMachine', + 28 => 'via-vpn', + 255 => 'other', ); my %map_role = ( 1 => 'master', @@ -197,21 +350,33 @@ my %map_role = ( 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 }, + nUserUpTime => { oid => '.1.3.6.1.4.1.14823.2.2.1.4.1.2.1.5' }, + nUserAuthenticationMethod => { oid => '.1.3.6.1.4.1.14823.2.2.1.4.1.2.1.6', map => \%map_auth_method }, +}; +my $mapping2 = { + nUserApBSSID => { oid => '.1.3.6.1.4.1.14823.2.2.1.4.1.2.1.11' }, }; -my $oid_wlsxSwitchUserEntry = '.1.3.6.1.4.1.14823.2.2.1.1.2.1.1'; +my $oid_wlsxUserEntry = '.1.3.6.1.4.1.14823.2.2.1.4.1.2.1'; my $oid_wlsxSwitchRole = '.1.3.6.1.4.1.14823.2.2.1.1.1.4'; +my $oid_apESSID = '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.2'; +my $oid_apIpAddress = '.1.3.6.1.4.1.14823.2.2.1.1.3.3.1.5'; 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->{global} = { total => 0, total_none => 0, total_web => 0, total_mac => 0, total_vpn => 0, + total_dot1x => 0, total_kerberos => 0, total_secureId => 0, total_pubcookie => 0, + total_xSec => 0, xSecMachine => 0, 'total_via-vpn' => 0, total_other => 0 }; + $self->{ap_selected} = {}; + $self->{essid_selected} = {}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => [ { oid => $oid_wlsxSwitchRole }, - { oid => $oid_wlsxSwitchUserEntry, start => $mapping->{userUpTime}->{oid}, end => $mapping->{userAuthenticationMethod}->{oid} }, + { oid => $oid_wlsxUserEntry, start => $mapping->{nUserUpTime}->{oid}, end => $mapping->{nUserAuthenticationMethod}->{oid} }, + { oid => $mapping2->{nUserApBSSID}->{oid} }, + { oid => $oid_apESSID }, + { oid => $oid_apIpAddress }, ], nothing_quit => 1); @@ -223,15 +388,34 @@ sub manage_selection { $self->{output}->exit(); } + my %map_ap = (); + foreach my $oid (keys %{$self->{results}->{$oid_apESSID}}) { + $oid =~ /^$oid_apESSID\.(.*)$/; + $map_ap{$1} = { essid => $self->{results}->{$oid_apESSID}->{$oid}, ip => $self->{results}->{$oid_apIpAddress}->{$oid_apIpAddress . '.' . $1} }; + } + my $total_timeticks = 0; - foreach my $oid (keys %{$self->{results}->{$oid_wlsxSwitchUserEntry}}) { - $oid =~ /^$mapping->{userAuthenticationMethod}->{oid}\.(.*)$/; + foreach my $oid (keys %{$self->{results}->{$oid_wlsxUserEntry}}) { + $oid =~ /^$mapping->{nUserAuthenticationMethod}->{oid}\.(.*)$/; my $instance = $1; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSwitchUserEntry}, instance => $instance); + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxUserEntry}, instance => $instance); + my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{nUserApBSSID}->{oid}}, instance => $instance); + + my $bssid = join('.', unpack('C*', $result2->{nUserApBSSID})); + next if (defined($self->{option_results}->{filter_ip_address}) && $self->{option_results}->{filter_ip_address} ne '' && + $map_ap{$bssid}->{ip} !~ /$self->{option_results}->{filter_ip_address}/); + next if (defined($self->{option_results}->{filter_ip_address}) && $self->{option_results}->{filter_ip_address} ne '' && + $map_ap{$bssid}->{essid} !~ /$self->{option_results}->{filter_essid}/); + + $self->{ap_selected}->{$bssid} = { users => 0, bssid => $bssid } if (!defined($self->{ap_selected}->{$bssid})); + $self->{ap_selected}->{$bssid}->{users}++; + + $self->{essid_selected}->{$map_ap{$bssid}->{essid}} = { users => 0, essid => $map_ap{$bssid}->{essid} } if (!defined($self->{essid_selected}->{$map_ap{$bssid}->{essid}})); + $self->{essid_selected}->{$map_ap{$bssid}->{essid}}->{users}++; $self->{global}->{total}++; - $self->{global}->{'total_' . $result->{userAuthenticationMethod}}++; - $total_timeticks += $result->{userUpTime}; + $self->{global}->{'total_' . $result->{nUserAuthenticationMethod}}++; + $total_timeticks += $result->{nUserUpTime}; } if ($self->{global}->{total} > 0) { @@ -261,6 +445,14 @@ Threshold critical. Can be: 'total', 'total-none', 'total-other', 'total-web', 'total-dot1x', 'total-vpn', 'total-mac', 'avg-connection-time' (seconds). +=item B<--filter-ip-address> + +Filter by ip address (regexp can be used). + +=item B<--filter-essid> + +Filter by ESSID (regexp can be used). + =back =cut