[1424336] Support for Extreme Discovery Protocol (EDP) and add EDP and LLDP L2 Topology to L3::Extreme
This commit is contained in:
		
							
								
								
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,295 @@ | ||||
| # SNMP::Info::EDP | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
|  | ||||
| package SNMP::Info::EDP; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.09'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     # EXTREME-EDP-MIB::extremeEdpTable | ||||
|     'edp_rem_sysname'  => 'extremeEdpNeighborName', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'edp_rem_sysname'   => \&SNMP::Info::munge_null, | ||||
| ); | ||||
|  | ||||
| sub hasEDP { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|  | ||||
|     return 1 if ( scalar( keys %$edp_ip ) ); | ||||
|      | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # Since we need to get IP Addresses from the extremeEdpNeighborTable which has | ||||
| # a different index (adds VLAN name) than the extremeEdpTable which holds | ||||
| # the remote device details use the index from extremeEdpNeighborTable but skip | ||||
| # indexes which have an address of 0.0.0.0.  Would like to include only one | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| sub _edp_index { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|      | ||||
|     my %edp_index; | ||||
|     foreach my $key ( keys %$edp_ip ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
|         next if ($ip eq '0.0.0.0'); | ||||
|         next unless $ip; | ||||
|         $edp_index{$key} = $key; | ||||
|     } | ||||
|     return \%edp_index; | ||||
| } | ||||
|  | ||||
| sub edp_if { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index = $edp->_edp_index() || {}; | ||||
|  | ||||
|     my %edp_if; | ||||
|     foreach my $key (keys %$index) { | ||||
|         my $iid = $key; | ||||
|         # ifIndex is first part of the iid | ||||
|         $iid = $1 if $iid =~ /^(\d+)\./; | ||||
|         $edp_if{$key} = $iid; | ||||
|     } | ||||
|   | ||||
|   return \%edp_if; | ||||
| } | ||||
|  | ||||
| sub edp_ip { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index  = $edp->_edp_index() || {}; | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|  | ||||
|     my %edp_ip; | ||||
|     foreach my $key ( keys %$index ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
|         # MIB says should only be IPv4 | ||||
|         next unless ($ip =~ /\d+(\.\d+){3}/); | ||||
|         $edp_ip{$key} = $ip; | ||||
|     } | ||||
|     return \%edp_ip; | ||||
| } | ||||
|  | ||||
| sub edp_port { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index    = $edp->_edp_index() || {}; | ||||
|     my $edp_rport = $edp->extremeEdpNeighborPort() || {}; | ||||
|     my $edp_rslot = $edp->extremeEdpNeighborSlot() || {}; | ||||
|  | ||||
|     my %edp_port; | ||||
|     foreach my $key ( sort keys %$edp_rport ) { | ||||
|         my $port = $edp_rport->{$key}; | ||||
|         my $slot = $edp_rslot->{$key} || 0; | ||||
|         next unless $port; | ||||
|         my $slotport = defined $slot ?  "$slot\/$port" : $port; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_port{$iid} = $slotport if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_port; | ||||
| } | ||||
|  | ||||
| sub edp_id { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index    = $edp->_edp_index() || {}; | ||||
|     my $edp_name = $edp->edp_rem_sysname() || {}; | ||||
|  | ||||
|     my %edp_name; | ||||
|     foreach my $key ( sort keys %$edp_name ) { | ||||
|         my $name = $edp_name->{$key} || 0; | ||||
|         next unless $name; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_name{$iid} = $name if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_name; | ||||
| } | ||||
|  | ||||
| sub edp_ver { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index   = $edp->_edp_index() || {}; | ||||
|     my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {}; | ||||
|  | ||||
|     my %edp_ver; | ||||
|     foreach my $key ( sort keys %$edp_ver ) { | ||||
|         my $ver = $edp_ver->{$key} || 0; | ||||
|         next unless $ver; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_ver{$iid} = $ver if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_ver; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP) | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $edp = new SNMP::Info (  | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
|  | ||||
|  my $class = $edp->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  $haslldp   = $edp->hasLLDP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  my $interfaces    = $edp->interfaces(); | ||||
|  my $edp_if       = $edp->edp_if(); | ||||
|  my $edp_ip       = $edp->edp_ip(); | ||||
|  my $edp_port     = $edp->edp_port(); | ||||
|  | ||||
|  foreach my $edp_key (keys %$edp_ip){ | ||||
|     my $iid           = $edp_if->{$edp_key}; | ||||
|     my $port          = $interfaces->{$iid}; | ||||
|     my $neighbor      = $edp_ip->{$edp_key}; | ||||
|     my $neighbor_port = $edp_port->{$edp_key}; | ||||
|     print "Port : $port connected to $neighbor / $neighbor_port\n"; | ||||
|  } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| interface to EDP information through SNMP. | ||||
|  | ||||
| EDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| identity and capabilities on the local network providing topology information. | ||||
|  | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<EXTREME-EDP-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $edp->hasEDP() | ||||
|  | ||||
| Is EDP is active in this device?   | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $edp->edp_id() | ||||
|  | ||||
| Returns the string value used to identify the chassis component associated | ||||
| with the remote system. | ||||
|  | ||||
| (C<extremeEdpNeighborName>) | ||||
|  | ||||
| =item $edp->edp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| =item  $edp->edp_ip() | ||||
|  | ||||
| Returns remote IPv4 address. | ||||
|  | ||||
| =item $edp->edp_port() | ||||
|  | ||||
| Returns remote port ID | ||||
|  | ||||
| =item $edp->edp_ver() | ||||
|  | ||||
| Returns the operating system version of the remote system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<extremeEdpNeighborSoftwareVersion>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|  | ||||
		Reference in New Issue
	
	Block a user