/usr/share/doc/libsnmp-session-perl/examples/arp is in libsnmp-session-perl 1.14~git20130523.186a005-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | #!/usr/bin/perl -w
## Name: test/arp
## Author: Simon Leinen <simon@switch.ch>
## Description: Dump ARP table using Perl SNMP library
######################################################################
## Usage: arp hostname [community]
##
## Extracts HOSTNAME's network to media address table using SNMP and
## prints it to standard output. Example output (errors probably due
## to the agent):
##
## $ perl test/arp babar public
## lo0 130.59.4.11 dynamic 08:00:20:12:cc:3f
## lo0 130.59.4.22 dynamic 08:00:20:88:9a:5e
## lo0 130.59.4.30 dynamic 08:00:20:76:48:af
## lo0 130.59.4.33 dynamic 08:00:09:f7:f2:9b
## lo0 130.59.4.38 dynamic 08:00:20:86:95:57
## lo0 130.59.4.110 dynamic 00:05:02:9c:34:1e
## lo0 130.59.4.134 dynamic 00:05:02:ec:a3:1b
## lo0 130.59.4.202 dynamic 00:00:0c:5d:05:d0
## lo0 224.0.0.0 dynamic 01:00:5e:00:00:00
## lo0 224.1.127.255 dynamic 01:00:5e:01:7f:ff
## lo0 224.2.127.253 dynamic 01:00:5e:02:7f:fd
## lo0 224.2.127.254 dynamic 01:00:5e:02:7f:fe
## lo0 239.255.255.255 dynamic 01:00:5e:7f:ff:ff
## hme0 130.59.4.2 dynamic 08:00:20:83:00:69
##
## The interface name in the first column is the ifDescr value for the
## interface to which the ipNetToMediaIfIndex refers.
######################################################################
require 5.002;
use strict;
use SNMP_Session "0.57"; # needs map_table
use BER;
sub out_arp_entry ($$$);
sub ether_hex ($);
sub ifDescr ($$);
sub usage ();
#
# OIDs we know by name.
#
my %OIDS = (
'ipNetToMediaPhysAddress' => [1,3,6,1,2,1,4,22,1,2],
'ipNetToMediaType' => [1,3,6,1,2,1,4,22,1,4],
);
my $hostname = $ARGV[0] || usage ();
my $community = $ARGV[1] || "public";
my $session;
die "Couldn't open SNMP session to $hostname"
unless ($session = SNMP_Session->open ($hostname, $community, 161));
$session->map_table ([$OIDS{'ipNetToMediaPhysAddress'},
$OIDS{'ipNetToMediaType'}],
\&out_arp_entry);
$session->close ();
1;
## out_arp_entry (INDEX, PHYS_ADDRESS, TYPE)
##
## Writes a line of ARP output from a partial row of the
## ipNetToMediaTable. The does not use the ipNetToMediaIfIndex or
## ipNetToMediaNetAddress, because those can be derived from the row
## index.
##
sub out_arp_entry ($$$) {
my ($index, $physAddress, $type) = @_;
## the index of this table has the form IFINDEX.IPADDRESS, where
## IPADDRESS is a "dotted quad" of four integers. We simply split
## at the first dot to get the interface index and the IP address in
## readable notation:
##
my ($ifIndex, $netAddress) = split(/\./, $index, 2);
$type = pretty_print ($type);
if ($type eq 1) { $type = "other"; }
elsif ($type eq 2) { $type = "invalid"; }
elsif ($type eq 3) { $type = "dynamic"; }
elsif ($type eq 4) { $type = "static"; }
$physAddress = ether_hex (hex_string ($physAddress));
printf STDOUT ("%-20s %-15s %-10s %s\n",
ifDescr ($ifIndex, $session),
$netAddress,
$type,
$physAddress);
}
## ether_hex (HEX_STRING)
##
## Converts a raw hex representation into the common form used in
## Ethernet addresses, e.g. "080020830069" becomes
## "08:00:20:83:00:69".
##
sub ether_hex ($) {
my ($string) = @_;
$string =~ s/([0-9a-f][0-9a-f])/$1:/g;
$string =~ s/:$//;
$string;
}
my %ifDescrCache;
## ifDescr (IFINDEX, SESSION)
##
## Return the interface description associated with the given
## IFINDEX. Uses SESSION as the destination for SNMP request.
## Results are cached in %ifDescrCache to avoid sending the same SNMP
## request more than once.
##
sub ifDescr ($$) {
my @ifDescr = split ('\.','1.3.6.1.2.1.2.2.1.2');
my ($ifIndex, $session) = @_;
return $ifDescrCache{$ifIndex,$session}
if defined ($ifDescrCache{$ifIndex,$session});
push @ifDescr,$ifIndex;
if ($session->get_request_response (encode_oid (@ifDescr))) {
my $response = $session->pdu_buffer;
my ($bindings, $binding, $oid, $value);
($bindings) = $session->decode_get_response ($response);
($binding,$bindings) = decode_sequence ($bindings);
($oid,$value) = decode_by_template ($binding, "%O%@");
return $ifDescrCache{$ifIndex,$session} = pretty_print ($value);
} else {
return "if#".$ifIndex;
}
}
sub usage () {
die "usage: $0 host [community]";
}
|