From ebf7ea4be446fa84690ef6ee1c93dba372fa1350 Mon Sep 17 00:00:00 2001 From: jjhua Date: Tue, 18 Jun 2013 07:41:10 +0000 Subject: [PATCH] fixed bug 3605, improve the code according to Bruce's suggestion, except xCAT_monitoring::monitorctrl->getNodeConfData() git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@16655 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/perl/xCAT/Postage.pm | 235 +++++++++++--------------- xCAT-server/lib/perl/xCAT/SvrUtils.pm | 13 +- 2 files changed, 109 insertions(+), 139 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/Postage.pm b/xCAT-server/lib/perl/xCAT/Postage.pm index 99342dc20..e7caebec6 100644 --- a/xCAT-server/lib/perl/xCAT/Postage.pm +++ b/xCAT-server/lib/perl/xCAT/Postage.pm @@ -272,14 +272,28 @@ sub makescript { # get the net', 'mask', 'gateway' from networks table my $nets = getNetworks(); + # get attributes(routename,net,mask,gateway,ifname) from the routes table + # The values will be used in the "foreach my $n (@$nodes ) { .." loop + my $routes = getRoutes(); + + + #check it the vlan plugin exists or not + #the default doesn't exist. + my $vlan_exists = 0; + my $module_name="xCAT_plugin::vlan"; + eval("use $module_name;"); + if (!$@) { + $vlan_exists = 1; + } + # For AIX, get the password and cryptmethod for system root my $aixrootpasswdvars = getAIXPasswdVars(); - #%image_hash is used to store the attributes in linuximage and osimage tabs + #%image_hash is used to store the attributes in linuximage and nimimage tabs my %image_hash; - getLinuximage(\%image_hash); + getImage(\%image_hash); - # get postscript and postscript + # get postscript and postscript from postscripts and osimage tabs my $script_hash = xCAT::Postage::getScripts($nodes, \%image_hash); my $tftpdir = xCAT::TableUtils::getTftpDir(); @@ -306,6 +320,12 @@ sub makescript { } } + #Some of the strings are same to all the nodes. + #So move the string substitutions outside the loop + $t_inc =~ s/#SITE_TABLE_ALL_ATTRIBS_EXPORT#/$allattribsfromsitetable/eg; + $t_inc =~ s/#AIX_ROOT_PW_VARS_EXPORT#/$aixrootpasswdvars/eg; + $t_inc =~ s/tabdump\(([\w]+)\)/tabdump($1)/eg; + foreach my $n (@$nodes ) { $node = $n; $inc = $t_inc; @@ -334,21 +354,19 @@ sub makescript { { my $rn=$noderesent->{'routenames'}; my @rn_a=split(',', $rn); - my $routestab = xCAT::Table->new('routes'); - if ((@rn_a > 0) && ($routestab)) { + if ((@rn_a > 0) && defined($routes) ) { $route_vars .= "NODEROUTENAMES=$rn\n"; $route_vars .= "export NODEROUTENAMES\n"; foreach my $route_name (@rn_a) { - my $routesent = $routestab->getAttribs({routename => $route_name}, 'net', 'mask', 'gateway', 'ifname'); - if ($routesent and defined($routesent->{net}) and defined($routesent->{mask})) { - my $val="ROUTE_$route_name=" . $routesent->{net} . "," . $routesent->{mask}; + if ($routes and defined($routes->{net}) and defined($routes->{mask})) { + my $val="ROUTE_$route_name=" . $routes->{net} . "," . $routes->{mask}; $val .= ","; - if (defined($routesent->{gateway})) { - $val .= $routesent->{gateway}; + if (defined($routes->{gateway})) { + $val .= $routes->{gateway}; } $val .= ","; - if (defined($routesent->{ifname})) { - $val .= $routesent->{ifname}; + if (defined($routes->{ifname})) { + $val .= $routes->{ifname}; } $route_vars .= "$val\n"; $route_vars .= "export ROUTE_$route_name\n"; @@ -362,7 +380,7 @@ sub makescript { ### vlan related item # for #VLAN_VARS_EXPORT# my $vlan_vars; - $vlan_vars = getVlanItems($node); + $vlan_vars = getVlanItems($node, $module_name, $vlan_exists); ## get monitoring server and other configuration data for monitoring setup on nodes # for #MONITORING_VARS_EXPORT# @@ -396,7 +414,7 @@ sub makescript { # my $diskless_net_vars; my $setbootfromnet = 0; - $diskless_net_vars = getDisklessNet($nets, \$setbootfromnet, $image_hash{$osimgname}{provmethod}); + $diskless_net_vars = getDisklessNet($nets, \$setbootfromnet, $osimgname, \%image_hash); ## postscripts # for #INCLUDE_POSTSCRIPTS_LIST# @@ -419,12 +437,10 @@ sub makescript { #$inc =~ s/#ENV:([^#]+)#/envvar($1)/eg; #$inc =~ s/#NODE#/$node/eg; $inc =~ s/\$NODE/$node/eg; - $inc =~ s/#SITE_TABLE_ALL_ATTRIBS_EXPORT#/$allattribsfromsitetable/eg; #$inc =~ s/#TABLE:([^:]+):([^:]+):([^:]+):BLANKOKAY#/tabdb($1,$2,$3,1)/eg; $inc =~ s/#TABLE:([^:]+):([^:]+):([^#]+)#/xCAT::Template::tabdb($1,$2,$3)/eg; $inc =~ s/#ROUTES_VARS_EXPORT#/$route_vars/eg; $inc =~ s/#VLAN_VARS_EXPORT#/$vlan_vars/eg; - $inc =~ s/#AIX_ROOT_PW_VARS_EXPORT#/$aixrootpasswdvars/eg; $inc =~ s/#MONITORING_VARS_EXPORT#/$mon_vars/eg; $inc =~ s/#OSIMAGE_VARS_EXPORT#/$osimage_vars/eg; $inc =~ s/#NETWORK_FOR_DISKLESS_EXPORT#/$diskless_net_vars/eg; @@ -433,7 +449,6 @@ sub makescript { #$inc =~ s/#COMMAND:([^#]+)#/command($1)/eg; $inc =~ s/\$NTYPE/$nodetype/eg; - $inc =~ s/tabdump\(([\w]+)\)/tabdump($1)/eg; $inc =~ s/#Subroutine:([^:]+)::([^:]+)::([^:]+):([^#]+)#/runsubroutine($1,$2,$3,$4)/eg; # we will create a file in /tftboot/mypostscript/mypostscript_ @@ -455,7 +470,9 @@ sub makescript { return 1; } $script_fp{$node}=$script; - `/bin/chmod ugo+x $scriptfile`; + #use the chmod perl function instead of forking the cmd + #`/bin/chmod ugo+x $scriptfile`; + chmod 0755, $scriptfile; print $script $inc; close($script_fp{$node}); # TODO remove the blank lines @@ -588,92 +605,6 @@ sub getNodeType return $result; } - -sub getVlanItems_t -{ - - my $node = shift; - my $result; - - #get vlan related items - my $vlan; - my $swtab = xCAT::Table->new("switch", -create => 0); - if ($swtab) { - my $tmp = $swtab->getNodeAttribs($node, ['vlan'],prefetchcache=>1); - if (defined($tmp) && ($tmp) && $tmp->{vlan}) - { - $vlan = $tmp->{vlan}; - $result .= "VLANID='" . $vlan . "'\n"; - $result .= "export VLANID\n"; - } else { - my $vmtab = xCAT::Table->new("vm", -create => 0); - if ($vmtab) { - my $tmp1 = $vmtab->getNodeAttribs($node, ['nics'],prefetchcache=>1); - if (defined($tmp1) && ($tmp1) && $tmp1->{nics}) - { - $result .= "VMNODE='YES'\n"; - $result .= "export VMNODE\n"; - - my @nics=split(',', $tmp1->{nics}); - foreach my $nic (@nics) { - if ($nic =~ /^vl([\d]+)$/) { - $vlan = $1; - $result .= "VLANID='" . $vlan . "'\n"; - $result .= "export VLANID\n"; - last; - } - } - } - } - } - - if ($vlan) { - my $nwtab=xCAT::Table->new("networks", -create =>0); - if ($nwtab) { - my $sent = $nwtab->getAttribs({vlanid=>"$vlan"},'net','mask'); - my $subnet; - my $netmask; - if ($sent and ($sent->{net})) { - $subnet=$sent->{net}; - $netmask=$sent->{mask}; - } - if (($subnet) && ($netmask)) { - my $hoststab = xCAT::Table->new("hosts", -create => 0); - if ($hoststab) { - my $tmp = $hoststab->getNodeAttribs($node, ['otherinterfaces'],prefetchcache=>1); - if (defined($tmp) && ($tmp) && $tmp->{otherinterfaces}) - { - my $otherinterfaces = $tmp->{otherinterfaces}; - my @itf_pairs=split(/,/, $otherinterfaces); - foreach (@itf_pairs) { - my ($name,$ip)=split(/:/, $_); - if(xCAT::NetworkUtils->ishostinsubnet($ip, $netmask, $subnet)) { - if ($name =~ /^-/ ) { - $name = $node.$name; - } - $result .= "VLANHOSTNAME='" . $name . "'\n"; - $result .= "export VLANHOSTNAME\n"; - $result .= "VLANIP='" . $ip . "'\n"; - $result .= "export VLANIP\n"; - $result .= "VLANSUBNET='" . $subnet . "'\n"; - $result .= "export VLANSUBNET\n"; - $result .= "VLANNETMASK='" . $netmask . "'\n"; - $result .= "export VLANNETMASK\n"; - last; - } - } - } - } - } - } - } - } - - - - return $result; -} - sub getAIXPasswdVars { my $result; @@ -699,13 +630,13 @@ sub getAIXPasswdVars sub getVlanItems { - my $node = shift; + my $node = shift; + my $module_name = shift; + my $vlan_exists = shift; my $result; #get vlan related items - my $module_name="xCAT_plugin::vlan"; - eval("use $module_name;"); - if (!$@) { + if ( $vlan_exists ) { no strict "refs"; if (defined(${$module_name."::"}{getNodeVlanConfData})) { my @tmp_scriptd=${$module_name."::"}{getNodeVlanConfData}->($node); @@ -716,7 +647,6 @@ sub getVlanItems } } - return $result; } @@ -740,23 +670,41 @@ sub getMonItems return $result; } -sub getLinuximage +sub getImage { my $image_hash = shift; - my $linuximagetab = xCAT::Table->new('linuximage', -create => 1); - my @et2 = $linuximagetab->getAllAttribs('imagename', 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir' ); - if( @et2 ) { - foreach my $tmp_et2 (@et2) { - my $imagename= $tmp_et2->{imagename}; - $image_hash->{$imagename}->{pkglist}= $tmp_et2->{pkglist}; - $image_hash->{$imagename}->{pkgdir} = $tmp_et2->{pkgdir}; - $image_hash->{$imagename}->{otherpkglist} = $tmp_et2->{otherpkglist}; - $image_hash->{$imagename}->{otherpkgdir} = $tmp_et2->{otherpkgdir}; - } + #For linux, get the attributes for imagename + if ($^O =~ /^linux/i) { + my $linuximagetab = xCAT::Table->new('linuximage', -create => 1); + + my @et2 = $linuximagetab->getAllAttribs('imagename', 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir' ); + if( @et2 ) { + foreach my $tmp_et2 (@et2) { + my $imagename= $tmp_et2->{imagename}; + $image_hash->{$imagename}->{pkglist}= $tmp_et2->{pkglist}; + $image_hash->{$imagename}->{pkgdir} = $tmp_et2->{pkgdir}; + $image_hash->{$imagename}->{otherpkglist} = $tmp_et2->{otherpkglist}; + $image_hash->{$imagename}->{otherpkgdir} = $tmp_et2->{otherpkgdir}; + } + } } + #For AIX, get the nimtype value for each imagename + if ($^O =~ /^aix/i) { + my $nimtype; + my $nimimagetab = xCAT::Table->new('nimimage', -create => 1); + if ($nimimagetab) + { + my @et1 = $nimimagetab->getAllAttribs('imagename', 'nimtype'); + foreach my $tmp_et1 (@et1) { + my $imagename= $tmp_et1->{imagename}; + $image_hash->{$imagename}->{nimtype}= $tmp_et1->{nimtype}; + } + } + + } } @@ -972,13 +920,41 @@ sub getNetworks return \@nets; } +# get attributes(routename,net,mask,gateway,ifname) from the routes table +sub getRoutes +{ + my %routes = (); + my $routestab = xCAT::Table->new('routes'); + unless ($routestab) { + xCAT::MsgUtils->message("E", "Unable to open routes table"); + return undef + } + my @rts = $routestab->getAllAttribs('routename','net', 'mask', 'gateway', 'ifname'); + + foreach my $r ( @rts ) { + my $rtname = $r->{'routename'}; + $routes{ $rtname }{'net'} = $r->{'net'}; + $routes{ $rtname }{'mask'} = $r->{'mask'}; + $routes{ $rtname }{'gateway'} = $r->{'gateway'}; + $routes{ $rtname }{'ifname'} = $r->{'ifname'}; + } + + return \%routes; +} + + sub getDisklessNet() { my $nets = shift; my $setbootfromnet = shift; - my $provmethod = shift; - + my $osimgname = shift; + my $imagehash = shift; + my $provmethod; + if( defined($osimgname) && defined($imagehash) && defined($imagehash->{$osimgname}) ) { + $provmethod = $imagehash->{$osimgname}->{provmethod}; + } + my $result; my $isdiskless = 0; my $bootfromnet = 0; @@ -1001,17 +977,10 @@ sub getDisklessNet() && ($provmethod ne "statelite")) { my $nimtype; - my $nimimagetab = xCAT::Table->new('nimimage', -create => 1); - if ($nimimagetab) - { - (my $ref) = - $nimimagetab->getAttribs({imagename => $provmethod}, - 'nimtype'); - if ($ref) - { - $nimtype = $ref->{'nimtype'}; - } + if( defined($osimgname) && defined($imagehash) && defined($imagehash->{$osimgname})) { + $nimtype = $imagehash->{$osimgname}->{nimtype}; } + if ($nimtype eq 'diskless') { $isdiskless = 1; @@ -1343,7 +1312,7 @@ sub includefile sub getnodesetstate { my $node = shift; - return xCAT::SvrUtils->get_nodeset_state($node,prefetchcache=>1); + return xCAT::SvrUtils->get_nodeset_state($node,prefetchcache=>1, "global_tab_hash"=>\%::GLOBAL_TAB_HASH); } sub net_parms diff --git a/xCAT-server/lib/perl/xCAT/SvrUtils.pm b/xCAT-server/lib/perl/xCAT/SvrUtils.pm index 2a03bd02f..d25cc5dbc 100644 --- a/xCAT-server/lib/perl/xCAT/SvrUtils.pm +++ b/xCAT-server/lib/perl/xCAT/SvrUtils.pm @@ -156,15 +156,16 @@ sub get_nodeset_state my %options=@_; my %gnopts; if ($options{prefetchcache}) { $gnopts{prefetchcache}=1; } - - + my $tab_hash; + if ($options{global_tab_hash}) { $tab_hash = $options{global_tab_hash}; } + my $state = "undefined"; my $tftpdir; my $boottype; - if( %::GLOBAL_TAB_HASH && defined($::GLOBAL_TAB_HASH{noderes}) && defined($::GLOBAL_TAB_HASH{noderes}{$node}) ) { - $tftpdir = $::GLOBAL_TAB_HASH{noderes}{$node}{tftpdir}; - $boottype = $::GLOBAL_TAB_HASH{noderes}{$node}{netboot}; - + if( defined($tab_hash) && defined($tab_hash->{noderes}) && defined($tab_hash->{noderes}->{$node}) ) { + $tftpdir = $tab_hash->{noderes}->{$node}->{tftpdir}; + $boottype = $tab_hash->{noderes}->{$node}->{netboot}; + } else { #get boot type (pxe, yaboot or aixinstall) for the node my $noderestab = xCAT::Table->new('noderes', -create => 0);