do not clobber manual topo when discovering neighbors
This commit is contained in:
@@ -8,7 +8,7 @@ use base 'DBIx::Class::Schema';
|
|||||||
|
|
||||||
__PACKAGE__->load_namespaces;
|
__PACKAGE__->load_namespaces;
|
||||||
|
|
||||||
our $VERSION = 18; # schema version used for upgrades, keep as integer
|
our $VERSION = 19; # schema version used for upgrades, keep as integer
|
||||||
|
|
||||||
use Path::Class;
|
use Path::Class;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ __PACKAGE__->add_columns(
|
|||||||
{ data_type => "text", is_nullable => 1 },
|
{ data_type => "text", is_nullable => 1 },
|
||||||
"remote_id",
|
"remote_id",
|
||||||
{ data_type => "text", is_nullable => 1 },
|
{ data_type => "text", is_nullable => 1 },
|
||||||
|
"manual_topo",
|
||||||
|
{ data_type => "bool", is_nullable => 0, default_value => \"false" },
|
||||||
"vlan",
|
"vlan",
|
||||||
{ data_type => "text", is_nullable => 1 },
|
{ data_type => "text", is_nullable => 1 },
|
||||||
"pvid",
|
"pvid",
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE device_port ADD COLUMN "manual_topo" bool DEFAULT false NOT NULL;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
@@ -648,6 +648,12 @@ sub find_neighbors {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# IP Phone detection type fixup
|
||||||
|
if (defined $remote_type and $remote_type =~ m/(mitel.5\d{3})/i) {
|
||||||
|
$remote_type = 'IP Phone - '. $remote_type
|
||||||
|
if $remote_type !~ /ip phone/i;
|
||||||
|
}
|
||||||
|
|
||||||
# hack for devices seeing multiple neighbors on the port
|
# hack for devices seeing multiple neighbors on the port
|
||||||
if (ref [] eq ref $remote_ip) {
|
if (ref [] eq ref $remote_ip) {
|
||||||
debug sprintf
|
debug sprintf
|
||||||
@@ -666,6 +672,12 @@ sub find_neighbors {
|
|||||||
$remote_port = $port;
|
$remote_port = $port;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
# what we came here to do.... discover the neighbor
|
||||||
|
debug sprintf
|
||||||
|
' [%s] neigh - adding neighbor %s, type [%s], on %s to discovery queue',
|
||||||
|
$device->ip, $remote_ip, $remote_type, $port;
|
||||||
|
_enqueue_discover($remote_ip, $remote_type);
|
||||||
|
|
||||||
$remote_port = $c_port->{$entry};
|
$remote_port = $c_port->{$entry};
|
||||||
|
|
||||||
if (defined $remote_port) {
|
if (defined $remote_port) {
|
||||||
@@ -678,12 +690,7 @@ sub find_neighbors {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# XXX too custom? IP Phone detection
|
# if all the data looks sane, update the port row with neighbor info
|
||||||
if (defined $remote_type and $remote_type =~ m/(mitel.5\d{3})/i) {
|
|
||||||
$remote_type = 'IP Phone - '. $remote_type
|
|
||||||
if $remote_type !~ /ip phone/i;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $portrow = schema('netdisco')->resultset('DevicePort')
|
my $portrow = schema('netdisco')->resultset('DevicePort')
|
||||||
->single({ip => $device->ip, port => $port});
|
->single({ip => $device->ip, port => $port});
|
||||||
|
|
||||||
@@ -693,17 +700,18 @@ sub find_neighbors {
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($portrow->manual_topo) {
|
||||||
|
info sprintf ' [%s] neigh - %s has manually defined topology',
|
||||||
|
$device->ip, $port;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
$portrow->update({
|
$portrow->update({
|
||||||
remote_ip => $remote_ip,
|
remote_ip => $remote_ip,
|
||||||
remote_port => $remote_port,
|
remote_port => $remote_port,
|
||||||
remote_type => $remote_type,
|
remote_type => $remote_type,
|
||||||
remote_id => $remote_id,
|
remote_id => $remote_id,
|
||||||
});
|
});
|
||||||
|
|
||||||
debug sprintf
|
|
||||||
' [%s] neigh - adding neighbor %s, type [%s], on %s to discovery queue',
|
|
||||||
$device->ip, $remote_ip, $remote_type, $port;
|
|
||||||
_enqueue_discover($remote_ip, $remote_type);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -712,6 +720,10 @@ sub find_neighbors {
|
|||||||
sub _set_manual_topology {
|
sub _set_manual_topology {
|
||||||
my ($device, $snmp) = @_;
|
my ($device, $snmp) = @_;
|
||||||
|
|
||||||
|
schema('netdisco')->txn_do(sub {
|
||||||
|
# clear manual topology flags
|
||||||
|
schema('netdisco')->resultset('DevicePort')->update({manual_topo => \'false'});
|
||||||
|
|
||||||
my $topo_links = schema('netdisco')->resultset('Topology');
|
my $topo_links = schema('netdisco')->resultset('Topology');
|
||||||
debug sprintf ' [%s] neigh - setting manual topology links', $device->ip;
|
debug sprintf ' [%s] neigh - setting manual topology links', $device->ip;
|
||||||
|
|
||||||
@@ -720,15 +732,18 @@ sub _set_manual_topology {
|
|||||||
try {
|
try {
|
||||||
schema('netdisco')->txn_do(sub {
|
schema('netdisco')->txn_do(sub {
|
||||||
# only work on root_ips
|
# only work on root_ips
|
||||||
|
my $left = get_device($link->dev1);
|
||||||
|
my $right = get_device($link->dev2);
|
||||||
|
|
||||||
# skip bad entries
|
# skip bad entries
|
||||||
my $left = get_device($link->dev1) or return;
|
return unless ($left->in_storage and $right->in_storage);
|
||||||
my $right = get_device($link->dev2) or return;
|
|
||||||
|
|
||||||
$left->ports
|
$left->ports
|
||||||
->single({port => $link->port1})
|
->single({port => $link->port1})
|
||||||
->update({
|
->update({
|
||||||
remote_ip => $right->ip,
|
remote_ip => $right->ip,
|
||||||
remote_port => $link->port2,
|
remote_port => $link->port2,
|
||||||
|
manual_topo => \'true',
|
||||||
});
|
});
|
||||||
|
|
||||||
$right->ports
|
$right->ports
|
||||||
@@ -736,10 +751,12 @@ sub _set_manual_topology {
|
|||||||
->update({
|
->update({
|
||||||
remote_ip => $left->ip,
|
remote_ip => $left->ip,
|
||||||
remote_port => $link->port1,
|
remote_port => $link->port1,
|
||||||
|
manual_topo => \'true',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
# only enqueue if device is not already discovered, and
|
# only enqueue if device is not already discovered, and
|
||||||
|
|||||||
Reference in New Issue
Block a user