diff --git a/Anvil/Tools/Database.pm b/Anvil/Tools/Database.pm
index f0013bd2..f627a5fc 100644
--- a/Anvil/Tools/Database.pm
+++ b/Anvil/Tools/Database.pm
@@ -16689,10 +16689,11 @@ sub _age_out_data
my $to_clean = {};
# Power, temperatures, ip addresses and variables
- $to_clean->{table}{temperature}{child_table}{temperature}{uuid_column} = "temperature_uuid";
- $to_clean->{table}{power}{child_table}{power}{uuid_column} = "power_uuid";
- $to_clean->{table}{ip_addresses}{child_table}{ip_addresses}{uuid_column} = "ip_address_uuid";
- $to_clean->{table}{variables}{child_table}{variables}{uuid_column} = "variable_uuid";
+ $to_clean->{table}{temperature}{child_table}{temperature}{uuid_column} = "temperature_uuid";
+ $to_clean->{table}{power}{child_table}{power}{uuid_column} = "power_uuid";
+ $to_clean->{table}{ip_addresses}{child_table}{ip_addresses}{uuid_column} = "ip_address_uuid";
+ $to_clean->{table}{variables}{child_table}{variables}{uuid_column} = "variable_uuid";
+ $to_clean->{table}{network_interfaces}{child_table}{network_interfaces}{uuid_column} = "network_interface_uuid";
# scan_apc_pdu
$to_clean->{table}{scan_apc_pdus}{child_table}{scan_apc_pdu_phases}{uuid_column} = "scan_apc_pdu_phase_uuid";
diff --git a/notes b/notes
index f4e94ab5..3d21efb0 100644
--- a/notes
+++ b/notes
@@ -1,3 +1,29 @@
+# Configure APC PDUs and UPSes
+tcpip -i 10.201.2.3 -s 255.255.0.0 -g 10.201.255.254
+web -h enable
+web -s enable
+snmp -S enable -c1 private -a1 writeplus
+snmp -S enable -c2 public -a2 writeplus
+
+Anvil! to Anvil! live migration;
+1. Create LVs
+2. Make sure /etc/hosts is populated
+3. If DR is used, disconnect first to stay within the max-peers=3
+3. Update dbrd config, A:1 -> A:2, A:1 -> B:1, B:1 -> B:2 (if both online and UpToDate, otherwise both from UpToDate)
+4. Create drbd md on new Anvil!
+5. drbdadm adjust on old nodes.
+6. Wait for DRBD resource to sync to node 1 (it can sync to node 2 later)
+7. Copy server's XML to new cluster
+8. pcs resource unmanage srv01-cs8
+9. Allow dual primary between A1:B1 (or A2:B1) -
+[root@an-a01n01 ~]# pcs resource disable srv01-cs8
+Warning: 'srv01-cs8' is unmanaged
+[root@an-a01n01 ~]# pcs resource manage srv01-cs8
+[root@an-a01n01 ~]# pcs resource delete srv01-cs8
+Deleting Resource - srv01-cs8
+10.
+
+
TODO:
- Remove this; (step 2) "This is the user name that you will log into Striker as and the name of the user that owns the database"
- Being set to the gateway, not the default DNS - "This is the domain name server(s) to use when resolving domain names. You can specify 2 or more, separated by commas."
diff --git a/scancore-agents/scan-network/scan-network b/scancore-agents/scan-network/scan-network
index 78c5a2f2..77433a89 100755
--- a/scancore-agents/scan-network/scan-network
+++ b/scancore-agents/scan-network/scan-network
@@ -798,18 +798,303 @@ sub read_last_scan
return(0);
}
-# There is a bug somewhere where interfaces and ip addresses are periodically being added twice per host.
-# This checks for / cleans those up. Remove this when the core issue is resolved.
+# There is a bug somewhere where interfaces, bridges and ip addresses are periodically being added twice per
+# host. This checks for / cleans those up. Remove this when the core issue is resolved.
sub clear_duplicates
{
my ($anvil) = @_;
+ # Look for duplicate bridges.
my $query = "
+SELECT
+ bridge_uuid,
+ bridge_name,
+ bridge_id,
+ bridge_mac_address
+FROM
+ bridges
+WHERE
+ bridge_host_uuid = ".$anvil->Database->quote($anvil->Get->host_uuid)."
+ORDER BY
+ bridge_name ASC,
+ bridge_id DESC
+;";
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0124", variables => { query => $query }});
+ my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
+ my $count = @{$results};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ results => $results,
+ count => $count,
+ }});
+ foreach my $row (@{$results})
+ {
+ my $bridge_uuid = $row->[0];
+ my $bridge_name = $row->[1];
+ my $bridge_id = $row->[2];
+ my $bridge_mac_address = $row->[3];
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ bridge_uuid => $bridge_uuid,
+ bridge_name => $bridge_name,
+ bridge_id => $bridge_id,
+ bridge_mac_address => $bridge_mac_address,
+ }});
+
+ if (not exists $anvil->data->{duplicate_bridges}{seen}{$bridge_name})
+ {
+ $anvil->data->{duplicate_bridges}{seen}{$bridge_name} = [];
+ }
+ push @{$anvil->data->{duplicate_bridges}{seen}{$bridge_name}}, $bridge_uuid;
+
+ $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_name} = $bridge_name;
+ $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_mac_address} = $bridge_mac_address;
+ $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_id} = $bridge_id;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "duplicate_bridges::bridge_uuid::${bridge_uuid}::bridge_name" => $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_name},
+ "duplicate_bridges::bridge_uuid::${bridge_uuid}::bridge_id" => $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_id},
+ "duplicate_bridges::bridge_uuid::${bridge_uuid}::bridge_mac_address" => $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_mac_address},
+ }});
+
+ $anvil->data->{deleted_bridges}{$bridge_uuid} = 0;
+ }
+ foreach my $bridge_name (sort {$a cmp $b} keys %{$anvil->data->{duplicate_bridges}{seen}})
+ {
+ my $count = @{$anvil->data->{duplicate_bridges}{seen}{$bridge_name}};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ 's1:bridge_name' => $bridge_name,
+ 's2:count' => $count,
+ }});
+
+ if ($count > 1)
+ {
+ # Duplicate! Is one of them marked as DELETED?
+ foreach my $bridge_uuid (@{$anvil->data->{duplicate_bridges}{seen}{$bridge_name}})
+ {
+ # Is this one deleted?
+ my $bridge_mac_address = $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_mac_address};
+ my $bridge_id = $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_id};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ bridge_uuid => $bridge_uuid,
+ bridge_mac_address => $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_mac_address},
+ bridge_id => $anvil->data->{duplicate_bridges}{bridge_uuid}{$bridge_uuid}{bridge_id},
+ }});
+ if ($bridge_id eq "DELETED")
+ {
+ # Take this one out.
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0685", variables => {
+ name => $bridge_name,
+ uuid => $bridge_uuid,
+ }});
+
+ my $queries = [];
+ push @{$queries}, "DELETE FROM history.network_interfaces WHERE network_interface_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM network_interfaces WHERE network_interface_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM history.bondss WHERE bond_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM bondss WHERE bond_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM history.bridges WHERE bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM bridges WHERE bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+
+ # Write it out.
+ $anvil->Database->write({debug => 2, query => $queries, source => $THIS_FILE, line => __LINE__});
+
+ $count--;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }});
+
+ $anvil->data->{deleted_bridges}{$bridge_uuid} = 1;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "deleted_bridges::${bridge_uuid}" => $anvil->data->{deleted_bridges}{$bridge_uuid},
+ }});
+ }
+ last if $count == 1;
+ }
+
+ # If count is still > 1, we need to arbitrarily delete an interface.
+ if ($count > 1)
+ {
+ foreach my $bridge_uuid (@{$anvil->data->{duplicate_bridges}{seen}{$bridge_name}})
+ {
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0685", variables => {
+ name => $bridge_name,
+ uuid => $bridge_uuid,
+ }});
+
+ my $queries = [];
+ push @{$queries}, "DELETE FROM history.network_interfaces WHERE network_interface_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM network_interfaces WHERE network_interface_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM history.bondss WHERE bond_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM bondss WHERE bond_bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM history.bridges WHERE bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+ push @{$queries}, "DELETE FROM bridges WHERE bridge_uuid = ".$anvil->Database->quote($bridge_uuid).";";
+
+ # Write it out.
+ $anvil->Database->write({debug => 2, query => $queries, source => $THIS_FILE, line => __LINE__});
+
+ $count--;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }});
+
+ $anvil->data->{deleted_bridges}{$bridge_uuid} = 1;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "deleted_bridges::${bridge_uuid}" => $anvil->data->{deleted_bridges}{$bridge_uuid},
+ }});
+ }
+ last if $count == 1;
+ }
+ }
+ }
+ delete $anvil->data->{duplicate_bridges};
+
+ # Load the bridges again.
+ $anvil->Database->get_bridges({include_deleted => 1});
+
+ # Look for duplicate bonds.
+ $query = "
+SELECT
+ bond_uuid,
+ bond_name,
+ bond_operational,
+ bond_mac_address,
+ bond_bridge_uuid
+FROM
+ bonds
+WHERE
+ bond_host_uuid = ".$anvil->Database->quote($anvil->Get->host_uuid)."
+ORDER BY
+ bond_name ASC,
+ bond_operational DESC
+;";
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0124", variables => { query => $query }});
+ $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
+ $count = @{$results};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ results => $results,
+ count => $count,
+ }});
+ foreach my $row (@{$results})
+ {
+ my $bond_uuid = $row->[0];
+ my $bond_name = $row->[1];
+ my $bond_operational = $row->[2];
+ my $bond_mac_address = $row->[3];
+ my $bond_bridge_uuid = defined $row->[4] ? $row->[4] : "";
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ bond_uuid => $bond_uuid,
+ bond_name => $bond_name,
+ bond_operational => $bond_operational,
+ bond_mac_address => $bond_mac_address,
+ bond_bridge_uuid => $bond_bridge_uuid,
+ }});
+
+ if (not exists $anvil->data->{duplicate_bonds}{seen}{$bond_name})
+ {
+ $anvil->data->{duplicate_bonds}{seen}{$bond_name} = [];
+ }
+ push @{$anvil->data->{duplicate_bonds}{seen}{$bond_name}}, $bond_uuid;
+
+ $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_name} = $bond_name;
+ $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_mac_address} = $bond_mac_address;
+ $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_operational} = $bond_operational;
+ $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_bridge_uuid} = $bond_bridge_uuid;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "duplicate_bonds::bond_uuid::${bond_uuid}::bond_name" => $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_name},
+ "duplicate_bonds::bond_uuid::${bond_uuid}::bond_operational" => $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_operational},
+ "duplicate_bonds::bond_uuid::${bond_uuid}::bond_mac_address" => $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_mac_address},
+ "duplicate_bonds::bond_uuid::${bond_uuid}::bond_bridge_uuid" => $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_bridge_uuid},
+ }});
+
+ $anvil->data->{deleted_bonds}{$bond_uuid} = 0;
+ }
+ foreach my $bond_name (sort {$a cmp $b} keys %{$anvil->data->{duplicate_bonds}{seen}})
+ {
+ my $count = @{$anvil->data->{duplicate_bonds}{seen}{$bond_name}};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ 's1:bond_name' => $bond_name,
+ 's2:count' => $count,
+ }});
+
+ if ($count > 1)
+ {
+ # Duplicate! Is one of them marked as DELETED?
+ foreach my $bond_uuid (@{$anvil->data->{duplicate_bonds}{seen}{$bond_name}})
+ {
+ # Is this one deleted?
+ my $bond_mac_address = $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_mac_address};
+ my $bond_operational = $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_operational};
+ my $bond_bridge_uuid = $anvil->data->{duplicate_bonds}{bond_uuid}{$bond_uuid}{bond_bridge_uuid};
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ bond_uuid => $bond_uuid,
+ bond_mac_address => $bond_mac_address,
+ bond_operational => $bond_operational,
+ bond_bridge_uuid => $bond_bridge_uuid,
+ }});
+ if ((($bond_bridge_uuid) && ($anvil->data->{deleted_bridges}{$bond_bridge_uuid})) or ($bond_operational eq "DELETED"))
+ {
+ # Take this one out.
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0685", variables => {
+ name => $bond_name,
+ uuid => $bond_uuid,
+ }});
+
+ my $queries = [];
+ push @{$queries}, "DELETE FROM history.network_interfaces WHERE network_interface_bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM network_interfaces WHERE network_interface_bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM history.bonds WHERE bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM bonds WHERE bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+
+ # Write it out.
+ $anvil->Database->write({debug => 2, query => $queries, source => $THIS_FILE, line => __LINE__});
+
+ $count--;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }});
+
+ $anvil->data->{deleted_bonds}{$bond_uuid} = 1;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "deleted_bonds::${bond_uuid}" => $anvil->data->{deleted_bonds}{$bond_uuid},
+ }});
+ }
+ }
+
+ # If count is still > 1, we need to arbitrarily delete an interface.
+ if ($count > 1)
+ {
+ foreach my $bond_uuid (@{$anvil->data->{duplicate_bonds}{seen}{$bond_name}})
+ {
+ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0685", variables => {
+ name => $bond_name,
+ uuid => $bond_uuid,
+ }});
+
+ my $queries = [];
+ push @{$queries}, "DELETE FROM history.network_interfaces WHERE network_interface_bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM network_interfaces WHERE network_interface_bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM history.bonds WHERE bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+ push @{$queries}, "DELETE FROM bonds WHERE bond_uuid = ".$anvil->Database->quote($bond_uuid).";";
+
+ # Write it out.
+ $anvil->Database->write({debug => 2, query => $queries, source => $THIS_FILE, line => __LINE__});
+
+ $count--;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }});
+
+ $anvil->data->{deleted_bonds}{$bond_uuid} = 1;
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
+ "deleted_bonds::${bond_uuid}" => $anvil->data->{deleted_bonds}{$bond_uuid},
+ }});
+ }
+ last if $count == 1;
+ }
+ }
+ }
+ delete $anvil->data->{duplicate_bonds};
+
+
+ # Look for duplicate network interfaces
+ $query = "
SELECT
network_interface_uuid,
network_interface_name,
network_interface_mac_address,
- network_interface_operational
+ network_interface_operational,
+ network_interface_bond_uuid,
+ network_interface_bridge_uuid
FROM
network_interfaces
WHERE
@@ -817,23 +1102,27 @@ WHERE
ORDER BY
network_interface_name ASC;";
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0124", variables => { query => $query }});
- my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
- my $count = @{$results};
+ $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
+ $count = @{$results};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
results => $results,
count => $count,
}});
foreach my $row (@{$results})
{
- my $network_interface_uuid = $row->[0];
- my $network_interface_name = $row->[1];
- my $network_interface_mac_address = $row->[2];
- my $network_interface_operational = $row->[3];
+ my $network_interface_uuid = $row->[0];
+ my $network_interface_name = $row->[1];
+ my $network_interface_mac_address = $row->[2];
+ my $network_interface_operational = $row->[3];
+ my $network_interface_bond_uuid = defined $row->[4] ? $row->[4] : "";
+ my $network_interface_bridge_uuid = defined $row->[5] ? $row->[5] : "";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
network_interface_uuid => $network_interface_uuid,
network_interface_name => $network_interface_name,
network_interface_mac_address => $network_interface_mac_address,
network_interface_operational => $network_interface_operational,
+ network_interface_bond_uuid => $network_interface_bond_uuid,
+ network_interface_bridge_uuid => $network_interface_bridge_uuid,
}});
if (not exists $anvil->data->{duplicate_nics}{seen}{$network_interface_name})
@@ -845,10 +1134,14 @@ ORDER BY
$anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_name} = $network_interface_name;
$anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_mac_address} = $network_interface_mac_address;
$anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_operational} = $network_interface_operational;
+ $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bond_uuid} = $network_interface_bond_uuid;
+ $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bridge_uuid} = $network_interface_bridge_uuid;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
"duplicate_nics::network_interface_uuid::${network_interface_uuid}::network_interface_name" => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_name},
"duplicate_nics::network_interface_uuid::${network_interface_uuid}::network_interface_mac_address" => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_mac_address},
"duplicate_nics::network_interface_uuid::${network_interface_uuid}::network_interface_operational" => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_operational},
+ "duplicate_nics::network_interface_uuid::${network_interface_uuid}::network_interface_bond_uuid" => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bond_uuid},
+ "duplicate_nics::network_interface_uuid::${network_interface_uuid}::network_interface_bridge_uuid" => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bridge_uuid},
}});
}
foreach my $network_interface_name (sort {$a cmp $b} keys %{$anvil->data->{duplicate_nics}{seen}})
@@ -867,12 +1160,18 @@ ORDER BY
# Is this one deleted?
my $network_interface_mac_address = $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_mac_address};
my $network_interface_operational = $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_operational};
+ my $network_interface_bond_uuid = $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bond_uuid};
+ my $network_interface_bridge_uuid = $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_bridge_uuid};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
network_interface_uuid => $network_interface_uuid,
- network_interface_mac_address => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_mac_address},
- network_interface_operational => $anvil->data->{duplicate_nics}{network_interface_uuid}{$network_interface_uuid}{network_interface_operational},
+ network_interface_mac_address => $network_interface_mac_address,
+ network_interface_operational => $network_interface_operational,
+ network_interface_bond_uuid => $network_interface_bond_uuid,
+ network_interface_bridge_uuid => $network_interface_bridge_uuid,
}});
- if ($network_interface_operational eq "DELETED")
+ if ((($network_interface_bond_uuid) && ($anvil->data->{deleted_bonds}{$network_interface_bond_uuid})) or
+ (($network_interface_bridge_uuid) && ($anvil->data->{deleted_bridges}{$network_interface_bridge_uuid})) or
+ ($network_interface_operational eq "DELETED"))
{
# Take this one out.
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0647", variables => {
@@ -887,7 +1186,6 @@ ORDER BY
$count--;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }});
}
- last if $count == 1;
}
# If count is still > 1, we need to arbitrarily delete an interface.
@@ -901,6 +1199,7 @@ ORDER BY
}});
my $query = "DELETE FROM network_interfaces WHERE network_interface_uuid = ".$anvil->Database->quote($network_interface_uuid).";";
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
$anvil->Database->write({query => $query, source => $THIS_FILE, line => __LINE__});
$count--;
@@ -1004,6 +1303,7 @@ ORDER BY
}});
my $query = "DELETE FROM ip_addresses WHERE ip_address_uuid = ".$anvil->Database->quote($ip_address_uuid).";";
+ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
$anvil->Database->write({query => $query, source => $THIS_FILE, line => __LINE__});
$count--;
@@ -1014,6 +1314,7 @@ ORDER BY
}
}
+
return(0);
}
diff --git a/share/words.xml b/share/words.xml
index f06540d2..e7c122e3 100644
--- a/share/words.xml
+++ b/share/words.xml
@@ -2075,6 +2075,8 @@ The file: [#!variable!file!#] needs to be updated. The difference is:
Testing that our short host name resolves to one of our IP prior to starting the cluster.
Changing the ownership of: [#!variable!file!#] to be owned by: [#!variable!user!#:#!variable!user!#].
Enabling 'ping' for all users.
+ The network interface: [#!variable!nic!#] on the host: [#!variable!host!#] is recorded in the 'history.network_interfaces' table, but has not corresponding entry in the public table. Removing it.
+ [ Note ] - The network bridge: [#!variable!name!#] with 'bridge_uuid': [#!variable!uuid!#] is a duplicate, removing it from the database(s).
The host name: [#!variable!target!#] does not resolve to an IP address.