defect 4283: fix the syntax issues in the hosts.pm and NetworkUtils.pm for the code that support multiple domain and makehosts against nics table
This commit is contained in:
		@@ -69,14 +69,14 @@ This program module file, is a set of network utilities used by xCAT commands.
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
sub getNodeDomains()
 | 
			
		||||
{
 | 
			
		||||
    my $class    = shift;
 | 
			
		||||
        my $class    = shift;
 | 
			
		||||
	my $nodes  = shift;
 | 
			
		||||
 | 
			
		||||
	my @nodelist = @$nodes;
 | 
			
		||||
	my %nodedomains;
 | 
			
		||||
 | 
			
		||||
	# Get the network info for each node
 | 
			
		||||
    my %nethash = xCAT::DBobjUtils->getNetwkInfo(\@nodelist);
 | 
			
		||||
        my %nethash = xCAT::DBobjUtils->getNetwkInfo(\@nodelist);
 | 
			
		||||
 | 
			
		||||
	# get the site domain value
 | 
			
		||||
	my @domains = xCAT::TableUtils->get_site_attribute("domain");
 | 
			
		||||
@@ -85,12 +85,13 @@ sub getNodeDomains()
 | 
			
		||||
	# for each node - set hash value to network domain or default 
 | 
			
		||||
	#		to site domain 
 | 
			
		||||
	foreach my $node (@nodelist) {
 | 
			
		||||
		if ($nethash{$node}{domain}) {
 | 
			
		||||
			$nodedomains{$node} = $nethash{$node}{domain};
 | 
			
		||||
		} else {
 | 
			
		||||
			$nodedomains{$node} = $sitedomain;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
            unless (defined($node)) {next;}
 | 
			
		||||
            if (defined($nethash{$node}) && $nethash{$node}{domain}) {
 | 
			
		||||
                $nodedomains{$node} = $nethash{$node}{domain};
 | 
			
		||||
            } else {
 | 
			
		||||
                $nodedomains{$node} = $sitedomain;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	return \%nodedomains;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ sub delnode
 | 
			
		||||
 | 
			
		||||
sub addnode
 | 
			
		||||
{
 | 
			
		||||
	my $callback = shift;
 | 
			
		||||
    my $callback = shift;
 | 
			
		||||
    my $node = shift;
 | 
			
		||||
    my $ip   = shift;
 | 
			
		||||
 | 
			
		||||
@@ -65,11 +65,11 @@ sub addnode
 | 
			
		||||
 | 
			
		||||
    my $othernames = shift;
 | 
			
		||||
    my $domain     = shift;
 | 
			
		||||
	my $nics  	   = shift;
 | 
			
		||||
    my $nics         = shift;
 | 
			
		||||
    my $idx        = 0;
 | 
			
		||||
    my $foundone   = 0;
 | 
			
		||||
 | 
			
		||||
	# if this ip was already added then just update the entry 
 | 
			
		||||
    # if this ip was already added then just update the entry 
 | 
			
		||||
    while ($idx <= $#hosts)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@@ -82,22 +82,22 @@ sub addnode
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
				# we found a matching entry in the hosts list
 | 
			
		||||
				if ($nics) {
 | 
			
		||||
					# we're processing the nics table and we found an
 | 
			
		||||
					#   existing entry for this ip so just add this
 | 
			
		||||
					#	node name as an alias for the existing entry
 | 
			
		||||
					my ($hip, $hnode, $hdom, $hother)= split(/ /, $hosts[$idx]);
 | 
			
		||||
 | 
			
		||||
					# at this point "othernames", if any is just a space
 | 
			
		||||
					#	delimited list - so just add the node name to the list
 | 
			
		||||
					$othernames .= " $node";
 | 
			
		||||
					$hosts[$idx] = build_line($callback, $ip, $hnode, $domain, $othernames);
 | 
			
		||||
				} else {
 | 
			
		||||
					# otherwise just try to completely update the existing
 | 
			
		||||
					#	entry
 | 
			
		||||
                	$hosts[$idx] = build_line($callback, $ip, $node, $domain, $othernames);
 | 
			
		||||
				}
 | 
			
		||||
                # we found a matching entry in the hosts list
 | 
			
		||||
                if ($nics) {
 | 
			
		||||
                    # we're processing the nics table and we found an
 | 
			
		||||
                    #   existing entry for this ip so just add this
 | 
			
		||||
                    # ode name as an alias for the existing entry
 | 
			
		||||
                    my ($hip, $hnode, $hdom, $hother)= split(/ /, $hosts[$idx]);
 | 
			
		||||
                    
 | 
			
		||||
                    # at this point "othernames", if any is just a space
 | 
			
		||||
                    # elimited list - so just add the node name to the list
 | 
			
		||||
                    $othernames .= " $node";
 | 
			
		||||
                    $hosts[$idx] = build_line($callback, $ip, $hnode, $domain, $othernames);
 | 
			
		||||
                } else {
 | 
			
		||||
                    # otherwise just try to completely update the existing
 | 
			
		||||
                    # entry
 | 
			
		||||
                    $hosts[$idx] = build_line($callback, $ip, $node, $domain, $othernames);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            $foundone = 1;
 | 
			
		||||
        }
 | 
			
		||||
@@ -106,14 +106,14 @@ sub addnode
 | 
			
		||||
    if ($foundone) { return; }
 | 
			
		||||
 | 
			
		||||
    my $line = build_line($callback, $ip, $node, $domain, $othernames);
 | 
			
		||||
	if ($line) {
 | 
			
		||||
    	push @hosts, $line;
 | 
			
		||||
	}
 | 
			
		||||
    if ($line) {
 | 
			
		||||
        push @hosts, $line;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub build_line
 | 
			
		||||
{
 | 
			
		||||
	my $callback = shift;
 | 
			
		||||
    my $callback   = shift;
 | 
			
		||||
    my $ip         = shift;
 | 
			
		||||
    my $node       = shift;
 | 
			
		||||
    my $domain     = shift;
 | 
			
		||||
@@ -121,13 +121,13 @@ sub build_line
 | 
			
		||||
    my @o_names    = ();
 | 
			
		||||
    my @n_names    = ();
 | 
			
		||||
 | 
			
		||||
    # Trim spaces from the beginning and end from $othernames
 | 
			
		||||
    $othernames =~ s/^\s+|\s+$//g;
 | 
			
		||||
 | 
			
		||||
    if (defined $othernames)
 | 
			
		||||
    {
 | 
			
		||||
		# the "hostnames" attribute can be a list delimited by 
 | 
			
		||||
		#	either a comma or a space
 | 
			
		||||
        # Trim spaces from the beginning and end from $othernames
 | 
			
		||||
        $othernames =~ s/^\s+|\s+$//g;
 | 
			
		||||
 | 
			
		||||
        # the "hostnames" attribute can be a list delimited by 
 | 
			
		||||
        #  either a comma or a space
 | 
			
		||||
        @o_names = split(/,| /, $othernames);
 | 
			
		||||
    }
 | 
			
		||||
    my $longname;
 | 
			
		||||
@@ -153,26 +153,26 @@ sub build_line
 | 
			
		||||
    }
 | 
			
		||||
    unshift(@o_names, @n_names);
 | 
			
		||||
 | 
			
		||||
	my $shortname=$node;
 | 
			
		||||
    my $shortname=$node;
 | 
			
		||||
 | 
			
		||||
    if ($node =~ m/\.$domain$/i)
 | 
			
		||||
    {
 | 
			
		||||
        $longname = $node;
 | 
			
		||||
		($shortname = $node) =~ s/\.$domain$//;
 | 
			
		||||
        ($shortname = $node) =~ s/\.$domain$//;
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($domain && !$longname)
 | 
			
		||||
    {
 | 
			
		||||
		$shortname = $node;
 | 
			
		||||
        $shortname = $node;
 | 
			
		||||
        $longname = "$node.$domain";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # if shortname contains a dot then we have a bad syntax for name
 | 
			
		||||
	if ($shortname =~ /\./) {
 | 
			
		||||
		my $rsp;
 | 
			
		||||
		push @{$rsp->{data}}, "Invalid short node name \'$shortname\'. The short node name may not contain a dot. The short node name is considered to be anything preceeding the network domain name in the fully qualified node name \'$longname\'.\n";
 | 
			
		||||
		xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
			
		||||
		return undef;
 | 
			
		||||
	}
 | 
			
		||||
    if ($shortname =~ /\./) {
 | 
			
		||||
        my $rsp;
 | 
			
		||||
        push @{$rsp->{data}}, "Invalid short node name \'$shortname\'. The short node name may not contain a dot. The short node name is considered to be anything preceeding the network domain name in the fully qualified node name \'$longname\'.\n";
 | 
			
		||||
        xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
			
		||||
        return undef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $othernames = join(' ', @o_names);
 | 
			
		||||
    if    ($LONGNAME)        { return "$ip $longname $shortname $othernames\n"; }
 | 
			
		||||
@@ -182,7 +182,7 @@ sub build_line
 | 
			
		||||
 | 
			
		||||
sub addotherinterfaces
 | 
			
		||||
{
 | 
			
		||||
	my $callback		= shift;
 | 
			
		||||
    my $callback        = shift;
 | 
			
		||||
    my $node            = shift;
 | 
			
		||||
    my $otherinterfaces = shift;
 | 
			
		||||
    my $domain          = shift;
 | 
			
		||||
@@ -190,12 +190,12 @@ sub addotherinterfaces
 | 
			
		||||
    my @itf_pairs = split(/,/, $otherinterfaces);
 | 
			
		||||
    foreach (@itf_pairs)
 | 
			
		||||
    {
 | 
			
		||||
		my ($itf, $ip); 
 | 
			
		||||
		if ($_  =~ /!/) {
 | 
			
		||||
			($itf, $ip) = split(/!/, $_);
 | 
			
		||||
		} else {
 | 
			
		||||
        	($itf, $ip) = split(/:/, $_);
 | 
			
		||||
		}
 | 
			
		||||
        my ($itf, $ip); 
 | 
			
		||||
        if ($_  =~ /!/) {
 | 
			
		||||
            ($itf, $ip) = split(/!/, $_);
 | 
			
		||||
        } else {
 | 
			
		||||
            ($itf, $ip) = split(/:/, $_);
 | 
			
		||||
        }
 | 
			
		||||
        if ($ip && xCAT::NetworkUtils->isIpaddr($ip))
 | 
			
		||||
        {
 | 
			
		||||
            if ($itf =~ /^-/)
 | 
			
		||||
@@ -216,12 +216,12 @@ sub delotherinterfaces
 | 
			
		||||
    my @itf_pairs = split(/,/, $otherinterfaces);
 | 
			
		||||
    foreach (@itf_pairs)
 | 
			
		||||
    {
 | 
			
		||||
		my ($itf, $ip); 
 | 
			
		||||
		if ($_  =~ /!/) {
 | 
			
		||||
			($itf, $ip) = split(/!/, $_);
 | 
			
		||||
		} else {
 | 
			
		||||
        	($itf, $ip) = split(/:/, $_);
 | 
			
		||||
		}
 | 
			
		||||
        my ($itf, $ip); 
 | 
			
		||||
        if ($_  =~ /!/) {
 | 
			
		||||
            ($itf, $ip) = split(/!/, $_);
 | 
			
		||||
        } else {
 | 
			
		||||
            ($itf, $ip) = split(/:/, $_);
 | 
			
		||||
        }
 | 
			
		||||
        if ($ip && xCAT::NetworkUtils->isIpaddr($ip))
 | 
			
		||||
        {
 | 
			
		||||
            if ($itf =~ /^-/)
 | 
			
		||||
@@ -234,82 +234,80 @@ sub delotherinterfaces
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub add_hosts_content {
 | 
			
		||||
	my %args = @_;
 | 
			
		||||
	my $nodelist = $args{nodelist};
 | 
			
		||||
	my $callback = $args{callback};
 | 
			
		||||
	my $DELNODE = $args{delnode};
 | 
			
		||||
	my $domain = $args{domain};
 | 
			
		||||
    	my $hoststab = xCAT::Table->new('hosts',-create=>0);
 | 
			
		||||
            my $hostscache;
 | 
			
		||||
	    if ($hoststab) {
 | 
			
		||||
             $hostscache =
 | 
			
		||||
              $hoststab->getNodesAttribs($nodelist,
 | 
			
		||||
                                       [qw(ip node hostnames otherinterfaces)]);
 | 
			
		||||
			       }
 | 
			
		||||
            foreach (@{$nodelist})
 | 
			
		||||
    my %args = @_;
 | 
			
		||||
    my $nodelist = $args{nodelist};
 | 
			
		||||
    my $callback = $args{callback};
 | 
			
		||||
    my $DELNODE = $args{delnode};
 | 
			
		||||
    my $domain = $args{domain};
 | 
			
		||||
    my $hoststab = xCAT::Table->new('hosts',-create=>0);
 | 
			
		||||
    my $hostscache;
 | 
			
		||||
    if ($hoststab) {
 | 
			
		||||
         $hostscache = $hoststab->getNodesAttribs($nodelist,
 | 
			
		||||
                                   [qw(ip node hostnames otherinterfaces)]);
 | 
			
		||||
    }
 | 
			
		||||
    foreach (@{$nodelist}) {
 | 
			
		||||
        my $ref = $hostscache->{$_}->[0];
 | 
			
		||||
        my $nodename = $_;
 | 
			
		||||
        my $ip = $ref->{ip};
 | 
			
		||||
        if (not $ip) {
 | 
			
		||||
            $ip = xCAT::NetworkUtils->getipaddr($nodename); #attempt lookup
 | 
			
		||||
        } 
 | 
			
		||||
 | 
			
		||||
        my $netn;
 | 
			
		||||
        ($domain, $netn) = &getIPdomain($ip, $callback);
 | 
			
		||||
        if (!$domain) {
 | 
			
		||||
            if ($::sitedomain) {
 | 
			
		||||
                $domain=$::sitedomain;
 | 
			
		||||
            } elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                $domain=$::XCATSITEVALS{domain};
 | 
			
		||||
            } else {
 | 
			
		||||
                my $rsp;
 | 
			
		||||
                push @{$rsp->{data}}, "No domain can be determined for node \'$nodename\'. The domain of the xCAT node must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
 | 
			
		||||
                xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                next;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($DELNODE)
 | 
			
		||||
        {
 | 
			
		||||
            delnode $nodename, $ip, $ref->{hostnames}, $domain;
 | 
			
		||||
            if (defined($ref->{otherinterfaces}))
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                my $ref = $hostscache->{$_}->[0];
 | 
			
		||||
		my $nodename = $_;
 | 
			
		||||
		my $ip = $ref->{ip};
 | 
			
		||||
		if (not $ip) {
 | 
			
		||||
			$ip = xCAT::NetworkUtils->getipaddr($nodename); #attempt lookup
 | 
			
		||||
		} 
 | 
			
		||||
 | 
			
		||||
				my $netn;
 | 
			
		||||
                ($domain, $netn) = &getIPdomain($ip, $callback);
 | 
			
		||||
                if (!$domain) {
 | 
			
		||||
                    if ($::sitedomain) {
 | 
			
		||||
                        $domain=$::sitedomain;
 | 
			
		||||
                    } elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                        $domain=$::XCATSITEVALS{domain};
 | 
			
		||||
                    } else {
 | 
			
		||||
                        my $rsp;
 | 
			
		||||
                        push @{$rsp->{data}}, "No domain can be determined for node \'$nodename\'. The domain of the xCAT node must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
 | 
			
		||||
                        xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                        next;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if ($DELNODE)
 | 
			
		||||
                {
 | 
			
		||||
                    delnode $nodename, $ip, $ref->{hostnames}, $domain;
 | 
			
		||||
                    if (defined($ref->{otherinterfaces}))
 | 
			
		||||
                    {
 | 
			
		||||
                        delotherinterfaces $nodename, $ref->{otherinterfaces}, $domain;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (xCAT::NetworkUtils->isIpaddr($ip))
 | 
			
		||||
                    {
 | 
			
		||||
                        addnode $callback, $nodename, $ip, $ref->{hostnames}, $domain;
 | 
			
		||||
                    }
 | 
			
		||||
		    else
 | 
			
		||||
		    {
 | 
			
		||||
			    my $rsp;
 | 
			
		||||
                delotherinterfaces $nodename, $ref->{otherinterfaces}, $domain;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (xCAT::NetworkUtils->isIpaddr($ip))
 | 
			
		||||
            {
 | 
			
		||||
                addnode $callback, $nodename, $ip, $ref->{hostnames}, $domain;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                my $rsp;
 | 
			
		||||
                if (!$ip)
 | 
			
		||||
                {
 | 
			
		||||
                    push @{$rsp->{data}}, "Ignoring node \'$nodename\', it can not be resolved.";
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
			        push @{$rsp->{data}}, "Ignoring node \'$nodename\', its ip address \'$ip\' is not valid.";
 | 
			
		||||
                    push @{$rsp->{data}}, "Ignoring node \'$nodename\', its ip address \'$ip\' is not valid.";
 | 
			
		||||
                }
 | 
			
		||||
			    xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
		    }
 | 
			
		||||
                xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (defined($ref->{otherinterfaces}))
 | 
			
		||||
            {
 | 
			
		||||
                addotherinterfaces $callback, $nodename, $ref->{otherinterfaces}, $domain;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }    #end foreach
 | 
			
		||||
    if ($args{hostsref}) {
 | 
			
		||||
        @{$args{hostsref}} = @hosts;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
                    if (defined($ref->{otherinterfaces}))
 | 
			
		||||
                    {
 | 
			
		||||
                        addotherinterfaces $callback, $nodename, $ref->{otherinterfaces}, $domain;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }    #end foreach
 | 
			
		||||
	    if ($args{hostsref}) {
 | 
			
		||||
	    	@{$args{hostsref}} = @hosts;
 | 
			
		||||
	    }
 | 
			
		||||
	  }
 | 
			
		||||
sub process_request
 | 
			
		||||
{
 | 
			
		||||
    Getopt::Long::Configure("bundling");
 | 
			
		||||
@@ -324,7 +322,7 @@ sub process_request
 | 
			
		||||
    my $HELP;
 | 
			
		||||
    my $VERSION;
 | 
			
		||||
    my $REMOVE;
 | 
			
		||||
	my $DELNODE;
 | 
			
		||||
    my $DELNODE;
 | 
			
		||||
 | 
			
		||||
    my $usagemsg =
 | 
			
		||||
    "Usage: makehosts <noderange> [-d] [-n] [-l] [-a] [-o] [-m]\n       makehosts -h\n       makehosts -v";
 | 
			
		||||
@@ -390,14 +388,14 @@ sub process_request
 | 
			
		||||
       return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	# get site domain for backward compatibility
 | 
			
		||||
	my $sitetab = xCAT::Table->new('site');
 | 
			
		||||
	if ($sitetab) {
 | 
			
		||||
		my $dom = $sitetab->getAttribs({key=>'domain'},'value');
 | 
			
		||||
		if ($dom and $dom->{value}) {
 | 
			
		||||
			$::sitedomain=$dom->{value};
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    # get site domain for backward compatibility
 | 
			
		||||
    my $sitetab = xCAT::Table->new('site');
 | 
			
		||||
    if ($sitetab) {
 | 
			
		||||
        my $dom = $sitetab->getAttribs({key=>'domain'},'value');
 | 
			
		||||
        if ($dom and $dom->{value}) {
 | 
			
		||||
            $::sitedomain=$dom->{value};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $hoststab = xCAT::Table->new('hosts');
 | 
			
		||||
    my $domain;
 | 
			
		||||
@@ -431,9 +429,9 @@ sub process_request
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		#  the contents of the /etc/hosts file is saved in the @hosts array
 | 
			
		||||
		#	the @hosts elements are updated and used to re-create the 
 | 
			
		||||
		#	/etc/hosts file at the end by the writeout subroutine.
 | 
			
		||||
        #  the contents of the /etc/hosts file is saved in the @hosts array
 | 
			
		||||
        #    the @hosts elements are updated and used to re-create the 
 | 
			
		||||
        #    /etc/hosts file at the end by the writeout subroutine.
 | 
			
		||||
        open($lockh, ">", "/tmp/xcat/hostsfile.lock");
 | 
			
		||||
        flock($lockh, LOCK_EX);
 | 
			
		||||
        my $rconf;
 | 
			
		||||
@@ -465,21 +463,21 @@ sub process_request
 | 
			
		||||
                }
 | 
			
		||||
                my $linklocal = xCAT::NetworkUtils->linklocaladdr($mac);
 | 
			
		||||
 | 
			
		||||
				my $netn;
 | 
			
		||||
                my $netn;
 | 
			
		||||
                ($domain, $netn) = &getIPdomain($linklocal, $callback);
 | 
			
		||||
 | 
			
		||||
				if (!$domain) {
 | 
			
		||||
					if ($::sitedomain) {
 | 
			
		||||
						$domain=$::sitedomain;
 | 
			
		||||
                    			} elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                        			$domain=$::XCATSITEVALS{domain};
 | 
			
		||||
					} else {
 | 
			
		||||
						my $rsp;
 | 
			
		||||
						push @{$rsp->{data}}, "No domain can be determined for node \'$node\'.  The domain of the xCAT node must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
                    	xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                    	next;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
                if (!$domain) {
 | 
			
		||||
                    if ($::sitedomain) {
 | 
			
		||||
                        $domain=$::sitedomain;
 | 
			
		||||
                    } elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                        $domain=$::XCATSITEVALS{domain};
 | 
			
		||||
                    } else {
 | 
			
		||||
                        my $rsp;
 | 
			
		||||
                        push @{$rsp->{data}}, "No domain can be determined for node \'$node\'.  The domain of the xCAT node must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
                        xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                        next;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if ($DELNODE)
 | 
			
		||||
                {
 | 
			
		||||
@@ -493,7 +491,7 @@ sub process_request
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
		add_hosts_content(nodelist=>$req->{node},callback=>$callback,delnode=>$DELNODE,domain=>$domain);
 | 
			
		||||
            add_hosts_content(nodelist=>$req->{node},callback=>$callback,delnode=>$DELNODE,domain=>$domain);
 | 
			
		||||
        }    # end else
 | 
			
		||||
 | 
			
		||||
        # do the other node nics - if any
 | 
			
		||||
@@ -515,14 +513,14 @@ sub process_request
 | 
			
		||||
 | 
			
		||||
            push @allnodes, $_->{node};
 | 
			
		||||
 | 
			
		||||
			my $netn;
 | 
			
		||||
           ($domain, $netn) = &getIPdomain($_->{ip});
 | 
			
		||||
			if (!$domain) {
 | 
			
		||||
            my $netn;
 | 
			
		||||
            ($domain, $netn) = &getIPdomain($_->{ip});
 | 
			
		||||
            if (!$domain) {
 | 
			
		||||
                $domain=$::sitedomain;
 | 
			
		||||
            }
 | 
			
		||||
			if (!$domain) {
 | 
			
		||||
            if (!$domain) {
 | 
			
		||||
                $domain=$::XCATSITEVALS{domain};
 | 
			
		||||
	    }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (xCAT::NetworkUtils->isIpaddr($_->{ip}))
 | 
			
		||||
            {
 | 
			
		||||
@@ -569,13 +567,13 @@ sub writeout
 | 
			
		||||
=head3    donics
 | 
			
		||||
 | 
			
		||||
           Add the additional network interfaces for a list of nodes as 
 | 
			
		||||
				indicated in the nics table
 | 
			
		||||
           indicated in the nics table
 | 
			
		||||
 | 
			
		||||
        Arguments:
 | 
			
		||||
               node name
 | 
			
		||||
           node name
 | 
			
		||||
        Returns:
 | 
			
		||||
			0 - ok
 | 
			
		||||
			1 - error
 | 
			
		||||
            0 - ok
 | 
			
		||||
            1 - error
 | 
			
		||||
 | 
			
		||||
        Globals:
 | 
			
		||||
 | 
			
		||||
@@ -601,8 +599,8 @@ sub donics
 | 
			
		||||
 | 
			
		||||
    foreach my $node (@nodelist)
 | 
			
		||||
    {
 | 
			
		||||
		my $nich;
 | 
			
		||||
		my %nicindex;
 | 
			
		||||
        my $nich;
 | 
			
		||||
        my %nicindex;
 | 
			
		||||
 | 
			
		||||
        # get the nic info
 | 
			
		||||
        my $et =
 | 
			
		||||
@@ -615,64 +613,64 @@ sub donics
 | 
			
		||||
                                   ]
 | 
			
		||||
                                   );
 | 
			
		||||
 | 
			
		||||
		# only require IP for nic
 | 
			
		||||
        # only require IP for nic
 | 
			
		||||
        if ( !($et->{nicips}) ) {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		# gather nics info
 | 
			
		||||
		# delimiter could be ":" or "!"  
 | 
			
		||||
		# new  $et->{nicips} looks like 
 | 
			
		||||
		#		"eth0!11.10.1.1,eth1!60.0.0.5|60.0.0.250..."
 | 
			
		||||
        # gather nics info
 | 
			
		||||
        # delimiter could be ":" or "!"  
 | 
			
		||||
        # new  $et->{nicips} looks like 
 | 
			
		||||
        # "eth0!11.10.1.1,eth1!60.0.0.5|60.0.0.250..."
 | 
			
		||||
        my @nicandiplist = split(',', $et->{'nicips'});
 | 
			
		||||
 | 
			
		||||
        foreach (@nicandiplist)
 | 
			
		||||
        {
 | 
			
		||||
			my ($nicname, $nicip);
 | 
			
		||||
            my ($nicname, $nicip);
 | 
			
		||||
 | 
			
		||||
			# if it contains a "!" then split on "!"
 | 
			
		||||
			if ($_  =~ /!/) {
 | 
			
		||||
				($nicname, $nicip) = split('!', $_);
 | 
			
		||||
			} else {
 | 
			
		||||
            	($nicname, $nicip) = split(':', $_);
 | 
			
		||||
			}
 | 
			
		||||
            # if it contains a "!" then split on "!"
 | 
			
		||||
            if ($_  =~ /!/) {
 | 
			
		||||
                ($nicname, $nicip) = split('!', $_);
 | 
			
		||||
            } else {
 | 
			
		||||
                ($nicname, $nicip) = split(':', $_);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			$nicindex{$nicname}=0;
 | 
			
		||||
            $nicindex{$nicname}=0;
 | 
			
		||||
 | 
			
		||||
			if (!$nicip) {
 | 
			
		||||
				next;
 | 
			
		||||
			}
 | 
			
		||||
            if (!$nicip) {
 | 
			
		||||
                next;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			if ( $nicip =~ /\|/) {
 | 
			
		||||
				my @ips = split( /\|/, $nicip);
 | 
			
		||||
				foreach my $ip (@ips) {
 | 
			
		||||
					$nich->{$nicname}->{nicip}->[$nicindex{$nicname}] = $ip;
 | 
			
		||||
					$nicindex{$nicname}++;
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				$nich->{$nicname}->{nicip}->[$nicindex{$nicname}] = $nicip;
 | 
			
		||||
				$nicindex{$nicname}++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
            if ( $nicip =~ /\|/) {
 | 
			
		||||
                my @ips = split( /\|/, $nicip);
 | 
			
		||||
                foreach my $ip (@ips) {
 | 
			
		||||
                    $nich->{$nicname}->{nicip}->[$nicindex{$nicname}] = $ip;
 | 
			
		||||
                    $nicindex{$nicname}++;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $nich->{$nicname}->{nicip}->[$nicindex{$nicname}] = $nicip;
 | 
			
		||||
                $nicindex{$nicname}++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my @nicandsufx = split(',', $et->{'nichostnamesuffixes'});
 | 
			
		||||
        my @nicandprfx = split(',', $et->{'nichostnameprefixes'});
 | 
			
		||||
 | 
			
		||||
        foreach (@nicandsufx)
 | 
			
		||||
        {
 | 
			
		||||
			my ($nicname, $nicsufx);
 | 
			
		||||
			if ($_  =~ /!/) {
 | 
			
		||||
				($nicname, $nicsufx) = split('!', $_);
 | 
			
		||||
			} else {
 | 
			
		||||
            	($nicname, $nicsufx) = split(':', $_);
 | 
			
		||||
			}
 | 
			
		||||
            my ($nicname, $nicsufx);
 | 
			
		||||
            if ($_  =~ /!/) {
 | 
			
		||||
                ($nicname, $nicsufx) = split('!', $_);
 | 
			
		||||
            } else {
 | 
			
		||||
                ($nicname, $nicsufx) = split(':', $_);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ( $nicsufx =~ /\|/) {
 | 
			
		||||
                my @sufs = split( /\|/, $nicsufx);
 | 
			
		||||
				my $index=0;
 | 
			
		||||
                my $index=0;
 | 
			
		||||
                foreach my $suf (@sufs) {
 | 
			
		||||
                    $nich->{$nicname}->{nicsufx}->[$index] = $suf;
 | 
			
		||||
					$index++;
 | 
			
		||||
                    $index++;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $nich->{$nicname}->{nicsufx}->[0] = $nicsufx;
 | 
			
		||||
@@ -680,46 +678,49 @@ sub donics
 | 
			
		||||
        }
 | 
			
		||||
        foreach (@nicandprfx)
 | 
			
		||||
        {
 | 
			
		||||
			my ($nicname, $nicprfx);
 | 
			
		||||
			if ($_  =~ /!/) {
 | 
			
		||||
				($nicname, $nicprfx) = split('!', $_);
 | 
			
		||||
			} else {
 | 
			
		||||
            	($nicname, $nicprfx) = split(':', $_);
 | 
			
		||||
			}
 | 
			
		||||
            my ($nicname, $nicprfx);
 | 
			
		||||
            if ($_  =~ /!/) {
 | 
			
		||||
                ($nicname, $nicprfx) = split('!', $_);
 | 
			
		||||
            } else {
 | 
			
		||||
                ($nicname, $nicprfx) = split(':', $_);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ( $nicprfx =~ /\|/) {
 | 
			
		||||
            if ( defined($nicprfx) && $nicprfx =~ /\|/) {
 | 
			
		||||
                my @prfs = split( /\|/, $nicprfx);
 | 
			
		||||
				my $index=0;
 | 
			
		||||
                my $index=0;
 | 
			
		||||
                foreach my $prf (@prfs) {
 | 
			
		||||
                    $nich->{$nicname}->{nicprfx}->[$index] = $prf;
 | 
			
		||||
					$index++;
 | 
			
		||||
                    $index++;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $nich->{$nicname}->{nicprfx}->[0] = $nicprfx;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		# see if we need to fill in a default suffix
 | 
			
		||||
		# nich has all the valid nics - ie. that have IPs provided!
 | 
			
		||||
		foreach my $nic (keys %{$nich}) {
 | 
			
		||||
			for (my $i = 0; $i < $nicindex{$nic}; $i++ ){
 | 
			
		||||
				if (!$nich->{$nic}->{nicsufx}->[$i] && !$nich->{$nic}->{nicprfx}->[$i]) {
 | 
			
		||||
					# then we have no suffix at all for this 
 | 
			
		||||
					# so set a default
 | 
			
		||||
					$nich->{$nic}->{nicsufx}->[$i] = "-$nic";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
        # see if we need to fill in a default suffix
 | 
			
		||||
        # nich has all the valid nics - ie. that have IPs provided!
 | 
			
		||||
        foreach my $nic (keys %{$nich}) {
 | 
			
		||||
            unless (defined ($nicindex{$nic})) {
 | 
			
		||||
                $nicindex{$nic} = 0;
 | 
			
		||||
            }
 | 
			
		||||
            for (my $i = 0; $i < $nicindex{$nic}; $i++ ){
 | 
			
		||||
                if (!$nich->{$nic}->{nicsufx}->[$i] && !$nich->{$nic}->{nicprfx}->[$i]) {
 | 
			
		||||
                    # then we have no suffix at all for this 
 | 
			
		||||
                    # so set a default
 | 
			
		||||
                    $nich->{$nic}->{nicsufx}->[$i] = "-$nic";
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my @nicandnetwrk = split(',', $et->{'nicnetworks'});
 | 
			
		||||
        foreach (@nicandnetwrk)
 | 
			
		||||
        {
 | 
			
		||||
			my ($nicname, $netwrk);
 | 
			
		||||
			if ($_  =~ /!/) {
 | 
			
		||||
				($nicname, $netwrk) = split('!', $_);
 | 
			
		||||
			} else {
 | 
			
		||||
            	($nicname, $netwrk) = split(':', $_);
 | 
			
		||||
			}
 | 
			
		||||
            my ($nicname, $netwrk);
 | 
			
		||||
            if ($_  =~ /!/) {
 | 
			
		||||
                ($nicname, $netwrk) = split('!', $_);
 | 
			
		||||
            } else {
 | 
			
		||||
                ($nicname, $netwrk) = split(':', $_);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!$netwrk) {
 | 
			
		||||
                next;
 | 
			
		||||
@@ -737,7 +738,10 @@ sub donics
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		my @nicandnicalias = split(',', $et->{'nicaliases'});
 | 
			
		||||
        my @nicandnicalias;
 | 
			
		||||
        if (defined($et->{'nicaliases'})) {
 | 
			
		||||
            @nicandnicalias = split(',', $et->{'nicaliases'});
 | 
			
		||||
        }
 | 
			
		||||
        foreach (@nicandnicalias)
 | 
			
		||||
        {
 | 
			
		||||
            my ($nicname, $aliases);
 | 
			
		||||
@@ -762,78 +766,82 @@ sub donics
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		# end gather nics info
 | 
			
		||||
        # end gather nics info
 | 
			
		||||
 | 
			
		||||
		# add or delete nic entries in the hosts file
 | 
			
		||||
		foreach my $nic (keys %{$nich}) {
 | 
			
		||||
        # add or delete nic entries in the hosts file
 | 
			
		||||
        foreach my $nic (keys %{$nich}) {
 | 
			
		||||
            # make sure we have the short hostname
 | 
			
		||||
            my $shorthost;
 | 
			
		||||
            ($shorthost = $node) =~ s/\..*$//;
 | 
			
		||||
            for (my $i = 0; $i < $nicindex{$nic}; $i++ ){
 | 
			
		||||
                my $nicip = "";
 | 
			
		||||
                my $nicsuffix = "";
 | 
			
		||||
                my $nicprefix = "";
 | 
			
		||||
                my $nicnetworks = "";
 | 
			
		||||
                my $nicaliases = "";
 | 
			
		||||
                
 | 
			
		||||
                $nicip = $nich->{$nic}->{nicip}->[$i] if (defined ($nich->{$nic}->{nicip}->[$i]));
 | 
			
		||||
                $nicsuffix = $nich->{$nic}->{nicsufx}->[$i] if (defined($nich->{$nic}->{nicsufx}->[$i]));
 | 
			
		||||
                $nicprefix = $nich->{$nic}->{nicprfx}->[$i] if (defined($nich->{$nic}->{nicprfx}->[$i]));
 | 
			
		||||
                $nicnetworks = $nich->{$nic}->{netwrk}->[$i] if (defined($nich->{$nic}->{netwrk}->[$i]));
 | 
			
		||||
                $nicaliases = $nich->{$nic}->{nicaliases}->[$i] if (defined($nich->{$nic}->{nicaliases}->[$i]));
 | 
			
		||||
 | 
			
		||||
			for (my $i = 0; $i < $nicindex{$nic}; $i++ ){
 | 
			
		||||
                if (!$nicip) {
 | 
			
		||||
                    next;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
				my $nicip = $nich->{$nic}->{nicip}->[$i];
 | 
			
		||||
				my $nicsuffix = $nich->{$nic}->{nicsufx}->[$i];
 | 
			
		||||
				my $nicprefix = $nich->{$nic}->{nicprfx}->[$i];
 | 
			
		||||
				my $nicnetworks = $nich->{$nic}->{netwrk}->[$i];
 | 
			
		||||
				my $nicaliases = $nich->{$nic}->{nicaliases}->[$i];
 | 
			
		||||
                # construct hostname for nic
 | 
			
		||||
                my $nichostname = "$nicprefix$shorthost$nicsuffix";
 | 
			
		||||
 | 
			
		||||
				if (!$nicip) {
 | 
			
		||||
					next;
 | 
			
		||||
				}
 | 
			
		||||
                # get domain from network def provided by nic attr
 | 
			
		||||
                my $nt = $nettab->getAttribs({ netname => "$nicnetworks"}, 'domain');
 | 
			
		||||
                # look up the domain as a check or if it's not provided
 | 
			
		||||
                my ($ndomain, $netn) = &getIPdomain($nicip, $callback);
 | 
			
		||||
 | 
			
		||||
            	# construct hostname for nic
 | 
			
		||||
            	my $nichostname = "$nicprefix$shorthost$nicsuffix";
 | 
			
		||||
 | 
			
		||||
            	# get domain from network def provided by nic attr
 | 
			
		||||
				my $nt = $nettab->getAttribs({ netname => "$nicnetworks"}, 'domain');
 | 
			
		||||
				# look up the domain as a check or if it's not provided
 | 
			
		||||
				my ($ndomain, $netn) = &getIPdomain($nicip, $callback);
 | 
			
		||||
 | 
			
		||||
				if ( $nt->{domain} && $ndomain ) {
 | 
			
		||||
					# if they don't match we may have a problem.
 | 
			
		||||
					if($nicnetworks ne $netn) {	
 | 
			
		||||
						my $rsp;
 | 
			
		||||
						push @{$rsp->{data}}, "The xCAT network name listed for
 | 
			
		||||
                if ( $nt->{domain} && $ndomain ) {
 | 
			
		||||
                    # if they don't match we may have a problem.
 | 
			
		||||
                    if($nicnetworks ne $netn) {    
 | 
			
		||||
                        my $rsp;
 | 
			
		||||
                        push @{$rsp->{data}}, "The xCAT network name listed for
 | 
			
		||||
\'$nichostname\' is \'$nicnetworks\' however the nic IP address \'$nicip\' seems to be in the \'$netn\' network.\nIf there is an error then makes corrections to the database definitions and re-run this command.\n";
 | 
			
		||||
						xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
                        xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
				# choose a domain
 | 
			
		||||
				my $nicdomain;
 | 
			
		||||
				if ( $ndomain ) {
 | 
			
		||||
					# use the one based on the ip address 
 | 
			
		||||
					$nicdomain=$ndomain;
 | 
			
		||||
				} elsif ( $nt->{domain} ) {
 | 
			
		||||
					# then try the one provided in the nics entry 
 | 
			
		||||
					$nicdomain=$nt->{domain};
 | 
			
		||||
				} elsif ( $::sitedomain)  {
 | 
			
		||||
					# try the site domain for backward compatibility
 | 
			
		||||
					$nicdomain=$::sitedomain;
 | 
			
		||||
                		} elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                        		$nicdomain=$::XCATSITEVALS{domain};
 | 
			
		||||
				} else {
 | 
			
		||||
					my $rsp;
 | 
			
		||||
					push @{$rsp->{data}}, "No domain can be determined for the NIC IP value of \'$nicip\'. The network domains must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
					xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
					next;
 | 
			
		||||
				}
 | 
			
		||||
                # choose a domain
 | 
			
		||||
                my $nicdomain;
 | 
			
		||||
                if ( $ndomain ) {
 | 
			
		||||
                    # use the one based on the ip address 
 | 
			
		||||
                    $nicdomain=$ndomain;
 | 
			
		||||
                } elsif ( $nt->{domain} ) {
 | 
			
		||||
                    # then try the one provided in the nics entry 
 | 
			
		||||
                    $nicdomain=$nt->{domain};
 | 
			
		||||
                } elsif ( $::sitedomain)  {
 | 
			
		||||
                    # try the site domain for backward compatibility
 | 
			
		||||
                    $nicdomain=$::sitedomain;
 | 
			
		||||
                } elsif ($::XCATSITEVALS{domain}) {
 | 
			
		||||
                    $nicdomain=$::XCATSITEVALS{domain};
 | 
			
		||||
                } else {
 | 
			
		||||
                    my $rsp;
 | 
			
		||||
                    push @{$rsp->{data}}, "No domain can be determined for the NIC IP value of \'$nicip\'. The network domains must be provided in an xCAT network definition or the xCAT site definition.\n";
 | 
			
		||||
                    xCAT::MsgUtils->message("W", $rsp, $callback);
 | 
			
		||||
                    next;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            	if ($delnode)
 | 
			
		||||
            	{
 | 
			
		||||
                	delnode $nichostname, $nicip, '', $nicdomain;
 | 
			
		||||
            	}
 | 
			
		||||
            	else
 | 
			
		||||
            	{
 | 
			
		||||
                	addnode $callback, $nichostname, $nicip, $nicaliases, $nicdomain, 1;
 | 
			
		||||
				}
 | 
			
		||||
                if ($delnode)
 | 
			
		||||
                {
 | 
			
		||||
                    delnode $nichostname, $nicip, '', $nicdomain;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    addnode $callback, $nichostname, $nicip, $nicaliases, $nicdomain, 1;
 | 
			
		||||
                }
 | 
			
		||||
            } # end for each index
 | 
			
		||||
        }    # end for each nic
 | 
			
		||||
    }    # end for each node
 | 
			
		||||
 | 
			
		||||
    if ($args{hostsref}) {
 | 
			
		||||
    	@{$args{hostsref}} = @hosts;
 | 
			
		||||
        @{$args{hostsref}} = @hosts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $nettab->close;
 | 
			
		||||
@@ -846,12 +854,12 @@ sub donics
 | 
			
		||||
 | 
			
		||||
=head3    getIPdomain
 | 
			
		||||
 | 
			
		||||
			Find the xCAT network definition match the IP and then return the
 | 
			
		||||
				domain value from that network def.
 | 
			
		||||
        Find the xCAT network definition match the IP and then return the
 | 
			
		||||
        domain value from that network def.
 | 
			
		||||
 | 
			
		||||
        Arguments:
 | 
			
		||||
               node IP
 | 
			
		||||
				callback
 | 
			
		||||
           node IP
 | 
			
		||||
           callback
 | 
			
		||||
        Returns:
 | 
			
		||||
            domain and netname - ok
 | 
			
		||||
            undef - error
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user