From 08a958ec60be840bc876221d5499e3cb2250ccba Mon Sep 17 00:00:00 2001 From: Digimer Date: Fri, 18 Jun 2021 22:42:10 -0400 Subject: [PATCH] * Finished updating Network->check_network() to check/heal bridges. * Updated anvil-configure-host to not reboot on network chane (will verify when this commit is function tested). Signed-off-by: Digimer --- Anvil/Tools/Network.pm | 75 ++++++++++++++++++++++++++++---------- share/words.xml | 1 + tools/anvil-configure-host | 12 +++--- 3 files changed, 63 insertions(+), 25 deletions(-) diff --git a/Anvil/Tools/Network.pm b/Anvil/Tools/Network.pm index db738459..bc89e5c0 100644 --- a/Anvil/Tools/Network.pm +++ b/Anvil/Tools/Network.pm @@ -198,6 +198,11 @@ sub bridge_info if ((not exists $anvil->data->{bridge}{$host}{$bridge}) or (ref($anvil->data->{bridge}{$host}{$bridge}{interfaces}) ne "ARRAY")) { $anvil->data->{bridge}{$host}{$bridge}{interfaces} = []; + $anvil->data->{bridge}{$host}{$bridge}{found} = 1; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { + "bridge::${host}::${bridge}::interfaces" => $anvil->data->{bridge}{$host}{$bridge}{interfaces}, + "bridge::${host}::${bridge}::found" => $anvil->data->{bridge}{$host}{$bridge}{found}, + }}); } push @{$anvil->data->{bridge}{$host}{$bridge}{interfaces}}, $interface; @@ -261,6 +266,10 @@ sub check_network heal => $heal, }}); + # Find out the bonds that are up. + my $host = $anvil->Get->short_host_name(); + $anvil->Network->bridge_info({debug => $debug}); + # Read in the network configuration files to track which interfaces are bound to which bonds. my $repaired = 0; my $interface = ""; @@ -323,19 +332,31 @@ sub check_network # Process foreach my $interface (sort {$a cmp $b} keys %{$anvil->data->{raw_network}{interface}}) { - my $type = $anvil->data->{raw_network}{interface}{$interface}{variable}{TYPE}; - my $device = $anvil->data->{raw_network}{interface}{$interface}{variable}{DEVICE}; + my $type = $anvil->data->{raw_network}{interface}{$interface}{variable}{TYPE}; + my $device = $anvil->data->{raw_network}{interface}{$interface}{variable}{DEVICE}; + my $name = defined $anvil->data->{raw_network}{interface}{$interface}{variable}{NAME} ? $anvil->data->{raw_network}{interface}{$interface}{variable}{NAME} : $device; + $name =~ s/ /_/g; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { interface => $interface, type => $type, device => $device, + name => $name, }}); # Is this a bridge? - if (lc($type) eq "bond") + if (lc($type) eq "bridge") { # Yup! - $anvil->data->{bridge_health}{$device}{up} = 0; + $anvil->data->{bridge_health}{$device}{up} = 0; + $anvil->data->{bridge_health}{$device}{name} = $name; + if ((exists $anvil->data->{bridge}{$host}{$device}) && ($anvil->data->{bridge}{$host}{$device}{found})) + { + $anvil->data->{bridge_health}{$device}{up} = 1; + } + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { + "bridge_health::${device}::up" => $anvil->data->{bridge_health}{$device}{up}, + "bridge_health::${device}::name" => $anvil->data->{bridge_health}{$device}{name}, + }}); } # Is this a bond? @@ -345,7 +366,7 @@ sub check_network $anvil->data->{bond_health}{$device}{configured_links} = 0; $anvil->data->{bond_health}{$device}{active_links} = 0; $anvil->data->{bond_health}{$device}{up_links} = 0; - $anvil->data->{bond_health}{$device}{name} = $interface; + $anvil->data->{bond_health}{$device}{name} = $name; # Find the links configured to be under this bond. foreach my $this_interface (sort {$a cmp $b} keys %{$anvil->data->{raw_network}{interface}}) @@ -482,16 +503,32 @@ sub check_network # down. my $bridge_count = keys %{$anvil->data->{bridge_health}}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { bridge_count => $bridge_count }}); - if ($bridge_count) + if (($bridge_count) && (not $heal eq "none")) { foreach my $bridge (sort {$a cmp $b} keys %{$anvil->data->{bridge_health}}) { - my $up = $anvil->data->{bridge_health}{$bridge}{up}; + my $up = $anvil->data->{bridge_health}{$bridge}{up}; + my $name = $anvil->data->{bridge_health}{$bridge}{name}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { bridge => $bridge, + name => $name, up => $up, }}); + if (not $up) + { + # Try to recover the interface + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0632", variables => { bridge => $bridge }}); + + my $shell_call = $anvil->data->{path}{exe}{ifup}." ".$name; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { shell_call => $shell_call }}); + + my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $shell_call}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { + 'output' => $output, + 'return_code' => $return_code, + }}); + } } } @@ -533,6 +570,18 @@ sub check_network $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0628", variables => { bond => $bond }}); } + # For good measure, try to up the bond as well. + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0630", variables => { bond => $bond }}); + + my $shell_call = $anvil->data->{path}{exe}{ifup}." ".$anvil->data->{bond_health}{$bond}{name}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { shell_call => $shell_call }}); + + my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $shell_call}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { + 'output' => $output, + 'return_code' => $return_code, + }}); + # If we're here, try to bring up down'ed interfaces. foreach my $interface (sort {$a cmp $b} keys %{$anvil->data->{bond_health}{$bond}{interface}}) { @@ -558,18 +607,6 @@ sub check_network }}); } } - -# # For good measure, try to up the bond as well. -# $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0630", variables => { bond => $bond }}); -# -# my $shell_call = $anvil->data->{path}{exe}{ifup}." ".$anvil->data->{bond_health}{$bond}{name}; -# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { shell_call => $shell_call }}); -# -# my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $shell_call}); -# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { -# 'output' => $output, -# 'return_code' => $return_code, -# }}); } } diff --git a/share/words.xml b/share/words.xml index 485b9d12..1c0f7625 100644 --- a/share/words.xml +++ b/share/words.xml @@ -1822,6 +1822,7 @@ The file: [#!variable!file!#] needs to be updated. The difference is: The bond: [#!variable!bond!#]'s interface: [#!variable!interface!#] is not in this bond. Trying to bring it up now... The bond: [#!variable!bond!#] will now be brought up (even if it already is up). Network device names have changed, rebooting to ensure they take effect. The job will restart once the network comes back up. + The bridge: [#!variable!bridge!#] is down, tryin to bring it up now. The host name: [#!variable!target!#] does not resolve to an IP address. diff --git a/tools/anvil-configure-host b/tools/anvil-configure-host index 1d107799..464e9732 100755 --- a/tools/anvil-configure-host +++ b/tools/anvil-configure-host @@ -97,7 +97,7 @@ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, 'print' ### it needs to reconfigure the system every run. if ($anvil->data->{sys}{reboot}) { - do_reboot($anvil); + #do_reboot($anvil); } $anvil->nice_exit({exit_code => 0}); @@ -1223,11 +1223,11 @@ sub reconfigure_network } # If we should reset, do so now. - if ($anvil->data->{sys}{reboot}) - { - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, key => "log_0631"}); - do_reboot($anvil); - } +# if ($anvil->data->{sys}{reboot}) +# { +# $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, key => "log_0631"}); +# do_reboot($anvil); +# } # Wait for a DB connection. We'll wait up to 130 seconds, as sometimes it takes a while for the network # to start routing traffic.