Support the use of a regexp to filter interface IDs (#4956)

Co-authored-by: –ykacherCentreon <ykacher@centreon.com>
This commit is contained in:
omercier 2024-03-25 22:02:57 +01:00 committed by GitHub
parent 8561043088
commit 48a70e481d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 4642 additions and 42 deletions

View File

@ -934,6 +934,7 @@ sub new {
'add-global' => { name => 'add_global' }, 'add-global' => { name => 'add_global' },
'add-status' => { name => 'add_status' }, 'add-status' => { name => 'add_status' },
'add-duplex-status' => { name => 'add_duplex_status' }, 'add-duplex-status' => { name => 'add_duplex_status' },
'regex-id' => { name => 'regex_id' },
'warning-status:s' => { name => 'warning_status', default => $self->default_warning_status() }, 'warning-status:s' => { name => 'warning_status', default => $self->default_warning_status() },
'critical-status:s' => { name => 'critical_status', default => $self->default_critical_status() }, 'critical-status:s' => { name => 'critical_status', default => $self->default_critical_status() },
'check-metrics:s' => { name => 'check_metrics', default => $self->default_check_metrics() }, 'check-metrics:s' => { name => 'check_metrics', default => $self->default_check_metrics() },
@ -1207,9 +1208,15 @@ sub get_selection {
my $all_ids = $self->{statefile_cache}->get(name => 'all_ids'); my $all_ids = $self->{statefile_cache}->get(name => 'all_ids');
if (!defined($self->{option_results}->{use_name}) && defined($self->{option_results}->{interface}) if (!defined($self->{option_results}->{use_name}) && defined($self->{option_results}->{interface})
&& $self->{no_interfaceid_options} == 0) { && $self->{no_interfaceid_options} == 0) {
foreach (@{$all_ids}) {
if ($self->{option_results}->{interface} =~ /(^|\s|,)$_(\s*,|$)/) { for my $id (@{$all_ids}) {
$self->add_selected_interface(id => $_);
if (defined($self->{option_results}->{regex_id}) # with option regex_id
and $id =~ /$self->{option_results}->{interface}/ # id must match the regex
or !defined($self->{option_results}->{regex_id}) # without the option
and $self->{option_results}->{interface} =~ /(^|\s|,)$id(\s*,|$)/ # the id must be part of the list
) {
$self->add_selected_interface(id => $id);
} }
} }
} else { } else {
@ -1683,15 +1690,20 @@ Units of thresholds for communication types (default: 'percent_delta') ('percent
=item B<--nagvis-perfdata> =item B<--nagvis-perfdata>
Display traffic perfdata to be compatible with nagvis widget. Display traffic perfdata to be compatible with NagVis widget.
=item B<--interface> =item B<--interface>
Set the interface (number expected) example: 1,2,... (empty means 'check all interfaces'). Define the interface filter on IDs (OID indexes, e.g.: 1,2,...). If empty, all interfaces will be monitored.
To filter on interface names, see --name.
=item B<--name> =item B<--name>
Allows you to define the interface (in option --interface) by name instead of OID index. The name matching mode supports regular expressions. With this option, the interfaces will be filtered by name (given in option --interface) instead of OID index. The name matching mode supports regular expressions.
=item B<--regex-id>
With this option, interface IDs will be filtered using the --interface parameter as a regular expression instead of a list of IDs.
=item B<--speed> =item B<--speed>
@ -1707,7 +1719,7 @@ Set interface speed for outgoing traffic (in Mb).
=item B<--map-speed-dsl> =item B<--map-speed-dsl>
Get interface speed configuration for interface type 'adsl' and 'vdsl2'. Get interface speed configuration for interfaces of type 'ADSL' and 'VDSL2'.
Syntax: --map-speed-dsl=interface-src-name,interface-dsl-name Syntax: --map-speed-dsl=interface-src-name,interface-dsl-name
@ -1719,7 +1731,7 @@ Force to use 64 bits counters only. Can be used to improve performance.
=item B<--force-counters32> =item B<--force-counters32>
Force to use 32 bits counters (even in snmp v2c and v3). Should be used when 64 bits counters are buggy. Force to use 32-bits counters (even with SNMP versions 2c and 3). To use when 64 bits counters are buggy.
=item B<--reload-cache-time> =item B<--reload-cache-time>

View File

@ -0,0 +1,71 @@
*** Settings ***
Documentation Network Interfaces
Library OperatingSystem
Library String
Library Examples
Test Timeout 120s
*** Variables ***
${CENTREON_PLUGINS} ${CURDIR}${/}..${/}..${/}..${/}src${/}centreon_plugins.pl
${CMD} perl ${CENTREON_PLUGINS}
... --plugin=os::linux::snmp::plugin
... --mode=interfaces
... --hostname=127.0.0.1
... --snmp-port=2024
... --snmp-community=network-interfaces
... --statefile-dir=/tmp/
${PERCENT} %
${COND} ${PERCENT}\{sub\} =~ /exited/ && ${PERCENT}{display} =~ /network/'
*** Test Cases ***
Interfaces by id ${tc}/5
[Tags] os linux network interfaces
${command} Catenate
... ${CMD}
... --interface='${filter}'
... ${extra_options}
${output} Run ${command}
${output} Strip String ${output}
Should Be Equal As Strings
... ${output}
... ${expected_result}
... \nWrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n
Examples: tc filter extra_options expected_result --
... 1 1 ${EMPTY} OK: Interface 'lo' Status : up (admin: up)
... 2 1,3 --add-traffic OK: All interfaces are ok
... 3 1,3 --add-traffic OK: All interfaces are ok | 'traffic_in_lo'=0.00b/s;;;0;10000000 'traffic_out_lo'=0.00b/s;;;0;10000000 'traffic_in_eth1'=0.00b/s;;;0;1000000000 'traffic_out_eth1'=0.00b/s;;;0;1000000000
... 4 2,3,4 --add-traffic OK: All interfaces are ok
... 5 2,3,4 --add-traffic OK: All interfaces are ok | 'traffic_in_eth0'=0.00b/s;;;0;1000000000 'traffic_out_eth0'=0.00b/s;;;0;1000000000 'traffic_in_eth1'=0.00b/s;;;0;1000000000 'traffic_out_eth1'=0.00b/s;;;0;1000000000 'traffic_in_eth2'=0.00b/s;;;0;1000000000 'traffic_out_eth2'=0.00b/s;;;0;1000000000
Interfaces by id regexp ${tc}/6
[Tags] os linux network interfaces
${command} Catenate
... ${CMD}
... --interface='${filter}'
... --regex-id
... ${extra_options}
${output} Run ${command}
${output} Strip String ${output}
Should Be Equal As Strings
... ${output}
... ${expected_result}
... \nWrong output result for command:\n${command}\n\nExpected:\n${expected_result}\nCommand output:\n${output}\n
Examples: tc filter extra_options expected_result --
... 1 ^1$ ${EMPTY} OK: Interface 'lo' Status : up (admin: up)
... 2 1 ${EMPTY} OK: Interface 'lo' Status : up (admin: up)
... 3 [13] --add-traffic OK: All interfaces are ok
... 4 [13] --add-traffic OK: All interfaces are ok | 'traffic_in_lo'=0.00b/s;;;0;10000000 'traffic_out_lo'=0.00b/s;;;0;10000000 'traffic_in_eth1'=0.00b/s;;;0;1000000000 'traffic_out_eth1'=0.00b/s;;;0;1000000000
... 5 [234] --add-traffic OK: All interfaces are ok
... 6 [234] --add-traffic OK: All interfaces are ok | 'traffic_in_eth0'=0.00b/s;;;0;1000000000 'traffic_out_eth0'=0.00b/s;;;0;1000000000 'traffic_in_eth1'=0.00b/s;;;0;1000000000 'traffic_out_eth1'=0.00b/s;;;0;1000000000 'traffic_in_eth2'=0.00b/s;;;0;1000000000 'traffic_out_eth2'=0.00b/s;;;0;1000000000

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,37 @@
--display-transform-dst
--display-transform-src
--filter-vdom --filter-vdom
--force-counters32 --force-counters32
--force-counters64
--map-speed-dsl
--nagvis-perfdata
--oid-display
--oid-extra-display
--oid-filter
2c
ADSL
Centreon Centreon
Datacore Datacore
deltaps
eth
Fortigate Fortigate
Fortinet Fortinet
ifAlias
ifDesc
ifName
in-bcast
in-mcast
in-ucast
interface-dsl-name
IpAddr
license-instances-usage-prct license-instances-usage-prct
MBean MBean
NagVis
OID OID
oneaccess-sys-mib oneaccess-sys-mib
out-bcast
out-mcast
out-ucast
perfdata perfdata
powershell powershell
proto proto
@ -18,5 +42,8 @@ space-usage-prct
SSH SSH
SureBackup SureBackup
topic-messages-inflighted topic-messages-inflighted
total-oper-down
total-oper-up
VDSL2
Veeam Veeam
WSMAN WSMAN