From 460ebac96deddedeb498c65b35ff2ba6b4ad8fea Mon Sep 17 00:00:00 2001 From: ligc Date: Wed, 12 May 2010 01:45:48 +0000 Subject: [PATCH] ipv6 fix, replace the Socket library calls with NetworkUtils subroutines git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6063 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/Utils.pm | 60 +++++++++++++++++++++++++++++++++++++---- xCAT/xCAT.spec | 2 ++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/perl-xCAT/xCAT/Utils.pm b/perl-xCAT/xCAT/Utils.pm index cd31d0991..189a3f0bf 100644 --- a/perl-xCAT/xCAT/Utils.pm +++ b/perl-xCAT/xCAT/Utils.pm @@ -24,6 +24,7 @@ use Socket; use strict; use warnings "all"; require xCAT::InstUtils; +require xCAT::NetworkUtils; require xCAT::Schema; require Data::Dumper; require xCAT::NodeRange; @@ -2472,9 +2473,44 @@ sub nodeonmynet } my $nodeip = getNodeIPaddress( $nodetocheck ); + if (!$nodeip) + { + return 0; + } unless ($nodeip =~ /\d+\.\d+\.\d+\.\d+/) { - return 0; #Not supporting IPv6 here IPV6TODO + #IPv6 + if ( $^O eq 'aix') + { + my @subnets = get_subnet_aix(); + for my $net_ent (@subnets) + { + if ($net_ent !~ /-/) + { + #ipv4 + next; + } + my ($net, $interface, $mask, $flag) = split/-/ , $net_ent; + if (xCAT::NetworkUtils->ishostinsubnet($nodeip, $mask, $net)) + { + return 1; + } + } + + } + #TODO, ipv6 on Linux + my $nettab=xCAT::Table->new("networks"); + my @vnets = $nettab->getAllAttribs('net','mgtifname','mask'); + foreach (@vnets) { + if ((defined $_->{mgtifname}) && ($_->{mgtifname} eq '!remote!')) + { + if (xCAT::NetworkUtils->ishostinsubnet($nodeip, $_->{mask}, $_->{net})) + { + return 1; + } + } + } + return 0; } my $noden = unpack("N", inet_aton($nodeip)); my @nets; @@ -2486,6 +2522,11 @@ sub nodeonmynet my @subnets = get_subnet_aix(); for my $net_ent (@subnets) { + if ($net_ent =~ /-/) + { + #ipv6 + next; + } my @ents = split /:/ , $net_ent; push @nets, $ents[0] . '/' . $ents[2] . ' dev ' . $ents[1]; } @@ -2543,9 +2584,9 @@ sub getNodeIPaddress my $nodetocheck = shift; my $nodeip; - if ( inet_aton($nodetocheck) ) { - $nodeip = inet_ntoa(inet_aton($nodetocheck)); - } else { + $nodeip = xCAT::NetworkUtils->getipaddr($nodetocheck); + if (!$nodeip) + { my $hoststab = xCAT::Table->new( 'hosts'); my $ent = $hoststab->getNodeAttribs( $nodetocheck, ['ip'] ); if ( $ent->{'ip'} ) { @@ -5164,9 +5205,11 @@ sub get_subnet_aix #We need to find entries like: #Destination Gateway Flags Refs Use If Exp Groups #9.114.47.192/27 9.114.47.205 U 1 1 en0 +#4000::/64 link#4 UCX 1 0 en2 - - + my ( $net, $netmask, $flag, $nic); if ( $entry =~ /^\s*([\d\.]+)\/(\d+)\s+[\d\.]+\s+(\w+)\s+\d+\s+\d+\s(\w+)/) { - my ( $net, $netmask, $flag, $nic) = ($1,$2,$3,$4); + ( $net, $netmask, $flag, $nic) = ($1,$2,$3,$4); my @dotsec = split /\./, $net; for ( my $i = 4; $i > scalar(@dotsec); $i--) { @@ -5174,6 +5217,13 @@ sub get_subnet_aix } push @aix_nrn, "$net:$nic:$netmask:$flag" if ($net ne '127.0.0.0'); } + elsif ($entry =~ /^\s*([\dA-Fa-f\:]+)\/(\d+)\s+.*?\s+(\w+)\s+\d+\s+\d+\s(\w+)/) + { + #print "=====$entry====\n"; + ( $net, $netmask, $flag, $nic) = ($1,$2,$3,$4); + # for ipv6, can not use : as the delimiter + push @aix_nrn, "$net-$nic-$netmask-$flag" if ($net ne '::') + } } return @aix_nrn; } diff --git a/xCAT/xCAT.spec b/xCAT/xCAT.spec index f5667718d..5ade758af 100644 --- a/xCAT/xCAT.spec +++ b/xCAT/xCAT.spec @@ -134,10 +134,12 @@ fi %postun if [ "$1" = "0" ]; then %ifnos linux +if [ !"$1" = "2" ] if grep "^xcatd" /etc/inittab >/dev/null then /usr/sbin/rmitab xcatd >/dev/null fi +fi %endif true # so on aix we do not end up with an empty if stmt fi