Предлагаю для решения задачи модифицированный utm5_arp.pl, с помощью которого можно считывать arp-таблицу с управляемого свитча по SNMP. Используется IP-MIB::ipNetToMediaTable (http://www.ietf.org/rfc/rfc1213.txt). Скрипт тестировался на DES-3326SR.
Код: Выделить всё
#!/usr/bin/perl
# e-mail:info@netup.ru
# Copyright (c) 2001-2005 NetUP Inc. <info@netup.ru>. All rights reserved.
# Modifyed by Serge A. Akhmanov <serge@s2s.msu.ru>, 2007
# Tested on DES-3326SR
use Socket;
use DBD::mysql;
use DBI();
use Time::Local;
use Getopt::Std;
$switch_ip = "192.168.0.2";
$mibvar = "1.3.6.1.2.1.4.22";
$snmp_comunity = "public";
$arp_command = "/usr/bin/snmptable -v2c -c $snmp_comunity $switch_ip $mibvar | grep dynamic";
#Load settings from config
open (CONFIG, "/netup/utm5/utm5.cfg");
@config = <CONFIG>;
close (CONFIG);
foreach $line (@config) {
if ($line =~ m/^([^#].+?)=(.*)$/) {
$$1 = $2;
};
};
# Connect to the database
if ($database_type eq "mysql") {
$DBI_data="DBI:$database_type:database=$database;host=$database_host;mysql_socket=$database_sock_path;";
} elsif ($database_type eq "postgres") {
$DBI_data="DBI:$database_type:dbname=$database";
} else {
print "Unknown database $database_type! Stopped. \n";
exit (1);
};
$dbh = DBI->connect("$DBI_data","$database_login","$database_password",{'RaiseError' => 1});
open(MAC,"$arp_command|");
@mac = <MAC>;
close (MAC);
foreach (@mac){
if ($_ =~ m/[^0-f]*(.{1,2}(:|-).{1,2}(:|-).{1,2}(:|-).{1,2}(:|-).{1,2}(:|-).{1,2})[^0-9]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).+/){
$bin_ip = unpack("N",inet_aton($7));
$bin_ip = $bin_ip > 2147483647 ? ($bin_ip - 0xFFFFFFFF - 1):$bin_ip;
# insert obtained ip-mac into DB. Don't insert duplicates
my $duplicated = 0;
$q = "SELECT ip FROM temp_ip WHERE ip=$bin_ip LIMIT 1";
$sth = $dbh->prepare( $q );
$sth->execute();
while( $zzz = $sth->fetchrow_hashref )
{
$duplicated = 1;
};
if (!$duplicated){
$dbh->do("INSERT INTO temp_ip (ip, mac) VALUES ($bin_ip, '$1')");
printf ("Inserted ip/mac $7/$1 to database \n");
};
};
};
Код: Выделить всё
snmpwalk -v2c -c public 192.168.0.2 1.3.6.1.2.1.4.22
snmptable -v2c -c public 192.168.0.2 1.3.6.1.2.1.4.22