refactor layer and pseudo checks

This commit is contained in:
Oliver Gorwits
2017-09-13 19:22:40 +01:00
parent 753acc607f
commit 58cd488ccc
10 changed files with 40 additions and 33 deletions

View File

@@ -193,6 +193,29 @@ __PACKAGE__->might_have(
=head1 ADDITIONAL METHODS
=head2 is_pseudo
Returns true if the vendor of the device is "netdisco".
=cut
sub not_pseudo {
my $device = shift;
return (defined $device->vendor and $device->vendor eq 'netdisco');
}
=head2 has_layer( $number )
Returns true if the device provided sysServices and supports the given layer.
=cut
sub has_layer {
my ($device, $layer) = @_;
return unless $layer and $layer =~ m/^[1-8]$/;
return $device->layers and substr($device->layers, (9-$layer), 1) == 1;
}
=head2 renumber( $new_ip )
Will update this device and all related database records to use the new IP

View File

@@ -192,12 +192,10 @@ sub is_discoverable_now {
my ($ip, $remote_type) = @_;
my $device = get_device($ip) or return 0;
if ($device->in_storage) {
if ($device->since_last_discover and setting('discover_min_age')
and $device->since_last_discover < setting('discover_min_age')) {
if ($device->since_last_discover and setting('discover_min_age')
and $device->since_last_discover < setting('discover_min_age')) {
return _bail_msg("is_discoverable: time since last discover less than discover_min_age");
}
return _bail_msg("is_discoverable: time since last discover less than discover_min_age");
}
return is_discoverable(@_);
@@ -242,9 +240,6 @@ sub is_arpnipable_now {
my ($ip) = @_;
my $device = get_device($ip) or return 0;
return _bail_msg("is_arpnipable: cannot arpnip an undiscovered device")
if not $device->in_storage;
if ($device->since_last_arpnip and setting('arpnip_min_age')
and $device->since_last_arpnip < setting('arpnip_min_age')) {
@@ -293,9 +288,6 @@ sub is_macsuckable_now {
my ($ip) = @_;
my $device = get_device($ip) or return 0;
return _bail_msg("is_macsuckable: cannot macsuck an undiscovered device")
if not $device->in_storage;
if ($device->since_last_macsuck and setting('macsuck_min_age')
and $device->since_last_macsuck < setting('macsuck_min_age')) {

View File

@@ -17,7 +17,10 @@ register_worker({ stage => 'check' }, sub {
unless $device->in_storage;
return Status->defer("arpnip skipped: $device is pseudo-device")
if $device->vendor and $device->vendor eq 'netdisco';
if $device->is_pseudo;
return Status->defer("arpnip skipped: $device has no layer 3 capability")
unless $device->has_layer(3);
return Status->defer("arpnip deferred: $device is not arpnipable")
unless is_arpnipable_now($device);

View File

@@ -18,9 +18,6 @@ register_worker({ stage => 'check', driver => 'snmp' }, sub {
my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
or return Status->defer("arpnip failed: could not SNMP connect to $device");
return Status->defer("Skipped arpnip for device $device without layer 3 capability")
unless $snmp->has_layer(3);
# get v4 arp table
my $v4 = get_arps($device, $snmp->at_paddr, $snmp->at_netaddr);
# get v6 neighbor cache

View File

@@ -17,9 +17,6 @@ register_worker({ stage => 'second', driver => 'snmp' }, sub {
my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
or return Status->defer("arpnip failed: could not SNMP connect to $device");
return Status->defer("Skipped arpnip for device $device without layer 3 capability")
unless $snmp->has_layer(3);
# get directly connected networks
my @subnets = gather_subnets($device, $snmp);
# TODO: IPv6 subnets

View File

@@ -13,15 +13,13 @@ register_worker({ stage => 'check' }, sub {
return Status->error('discover failed: unable to interpret device param')
unless defined $device;
my $host = $device->ip;
return Status->error("discover failed: no device param (need -d ?)")
if $host eq '0.0.0.0';
if $device->ip eq '0.0.0.0';
return Status->defer("discover skipped: $host is pseudo-device")
if $device->vendor and $device->vendor eq 'netdisco';
return Status->defer("discover skipped: $device is pseudo-device")
if $device->is_pseudo;
return Status->defer("discover deferred: $host is not discoverable")
return Status->defer("discover deferred: $device is not discoverable")
unless is_discoverable_now($device);
return Status->done('discover is able to run.');

View File

@@ -14,7 +14,7 @@ register_worker({ stage => 'second' }, sub {
# arpniped/macsucked, queue those jobs now
if ($device->in_storage
and $job->subaction and $job->subaction eq 'with-nodes') {
if (!defined $device->last_macsuck) {
if (!defined $device->last_macsuck and $device->has_layer(2)) {
jq_insert({
device => $device->ip,
action => 'macsuck',
@@ -23,7 +23,7 @@ register_worker({ stage => 'second' }, sub {
});
}
if (!defined $device->last_arpnip) {
if (!defined $device->last_arpnip and $device->has_layer(3)) {
jq_insert({
device => $device->ip,
action => 'arpnip',

View File

@@ -17,7 +17,10 @@ register_worker({ stage => 'check' }, sub {
unless $device->in_storage;
return Status->defer("macsuck skipped: $device is pseudo-device")
if $device->vendor and $device->vendor eq 'netdisco';
if $device->is_pseudo;
return Status->defer("arpnip skipped: $device has no layer 2 capability")
unless $device->has_layer(2);
return Status->defer("macsuck deferred: $device is not macsuckable")
unless is_macsuckable_now($device);

View File

@@ -21,9 +21,6 @@ register_worker({ stage => 'check', driver => 'snmp' }, sub {
my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
or return Status->defer("macsuck failed: could not SNMP connect to $device");
return Status->defer("Skipped macsuck for device $device without layer 2 capability")
unless $snmp->has_layer(2);
# would be possible just to use now() on updated records, but by using this
# same value for them all, we can if we want add a job at the end to
# select and do something with the updated set (see set archive, below)

View File

@@ -15,9 +15,6 @@ register_worker({ stage => 'second', driver => 'snmp' }, sub {
my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
or return Status->defer("macsuck failed: could not SNMP connect to $device");
return Status->defer("Skipped macsuck for device $device without layer 2 capability")
unless $snmp->has_layer(2);
my $now = 'to_timestamp('. (join '.', gettimeofday) .')';
my $cd11_txrate = $snmp->cd11_txrate;