From 57ecbb9c335f2519cd2b22474333f26eb2ff20fb Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Wed, 22 Jul 2020 14:05:28 +0200 Subject: [PATCH] add interface type in list-interfaces mode --- snmp_standard/mode/listinterfaces.pm | 103 ++++++++++++++++---------- snmp_standard/mode/resources/types.pm | 77 +++++++++++++++++++ 2 files changed, 139 insertions(+), 41 deletions(-) create mode 100644 snmp_standard/mode/resources/types.pm diff --git a/snmp_standard/mode/listinterfaces.pm b/snmp_standard/mode/listinterfaces.pm index fd98c30ca..810158dd9 100644 --- a/snmp_standard/mode/listinterfaces.pm +++ b/snmp_standard/mode/listinterfaces.pm @@ -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 + ); } } diff --git a/snmp_standard/mode/resources/types.pm b/snmp_standard/mode/resources/types.pm new file mode 100644 index 000000000..b5f5a8784 --- /dev/null +++ b/snmp_standard/mode/resources/types.pm @@ -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;