|
|
@ -15,7 +15,6 @@ my $THIS_FILE = "Network.pm"; |
|
|
|
### Methods; |
|
|
|
### Methods; |
|
|
|
# bridge_info |
|
|
|
# bridge_info |
|
|
|
# check_firewall |
|
|
|
# check_firewall |
|
|
|
# check_network |
|
|
|
|
|
|
|
# check_internet |
|
|
|
# check_internet |
|
|
|
# collect_data |
|
|
|
# collect_data |
|
|
|
# download |
|
|
|
# download |
|
|
@ -385,409 +384,6 @@ sub check_firewall |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### TODO: Phase this out when EL8 / ifcfg-X file support is ended. |
|
|
|
|
|
|
|
=head2 check_network |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B<< NOTE >>: This method is not yet implemented. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This method checks to see if bridges and the links in bonds are up. It can simply report the bridge, bond and link states, or it can try to bring up interfaces that are down. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This method returns C<< 0 >> if nothing was done. It returns C<< 1 >> if any repairs were done. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Data is stored in the hash; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* bridge_health::<bridge_name>::up = [0,1] |
|
|
|
|
|
|
|
* bond_health::<bond_name>::up = [0,1] |
|
|
|
|
|
|
|
* bond_health::<bond_name>::active_links = <number of interfaces active in the bond, but not necessarily up> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::up_links = <number of links that are 'up' or 'going back'> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::configured_links = <the number of interfaces configured to be members of this bond> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::interface::<interface_name>::in_bond = [0,1] <set to '1' if the interface is active in the bond> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::interface::<interface_name>::up = [0,1] <set to '1' if 'up' or 'going back'> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::interface::<interface_name>::carrier = [0,1] <set to '1' if carrier detected> |
|
|
|
|
|
|
|
* bond_health::<bond_name>::interface::<interface_name>::name = <This is the NetworkManager name of the interface> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Parameters; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=head3 heal (optional, default 'down_only') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When set to C<< down_only >>, a bond where both links are down will attempt to up the links. However, bonds with at least one link up will be left alone. This is the default behaviour as it's not uncommon for admins to remotely down a single interface that is failing to stop alerts until a physical repair can be made. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When set to C<< all >>, any interfaces that are found to be down will attempt to brought up. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Wen set to C<< none >>, no attempts will be made to bring up any interfaces. The states will simply be recorded. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B<< Note >>: Interfaces that show no carrier will not be started in any case. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=cut |
|
|
|
|
|
|
|
sub check_network |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $self = shift; |
|
|
|
|
|
|
|
my $parameter = shift; |
|
|
|
|
|
|
|
my $anvil = $self->parent; |
|
|
|
|
|
|
|
my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3; |
|
|
|
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Network->check_internet()" }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This is causing more problems than it solves. Disabled for the time being. |
|
|
|
|
|
|
|
return(0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $heal = defined $parameter->{heal} ? $parameter->{heal} : "down_only"; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
heal => $heal, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Find out the bonds that are up. |
|
|
|
|
|
|
|
my $host = $anvil->Get->short_host_name(); |
|
|
|
|
|
|
|
$anvil->Network->bridge_info({debug => $debug}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (exists $anvil->data->{bond_health}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
delete $anvil->data->{bond_health}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Read in the network configuration files to track which interfaces are bound to which bonds. |
|
|
|
|
|
|
|
my $repaired = 0; |
|
|
|
|
|
|
|
my $interface = ""; |
|
|
|
|
|
|
|
my $directory = $anvil->data->{path}{directories}{ifcfg}; |
|
|
|
|
|
|
|
local(*DIRECTORY); |
|
|
|
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0018", variables => { directory => $directory }}); |
|
|
|
|
|
|
|
opendir(DIRECTORY, $directory); |
|
|
|
|
|
|
|
while(my $file = readdir(DIRECTORY)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($file =~ /^ifcfg-(.*)$/) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$interface = $1; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { interface => $interface }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# We'll check these, so this just makes sure we don't get an undefined variable error. |
|
|
|
|
|
|
|
$anvil->data->{raw_network}{interface}{$interface}{variable}{TYPE} = ""; |
|
|
|
|
|
|
|
$anvil->data->{raw_network}{interface}{$interface}{variable}{DEVICE} = ""; |
|
|
|
|
|
|
|
$anvil->data->{raw_network}{interface}{$interface}{variable}{MASTER} = ""; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
my $full_path = $directory."/".$file; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { full_path => $full_path }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $device = ""; |
|
|
|
|
|
|
|
my $is_link = ""; |
|
|
|
|
|
|
|
my $in_bond = ""; |
|
|
|
|
|
|
|
my $is_bond = ""; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Read in the file. |
|
|
|
|
|
|
|
my $file_body = $anvil->Storage->read_file({debug => $debug, file => $full_path}); |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { file_body => $file_body }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach my $line (split/\n/, $file_body) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { line => $line }}); |
|
|
|
|
|
|
|
$line =~ s/#.*$//; |
|
|
|
|
|
|
|
if ($line =~ /^(.*?)=(.*)$/) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $variable = $1; |
|
|
|
|
|
|
|
my $value = $2; |
|
|
|
|
|
|
|
$value =~ s/^"(.*)"$/$1/; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
variable => $variable, |
|
|
|
|
|
|
|
value => $value, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$anvil->data->{raw_network}{interface}{$interface}{variable}{$variable} = $value; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"raw_network::interface::${interface}::variable::${variable}" => $anvil->data->{raw_network}{interface}{$interface}{variable}{$variable}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$interface = ""; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
closedir(DIRECTORY); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 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 $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 "bridge") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Yup! |
|
|
|
|
|
|
|
$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? |
|
|
|
|
|
|
|
if (lc($type) eq "bond") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Yes! |
|
|
|
|
|
|
|
$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} = $name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Find the links configured to be under this bond. |
|
|
|
|
|
|
|
foreach my $this_interface (sort {$a cmp $b} keys %{$anvil->data->{raw_network}{interface}}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Is this a bond? |
|
|
|
|
|
|
|
my $this_type = $anvil->data->{raw_network}{interface}{$this_interface}{variable}{TYPE}; |
|
|
|
|
|
|
|
my $this_device = $anvil->data->{raw_network}{interface}{$this_interface}{variable}{DEVICE}; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
this_interface => $this_interface, |
|
|
|
|
|
|
|
this_type => $this_type, |
|
|
|
|
|
|
|
this_device => $this_device, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
next if lc($this_type) ne "ethernet"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $master = $anvil->data->{raw_network}{interface}{$this_interface}{variable}{MASTER}; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { master => $master }}); |
|
|
|
|
|
|
|
if (($master) && ($master eq $device)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# This interface belongs to this bond. |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{in_bond} = 0; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{up} = "unknown"; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{carrier} = "unknown"; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{name} = $this_interface; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{configured_links}++; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${this_device}::name" => $anvil->data->{bond_health}{$device}{interface}{$this_device}{name}, |
|
|
|
|
|
|
|
"bond_health::${device}::configured_links" => $anvil->data->{bond_health}{$device}{configured_links}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Read the interface's carrier |
|
|
|
|
|
|
|
my $carrier_file = "/sys/class/net/".$this_device."/carrier"; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { carrier_file => $carrier_file }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (-e $carrier_file) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $carrier = $anvil->Storage->read_file({debug => $debug, file => $carrier_file}); |
|
|
|
|
|
|
|
chomp $carrier; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { carrier => $carrier }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{carrier} = $carrier; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${this_device}::carrier" => $anvil->data->{bond_health}{$device}{interface}{$this_device}{carrier}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $operstate_file = "/sys/class/net/".$this_device."/operstate"; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { operstate_file => $operstate_file }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (-e $operstate_file) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $operstate = $anvil->Storage->read_file({debug => $debug, file => $operstate_file}); |
|
|
|
|
|
|
|
chomp $operstate; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { operstate => $operstate }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$this_device}{up} = $operstate eq "up" ? 1 : 0; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${this_device}::operstate" => $anvil->data->{bond_health}{$device}{interface}{$this_device}{operstate}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Read in the /proc file. |
|
|
|
|
|
|
|
my $proc_file = "/proc/net/bonding/".$device; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { proc_file => $proc_file }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $in_link = ""; |
|
|
|
|
|
|
|
my $file_body = $anvil->Storage->read_file({debug => $debug, file => $proc_file}); |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { file_body => $file_body }}); |
|
|
|
|
|
|
|
foreach my $line (split/\n/, $file_body) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { line => $line }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($line =~ /Slave Interface: (.*)$/) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$in_link = $1; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{active_links}++; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$in_link}{in_bond} = 1; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::active_links" => $anvil->data->{bond_health}{$device}{active_links}, |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${in_link}::in_bond" => $anvil->data->{bond_health}{$device}{interface}{$in_link}{in_bond}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (not $line) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$in_link = ""; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { in_link => $in_link }}); |
|
|
|
|
|
|
|
next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if ($in_link) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($line =~ /MII Status: (.*)$/) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $status = $1; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { status => $status }}); |
|
|
|
|
|
|
|
if ($status eq "up") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{up_links}++; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$in_link}{up} = 1; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::up_links" => $anvil->data->{bond_health}{$device}{up_links}, |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${in_link}::up" => $anvil->data->{bond_health}{$device}{interface}{$in_link}{up}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{interface}{$in_link}{up} = 0; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"bond_health::${device}::interface::${in_link}::up" => $anvil->data->{bond_health}{$device}{interface}{$in_link}{up}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($line =~ /MII Status: (.*)$/) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
my $status = $1; |
|
|
|
|
|
|
|
$anvil->data->{bond_health}{$device}{up} = $status eq "up" ? 1 : 0; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
status => $status, |
|
|
|
|
|
|
|
"bond_health::${device}::up" => $anvil->data->{bond_health}{$device}{up}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Before we check the bonds, check the bridges. Bonds won't come up if they're in a bridge that is |
|
|
|
|
|
|
|
# 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) && (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 $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, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach my $bond (sort {$a cmp $b} keys %{$anvil->data->{bond_health}}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"s1:bond_health::${bond}::name" => $anvil->data->{bond_health}{$bond}{name}, |
|
|
|
|
|
|
|
"s2:bond_health::${bond}::up" => $anvil->data->{bond_health}{$bond}{up}, |
|
|
|
|
|
|
|
"s3:bond_health::${bond}::configured_links" => $anvil->data->{bond_health}{$bond}{configured_links}, |
|
|
|
|
|
|
|
"s4:bond_health::${bond}::active_links" => $anvil->data->{bond_health}{$bond}{active_links}, |
|
|
|
|
|
|
|
"s5:bond_health::${bond}::up_links" => $anvil->data->{bond_health}{$bond}{up_links}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
foreach my $interface (sort {$a cmp $b} keys %{$anvil->data->{bond_health}{$bond}{interface}}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"s1:bond_health::${bond}::interface::${interface}::name" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{name}, |
|
|
|
|
|
|
|
"s2:bond_health::${bond}::interface::${interface}::in_bond" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{in_bond}, |
|
|
|
|
|
|
|
"s3:bond_health::${bond}::interface::${interface}::up" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{up}, |
|
|
|
|
|
|
|
"s4:bond_health::${bond}::interface::${interface}::carrier" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{carrier}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($anvil->data->{bond_health}{$bond}{configured_links} != $anvil->data->{bond_health}{$bond}{up_links}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
next if $heal eq "none"; |
|
|
|
|
|
|
|
next if (($anvil->data->{bond_health}{$bond}{up}) && ($heal eq "down_only")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Log that we're going to try to heal this bond. |
|
|
|
|
|
|
|
if ($heal eq "down_only") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Log that we're healing fully down bonds. |
|
|
|
|
|
|
|
$repaired = 1; |
|
|
|
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0627", variables => { bond => $bond }}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Log that we're healing all bond links |
|
|
|
|
|
|
|
$repaired = 1; |
|
|
|
|
|
|
|
$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}}) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
"s2:bond_health::${bond}::interface::${interface}::in_bond" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{in_bond}, |
|
|
|
|
|
|
|
"s4:bond_health::${bond}::interface::${interface}::carrier" => $anvil->data->{bond_health}{$bond}{interface}{$interface}{carrier}, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
if ((not $anvil->data->{bond_health}{$bond}{interface}{$interface}{in_bond}) && ($anvil->data->{bond_health}{$bond}{interface}{$interface}{carrier})) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
# Link shown, try to start the interface. |
|
|
|
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0629", variables => { |
|
|
|
|
|
|
|
bond => $bond, |
|
|
|
|
|
|
|
interface => $interface." (".$anvil->data->{bond_health}{$bond}{interface}{$interface}{name}.")", |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $shell_call = $anvil->data->{path}{exe}{ifup}." ".$anvil->data->{bond_health}{$bond}{interface}{$interface}{name}; |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 1, list => { shell_call => $shell_call }}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my ($output, $return_code) = $anvil->System->call({debug => 1, shell_call => $shell_call}); |
|
|
|
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
|
|
|
'output' => $output, |
|
|
|
|
|
|
|
'return_code' => $return_code, |
|
|
|
|
|
|
|
}}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return($repaired); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=head2 check_internet |
|
|
|
=head2 check_internet |
|
|
|
|
|
|
|
|
|
|
|
This method tries to connect to the internet. If successful, C<< 1 >> is returned. Otherwise, C<< 0 >> is returned. |
|
|
|
This method tries to connect to the internet. If successful, C<< 1 >> is returned. Otherwise, C<< 0 >> is returned. |
|
|
|