vcl-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From arku...@apache.org
Subject svn commit: r1058314 - /incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
Date Wed, 12 Jan 2011 21:03:00 GMT
Author: arkurth
Date: Wed Jan 12 21:03:00 2011
New Revision: 1058314

URL: http://svn.apache.org/viewvc?rev=1058314&view=rev
Log:
VCL-429
Updated Windows.pm::get_network_configuration to improve the logic used to determine which
network interface is public.  It had assumed the first interface it finds with a public IP
address is the public interface.  Added additional logic to for interfaces with also have
a default gateway to take precedence.

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

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm?rev=1058314&r1=1058313&r2=1058314&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Wed Jan 12 21:03:00 2011
@@ -5034,12 +5034,11 @@ sub get_network_configuration {
 		return;
 	}
 	
-	my $computer_public_ip_address;
-	
-	my %public_interface;
+	my $public_interface_name;
+	my $private_interface_name;
 	
 	# Loop through all of the network interfaces found
-	foreach my $interface_name (sort keys %network_configuration) {
+	INTERFACE: foreach my $interface_name (sort keys %network_configuration) {
 		my @ip_addresses  = keys %{$network_configuration{$interface_name}{ip_address}};
 		my $description = $network_configuration{$interface_name}{description};
 		$description = '' if !$description;
@@ -5054,50 +5053,56 @@ sub get_network_configuration {
 		if (grep { $_ eq $computer_private_ip_address } @ip_addresses) {
 			# If private interface information was requested, return a hash containing only this interface
 			notify($ERRORS{'DEBUG'}, 0, "private interface found: $interface_name, description: $description,
address(es): " . join (", ", @ip_addresses));
+			$private_interface_name = $interface_name;
 			if ($network_type =~ /private/i) {
-				my %return_hash = ($interface_name => $network_configuration{$interface_name});
-				notify($ERRORS{'DEBUG'}, 0, "returning data for private interface: $interface_name ("
. join (", ", @ip_addresses) . ")");
-				return \%return_hash;
+				last INTERFACE;
 			}
 			else {
-				next;
+				next INTERFACE;
 			}
 		}
+		elsif ($network_type =~ /private/i) {
+			notify($ERRORS{'DEBUG'}, 0, "interface is not assigned the private IP address: $interface_name
(" . join (", ", @ip_addresses) . ")");
+			next INTERFACE;
+		}
 		
 		# Check if the interface should be ignored based on the name or description
 		if ($interface_name =~ /(loopback|vmnet|afs|tunnel|6to4|isatap|teredo)/i) {
 			notify($ERRORS{'DEBUG'}, 0, "interface '$interface_name' ignored because name contains
'$1', address(es): " . join (", ", @ip_addresses));
-			next;
+			next INTERFACE;
 		}
 		elsif ($description =~ /(loopback|virtual|afs|tunnel|pseudo|6to4|isatap)/i) {
 			notify($ERRORS{'DEBUG'}, 0, "interface '$interface_name' ignored because description contains
'$1': '$description', address(es): " . join (", ", @ip_addresses));
-			next;
+			next INTERFACE;
 		}
 		
 		# Loop through the IP addresses for the interface
 		# Once a public address is found, return the data for that interface
-		for my $ip_address (@ip_addresses) {
-			if (is_public_ip_address($ip_address)) {
-				notify($ERRORS{'DEBUG'}, 0, "public interface found: $interface_name, description: $description,
address(es): " . join (", ", @ip_addresses));
-				if ($network_type =~ /public/i) {
-					my %return_hash = ($interface_name => $network_configuration{$interface_name});
-					notify($ERRORS{'DEBUG'}, 0, "returning data for public interface: $interface_name ("
. join (", ", @ip_addresses) . ")");
-					return \%return_hash;
+		IP_ADDRESS: for my $ip_address (@ip_addresses) {
+			my $is_public = is_public_ip_address($ip_address);
+			my $default_gateway = $network_configuration{$interface_name}{default_gateway};
+			
+			if ($is_public) {
+				if ($default_gateway) {
+					notify($ERRORS{'DEBUG'}, 0, "public interface found with default gateway: $interface_name,
address(es): " . join (", ", @ip_addresses) . ", default gateway: $default_gateway");
+					$public_interface_name = $interface_name;
+					last INTERFACE;
 				}
 				else {
-					next;
+					notify($ERRORS{'DEBUG'}, 0, "interface found with public address but default gateway
is not set: $interface_name, address(es): " . join (", ", @ip_addresses));
+					$public_interface_name = $interface_name;
 				}
 			}
 			else {
-				notify($ERRORS{'DEBUG'}, 0, "interface found with non-public address not matching private
address for reservation: $interface_name, description: $description, address(es): " . join
(", ", @ip_addresses));
+				notify($ERRORS{'DEBUG'}, 0, "interface found with non-public address not matching private
address for reservation: $interface_name, address(es): " . join (", ", @ip_addresses));
 				
-				if (keys(%public_interface)) {
-					notify($ERRORS{'DEBUG'}, 0, "already found another interface with a non-public address
not matching private address for reservation, this one will be used if a public address isn't
found");
+				if ($public_interface_name) {
+					notify($ERRORS{'DEBUG'}, 0, "already found another interface with a non-public address
not matching private address for reservation, the one previously found will be used if a public
address isn't found");
 					next;
 				}
 				else {
 					notify($ERRORS{'DEBUG'}, 0, "interface will be returned if another with a public address
isn't found");
-					$public_interface{$interface_name} = $network_configuration{$interface_name};
+					$public_interface_name = $interface_name;
 				}
 			}
 			
@@ -5105,18 +5110,23 @@ sub get_network_configuration {
 	}
 
 	if ($network_type =~ /private/i) {
-		notify($ERRORS{'WARNING'}, 0, "did not find an interface using the private IP address for
the reservation: $computer_private_ip_address\n" . format_data(\%network_configuration));
-		return;
-	}
-	elsif (keys(%public_interface)) {
-		notify($ERRORS{'OK'}, 0, "did not find a public interface using a public IP address, but
found interface using private IP address not matching reservation private IP address, returning
data for public interface:\n" . format_data(\%public_interface));
-		return \%public_interface;
+		if ($private_interface_name) {
+			return {$private_interface_name => $network_configuration{$private_interface_name}};
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "did not find an interface using the private IP address
for the reservation: $computer_private_ip_address\n" . format_data(\%network_configuration));
+			return;
+		}
 	}
 	else {
-		notify($ERRORS{'WARNING'}, 0, "unable to determine the public interface:\n" . format_data(\%network_configuration));
-		return;
+		if ($public_interface_name) {
+			return {$public_interface_name => $network_configuration{$public_interface_name}};
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "failed to find a public interface:\n" . format_data(\%network_configuration));
+			return;
+		}
 	}
-	
 } ## end sub get_network_configuration
 
 #/////////////////////////////////////////////////////////////////////////////



Mime
View raw message