From f8b7e79dc5825ceb598be627fe3b1b21660032f5 Mon Sep 17 00:00:00 2001 From: ligc Date: Mon, 10 May 2010 08:05:31 +0000 Subject: [PATCH] fix for ipv6 support git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6036 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT/postscripts/configeth | 48 +++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/xCAT/postscripts/configeth b/xCAT/postscripts/configeth index d60686672..41e253d90 100755 --- a/xCAT/postscripts/configeth +++ b/xCAT/postscripts/configeth @@ -15,18 +15,49 @@ if ($^O =~ /^aix/i) { $nic = 'eth1'; } +sub getipaddr() +{ + my ($iporhost) = @_; + + my $socket6support = eval { require Socket6 }; + + if (($iporhost =~ /\d+\.\d+\.\d+\.\d+/) || ($iporhost =~ /:/)) + { + #pass in an ip and only want an ip?? + return $iporhost; + } + + if ($socket6support) # the getaddrinfo and getnameinfo supports both IPv4 and IPv6 + { + my ($family, $socket, $protocol, $ip, $name) = Socket6::getaddrinfo($iporhost,0); + if ($ip) + { + return (Socket6::getnameinfo($ip, Socket6::NI_NUMERICHOST()))[0]; + } + return undef; + } + else + { + return inet_ntoa(inet_aton($iporhost)) + } +} + my $hostname = "$ENV{NODE}-$nic"; -my $packed_ip = gethostbyname($hostname); -if (!$packed_ip) { system("logger -t xcat 'configeth: cannot resolve $hostname.'"); exit 1; } -my $ip = inet_ntoa($packed_ip); +my $ip = &getipaddr($hostname); +if (!$ip) { system("logger -t xcat 'configeth: cannot resolve $hostname.'"); exit 1; } #TODO: should contact xcatd on the service node to get the netmask and gateway from the networks table my $netmask = "255.255.0.0"; -my ($first, $second, $rest) = split(/\./, $ip); -my $gateway = "$first.$second.255.254"; +#my ($first, $second, $rest) = split(/\./, $ip); +#my $gateway = "$first.$second.255.254"; + if ($^O =~ /^aix/i) { - runcmd("chdev -l 'en1' -a netaddr=$ip -a netmask=$netmask -a state='up'"); + if ($ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + runcmd("chdev -l 'en1' -a netaddr=$ip -a netmask=$netmask -a state='up'"); + } else { #ipv6 + runcmd("autoconf6 -6i en1"); + } } elsif (($ENV{OSVER} && ($ENV{OSVER} =~ /sles|suse/i)) || (-f "/etc/SuSE-release")) { # Write the info to the ifcfg file @@ -55,9 +86,8 @@ elsif (($ENV{OSVER} && ($ENV{OSVER} =~ /sles|suse/i)) || (-f "/etc/SuSE-release" # make file for eth0, too if (! -f "$dir/ifcfg-$nic") { my $hostname = "$ENV{NODE}"; - my $packed_ip = gethostbyname($hostname); - if (!$packed_ip) { system("logger -t xcat 'configeth: cannot resolve $hostname.'"); exit 1; } - my $ip = inet_ntoa($packed_ip); + my $ip = &getipaddr($hostname); + if (!$ip) { system("logger -t xcat 'configeth: cannot resolve $hostname.'"); exit 1; } #TODO: should contact xcatd on the service node to get the netmask and gateway from the networks table my $netmask = "255.255.0.0";