#!/usr/bin/perl -w
#
# Fetch ARP cache and return human readable output
#
# cvicente@ns
# 08/13/2007

use strict;

my $USAGE = "
Usage: 
	$0 <ip|name> [<community>]

";

my $dev  = $ARGV[0]  || die $USAGE;
my $comm = $ARGV[1] || "public";

my $SNMPBULK      = "/usr/local/bin/snmpbulkwalk";
my $VER           = '2c';
my $MIBS          = "BRIDGE-MIB";
my $QUADIP        = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
my $ETHER         = '\w{2} \w{2} \w{2} \w{2} \w{2} \w{2}';

my @atphysaddr = &snmpbulk('atPhysAddress');
my @ifdescr    = &snmpbulk('ifDescr');

my (%idx, %phy);
for ( @atphysaddr ){
    if ( /atPhysAddress\.(\d+)\.1.($QUADIP) = Hex-STRING: ($ETHER)/ ){
	my $ip    = $2;
	$idx{$ip} = $1; 
	my $ether    = $3;
	$ether    =~ s/\s+//g;
	$phy{$ip} = $ether; 
    }
}

my %descr;
for ( @ifdescr ){
    if ( /ifDescr\.(\d+) = STRING: (.*)/ ){
	my $idx = $1;
	my $val = $2;
	$val =~ s/\"//g;
	$descr{$idx} = $val;
    }
}

foreach my $ip ( sort {compare_ip()} keys %idx ){
    my $ifindex = $idx{$ip};
    my $ifdescr = $descr{$ifindex} || " ";
    print $ip, "\t", $phy{$ip},  "\t", $ifindex, "\t", $ifdescr, "\n";
}

sub snmpbulk {
    my $o = shift;
    return `$SNMPBULK -v $VER -c $comm -m $MIBS $dev $o`;
}

sub compare_ip{
    pack("C4"=>$a =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) cmp pack("C4"=>$b =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/);
}

