Author: arkurth
Date: Tue Aug 17 14:33:09 2010
New Revision: 986327

URL: http://svn.apache.org/viewvc?rev=986327&view=rev
Log:
VCL-371
Updated DataStructure.pm::get_computer_private_ip_address() to correctly locate 
lines in /etc/hosts when there is no character after the host name.  Also 
updated subroutine to return the IP address if multiple matching lines are 
found containing the same address.

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.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=986327&r1=986326&r2=986327&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm Tue Aug 17 
14:33:09 2010
@@ -1547,44 +1547,47 @@ sub get_computer_private_ip_address {
        }
        
        # Find lines containing the computer name followed by a space or period
-       my @matching_computer_hosts_lines = grep(/\s$computer_name[\s\.]/i, 
@$output);
+       my %matching_computer_ip_addresses;
        
-       # Extract matching lines which aren't commented out
-       my @uncommented_computer_hosts_lines = grep(/^\s*[^#]/, 
@matching_computer_hosts_lines);
+       for my $line (@$output) {
+               # Ignore commented lines
+               next if ($line =~ /^\s*#/);
+               
+               # Ignore lines which don't contain the computer name
+               next if ($line !~ /$computer_name($|\.|\s)/i);
+               
+               # Extract the IP address from the matching line
+               my ($ip_address) = $line =~ /\s*((?:[0-9]{1,3}\.?){4})\s/i;
        
+               if (!$ip_address) {
+                       notify($ERRORS{'WARNING'}, 0, "unable to extract IP 
address from line: $line");
+                       next;
+               }
+               
+               # Add the IP address and line to the hash
+               $matching_computer_ip_addresses{$ip_address} = $line;
+       }
+
+       # Check the hash, it should contain 1 key
        # Make sure 1 uncommented line was found
-       if (@matching_computer_hosts_lines == 0) {
+       my $found_count = scalar keys %matching_computer_ip_addresses;
+       if ($found_count == 0) {
                notify($ERRORS{'WARNING'}, 0, "did not find any lines in 
/etc/hosts containing '$computer_name'");
                return;
        }
-       elsif (@uncommented_computer_hosts_lines == 0) {
-               notify($ERRORS{'WARNING'}, 0, "did not find any uncommented 
lines in /etc/hosts containing '$computer_name':\n" . join("\n", 
@matching_computer_hosts_lines));
-               return;
-       }
-       elsif (@uncommented_computer_hosts_lines > 1) {
-               notify($ERRORS{'WARNING'}, 0, "found multiple uncommented lines 
in /etc/hosts containing '$computer_name':\n" . join("\n", 
@matching_computer_hosts_lines));
-               return;
-       }
-       
-       my $matching_computer_hosts_line = $matching_computer_hosts_lines[0];
-       notify($ERRORS{'DEBUG'}, 0, "found line for '$computer_name' in 
/etc/hosts:\n$matching_computer_hosts_line");
-       
-       # Extract the IP address from the matching line
-       my ($ip_address) = $matching_computer_hosts_line =~ 
/\s*((?:[0-9]{1,3}\.?){4})\s+$computer_name/i;
-       
-       # Check if IP address was found
-       if (!$ip_address) {
-               notify($ERRORS{'WARNING'}, 0, "unable to determine IP address 
from line:\n$matching_computer_hosts_line");
+       elsif ($found_count > 1) {
+               notify($ERRORS{'WARNING'}, 0, "found multiple lines in 
/etc/hosts containing '$computer_name' with different IP addresses:\n" . 
join("\n", values(%matching_computer_ip_addresses)));
                return;
        }
        
-       notify($ERRORS{'DEBUG'}, 0, "found IP address: $ip_address");
+       my $ip_address = (keys %matching_computer_ip_addresses)[0];
        
        # Update the request data if subroutine was called as an object method 
without an argument
        if ($self && !$argument) {
                
$self->request_data->{reservation}{$self->reservation_id}{computer}{PRIVATE_IP_ADDRESS_ETC_HOSTS}
 = $ip_address;
        }
        
+       notify($ERRORS{'DEBUG'}, 0, "returning IP address from /etc/hosts file: 
$ip_address");
        return $ip_address;
 }
 


Reply via email to