all except body of resolve_node_names()

This commit is contained in:
Oliver Gorwits
2013-10-06 23:30:25 +01:00
parent 50ed3d0b90
commit fe8f3a1d99
6 changed files with 103 additions and 10 deletions

View File

@@ -10,7 +10,7 @@ use Time::HiRes 'gettimeofday';
use base 'Exporter';
our @EXPORT = ();
our @EXPORT_OK = qw/ do_arpnip store_arp /;
our @EXPORT_OK = qw/ do_arpnip store_arp resolve_node_names /;
our %EXPORT_TAGS = (all => \@EXPORT_OK);
=head1 NAME
@@ -82,16 +82,16 @@ sub _get_arps {
my $ip = $netaddr->{$arp};
next unless defined $ip;
next unless check_mac($device, $node);
push @arps, [$node, $ip, hostname_from_ip($ip)];
push @arps, [$node, $ip];
}
return @arps;
}
=head2 store_arp( $mac, $ip, $name, $now? )
=head2 store_arp( $mac, $ip, $now? )
Stores a new entry to the C<node_ip> table with the given MAC, IP (v4 or v6)
and DNS host name.
Stores a new entry to the C<node_ip> table with the given MAC, and IP (v4 or
v6).
Will mark old entries for this IP as no longer C<active>.
@@ -101,7 +101,7 @@ C<time_last> timestamp, otherwise the current timestamp (C<now()>) is used.
=cut
sub store_arp {
my ($mac, $ip, $name, $now) = @_;
my ($mac, $ip, $now) = @_;
$now ||= 'now()';
schema('netdisco')->txn_do(sub {
@@ -119,7 +119,6 @@ sub store_arp {
->search({'me.mac' => $mac, 'me.ip' => $ip})
->update_or_create(
{
dns => $name,
active => \'true',
time_last => \$now,
},
@@ -172,4 +171,22 @@ sub _store_subnet {
});
}
=head2 resolve_node_names( $device )
Given a Device database object, resolve Node IP (ARP) entries belonging to
this device into DNS names, and store them in the C<node_ip> database table.
This action is usually queued following C<do_arpip> so that it may run
asynchronously, and/or on another daemon worker node.
=cut
sub resolve_node_names {
my ($device) = @_;
schema('netdisco')->txn_do(sub {
# hostname_from_ip($ip)
});
}
1;

View File

@@ -22,7 +22,7 @@ sub capacity_for {
debug "checking local capacity for action $action";
my $action_map = {
Poller => [qw/discoverall discover arpwalk arpnip macwalk macsuck/],
Poller => [qw/discoverall discover arpwalk arpnip nodeip2name macwalk macsuck/],
Interactive => [qw/location contact portcontrol portname vlan power/],
};

View File

@@ -13,7 +13,7 @@ my $fqdn = hostfqdn || 'localhost';
my $role_map = {
(map {$_ => 'Poller'}
qw/discoverall discover arpwalk arpnip macwalk macsuck/),
qw/discoverall discover arpwalk arpnip nodeip2name macwalk macsuck/),
(map {$_ => 'Interactive'}
qw/location contact portcontrol portname vlan power/)
};

View File

@@ -1,9 +1,17 @@
package App::Netdisco::Daemon::Worker::Poller::Arpnip;
use Dancer::Plugin::DBIC 'schema';
use App::Netdisco::Core::Arpnip 'do_arpnip';
use App::Netdisco::Util::Device 'is_arpnipable';
use App::Netdisco::Util::Device qw/get_device is_arpnipable is_nodeip2nameable/;
use App::Netdisco::Core::Arpnip 'resolve_node_names';
use App::Netdisco::Daemon::Util ':all';
use NetAddr::IP::Lite ':lower';
use Role::Tiny;
use Class::Method::Modifiers;
use namespace::clean;
with 'App::Netdisco::Daemon::Worker::Poller::Common';
@@ -15,4 +23,43 @@ sub arpnip_layer { 3 }
sub arpwalk { (shift)->_walk_body('arpnip', @_) }
sub arpnip { (shift)->_single_body('arpnip', @_) }
after 'arpnip' => sub {
my ($self, $job) = @_;
my $host = NetAddr::IP::Lite->new($job->device);
my $device = get_device($host->addr);
my $jobqueue = schema('netdisco')->resultset('Admin');
schema('netdisco')->txn_do(sub {
$jobqueue->create({
device => $device->ip,
action => 'nodeip2name',
status => 'queued',
username => $job->username,
userip => $job->userip,
});
});
};
# run a nodeip2name job for one device
sub nodeip2name {
my ($self, $job) = @_;
my $host = NetAddr::IP::Lite->new($job->device);
my $device = get_device($host->addr);
my $jobqueue = schema('netdisco')->resultset('Admin');
if ($device->ip eq '0.0.0.0') {
return job_error("nodeip2name failed: no device param (need -d ?)");
}
unless (is_nodeip2nameable($device->ip)) {
return job_defer("nodeip2name deferred: $host is not nodeip2nameable");
}
resolve_node_names($device);
return job_done("Ended nodeip2name for ". $host->addr);
}
1;

View File

@@ -12,6 +12,7 @@ our @EXPORT_OK = qw/
check_no
is_discoverable
is_arpnipable
is_nodeip2nameable
is_macsuckable
/;
our %EXPORT_TAGS = (all => \@EXPORT_OK);
@@ -195,6 +196,32 @@ sub is_arpnipable {
return 1;
}
=head2 is_nodeip2nameable( $ip )
Given an IP address, returns C<true> if Netdisco on this host is permitted by
the local configuration to resolve Node IPs to DNS names for the device.
The configuration items C<nodeip2name_no> and C<nodeip2name_only> are checked
against the given IP.
Returns false if the host is not permitted to do this job for the target
device.
=cut
sub is_nodeip2nameable {
my $ip = shift;
my $device = get_device($ip) or return 0;
return _bail_msg("is_nodeip2nameable: device matched nodeip2name_no")
if check_no($device, 'nodeip2name_no');
return _bail_msg("is_nodeip2nameable: device failed to match nodeip2name_only")
if check_no($device, 'nodeip2name_only');
return 1;
}
=head2 is_macsuckable( $ip )
Given an IP address, returns C<true> if Netdisco on this host is permitted by

View File

@@ -86,6 +86,8 @@ macsuck_min_age: 0
arpnip_no: []
arpnip_only: []
arpnip_min_age: 0
nodeip2name_no: []
nodeip2name_only: []
store_wireless_clients: true
store_modules: true
ignore_interfaces: