This commit is contained in:
garnier-quentin 2020-07-06 17:27:00 +02:00
parent 2ea9c71d98
commit 1487ab33cb
1 changed files with 75 additions and 20 deletions

View File

@ -39,16 +39,28 @@ sub skip_global {
scalar(keys %{$self->{ap}}) == 1 ? return(1) : return(0); scalar(keys %{$self->{ap}}) == 1 ? return(1) : return(0);
} }
sub prefix_ap_output {
my ($self, %options) = @_;
return "Access point '" . $options{instance_value}->{display} . "' ";
}
sub prefix_global_output { sub prefix_global_output {
my ($self, %options) = @_; my ($self, %options) = @_;
return 'Access point '; return 'Access points ';
}
sub ap_long_output {
my ($self, %options) = @_;
return "checking access point '" . $options{instance_value}->{display} . "'";
}
sub prefix_ap_output {
my ($self, %options) = @_;
return "access point '" . $options{instance_value}->{display} . "' ";
}
sub prefix_interface_output {
my ($self, %options) = @_;
return "radio interface '" . $options{instance_value}->{display} . "' ";
} }
sub set_counters { sub set_counters {
@ -56,8 +68,14 @@ sub set_counters {
$self->{maps_counters_type} = [ $self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', cb_init => 'skip_global', }, { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', cb_init => 'skip_global', },
{ name => 'ap', type => 1, cb_prefix_output => 'prefix_ap_output', message_multiple => 'All access points are ok' } { name => 'ap', type => 3, cb_prefix_output => 'prefix_ap_output', cb_long_output => 'ap_long_output', indent_long_output => ' ', message_multiple => 'All access points are ok',
group => [
{ name => 'ap_global', type => 0 },
{ name => 'interfaces', type => 1, display_long => 1, cb_prefix_output => 'prefix_interface_output', message_multiple => 'radio interfaces are ok', skipped_code => { -10 => 1 } }
]
}
]; ];
$self->{maps_counters}->{global} = [ $self->{maps_counters}->{global} = [
{ label => 'total', nlabel => 'accesspoints.total.count', set => { { label => 'total', nlabel => 'accesspoints.total.count', set => {
key_values => [ { name => 'total' } ], key_values => [ { name => 'total' } ],
@ -101,7 +119,7 @@ sub set_counters {
} }
]; ];
$self->{maps_counters}->{ap} = [ $self->{maps_counters}->{ap_global} = [
{ label => 'status', threshold => 0, set => { { label => 'status', threshold => 0, set => {
key_values => [ { name => 'opstatus' }, { name => 'admstatus' }, { name => 'display' } ], key_values => [ { name => 'opstatus' }, { name => 'admstatus' }, { name => 'display' } ],
closure_custom_output => $self->can('custom_status_output'), closure_custom_output => $self->can('custom_status_output'),
@ -110,6 +128,17 @@ sub set_counters {
} }
} }
]; ];
$self->{maps_counters}->{interfaces} = [
{ label => 'radio-interface-channels-utilization', nlabel => 'accesspoint.radio.interface.channels.utilization.percentage', set => {
key_values => [ { name => 'channels_util' } ],
output_template => 'channels utilization: %s %%',
perfdatas => [
{ label => 'radio_interface_channels_utilization', template => '%s', min => 0, max => 100, unit => '%', label_extra_instance => 1 }
]
}
}
];
} }
sub new { sub new {
@ -118,10 +147,11 @@ sub new {
bless $self, $class; bless $self, $class;
$options{options}->add_options(arguments => { $options{options}->add_options(arguments => {
'filter-name:s' => { name => 'filter_name' }, 'filter-name:s' => { name => 'filter_name' },
'filter-group:s' => { name => 'filter_group' }, 'filter-group:s' => { name => 'filter_group' },
'warning-status:s' => { name => 'warning_status', default => '' }, 'warning-status:s' => { name => 'warning_status', default => '' },
'critical-status:s' => { name => 'critical_status', default => '%{admstatus} eq "enable" and %{opstatus} !~ /associated|downloading/' } 'critical-status:s' => { name => 'critical_status', default => '%{admstatus} eq "enable" and %{opstatus} !~ /associated|downloading/' },
'add-radio-interfaces' => { name => 'add_radio_interfaces' }
}); });
return $self; return $self;
@ -152,6 +182,7 @@ my $mapping2 = {
bsnAPAdminStatus => { oid => '.1.3.6.1.4.1.14179.2.2.1.1.37', map => $map_admin_status } bsnAPAdminStatus => { oid => '.1.3.6.1.4.1.14179.2.2.1.1.37', map => $map_admin_status }
}; };
my $oid_agentInventoryMachineModel = '.1.3.6.1.4.1.14179.1.1.1.3'; my $oid_agentInventoryMachineModel = '.1.3.6.1.4.1.14179.1.1.1.3';
my $oid_bsnAPIfLoadChannelUtilization = '.1.3.6.1.4.1.14179.2.2.13.1.3';
sub manage_selection { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
@ -190,8 +221,11 @@ sub manage_selection {
next; next;
} }
$self->{ap}->{$instance} = { $self->{ap}->{ $result->{bsnAPName} } = {
display => $result->{bsnAPName} instance => $instance,
display => $result->{bsnAPName},
ap_global => { display => $result->{bsnAPName} },
interfaces => {}
}; };
} }
@ -202,19 +236,32 @@ sub manage_selection {
$options{snmp}->load( $options{snmp}->load(
oids => [ map($_->{oid}, values(%$mapping2)) ], oids => [ map($_->{oid}, values(%$mapping2)) ],
instances => [ keys %{$self->{ap}} ], instances => [ map($_->{instance}, values %{$self->{ap}}) ],
instance_regexp => '^(.*)$' instance_regexp => '^(.*)$'
); );
$snmp_result = $options{snmp}->get_leef(); $snmp_result = $options{snmp}->get_leef();
my $snmp_result_radio;
$snmp_result_radio = $options{snmp}->get_table(oid => $oid_bsnAPIfLoadChannelUtilization)
if (defined($self->{option_results}->{add_radio_interfaces}));
foreach (keys %{$self->{ap}}) { foreach (keys %{$self->{ap}}) {
my $result = $options{snmp}->map_instance(mapping => $mapping2, results => $snmp_result, instance => $_); my $result = $options{snmp}->map_instance(mapping => $mapping2, results => $snmp_result, instance => $self->{ap}->{$_}->{instance});
$self->{global}->{total}++; $self->{global}->{total}++;
$self->{global}->{$result->{bsnAPOperationStatus}}++; $self->{global}->{$result->{bsnAPOperationStatus}}++;
$self->{global}->{$result->{bsnAPAdminStatus}}++; $self->{global}->{$result->{bsnAPAdminStatus}}++;
$self->{ap}->{$_}->{opstatus} = $result->{bsnAPOperationStatus}; $self->{ap}->{$_}->{ap_global}->{opstatus} = $result->{bsnAPOperationStatus};
$self->{ap}->{$_}->{admstatus} = $result->{bsnAPAdminStatus}; $self->{ap}->{$_}->{ap_global}->{admstatus} = $result->{bsnAPAdminStatus};
next if (!defined($self->{option_results}->{add_radio_interfaces}));
foreach my $oid (keys %$snmp_result_radio) {
next if ($oid !~ /^$oid_bsnAPIfLoadChannelUtilization\.$self->{ap}->{$_}->{instance}\.(\d+)/);
$self->{ap}->{$_}->{interfaces}->{$1} = {
display => $1,
channels_util => $snmp_result_radio->{$oid}
};
}
} }
} }
@ -241,6 +288,10 @@ Filter access point name (can be a regexp).
Filter access point group (can be a regexp). Filter access point group (can be a regexp).
=item B<--add-radio-interfaces>
Monitor radio interfaces channels utilization.
=item B<--warning-status> =item B<--warning-status>
Set warning threshold for status. Set warning threshold for status.
@ -253,6 +304,10 @@ Can used special variables like: %{admstatus}, %{opstatus}, %{display}
=item B<--warning-*> B<--critical-*> =item B<--warning-*> B<--critical-*>
Thresholds.
Can be: 'total', 'total-associated', 'total-disassociating', 'total-enabled',
'total-disabled', 'radio-interface-channels-utilization' (%).
=back =back
=cut =cut