fix for IP6 makenetworks

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6407 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
ligc 2010-06-09 09:22:14 +00:00
parent 3fce8957d7
commit e36edf8a6f

View File

@ -5,6 +5,7 @@ use Data::Dumper;
use Sys::Syslog;
use Socket;
use xCAT::Utils;
use xCAT::NetworkUtils;
use Getopt::Long;
sub handled_commands
@ -171,97 +172,180 @@ sub donets
return 1;
}
# do each ethernet interface
foreach my $i (@interfaces) {
my $master=xCAT::Utils->get_site_Master();
my $masterip = xCAT::NetworkUtils->getipaddr($master);
if ($masterip =~ /:/) {
# do each ethernet interface for ipv6
foreach my $i (@interfaces) {
if ($i =~ /^en/) {
# "mktcpip -S en0" to get nm & gw
my $mkcmd = "mktcpip -S $i";
my @netinfo = xCAT::Utils->runcmd($mkcmd, 0);
if ($::RUNCMD_RC != 0) {
my $rsp;
push @{$rsp->{data}}, "Could not run \'$mkcmd\'.\n";
xCAT::MsgUtils->message("E", $rsp, $callback);
return 1;
}
if ($i =~ /^en/) {
# "ifconfig en0 |grep fe80" to get net and prefix length
my $cmd = "ifconfig $i |grep -i inet6";
my @netinfo = xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0) {
# no ipv6 address configured
next;
}
my $netmask;
my $ipaddr;
my @fields;
my $gateway;
foreach my $line (@netinfo) {
next if ($line =~ /^\s*#/);
# only handle the ipv6 addr without %
foreach my $line (@netinfo)
{
next if ($line =~ /\%/);
my $gateway;
my $netmask;
my @fields;
@fields = split(/:/, $line);
}
$ipaddr = $fields[1];
$netmask = $fields[2];
$gateway = $fields[6];
@fields = split(/ /, $line);
($gateway, $netmask) = split(/\//, $fields[1]);
# split interface IP
my ($ip1, $ip2, $ip3, $ip4) = split('\.', $ipaddr);
my $eip = Net::IP::ip_expand_address ($gateway,6);
my $bip = Net::IP::ip_iptobin($eip,6);
my $bmask = Net::IP::ip_get_mask($netmask,6);
my $bnet = $bip & $bmask;
my $ipnet = Net::IP::ip_bintoip($bnet,6);
my $net = Net::IP::ip_compress_address($ipnet,6);
# split mask
my ($m1, $m2, $m3, $m4) = split('\.', $netmask);
my $netname = $net . "-" . $netmask;
# AND nm and ip to get net attribute
my $n1 = ((int $ip1) & (int $m1));
my $n2 = ((int $ip2) & (int $m2));
my $n3 = ((int $ip3) & (int $m3));
my $n4 = ((int $ip4) & (int $m4));
# see if this network (or equivalent) is already defined
# - compare net and prefix_len values
my $foundmatch = 0;
foreach my $netn (@netlist) {
# get net and prefix_len
my $dnet = $nethash{$netn}{'net'};
my $dprefix_len = $nethash{$netn}{'mask'};
my $net = "$n1.$n2.$n3.$n4";
if (($net == $dnet) && ($netmask == $dprefix_len))
{
$foundmatch = 1;
last;
}
}
# use convention for netname attr
my $netn;
my $maskn;
($netn = $net) =~ s/\./\_/g;
($maskn = $netmask) =~ s/\./\_/g;
# ( 1_2_3_4-255_255_255_192 - ugh!)
my $netname = $netn . "-" . $maskn;
if ($::DISPLAY) {
my $rsp;
push @{$rsp->{data}}, "\n#From $host.";
pus h @{$rsp->{data}}, "$netname:";
push @{$rsp->{data}}, " objtype=network";
push @{$rsp->{data}}, " net=$net";
push @{$rsp->{data}}, " mask=$netmask";
push @{$rsp->{data}}, " mgtifname=$i";
push @{$rsp->{data}}, " gateway=$gateway\n";
if ($foundmatch) {
pus h @{$rsp->{data}}, "# Note: An equivalent xCAT network definition already exists.\n";
}
xCA T::MsgUtils->message("I", $rsp, $callback);
} else {
# see if this network (or equivalent) is already defined
# - compare net and mask values
foreach my $netn (@netlist) {
# split definition mask
my ($dm1, $dm2, $dm3, $dm4) = split('\.', $nethash{$netn}{'mask'});
if ($foundmatch) {
next;
}
# split definition net addr
my ($dn1, $dn2, $dn3, $dn4) = split('\.', $nethash{$netn}{'net'});
# add new network def
$nettab->setAttribs({'net' => $net, 'mask' => $netmask}, {'netname' => $netname, 'gateway' => $gateway, 'mgtifname' => $i});
}
}
}
}
} else {
# do each ethernet interface for ipv4
foreach my $i (@interfaces) {
if ($i =~ /^en/) {
# "mktcpip -S en0" to get nm & gw
my $mkcmd = "mktcpip -S $i";
my @netinfo = xCAT::Utils->runcmd($mkcmd, 0);
if ($::RUNCMD_RC != 0) {
my $rsp;
push @{$rsp->{data}}, "Could not run \'$mkcmd\'.\n";
xCAT::MsgUtils->message("E", $rsp, $callback);
return 1;
}
my $netmask;
my $ipaddr;
my @fields;
my $gateway;
foreach my $line (@netinfo) {
next if ($line =~ /^\s*#/);
@fields = split(/:/, $line);
}
$ipaddr = $fields[1];
$netmask = $fields[2];
$gateway = $fields[6];
# split interface IP
my ($ip1, $ip2, $ip3, $ip4) = split('\.', $ipaddr);
# split mask
my ($m1, $m2, $m3, $m4) = split('\.', $netmask);
# AND nm and ip to get net attribute
my $n1 = ((int $ip1) & (int $m1));
my $n2 = ((int $ip2) & (int $m2));
my $n3 = ((int $ip3) & (int $m3));
my $n4 = ((int $ip4) & (int $m4));
my $net = "$n1.$n2.$n3.$n4";
# use convention for netname attr
my $netn;
my $maskn;
($netn = $net) =~ s/\./\_/g;
($maskn = $netmask) =~ s/\./\_/g;
# ( 1_2_3_4-255_255_255_192 - ugh!)
my $netname = $netn . "-" . $maskn;
# see if this network (or equivalent) is already defined
# - compare net and mask values
my $foundmatch = 0;
foreach my $netn (@netlist) {
# split definition mask
my ($dm1, $dm2, $dm3, $dm4) = split('\.', $nethash{$netn}{'mask'});
# split definition net addr
my ($dn1, $dn2, $dn3, $dn4) = split('\.', $nethash{$netn}{'net'});
# check for the same netmask and network address
if ( ($n1 == $dn1) && ($n2 ==$dn2) && ($n3 == $dn3) && ($n4 == $dn4) ) {
if ( ($m1 == $dm1) && ($m2 ==$dm2) && ($m3 == $dm3) && ($m4== $dm4) ) {
$foundmatch=1;
last;
}
}
}
if ($::DISPLAY) {
my $rsp;
push @{$rsp->{data}}, "\n#From $host.";
push @{$rsp->{data}}, "$netname:";
push @{$rsp->{data}}, " objtype=network";
push @{$rsp->{data}}, " net=$net";
push @{$rsp->{data}}, " mask=$netmask";
push @{$rsp->{data}}, " mgtifname=$i";
push @{$rsp->{data}}, " gateway=$gateway\n";
if ($foundmatch) {
push @{$rsp->{data}}, "# Note: An equivalent xCAT network definition already exists.\n";
}
xCAT::MsgUtils->message("I", $rsp, $callback);
} else {
if ($foundmatch) {
next;
}
# add new network def
$nettab->setAttribs({'net' => $net, 'mask' => $netmask}, {'netname' => $netname, 'gateway' => $gateway, 'mgtifname' => $i});
}
}
} # end foreach
} #end if ipv4
# check for the same netmask and network address
if ( ($n1 == $dn1) && ($n2 ==$dn2) && ($n3 == $dn3) && ($n4 == $dn4) ) {
if ( ($m1 == $dm1) && ($m2 ==$dm2) && ($m3 == $dm3) && ($m4== $dm4) ) {
$foundmatch=1;
}
}
}
if ($::DISPLAY) {
my $rsp;
push @{$rsp->{data}}, "\n#From $host.";
push @{$rsp->{data}}, "$netname:";
push @{$rsp->{data}}, " objtype=network";
push @{$rsp->{data}}, " net=$net";
push @{$rsp->{data}}, " mask=$netmask";
push @{$rsp->{data}}, " gateway=$gateway\n";
if ($foundmatch) {
push @{$rsp->{data}}, "# Note: An equivalent xCAT network definition already exists.\n";
}
xCAT::MsgUtils->message("I", $rsp, $callback);
} else {
if ($foundmatch) {
next;
}
# add new network def
$nettab->setAttribs({'net' => $net, 'mask' => $netmask}, {'netname' => $netname, 'gateway' => $gateway});
}
}
}
} else {
} else {
# For Linux systems
my @rtable = split /\n/, `/bin/netstat -rn`;