Author: arkurth
Date: Tue Dec  7 17:35:06 2010
New Revision: 1043137

URL: http://svn.apache.org/viewvc?rev=1043137&view=rev
Log:
VCL-420
Removed Linux.pm::get_public_default_gateway subroutine. It was only returning 
the legacy $GATEWAY variable which isn't set anymore.

Added DataStructure.pm::get_management_node_public_dns_servers. This parses the 
value of managementnode.publicDNSserver and returns an array of addresses.

Reworked Linux.pm::set_static_public_address. It now calls 
get_management_node_public_dns_servers and includes additional error checking.

Updated OS.pm::get_public_interface_name to check for interfaces without a 
bound IP address. It was failing to return the public interface name if it was 
down.

Other
Added $max_attempts argument to OS.pm::is_ssh_responding.

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm?rev=1043137&r1=1043136&r2=1043137&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm Tue Dec  7 
17:35:06 2010
@@ -2158,7 +2158,7 @@ sub get_management_node_public_default_g
        }
        
        # Attempt to retrieve the gateway from the route command
-       my ($route_exit_statux, $route_output) = run_command('route -n', 1);
+       my ($route_exit_status, $route_output) = run_command('route -n', 1);
        if ($route_output && (my @route_gateway_lines = grep(/^0.0.0.0/, 
@$route_output))) {
                if (scalar @route_gateway_lines == 1) {
                        ($default_gateway) = $route_gateway_lines[0] =~ 
/^[\d\.]+\s+([\d\.]+)/;
@@ -2225,6 +2225,29 @@ sub get_management_node_public_default_g
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 get_management_node_public_dns_servers
+
+ Parameters  : None
+ Returns     : If successful: array containing IP addresses
+               If failed: false
+ Description : Returns an array containing the addresses of the public DNS
+               servers configured for the management node.
+
+=cut
+
+sub get_management_node_public_dns_servers {
+       # Attempt to retrieve the DNS server addresses configured for this 
management node
+       my $dns_address_string = $ENV{management_node_info}{PUBLIC_DNS_SERVER};
+       if (!$dns_address_string) {
+               notify($ERRORS{'DEBUG'}, 0, "no public dns server addresses are 
configured for the management node");
+               return ();
+       }
+       
+       return split(/\s*[,;]\s*/g, $dns_address_string);
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 get_computer_state_name
 
  Parameters  : computer name (optional

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1043137&r1=1043136&r2=1043137&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm Tue Dec  7 17:35:06 
2010
@@ -354,10 +354,16 @@ sub wait_for_ssh {
 
 =head2 is_ssh_responding
 
- Parameters  : None
+ Parameters  : $max_attempts
  Returns     : If computer responds to SSH: 1
                If computer never responds to SSH: 0
- Description : Checks if the reservation computer is responding to SSH.
+ Description : Checks if the computer is responding to SSH. Ports 22 and 24 are
+               first checked to see if either is open. If neither is open, 0 is
+               returned. If either of the ports is open a test SSH command 
which
+               simply echo's a string is attempted. The default is to only
+               attempt to run this command once. This can be changed by
+               supplying the $max_attempts argument. If the $max_attempts is
+               supplied but set to 0, only the port checks are done.
 
 =cut
 
@@ -368,6 +374,9 @@ sub is_ssh_responding {
                return;
        }
        
+       # Get the max attempts argument if supplied, default to 1
+       my $max_attempts = shift || 1;
+       
        my $computer_node_name = $self->data->get_computer_node_name();
        
        # Try nmap to see if any of the ssh ports are open before attempting to 
run a test command
@@ -378,22 +387,27 @@ sub is_ssh_responding {
                return 0;
        }
        
-       # Run a test SSH command
-       my ($exit_status, $output) = run_ssh_command({
-               node => $computer_node_name,
-               command => "echo testing ssh on $computer_node_name",
-               max_attempts => 1,
-               output_level => 0,
-       });
-       
-       # The exit status will be 0 if the command succeeded
-       if (defined($output) && grep(/testing/, @$output)) {
-               notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is responding 
to SSH, port 22: $port_22_status, port 24: $port_24_status");
-               return 1;
+       if ($max_attempts) {
+               # Run a test SSH command
+               my ($exit_status, $output) = run_ssh_command({
+                       node => $computer_node_name,
+                       command => "echo testing ssh on $computer_node_name",
+                       max_attempts => $max_attempts,
+                       output_level => 0,
+               });
+               
+               # The exit status will be 0 if the command succeeded
+               if (defined($output) && grep(/testing/, @$output)) {
+                       notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is 
responding to SSH, port 22: $port_22_status, port 24: $port_24_status");
+                       return 1;
+               }
+               else {
+                       notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is NOT 
responding to SSH, SSH command failed, port 22: $port_22_status, port 24: 
$port_24_status");
+                       return 0;
+               }
        }
        else {
-               notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is NOT 
responding to SSH, SSH command failed, port 22: $port_22_status, port 24: 
$port_24_status");
-               return 0;
+               return 1;
        }
 }
 
@@ -855,13 +869,28 @@ sub get_public_interface_name {
        
        my $public_interface_name;
        
+       # Store the name of an interface found without any bound IP addresses
+       # This interface will be returned if no others are found with an IP 
address
+       my $addressless_interface_name;
+       
        # Loop through all of the network interfaces found
-       foreach my $interface_name (sort keys %$network_configuration) {
+       INTERFACE_NAME: foreach my $interface_name (sort keys 
%$network_configuration) {
                # Get the interface IP addresses and make sure an IP address 
was found
                my @ip_addresses  = keys 
%{$network_configuration->{$interface_name}{ip_address}};
-               if (!...@ip_addresses) {
-                       notify($ERRORS{'DEBUG'}, 0, "interface is not assigned 
an IP address: $interface_name");
-                       next;
+               
+               # Check if the interface does not have any bound IP addresses
+               # Store the interface name if another has not already been found
+               # This will be returned if no others are found with a bound IP 
address
+               # This may occur if the public interface is present but down
+               if (!...@ip_addresses && !defined($addressless_interface_name)) 
{
+                       if (!defined($addressless_interface_name)) {
+                               notify($ERRORS{'DEBUG'}, 0, "found interface 
without a bound IP address: $interface_name, this name will be returned if no 
other valid interface is found with a bound IP address");
+                               $addressless_interface_name = $interface_name;
+                       }
+                       else {
+                               notify($ERRORS{'DEBUG'}, 0, "found another 
interface without a bound IP address: $interface_name, the first interface 
found without a bound IP address will be returned if no other valid interface 
is found with a bound IP address: $addressless_interface_name");
+                       }
+                       next INTERFACE_NAME;
                }
                
                # Check if interface has private IP address assigned to it
@@ -908,6 +937,10 @@ sub get_public_interface_name {
                notify($ERRORS{'DEBUG'}, 0, "did not find any interfaces 
assigned a public IP address, returning interface assigned a private IP address 
not matching the private IP address assigned to the reservation computer: 
$public_interface_name");
                return $public_interface_name;
        }
+       elsif ($addressless_interface_name) {
+               notify($ERRORS{'DEBUG'}, 0, "did not find any interfaces 
assigned a public IP address, returning interface found with no bound IP 
addresses: $addressless_interface_name");
+               return $addressless_interface_name;
+       }
        else {
                notify($ERRORS{'WARNING'}, 0, "failed to determine the public 
interface from the network configuration:\n" . 
format_data($network_configuration));
                return;

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1043137&r1=1043136&r2=1043137&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Tue Dec  7 
17:35:06 2010
@@ -439,9 +439,9 @@ sub clear_private_keys {
 
 =head2 set_static_public_address
 
- Parameters  :
- Returns     :
- Description :
+ Parameters  : none
+ Returns     : boolean
+ Description : Configures the public interface with a static IP address.
 
 =cut
 
@@ -451,198 +451,193 @@ sub set_static_public_address {
                notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
                return 0;
        }
+       
+       my $computer_name = $self->data->get_computer_short_name();
+       
        # Make sure public IP configuration is static
-       my $ip_configuration = 
$self->data->get_management_node_public_ip_configuration() || 'undefined';
-       unless ($ip_configuration =~ /static/i) {
+       my $ip_configuration = 
$self->data->get_management_node_public_ip_configuration();
+       if ($ip_configuration !~ /static/i) {
                notify($ERRORS{'WARNING'}, 0, "static public address can only 
be set if IP configuration is static, current value: $ip_configuration");
                return;
        }
 
        # Get the IP configuration
-       my $public_interface_name = $self->get_public_interface_name()     || 
'undefined';
-       my $public_ip_address     = $self->data->get_computer_ip_address() || 
'undefined';
-
-       my $subnet_mask     = 
$self->data->get_management_node_public_subnet_mask() || 'undefined';
-       my $default_gateway = $self->get_public_default_gateway()               
    || 'undefined';
-       my $dns_server      = 
$self->data->get_management_node_public_dns_server()  || 'undefined';
-
+       my $interface_name = $self->get_public_interface_name() || 
'<undefined>';
+       my $ip_address = $self->data->get_computer_ip_address() || 
'<undefined>';
+       my $subnet_mask = $self->data->get_management_node_public_subnet_mask() 
|| '<undefined>';
+       my $default_gateway = 
$self->data->get_management_node_public_default_gateway() || '<undefined>';
+       my @dns_servers = $self->data->get_management_node_public_dns_servers();
+       
+       # Assemble a string containing the static IP configuration
+       my $configuration_info_string = <<EOF;
+public interface name: $interface_name
+public IP address: $ip_address
+public subnet mask: $subnet_mask
+public default gateway: $default_gateway
+public DNS server(s): @dns_servers
+EOF
+       
        # Make sure required info was retrieved
-       if ("$public_interface_name $subnet_mask $default_gateway $dns_server" 
=~ /undefined/) {
-               notify($ERRORS{'WARNING'}, 0, "unable to retrieve required 
network configuration:\ninterface: $public_interface_name\npublic IP address: 
$public_ip_address\nsubnet mask=$subnet_mask\ndefault 
gateway=$default_gateway\ndns server=$dns_server");
+       if ("$interface_name $ip_address $subnet_mask $default_gateway" =~ 
/undefined/) {
+               notify($ERRORS{'WARNING'}, 0, "failed to retrieve required 
network configuration for $computer_name:\n$configuration_info_string");
                return;
        }
-
-       my $management_node_keys = $self->data->get_management_node_keys();
-       my $image_name           = $self->data->get_image_name();
-       my $computer_short_name  = $self->data->get_computer_short_name();
-       my $computer_node_name   = $self->data->get_computer_node_name();
-
-       notify($ERRORS{'OK'}, 0, "initiating Linux set_static_public_address on 
$computer_short_name");
-       my @eth1file;
-       my $tmpfile = "/tmp/ifcfg-eth_device-$computer_short_name";
-       push(@eth1file, "DEVICE=$public_interface_name\n");
-       push(@eth1file, "BOOTPROTO=static\n");
-       push(@eth1file, "IPADDR=$public_ip_address\n");
-       push(@eth1file, "NETMASK=$subnet_mask\n");
-       push(@eth1file, "STARTMODE=onboot\n");
-       push(@eth1file, "ONBOOT=yes\n");
-
-       #write to tmpfile
-       if (open(TMP, ">$tmpfile")) {
-               print TMP @eth1file;
-               close(TMP);
+       else {
+               notify($ERRORS{'OK'}, 0, "attempting to set static public IP 
address on $computer_name:\n$configuration_info_string");
+       }
+       
+       # Assemble the ifcfg file path
+       my $network_scripts_path = "/etc/sysconfig/network-scripts";
+       my $ifcfg_file_path = "$network_scripts_path/ifcfg-$interface_name";
+       notify($ERRORS{'DEBUG'}, 0, "public interface ifcfg file path: 
$ifcfg_file_path");
+       
+       # Assemble the ifcfg file contents
+       my $ifcfg_contents = <<EOF;
+DEVICE=$interface_name
+BOOTPROTO=static
+IPADDR=$ip_address
+NETMASK=$subnet_mask
+STARTMODE=onboot
+ONBOOT=yes
+EOF
+       
+       # Echo the contents to the ifcfg file
+       my $echo_ifcfg_command = "echo \"$ifcfg_contents\" > $ifcfg_file_path";
+       my ($echo_ifcfg_exit_status, $echo_ifcfg_output) = 
$self->execute($echo_ifcfg_command);
+       if (!defined($echo_ifcfg_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to 
recreate $ifcfg_file_path on $computer_name: '$echo_ifcfg_command'");
+               return;
+       }
+       elsif ($echo_ifcfg_exit_status || grep(/echo:/i, @$echo_ifcfg_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to recreate 
$ifcfg_file_path on $computer_name, exit status: $echo_ifcfg_exit_status, 
command: '$echo_ifcfg_command', output:\n" . join("\n", @$echo_ifcfg_output));
+               return;
        }
        else {
-               #print "could not write $tmpfile $!\n";
-
+               notify($ERRORS{'DEBUG'}, 0, "recreated $ifcfg_file_path on 
$computer_name:\n$ifcfg_contents");
        }
-       my @sshcmd = run_ssh_command($computer_short_name, 
$management_node_keys, "/etc/sysconfig/network-scripts/ifdown 
$public_interface_name", "root");
-       foreach my $l (@{$sshcmd[1]}) {
-               if ($l) {
-                       #potential problem
-                       notify($ERRORS{'OK'}, 0, "sshcmd output ifdown 
$computer_short_name $l");
-               }
+       
+       # Restart the interface
+       notify($ERRORS{'DEBUG'}, 0, "attempting to restart public interface 
$interface_name on $computer_name");
+       my $interface_restart_command = "$network_scripts_path/ifdown 
$interface_name ; $network_scripts_path/ifup $interface_name";
+       my ($interface_restart_exit_status, $interface_restart_output) = 
$self->execute($interface_restart_command);
+       if (!defined($interface_restart_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to restart 
public interface $interface_name on $computer_name: 
'$interface_restart_command'");
+               return;
        }
-       #copy new ifcfg-Device
-       if (run_scp_command($tmpfile, 
"$computer_short_name:/etc/sysconfig/network-scripts/ifcfg-$public_interface_name",
 $management_node_keys)) {
-
-               #confirm it got there
-               undef @sshcmd;
-               @sshcmd = run_ssh_command($computer_short_name, 
$management_node_keys, "cat 
/etc/sysconfig/network-scripts/ifcfg-$public_interface_name", "root");
-               my $success = 0;
-               foreach my $i (@{$sshcmd[1]}) {
-                       if ($i =~ /$public_ip_address/) {
-                               notify($ERRORS{'OK'}, 0, "SUCCESS - copied 
ifcfg_$public_interface_name\n");
-                               $success = 1;
-                       }
-               }
-               if (unlink($tmpfile)) {
-                       notify($ERRORS{'OK'}, 0, "unlinking $tmpfile");
-               }
-
-               if (!$success) {
-                       notify($ERRORS{'WARNING'}, 0, "unable to copy $tmpfile 
to $computer_short_name file ifcfg-$public_interface_name did get updated with 
$public_ip_address ");
-                       return 0;
-               }
-       } ## end if (run_scp_command($tmpfile, 
"$computer_short_name:/etc/sysconfig/network-scripts/ifcfg-$public_interface_name"...
-
-       #bring device up
-       @sshcmd = run_ssh_command($computer_short_name, $management_node_keys, 
"/etc/sysconfig/network-scripts/ifup $public_interface_name", "root");
-       #should be empty
-       foreach my $l (@{$sshcmd[1]}) {
-               if ($l) {
-                       #potential problem
-                       notify($ERRORS{'OK'}, 0, "possible problem with ifup 
$public_interface_name $l");
-               }
+       elsif ($interface_restart_exit_status) {
+               notify($ERRORS{'WARNING'}, 0, "failed to restart public 
interface $interface_name on $computer_name, exit status: 
$interface_restart_exit_status, command: '$interface_restart_command', 
output:\n" . join("\n", @$interface_restart_output));
+               return;
        }
-       #correct route table - delete old default and add new in same line
-       undef @sshcmd;
-       @sshcmd = run_ssh_command($computer_short_name, $management_node_keys, 
"/sbin/route del default", "root");
-       #should be empty
-       foreach my $l (@{$sshcmd[1]}) {
-               if ($l =~ /Usage:/) {
-                       #potential problem
-                       notify($ERRORS{'OK'}, 0, "possible problem with route 
del default $l");
-               }
-               if ($l =~ /No such process/) {
-                       notify($ERRORS{'OK'}, 0, "$l - ok  just no default 
route since we downed eth device");
-               }
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "restarted public interface 
$interface_name on $computer_name");
        }
-
-       notify($ERRORS{'OK'}, 0, "Setting default route");
-       undef @sshcmd;
-       @sshcmd = run_ssh_command($computer_short_name, $management_node_keys, 
"/sbin/route add default gw $default_gateway metric 0 $public_interface_name", 
"root");
-       #should be empty
-       foreach my $l (@{$sshcmd[1]}) {
-               if ($l =~ /Usage:/) {
-                       #potential problem
-                       notify($ERRORS{'OK'}, 0, "possible problem with route 
add default gw $default_gateway metric 0 $public_interface_name");
-               }
-               if ($l =~ /No such process/) {
-                       notify($ERRORS{'CRITICAL'}, 0, "problem with 
$computer_short_name $l add default gw $default_gateway metric 0 
$public_interface_name");
-                       return 0;
-               }
-       } ## end foreach my $l (@{$sshcmd[1]})
-
-       #correct external sshd file
-
-       if (run_ssh_command($computer_short_name, $management_node_keys, "sed 
-i -e \"/ListenAddress .*/d \" /etc/ssh/external_sshd_config", "root")) {
-               notify($ERRORS{'OK'}, 0, "Cleared ListenAddress from 
external_sshd_config");
+       
+       # Delete existing default route
+       my $route_del_command = "/sbin/route del default";
+       my ($route_del_exit_status, $route_del_output) = 
$self->execute($route_del_command);
+       if (!defined($route_del_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to delete 
the existing default route on $computer_name: '$route_del_command'");
+               return;
        }
-
-       # Add correct ListenAddress
-       if (run_ssh_command($computer_short_name, $management_node_keys, "echo 
\"ListenAddress $public_ip_address\" >> /etc/ssh/external_sshd_config", 
"root")) {
-               notify($ERRORS{'OK'}, 0, "appended ListenAddress 
$public_ip_address to external_sshd_config");
+       elsif (grep(/No such process/i, @$route_del_output)) {
+               notify($ERRORS{'DEBUG'}, 0, "existing default route is not 
set");
        }
-
-       #modify /etc/resolve.conf
-       my $search;
-       undef @sshcmd;
-       @sshcmd = run_ssh_command($computer_short_name, $management_node_keys, 
"cat /etc/resolv.conf", "root");
-       foreach my $l (@{$sshcmd[1]}) {
-               chomp($l);
-               if ($l =~ /search/) {
-                       $search = $l;
-               }
+       elsif ($route_del_exit_status) {
+               notify($ERRORS{'WARNING'}, 0, "failed to delete existing 
default route on $computer_name, exit status: $route_del_exit_status, command: 
'$route_del_command', output:\n" . join("\n", @$route_del_output));
+               return;
        }
-
-       if (defined($search)) {
-               my @resolvconf;
-               push(@resolvconf, "$search\n");
-               my ($s1, $s2, $s3);
-               if ($dns_server =~ /,/) {
-                       ($s1, $s2, $s3) = split(/,/, $dns_server);
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "deleted existing default route on 
$computer_name, output:\n" . join("\n", @$route_del_output));
+       }
+       
+       # Set default route
+       my $route_add_command = "/sbin/route add default gw $default_gateway 
metric 0 $interface_name 2>&1 && /sbin/route -n";
+       my ($route_add_exit_status, $route_add_output) = 
$self->execute($route_add_command);
+       if (!defined($route_add_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to add 
default route to $default_gateway on public interface $interface_name on 
$computer_name: '$route_add_command'");
+               return;
+       }
+       elsif ($route_add_exit_status) {
+               notify($ERRORS{'WARNING'}, 0, "failed to add default route to 
$default_gateway on public interface $interface_name on $computer_name, exit 
status: $route_add_exit_status, command: '$route_add_command', output:\n" . 
join("\n", @$route_add_output));
+               return;
+       }
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "added default route to 
$default_gateway on public interface $interface_name on $computer_name, 
output:\n" . format_data($route_add_output));
+       }
+       
+       # Update the external sshd file
+       # Remove existing ListenAddress lines using sed
+       # Add ListenAddress line to the end of the file
+       my $ext_sshd_command;
+       $ext_sshd_command .= "sed -i -e \"/ListenAddress .*/d \" 
/etc/ssh/external_sshd_config 2>&1";
+       $ext_sshd_command .= " && echo \"ListenAddress $ip_address\" >> 
/etc/ssh/external_sshd_config";
+       $ext_sshd_command .= " && tail -n1 /etc/ssh/external_sshd_config";
+       my ($ext_sshd_exit_status, $ext_sshd_output) = 
$self->execute($ext_sshd_command);
+       if (!defined($ext_sshd_output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to update 
ListenAddress line in /etc/ssh/external_sshd_config on $computer_name: 
'$ext_sshd_command'");
+               return;
+       }
+       elsif ($ext_sshd_exit_status) {
+               notify($ERRORS{'WARNING'}, 0, "failed to update ListenAddress 
line in /etc/ssh/external_sshd_config on $computer_name, exit status: 
$ext_sshd_exit_status\ncommand:\n'$ext_sshd_command'\noutput:\n" . join("\n", 
@$ext_sshd_output));
+               return;
+       }
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "updated ListenAddress line in 
/etc/ssh/external_sshd_config on $computer_name, output:\n" . join("\n", 
@$ext_sshd_output));
+       }
+       
+       # Update resolv.conf if DNS server address is configured for the 
management node
+       my $resolv_conf_path = "/etc/resolv.conf";
+       if (@dns_servers) {
+               # Get the resolve.conf contents
+               my $cat_resolve_command = "cat $resolv_conf_path";
+               my ($cat_resolve_exit_status, $cat_resolve_output) = 
$self->execute($cat_resolve_command);
+               if (!defined($cat_resolve_output)) {
+                       notify($ERRORS{'WARNING'}, 0, "failed to run command to 
retrieve existing $resolv_conf_path contents from $computer_name");
+                       return;
+               }
+               elsif ($cat_resolve_exit_status || grep(/^(bash:|cat:)/, 
@$cat_resolve_output)) {
+                       notify($ERRORS{'WARNING'}, 0, "failed to retrieve 
existing $resolv_conf_path contents from $computer_name, exit status: 
$cat_resolve_exit_status, command: '$cat_resolve_command', output:\n" . 
join("\n", @$cat_resolve_output));
+                       return;
                }
                else {
-                       $s1 = $dns_server;
+                       notify($ERRORS{'DEBUG'}, 0, "retrieved existing 
$resolv_conf_path contents from $computer_name:\n" . join("\n", 
@$cat_resolve_output));
                }
-               push(@resolvconf, "nameserver $s1\n");
-               push(@resolvconf, "nameserver $s2\n") if (defined($s2));
-               push(@resolvconf, "nameserver $s3\n") if (defined($s3));
-               my $rtmpfile = "/tmp/resolvconf$computer_short_name";
-               if (open(RES, ">$rtmpfile")) {
-                       print RES @resolvconf;
-                       close(RES);
+               
+               # Remove lines containing nameserver
+               my @resolv_conf_lines = grep(!/nameserver/i, 
@$cat_resolve_output);
+               
+               # Add a nameserver line for each configured DNS server
+               for my $dns_server_address (@dns_servers) {
+                       push @resolv_conf_lines, "nameserver 
$dns_server_address";
                }
-               else {
-                       notify($ERRORS{'OK'}, 0, "could not write to $rtmpfile 
$!");
+               
+               # Remove newlines for consistency
+               map { chomp $_ } @resolv_conf_lines;
+               
+               # Assemble the lines into an array
+               my $resolv_conf_contents = join("\n", @resolv_conf_lines);
+               
+               # Echo the updated contents to resolv.conf
+               my $echo_resolve_command = "echo \"$resolv_conf_contents\" > 
$resolv_conf_path 2>&1 && cat $resolv_conf_path";
+               my ($echo_resolve_exit_status, $echo_resolve_output) = 
$self->execute($echo_resolve_command);
+               if (!defined($echo_resolve_output)) {
+                       notify($ERRORS{'WARNING'}, 0, "failed to run command to 
update $resolv_conf_path on $computer_name:\n$echo_resolve_command");
+                       return;
                }
-               #put resolve.conf  file back on node
-               notify($ERRORS{'OK'}, 0, "copying in new resolv.conf");
-               if (run_scp_command($rtmpfile, 
"$computer_short_name:/etc/resolv.conf", $management_node_keys)) {
-                       notify($ERRORS{'OK'}, 0, "SUCCESS copied new 
resolv.conf to $computer_short_name");
+               elsif ($echo_resolve_exit_status) {
+                       notify($ERRORS{'WARNING'}, 0, "failed to update 
$resolv_conf_path on $computer_name, exit status: 
$echo_resolve_exit_status\ncommand:\n$echo_resolve_command\noutput:\n" . 
join("\n", @$echo_resolve_output));
+                       return;
                }
                else {
-                       notify($ERRORS{'OK'}, 0, "FALIED to copied new 
resolv.conf to $computer_short_name");
-                       return 0;
+                       notify($ERRORS{'DEBUG'}, 0, "updated $resolv_conf_path 
on $computer_name:\n" . join("\n", @$echo_resolve_output));
                }
-
-               if (unlink($rtmpfile)) {
-                       notify($ERRORS{'OK'}, 0, "unlinking $rtmpfile");
-               }
-       } ## end if (defined($search))
+       }
        else {
-               notify($ERRORS{'WARNING'}, 0, "pulling resolve.conf from 
$computer_short_name failed output= @{ $sshcmd[1] }");
+               notify($ERRORS{'DEBUG'}, 0, "$resolv_conf_path not updated  on 
$computer_name because DNS server address is not configured for the management 
node");
        }
-
-
+       
+       notify($ERRORS{'OK'}, 0, "successfully set static public IP address on 
$computer_name");
        return 1;
-} ## end sub set_static_public_address
-
-#/////////////////////////////////////////////////////////////////////////////
-
-=head2 get_public_default_gateway
-
- Parameters  :
- Returns     :
- Description :
-
-=cut
-
-sub get_public_default_gateway {
-
-       #global varible pulled from vcld.conf
-       return $GATEWAY;
 }
 
 #/////////////////////////////////////////////////////////////////////////////


Reply via email to