add interface type in list-interfaces mode

This commit is contained in:
garnier-quentin 2020-07-22 14:05:28 +02:00
parent adda9e9911
commit 6383f4db34
2 changed files with 139 additions and 41 deletions

View File

@ -24,27 +24,29 @@ use base qw(centreon::plugins::mode);
use strict;
use warnings;
use snmp_standard::mode::resources::types qw($map_iftype);
my $oid_speed32 = '.1.3.6.1.2.1.2.2.1.5'; # in b/s
my $oid_speed64 = '.1.3.6.1.2.1.31.1.1.1.15';
sub set_oids_status {
my ($self, %options) = @_;
$self->{oid_adminstatus} = '.1.3.6.1.2.1.2.2.1.7';
$self->{oid_adminstatus_mapping} = {
1 => 'up', 2 => 'down', 3 => 'testing', 4 => 'unknown', 5 => 'dormant', 6 => 'notPresent', 7 => 'lowerLayerDown',
1 => 'up', 2 => 'down', 3 => 'testing', 4 => 'unknown', 5 => 'dormant', 6 => 'notPresent', 7 => 'lowerLayerDown'
};
$self->{oid_opstatus} = '.1.3.6.1.2.1.2.2.1.8';
$self->{oid_opstatus_mapping} = {
1 => 'up', 2 => 'down', 3 => 'testing', 4 => 'unknown', 5 => 'dormant', 6 => 'notPresent', 7 => 'lowerLayerDown',
1 => 'up', 2 => 'down', 3 => 'testing', 4 => 'unknown', 5 => 'dormant', 6 => 'notPresent', 7 => 'lowerLayerDown'
};
$self->{oid_mac_address} = '.1.3.6.1.2.1.2.2.1.6';
$self->{oid_iftype} = '.1.3.6.1.2.1.2.2.1.3';
}
sub check_oids_label {
my ($self, %options) = @_;
foreach (('oid_filter', 'oid_display')) {
$self->{option_results}->{$_} = lc($self->{option_results}->{$_}) if (defined($self->{option_results}->{$_}));
if (!defined($self->{oids_label}->{$self->{option_results}->{$_}})) {
@ -62,25 +64,25 @@ sub set_oids_label {
$self->{oids_label} = {
'ifdesc' => '.1.3.6.1.2.1.2.2.1.2',
'ifalias' => '.1.3.6.1.2.1.31.1.1.1.18',
'ifname' => '.1.3.6.1.2.1.31.1.1.1.1',
'ifname' => '.1.3.6.1.2.1.31.1.1.1.1'
};
}
sub default_oid_filter_name {
my ($self, %options) = @_;
return 'ifname';
}
sub default_oid_display_name {
my ($self, %options) = @_;
return 'ifname';
}
sub is_admin_status_down {
my ($self, %options) = @_;
if (defined($self->{option_results}->{use_adminstatus}) && defined($options{admin_status}) &&
$self->{oid_adminstatus_mapping}->{$options{admin_status}} ne 'up') {
return 1;
@ -92,21 +94,21 @@ sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => defined($options{package}) ? $options{package} : __PACKAGE__, %options);
bless $self, $class;
$self->{no_speed} = defined($options{no_speed}) && $options{no_speed} =~ /^[01]$/ ? $options{no_speed} : 0;
$options{options}->add_options(arguments => {
"name" => { name => 'use_name' },
"interface:s" => { name => 'interface' },
"speed:s" => { name => 'speed' },
"filter-status:s" => { name => 'filter_status' },
"skip-speed0" => { name => 'skip_speed0' },
"use-adminstatus" => { name => 'use_adminstatus' },
"oid-filter:s" => { name => 'oid_filter', default => $self->default_oid_filter_name() },
"oid-display:s" => { name => 'oid_display', default => $self->default_oid_display_name() },
"display-transform-src:s" => { name => 'display_transform_src' },
"display-transform-dst:s" => { name => 'display_transform_dst' },
"add-extra-oid:s@" => { name => 'add_extra_oid' },
"add-mac-address" => { name => 'add_mac_address' },
'name' => { name => 'use_name' },
'interface:s' => { name => 'interface' },
'speed:s' => { name => 'speed' },
'filter-status:s' => { name => 'filter_status' },
'skip-speed0' => { name => 'skip_speed0' },
'use-adminstatus' => { name => 'use_adminstatus' },
'oid-filter:s' => { name => 'oid_filter', default => $self->default_oid_filter_name() },
'oid-display:s' => { name => 'oid_display', default => $self->default_oid_display_name() },
'display-transform-src:s' => { name => 'display_transform_src' },
'display-transform-dst:s' => { name => 'display_transform_dst' },
'add-extra-oid:s@' => { name => 'add_extra_oid' },
'add-mac-address' => { name => 'add_mac_address' }
});
$self->{interface_id_selected} = [];
@ -121,7 +123,7 @@ sub check_options {
$self->set_oids_label();
$self->check_oids_label();
$self->set_oids_status();
$self->{extra_oids} = {};
foreach (@{$self->{option_results}->{add_extra_oid}}) {
next if ($_ eq '');
@ -154,34 +156,46 @@ sub run {
if (defined($self->{option_results}->{speed}) && $self->{option_results}->{speed} ne '') {
$interface_speed = $self->{option_results}->{speed};
}
if (defined($self->{option_results}->{skip_speed0}) && $interface_speed == 0) {
$self->{output}->output_add(long_msg => "Skipping interface '" . $display_value . "': interface speed is 0 and option --skip-speed0 is set");
$self->{output}->output_add(long_msg => "skipping interface '" . $display_value . "': interface speed is 0 and option --skip-speed0 is set");
next;
}
if (defined($self->{option_results}->{filter_status}) && defined($result->{$self->{oid_opstatus} . "." . $_}) &&
$self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} !~ /$self->{option_results}->{filter_status}/i) {
$self->{output}->output_add(long_msg => "Skipping interface '" . $display_value . "': no matching filter status");
$self->{output}->output_add(long_msg => "skipping interface '" . $display_value . "': no matching filter status");
next;
}
if ($self->is_admin_status_down(admin_status => $result->{$self->{oid_adminstatus} . "." . $_})) {
$self->{output}->output_add(long_msg => "Skipping interface '" . $display_value . "': adminstatus is not 'up' and option --use-adminstatus is set");
$self->{output}->output_add(long_msg => "skipping interface '" . $display_value . "': adminstatus is not 'up' and option --use-adminstatus is set");
next;
}
my $extra_values = $self->get_extra_values_by_instance(result => $result, instance => $_);
my $extra_display = '';
foreach my $name (keys %{$extra_values}) {
$extra_display .= ', ' . $name . ' = ' . $extra_values->{$name};
$extra_display .= '[' . $name . ' = ' . $extra_values->{$name} . ']';
}
if (defined($self->{oid_iftype})) {
$extra_display .= '[type = ' . $map_iftype->{ $result->{ $self->{oid_iftype} . '.' . $_ } } . ']';
}
$self->{output}->output_add(long_msg => "'" . $display_value . "' [speed = $interface_speed, status = " .
(defined($result->{$self->{oid_opstatus} . "." . $_}) ? $self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} : '') .
', id = ' . $_ . $extra_display . ']');
$self->{output}->output_add(
long_msg => sprintf(
"'%s' [speed = %s][status = %s][id = %s]%s",
$display_value,
$interface_speed,
(defined($result->{$self->{oid_opstatus} . "." . $_}) ? $self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} : ''),
$_,
$extra_display
)
);
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List interfaces:');
$self->{output}->output_add(
severity => 'OK',
short_msg => 'List interfaces:'
);
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
@ -193,6 +207,7 @@ sub get_additional_information {
push @$oids, $self->{oid_adminstatus} if (defined($self->{oid_adminstatus}));
push @$oids, $self->{oid_opstatus} if (defined($self->{oid_opstatus}));
push @$oids, $self->{oid_mac_address} if (defined($self->{option_results}->{add_mac_address}));
push @$oids, $self->{oid_iftype} if (defined($self->{oid_iftype}));
push @$oids, $oid_speed32 if ($self->{no_speed} == 0);
push @$oids, $oid_speed64 if (!$self->{snmp}->is_snmpv1() && $self->{no_speed} == 0);
@ -265,9 +280,9 @@ sub manage_selection {
}
}
}
if (scalar(@{$self->{interface_id_selected}}) <= 0 && !defined($options{disco})) {
$self->{output}->add_option_msg(short_msg => "No entry found");
$self->{output}->add_option_msg(short_msg => 'No entry found');
$self->{output}->option_exit();
}
}
@ -310,6 +325,7 @@ sub disco_format {
if (defined($self->{option_results}->{add_mac_address})) {
push @$names, 'macaddress';
}
push @$names, 'type' if (defined($self->{oid_iftype}));
$self->{output}->add_disco_format(elements => $names);
}
@ -338,13 +354,18 @@ sub disco_show {
next if (defined($self->{option_results}->{filter_status}) && defined($result->{$self->{oid_opstatus} . "." . $_}) &&
$self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} !~ /$self->{option_results}->{filter_status}/i);
next if ($self->is_admin_status_down(admin_status => $result->{$self->{oid_adminstatus} . "." . $_}));
my $extra_values = $self->get_extra_values_by_instance(result => $result, instance => $_);
$self->{output}->add_disco_entry(name => $display_value,
total => $interface_speed,
status => defined($result->{$self->{oid_opstatus} . "." . $_}) ? $self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} : '',
interfaceid => $_,
%$extra_values);
if (defined($self->{oid_iftype})) {
$extra_values->{type} = $map_iftype->{ $result->{ $self->{oid_iftype} . '.' . $_ } };
}
$self->{output}->add_disco_entry(
name => $display_value,
total => $interface_speed,
status => defined($result->{$self->{oid_opstatus} . "." . $_}) ? $self->{oid_opstatus_mapping}->{$result->{$self->{oid_opstatus} . "." . $_}} : '',
interfaceid => $_,
%$extra_values
);
}
}

View File

@ -0,0 +1,77 @@
#
# Copyright 2020 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 snmp_standard::mode::resources::types;
use strict;
use warnings;
use Exporter;
our $map_iftype;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw($map_iftype);
$map_iftype = {
1 => 'other', 2 => 'regular1822', 3 => 'hdh1822', 4 => 'ddnX25', 5 => 'rfc877x25', 6 => 'ethernetCsmacd',
7 => 'iso88023Csmacd', 8 => 'iso88024TokenBus', 9 => 'iso88025TokenRing', 10 => 'iso88026Man', 11 => 'starLan',
12 => 'proteon10Mbit', 13 => 'proteon80Mbit', 14 => 'hyperchannel', 15 => 'fddi', 16 => 'lapb', 17 => 'sdlc', 18 => 'ds1',
19 => 'e1', 20 => 'basicISDN', 21 => 'primaryISDN', 22 => 'propPointToPointSerial', 23 => 'ppp', 24 => 'softwareLoopback',
25 => 'eon', 26 => 'ethernet3Mbit', 27 => 'nsip', 28 => 'slip', 29 => 'ultra', 30 => 'ds3', 31 => 'sip', 32 => 'frameRelay',
33 => 'rs232', 34 => 'para', 35 => 'arcnet', 36 => 'arcnetPlus', 37 => 'atm', 38 => 'miox25', 39 => 'sonet', 40 => 'x25ple', 41 => 'iso88022llc',
42 => 'localTalk', 43 => 'smdsDxi', 44 => 'frameRelayService', 45 => 'v35', 46 => 'hssi', 47 => 'hippi', 48 => 'modem', 49 => 'aal5',
50 => 'sonetPath', 51 => 'sonetVT', 52 => 'smdsIcip', 53 => 'propVirtual', 54 => 'propMultiplexor', 55 => 'ieee80212', 56 => 'fibreChannel',
57 => 'hippiInterface', 58 => 'frameRelayInterconnect', 59 => 'aflane8023', 60 => 'aflane8025', 61 => 'cctEmul', 62 => 'fastEther', 63 => 'isdn',
64 => 'v11', 65 => 'v36', 66 => 'g703at64k', 67 => 'g703at2mb', 68 => 'qllc', 69 => 'fastEtherFX', 70 => 'channel', 71 => 'ieee80211',
72 => 'ibm370parChan', 73 => 'escon', 74 => 'dlsw', 75 => 'isdns', 76 => 'isdnu', 77 => 'lapd', 78 => 'ipSwitch', 79 => 'rsrb', 80 => 'atmLogical',
81 => 'ds0', 82 => 'ds0Bundle', 83 => 'bsc', 84 => 'async', 85 => 'cnr', 86 => 'iso88025Dtr', 87 => 'eplrs', 88 => 'arap', 89 => 'propCnls',
90 => 'hostPad', 91 => 'termPad', 92 => 'frameRelayMPI', 93 => 'x213', 94 => 'adsl', 95 => 'radsl', 96 => 'sdsl', 97 => 'vdsl',
98 => 'iso88025CRFPInt', 99 => 'myrinet', 100 => 'voiceEM', 101 => 'voiceFXO', 102 => 'voiceFXS', 103 => 'voiceEncap', 104 => 'voiceOverIp',
105 => 'atmDxi', 106 => 'atmFuni', 107 => 'atmIma', 108 => 'pppMultilinkBundle', 109 => 'ipOverCdlc', 110 => 'ipOverClaw', 111 => 'stackToStack',
112 => 'virtualIpAddress', 113 => 'mpc', 114 => 'ipOverAtm', 115 => 'iso88025Fiber', 116 => 'tdlc', 117 => 'gigabitEthernet', 118 => 'hdlc',
119 => 'lapf', 120 => 'v37', 121 => 'x25mlp', 122 => 'x25huntGroup', 123 => 'transpHdlc', 124 => 'interleave', 125 => 'fast', 126 => 'ip',
127 => 'docsCableMaclayer', 128 => 'docsCableDownstream', 129 => 'docsCableUpstream', 130 => 'a12MppSwitch', 131 => 'tunnel', 132 => 'coffee',
133 => 'ces', 134 => 'atmSubInterface', 135 => 'l2vlan', 136 => 'l3ipvlan', 137 => 'l3ipxvlan', 138 => 'digitalPowerline', 139 => 'mediaMailOverIp',
140 => 'dtm', 141 => 'dcn', 142 => 'ipForward', 143 => 'msdsl', 144 => 'ieee1394', 145 => 'if-gsn', 146 => 'dvbRccMacLayer', 147 => 'dvbRccDownstream',
148 => 'dvbRccUpstream', 149 => 'atmVirtual', 150 => 'mplsTunnel', 151 => 'srp', 152 => 'voiceOverAtm', 153 => 'voiceOverFrameRelay', 154 => 'idsl',
155 => 'compositeLink', 156 => 'ss7SigLink', 157 => 'propWirelessP2P', 158 => 'frForward', 159 => 'rfc1483', 160 => 'usb', 161 => 'ieee8023adLag',
162 => 'bgppolicyaccounting', 163 => 'frf16MfrBundle', 164 => 'h323Gatekeeper', 165 => 'h323Proxy', 166 => 'mpls', 167 => 'mfSigLink', 168 => 'hdsl2',
169 => 'shdsl', 170 => 'ds1FDL', 171 => 'pos', 172 => 'dvbAsiIn', 173 => 'dvbAsiOut', 174 => 'plc', 175 => 'nfas', 176 => 'tr008', 177 => 'gr303RDT',
178 => 'gr303IDT', 179 => 'isup', 180 => 'propDocsWirelessMaclayer', 181 => 'propDocsWirelessDownstream', 182 => 'propDocsWirelessUpstream', 183 => 'hiperlan2',
184 => 'propBWAp2Mp', 185 => 'sonetOverheadChannel', 186 => 'digitalWrapperOverheadChannel', 187 => 'aal2', 188 => 'radioMAC', 189 => 'atmRadio',
190 => 'imt', 191 => 'mvl', 192 => 'reachDSL', 193 => 'frDlciEndPt', 194 => 'atmVciEndPt', 195 => 'opticalChannel', 196 => 'opticalTransport',
197 => 'propAtm', 198 => 'voiceOverCable', 199 => 'infiniband', 200 => 'teLink', 201 => 'q2931', 202 => 'virtualTg', 203 => 'sipTg', 204 => 'sipSig',
205 => 'docsCableUpstreamChannel', 206 => 'econet', 207 => 'pon155', 208 => 'pon622', 209 => 'bridge', 210 => 'linegroup', 211 => 'voiceEMFGD',
212 => 'voiceFGDEANA', 213 => 'voiceDID', 214 => 'mpegTransport', 215 => 'sixToFour', 216 => 'gtp', 217 => 'pdnEtherLoop1', 218 => 'pdnEtherLoop2',
219 => 'opticalChannelGroup', 220 => 'homepna', 221 => 'gfp', 222 => 'ciscoISLvlan', 223 => 'actelisMetaLOOP', 224 => 'fcipLink', 225 => 'rpr', 226 => 'qam',
227 => 'lmp', 228 => 'cblVectaStar', 229 => 'docsCableMCmtsDownstream', 230 => 'adsl2', 231 => 'macSecControlledIF', 232 => 'macSecUncontrolledIF',
233 => 'aviciOpticalEther', 234 => 'atmbond', 235 => 'voiceFGDOS', 236 => 'mocaVersion1', 237 => 'ieee80216WMAN', 238 => 'adsl2plus', 239 => 'dvbRcsMacLayer',
240 => 'dvbTdm', 241 => 'dvbRcsTdma', 242 => 'x86Laps', 243 => 'wwanPP', 244 => 'wwanPP2', 245 => 'voiceEBS', 246 => 'ifPwType', 247 => 'ilan', 248 => 'pip',
249 => 'aluELP', 250 => 'gpon', 251 => 'vdsl2', 252 => 'capwapDot11Profile', 253 => 'capwapDot11Bss', 254 => 'capwapWtpVirtualRadio', 255 => 'bits',
256 => 'docsCableUpstreamRfPort', 257 => 'cableDownstreamRfPort', 258 => 'vmwareVirtualNic', 259 => 'ieee802154', 260 => 'otnOdu', 261 => 'otnOtu',
262 => 'ifVfiType', 263 => 'g9981', 264 => 'g9982', 265 => 'g9983', 266 => 'aluEpon', 267 => 'aluEponOnu', 268 => 'aluEponPhysicalUni',
269 => 'aluEponLogicalLink', 270 => 'aluGponOnu', 271 => 'aluGponPhysicalUni', 272 => 'vmwareNicTeam', 277 => 'docsOfdmDownstream', 278 => 'docsOfdmaUpstream',
279 => 'gfast', 280 => 'sdci', 281 => 'xboxWireless', 282 => 'fastdsl', 283 => 'docsCableScte55d1FwdOob', 284 => 'docsCableScte55d1RetOob',
285 => 'docsCableScte55d2DsOob', 286 => 'docsCableScte55d2UsOob', 287 => 'docsCableNdf', 288 => 'docsCableNdr', 289 => 'ptm', 290 => 'ghn', 291 => 'otnOtsi',
292 => 'otnOtuc', 293 => 'otnOduc', 294 => 'otnOtsig', 295 => 'microwaveCarrierTermination', 296 => 'microwaveRadioLinkTerminal', 297 => 'ieee8021axDrni',
298 => 'ax25', 299 => 'ieee19061nanocom', 300 => 'cpri'
};
1;