согласен.. в свое время, когда стояла такая задача (да и сейчас в принЦипе тоже иногда пользуюсь) использовал арпвотч и перловый скрипт, распихивающий в БД
#!/usr/bin/perl
use DBI;
use Mail::POP3Client;
$dbh = DBI->connect('dbi:Pg:dbname=arp;host=127.0.0.1', 'user', 'passwd', {PrintError=>1, RaiseError=>1});
$pop = new Mail::POP3Client( USER => "arpwatch",
PASSWORD => "arpwatch",
HOST => "127.0.0.1" ) || die "error";
for( $kk = 1; $kk <= $pop->Count(); $kk++ )
{
$body = $pop->Body($kk);
$body =~ s/\s/ /g;
if ($body =~ /ip address: (\d+\.\d+\.\d+\.\d+).+ethernet address: (\w+:\w+:\w+:\w+:\w+:\w+)/)
{
$sql = "SELECT user_id, user_mac FROM pron_users WHERE state<>0 AND user_ip='$1'";
$sth = $dbh->prepare($sql);
if ($sth) { $sth->execute(); }
($user_id, $user_mac) = $sth->fetchrow_array();
if (defined($user_id))
{
if (!defined($user_mac) || $user_mac eq '')
{
$sql = "UPDATE pron_users SET user_mac='$2' WHERE user_id=$user_id";
$sth = $dbh->prepare($sql);
if ($sth) { $sth->execute(); }
}
else
{
$sql = "SELECT user_id FROM pron_users WHERE state<>0 AND user_mac='$2'";
$sth = $dbh->prepare($sql);
if ($sth) { $sth->execute(); }
($user_id) = $sth->fetchrow_array();
if (!defined($userid))
{
print "mac changed. ip: $1, mac: $2\n";
}
}
}
}
$pop->Delete($kk);
}
$pop->Close;
смысл заключается в том, что арпвотч шлёт письма на указанный в его конфиге ящик, после чего скрипт проверяет данный ящик, парсит письма и выполняет определенные деиствия..