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:
Steven Bakker 2013-05-01 14:29:13 +00:00
parent 264c13e156
commit 6c655ee671
4 changed files with 63 additions and 7 deletions

View File

@ -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}"

View File

@ -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) = @_;

View File

@ -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>).

View File

@ -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)