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.55';
|
|
|
|
%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
|
|
|