mirror of
https://github.com/AMS-IX/arpsponge.git
synced 2024-09-21 07:47:08 +00:00
Added patch for "--sweep-skip-alive" by Chris Caputo (SIX).
Also added controls for run-time setting. Updated asctl's POD.
This commit is contained in:
parent
264c13e156
commit
6c655ee671
@ -36,7 +36,8 @@ export AGE \
|
||||
RATE \
|
||||
SPONGE_NETWORK \
|
||||
ARP_UPDATE_METHOD \
|
||||
SWEEP
|
||||
SWEEP \
|
||||
SWEEP_SKIP_ALIVE
|
||||
|
||||
# Defaults for all sponges.
|
||||
if test -f /etc/default/${PROG}/defaults ; then
|
||||
@ -81,6 +82,7 @@ start_sponge() {
|
||||
eval_bool ${SPONGE_NETWORK} && opts="$opts --sponge-network"
|
||||
eval_bool ${GRATUITOUS} && opts="$opts --gratuitous"
|
||||
eval_bool ${DUMMY_MODE} && opts="$opts --dummy"
|
||||
eval_bool ${SWEEP_SKIP_ALIVE} && opts="$opts --sweep-skip-alive"
|
||||
|
||||
[ -n "${INIT_MODE}" ] && opts="$opts --init=${INIT_MODE}"
|
||||
[ -n "${LEARNING}" ] && opts="$opts --learning=${LEARNING}"
|
||||
|
@ -34,7 +34,7 @@ use Time::HiRes qw( time );
|
||||
use POSIX qw( strftime );
|
||||
|
||||
BEGIN {
|
||||
our $VERSION = '0.03';
|
||||
our $VERSION = '0.04';
|
||||
}
|
||||
|
||||
my %Command_Dispatch = map { $_ => "_cmd_$_" } qw(
|
||||
@ -42,7 +42,7 @@ my %Command_Dispatch = map { $_ => "_cmd_$_" } qw(
|
||||
get_param get_arp get_ip get_status get_log ping quit
|
||||
set_queuedepth set_max_rate set_max_pending set_learning
|
||||
set_proberate set_flood_protection set_dummy
|
||||
set_sweep_age set_sweep_sec
|
||||
set_sweep_age set_sweep_sec set_sweep_skip_alive
|
||||
set_alive set_dead set_pending
|
||||
set_arp_update_flags
|
||||
set_log_level
|
||||
@ -553,6 +553,20 @@ sub _cmd_set_sweep_age {
|
||||
return $self->send_ok(sprintf("old=%d\nnew=%d", $old, $new));
|
||||
}
|
||||
|
||||
sub _cmd_set_sweep_skip_alive {
|
||||
my ($self, $sponge, $cmd, @args) = @_;
|
||||
|
||||
my $int = is_valid_int($args[0], -min=>0, -max=>1);
|
||||
if (!defined $int) {
|
||||
return $self->send_error("$cmd {0|1}");
|
||||
}
|
||||
log_notice("[client %d] %s %d", $self->fileno, $cmd, $int);
|
||||
my $old = $sponge->user('sweep_skip_alive');
|
||||
$sponge->user('sweep_skip_alive', $int);
|
||||
$int = $sponge->user('sweep_skip_alive');
|
||||
return $self->send_ok(sprintf("old=%d\nnew=%d", $old, $int));
|
||||
}
|
||||
|
||||
sub _cmd_set_dummy {
|
||||
my ($self, $sponge, $cmd, @args) = @_;
|
||||
|
||||
|
@ -114,6 +114,7 @@ Options:
|
||||
--statusfile=file - where to write status information when receiving
|
||||
HUP or USR1 signal (<rundir>/status)
|
||||
--sweep=sec/thr - periodically sweep for "quiet" IP addresses
|
||||
--sweep-skip-alive - sweep avoids IP addresses in state ALIVE
|
||||
--verbose[=n] - be verbose; print information on STDOUT;
|
||||
turns off syslog
|
||||
|
||||
@ -180,6 +181,7 @@ sub Main {
|
||||
'sponge-network' => \(my $sponge_net),
|
||||
'statusfile=s' => \(my $statusfile),
|
||||
'sweep=s' => \(my $sweep_sec),
|
||||
'sweep-skip-alive' => \(my $sweep_skip_alive),
|
||||
'verbose|v+' => \(my $verbose),
|
||||
'version|V' => sub { print "$0 $VERSION\n"; exit 0 },
|
||||
) or pod2usage(2);
|
||||
@ -261,6 +263,7 @@ sub Main {
|
||||
$sponge->user('learning', $learning);
|
||||
$proberate = $DFL_PROBERATE if $proberate < 0 || $proberate > 1e6;
|
||||
$sponge->user('probesleep', 1.0/$proberate);
|
||||
$sponge->user('sweep_skip_alive', $sweep_skip_alive);
|
||||
|
||||
if ($sweep_sec) {
|
||||
$sponge->user('sweep_sec', $sweep_sec);
|
||||
@ -537,6 +540,8 @@ sub get_status_info_s {
|
||||
sprintf("%-17s %d\n", 'max pending:', $sponge->max_pending),
|
||||
sprintf("%-17s %d sec\n", 'sweep period:', $sponge->user('sweep_sec')),
|
||||
sprintf("%-17s %d sec\n", 'sweep age:', $sponge->user('sweep_age')),
|
||||
sprintf("%-17s %s\n", 'sweep skip alive:',
|
||||
$sponge->user('sweep_skip_alive') ? "yes" : "no"),
|
||||
sprintf("%-17s %d sec\n", 'proberate:',
|
||||
1/$sponge->user('probesleep')),
|
||||
sprintf("%-17s %d sec\n", 'next sweep in:',
|
||||
@ -767,7 +772,10 @@ sub do_sweep($) {
|
||||
for (my $num = $lo; $num <= $hi; $num++) {
|
||||
my $ip = sprintf("%08x", $num);
|
||||
my $age = time - $sponge->state_mtime($ip);
|
||||
if ($age >= $threshold) {
|
||||
if ($age >= $threshold &&
|
||||
! ($sponge->user('sweep_skip_alive') &&
|
||||
$sponge->get_state($ip) == ALIVE))
|
||||
{
|
||||
if ($verbose>1) {
|
||||
log_sverbose(1, "DO PROBE %s (%d >= %d)\n",
|
||||
hex2ip($ip), $age, $threshold);
|
||||
@ -1153,6 +1161,7 @@ I<Options>:
|
||||
--sponge-network
|
||||
--statusfile=file
|
||||
--sweep=interval/threshold
|
||||
--sweep-skip-alive
|
||||
--verbose[=n]
|
||||
|
||||
B</etc/init.d/@NAME@> {B<start>|B<stop>|B<restart>|B<status>}
|
||||
@ -1552,6 +1561,10 @@ cost of more ARP queries from the daemon's host.
|
||||
|
||||
=back
|
||||
|
||||
=item X<--sweep-skip-alive>B<--sweep-skip-alive>
|
||||
|
||||
Do not sweep IP addresses with sponge state of ALIVE.
|
||||
|
||||
=item X<--verbose>B<--verbose>[=I<n>]
|
||||
|
||||
Be verbose; print information on F<STDOUT>;
|
||||
@ -1715,6 +1728,10 @@ The argument to C<--pending>.
|
||||
|
||||
The argument to C<--sweep>.
|
||||
|
||||
=item I<SWEEP_SKIP_ALIVE> (boolean)
|
||||
|
||||
Use C<--sweep-skip-alive>
|
||||
|
||||
=item I<GRATUITOUS> (boolean)
|
||||
|
||||
Whether or not to send gratuitous ARPs (C<--gratuitous>).
|
||||
|
@ -181,6 +181,9 @@ my %Syntax = (
|
||||
'set sweep_period $secs' => {
|
||||
'?' => 'Set sweep/probe parameters.',
|
||||
'$secs' => { type=>'int', min=>1 }, },
|
||||
'set sweep_skip_alive $bool' => {
|
||||
'?' => 'Enable/disable sweeping of ALIVE addresses.',
|
||||
'$bool' => { type=>'bool' }, },
|
||||
);
|
||||
|
||||
sub Main {
|
||||
@ -1390,6 +1393,18 @@ sub do_set_sweep_age {
|
||||
-type => 'int');
|
||||
}
|
||||
|
||||
# cmd: set sweep_skip_alive
|
||||
sub do_set_sweep_skip_alive {
|
||||
my ($conn, $parsed, $args) = @_;
|
||||
|
||||
do_set_generic(-conn => $conn,
|
||||
-name => 'sweep skip-alive',
|
||||
-val => $args->{'bool'},
|
||||
-options => $args->{-options},
|
||||
-type => 'bool');
|
||||
}
|
||||
|
||||
|
||||
sub do_set_ip_generic {
|
||||
my %opts = @_;
|
||||
my $conn = $opts{-conn};
|
||||
@ -1581,13 +1596,15 @@ sub do_param {
|
||||
sprintf("$tag= %d\n", 'queuedepth', $$info{queue_depth}),
|
||||
sprintf("$tag= %0.2f q/min\n", 'max_rate', $$info{max_rate}),
|
||||
sprintf("$tag= %0.2f q/sec\n", 'flood_protection',
|
||||
$$info{flood_protection}),
|
||||
$$info{flood_protection}),
|
||||
sprintf("$tag= %d\n", 'max_pending', $$info{max_pending}),
|
||||
sprintf("$tag= %d secs\n", 'sweep_period', $$info{sweep_period}),
|
||||
sprintf("$tag= %d secs\n", 'sweep_age', $$info{sweep_age}),
|
||||
sprintf("$tag= %s\n", 'sweep_skip_alive',
|
||||
$$info{sweep_skip_alive}?'yes':'no'),
|
||||
sprintf("$tag= %d pkts/sec\n", 'proberate', $$info{proberate}),
|
||||
sprintf("$tag= %s\n", 'learning',
|
||||
$$info{learning}?"yes ($$info{learning} secs)":'no'),
|
||||
$$info{learning}?"yes ($$info{learning} secs)":'no'),
|
||||
sprintf("$tag= %s\n", 'dummy', $$info{dummy}?'yes':'no'),
|
||||
sprintf("$tag= %s\n", 'arp_update_flags', $$info{arp_update_flags}),
|
||||
sprintf("$tag= %s\n", 'log_level', $$info{log_level}),
|
||||
@ -2294,10 +2311,16 @@ Set rate parameters
|
||||
|
||||
=item B<set sweep_age> I<secs>
|
||||
|
||||
=item B<set sweep_probe> I<secs>
|
||||
=item B<set sweep_period> I<secs>
|
||||
|
||||
Set sweep/probe parameters
|
||||
|
||||
=item B<set sweep_skip_alive> I<bool>
|
||||
|
||||
Enable/disable skipping ALIVE addresses during sweeping; I<bool> can be any of:
|
||||
C<yes>, C<true>, C<on>, C<1>,
|
||||
C<no>, C<false>, C<off>, C<0>.
|
||||
|
||||
=item B<show arp> [I<ip-any>]
|
||||
|
||||
Show ARP table for given IP(s)
|
||||
|
Loading…
Reference in New Issue
Block a user