296 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
# 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::EDP::ISA       = qw/SNMP::Info Exporter/;
 | 
						|
@SNMP::Info::EDP::EXPORT_OK = qw//;
 | 
						|
 | 
						|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
						|
 | 
						|
$VERSION = '3.64';
 | 
						|
 | 
						|
%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
 | 
						|
 |