diff --git a/Netdisco/Changes b/Netdisco/Changes index e6c99a62..6c37f39d 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -4,6 +4,7 @@ * Update Print media CSS to handle new UI components * Deadlock in Discover over access to the device_ports table + * Set canonical IP failed on synthesized cols (and was wrong anyway) (closes #35) 2.018000 - 2013-10-08 diff --git a/Netdisco/lib/App/Netdisco/Core/Discover.pm b/Netdisco/lib/App/Netdisco/Core/Discover.pm index 6f8a8f99..251c16f4 100644 --- a/Netdisco/lib/App/Netdisco/Core/Discover.pm +++ b/Netdisco/lib/App/Netdisco/Core/Discover.pm @@ -12,6 +12,7 @@ use Try::Tiny; use base 'Exporter'; our @EXPORT = (); our @EXPORT_OK = qw/ + set_canonical_ip store_device store_interfaces store_wireless store_vlans store_power store_modules store_neighbors discover_new_neighbors @@ -48,9 +49,6 @@ sub store_device { my $interfaces = $snmp->interfaces; my $ip_netmask = $snmp->ip_netmask; - # find root IP - _set_canonical_ip($device, $snmp); - my $hostname = hostname_from_ip($device->ip); $device->dns($hostname) if $hostname; my $localnet = NetAddr::IP::Lite->new('127.0.0.0/8'); @@ -118,7 +116,7 @@ sub store_device { }); } -sub _set_canonical_ip { +sub set_canonical_ip { my ($device, $snmp) = @_; my $oldip = $device->ip; @@ -131,34 +129,36 @@ sub _set_canonical_ip { # remove old device and aliases schema('netdisco')->txn_do(sub { - my $gone = $device->device_ips->delete; - debug sprintf ' [%s] device - removed %s aliases', - $oldip, $gone; + my $copy = schema('netdisco')->resultset('Device') + ->find({ip => $oldip}); # our special delete which is more efficient schema('netdisco')->resultset('Device') ->search({ ip => $device->ip })->delete({keep_nodes => 1}); - - # a new row object from the old one - $device = schema('netdisco')->resultset('Device') - ->new({ $device->get_columns }); - debug sprintf ' [%s] device - deleted self', $oldip; + + $device = schema('netdisco')->resultset('Device') + ->create({ $copy->get_columns, ip => $newip }) + if defined $copy; + + # make nodes follow device + schema('netdisco')->resultset('Node') + ->search({switch => $oldip}) + ->update({switch => $newip}); }); - - $device->ip($newip); } - - # either root_ip is changed or unchanged, but it exists - return; + } + else { + my $revname = ipv4_from_hostname($snmp->name); + if (setting('reverse_sysname') and $revname) { + debug sprintf ' [%s] device - changing root IP to revname %s', + $oldip, $revname; + $device->ip($revname); + } } - my $revname = ipv4_from_hostname($snmp->name); - if (setting('reverse_sysname') and $revname) { - debug sprintf ' [%s] device - changing root IP to revname %s', - $oldip, $revname; - $device->ip($revname); - } + # either root_ip is changed or unchanged, but it exists + return $device; } =head2 store_interfaces( $device, $snmp ) diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm index 999b24d4..cf931f85 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm @@ -71,6 +71,7 @@ sub discover { return job_error("discover failed: could not SNMP connect to $host"); } + $device = set_canonical_ip($device, $snmp); store_device($device, $snmp); store_interfaces($device, $snmp); store_wireless($device, $snmp);