From 5a5e0c7dc12519ec0963576d02b9964d1670cac1 Mon Sep 17 00:00:00 2001 From: nott Date: Sat, 3 May 2008 13:01:21 +0000 Subject: [PATCH] Updates for AIX diskless support git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1267 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT-2.0/xCAT/Utils.pm | 25 +- xCAT-server-2.0/lib/xcat/plugins/aixdskls.pm | 364 +++++++++++++++---- xCAT-server-2.0/sbin/xcatconfig | 3 +- 3 files changed, 322 insertions(+), 70 deletions(-) diff --git a/perl-xCAT-2.0/xCAT/Utils.pm b/perl-xCAT-2.0/xCAT/Utils.pm index c56254ba6..9a074d2c6 100644 --- a/perl-xCAT-2.0/xCAT/Utils.pm +++ b/perl-xCAT-2.0/xCAT/Utils.pm @@ -1826,8 +1826,31 @@ sub create_postscripts_tar xCAT::MsgUtils->message("S", "Error from $cmd\n"); return $::RUNCMD_RC; } - return 0; + + # for AIX add an entry to the /etc/tftpaccess.ctrl file so + # we can tftp the tar file from the node + if (xCAT::Utils->isAIX()) { + my $tftpctlfile = "/etc/tftpaccess.ctl"; + my $entry = "allow:/install/autoinst/xcatpost.tar.gz"; + + # see if there is already an entry + my $cmd = "cat $tftpctlfile | grep xcatpost"; + my @result = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + # not found so add it + unless (open(TFTPFILE, ">>$tftpctlfile")) { + xCAT::MsgUtils->message("S", "Could not open $tftpctlfile.\n"); + return $::RUNCMD_RC; + } + + print TFTPFILE $entry; + + close (TFTPFILE); + } + } + return 0; } #----------------------------------------------------------------------------- diff --git a/xCAT-server-2.0/lib/xcat/plugins/aixdskls.pm b/xCAT-server-2.0/lib/xcat/plugins/aixdskls.pm index c3bbe1356..f37e9af71 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/aixdskls.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/aixdskls.pm @@ -153,11 +153,12 @@ sub dsklsimage # parse the options Getopt::Long::Configure("no_pass_through"); if(!GetOptions( + 'f|force' => \$::FORCE, 'h|help' => \$::HELP, 's=s' => \$::opt_s, 'l=s' => \$::opt_l, 'S=s' => \$::opt_S, - 'verbose|V' => \$::opt_V, + 'verbose|V' => \$::VERBOSE, 'v|version' => \$::VERSION,)) { @@ -181,22 +182,19 @@ sub dsklsimage } my $spot_name = shift @ARGV; - unless ($spot_name) { - &dsklsimage_usage($callback); - return 1; - } - # must have a source and a name if (!$::opt_s || !defined($spot_name) ) { + my $rsp; + push @{$rsp->{data}}, "The image source and image name are required.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); &dsklsimage_usage($callback); return 1; } # - # See if this NIM SPOT definition already exists + # Get a list of the defined resources # - my $spot_exists=0; - my $cmd = qq~lsnim -c resources | /usr/bin/cut -f1 -d' ' 2>/dev/null~; + my $cmd = qq~/usr/sbin/lsnim -c resources | /usr/bin/cut -f1 -d' ' 2>/dev/null~; my @output = xCAT::Utils->runcmd("$cmd", -1); if ($::RUNCMD_RC != 0) { @@ -205,16 +203,79 @@ sub dsklsimage xCAT::MsgUtils->message("E", $rsp, $callback); return 1; } - elsif (grep(/^$spot_name$/, @output)) - { - $spot_exists=1; + + # if the source is not the name of an lpp_source then try to create one + # we will need the lpp_source to update the image + my $lppsrcname; + my $buildlpp=0; + if (-d $::opt_s) { + # this is a source directory + # so see if we need to create a new lpp_source + # make a name using the convention and check if it already exists + $lppsrcname= $spot_name . "_lpp"; + if (grep(/^$lppsrcname$/, @output)) { + if ($::FORCE) { + # get rid of the old lpp_source + my $cmd = "/usr/sbin/nim -o remove $lppsrcname"; + my $out = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Could not run command \'$cmd\'. (rc = $::RUNCMD_RC)\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + + # build a new one + $buildlpp = 1; + } else { + my $rsp; + push @{$rsp->{data}}, "The lpp_source (\'$lppsrcname\') for this COSI already exists. Use the force option to re-create it.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + } else { + $buildlpp = 1; + } + } else { + # if not a dir then should be an existing lpp_source + if (!(grep(/^$::opt_s$/, @output))) { + my $rsp; + push @{$rsp->{data}}, "\'$::opt_s\' is not a source directory or the name of a NIM lpp_source resource.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + &dsklsimage_usage($callback); + return 1; + } else { + # ok this is the lpp_source to use + $lppsrcname= $::opt_s + } + } + + # build an lpp_source if needed + if ($buildlpp) { my $rsp; - push @{$rsp->{data}}, "A NIM SPOT resource named \'$spot_name\' already exists."; + push @{$rsp->{data}}, "Creating a NIM lpp_source resource called \'$lppsrcname\'. This could take a while.\n"; xCAT::MsgUtils->message("I", $rsp, $callback); - # return 1; + + my $cmd = "/usr/sbin/nim -o define -t lpp_source -a server=master -a location=/install/nim/lpp_source/$lppsrcname -a source=$::opt_s $lppsrcname"; + + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Running: \'$cmd\'\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + + my $output = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + my $rsp; + push @{$rsp->{data}}, "Could not run command \'$cmd\'. (rc = $::RUNCMD_RC)\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } } - if (!$spot_exists) { + # if the SPOT doesn't exist then create it + if (!(grep(/^$spot_name$/, @output)) || $::FORCE) { # # Create the SPOT/COSI @@ -222,18 +283,18 @@ sub dsklsimage my $mkcosi_cmd = "/usr/sbin/mkcosi "; # do we want verbose output? - if ($::opt_V) { + if ($::VERBOSE) { $mkcosi_cmd .= "-v "; } # source of images - $mkcosi_cmd .= "-s $::opt_s "; + $mkcosi_cmd .= "-s $lppsrcname "; # where to put it - the default is /install if ($::opt_l) { $mkcosi_cmd .= "-l $::opt_l "; } else { - $mkcosi_cmd .= "-l /install "; + $mkcosi_cmd .= "-l /install/nim/spot "; } # what server do we want this created on? @@ -251,6 +312,12 @@ sub dsklsimage push @{$rsp->{data}}, "Creating a NIM SPOT resource. This could take a while.\n"; xCAT::MsgUtils->message("I", $rsp, $callback); + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Running: \'$mkcosi_cmd\'\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + my $output = xCAT::Utils->runcmd("$mkcosi_cmd", -1); if ($::RUNCMD_RC != 0) { @@ -260,10 +327,40 @@ sub dsklsimage return 1; } - } # end if spot doesn't exist + } # end - if spot doesn't exist + else { + my $rsp; + push @{$rsp->{data}}, "A SPOT called $spot_name already exists.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + + my $rsp; + push @{$rsp->{data}}, "Updating $spot_name.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); # - # Get the SPOT location ( /../usr) + # add rpm.rte to the SPOT + # - it contains gunzip which is needed on the node + # - assume the source for the spot also has the rpm.rte fileset + # + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Installing rpm.rte in the image.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + + my $cmd = "/usr/sbin/chcosi -i -s $::opt_s -f rpm.rte $spot_name"; + my $output = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + my $rsp; + push @{$rsp->{data}}, "Could not run command \'$cmd\'. (rc = $::RUNCMD_RC)\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + + # + # Get the SPOT location ( path to ../usr) # $::spot_loc = &get_spot_loc($spot_name, $callback); if (!defined($::spot_loc) ) { @@ -277,9 +374,14 @@ sub dsklsimage # Create ODMscript in the SPOT and modify the rc.dd-boot script # - need for rnetboot to work - handles default console setting # + my $odmscript = "$::spot_loc/ODMscript"; + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Adding $odmscript to the image.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } # Create ODMscript script - my $odmscript = "$::spot_loc/ODMscript"; my $text = "CuAt:\n\tname = sys0\n\tattribute = syscons\n\tvalue = /dev/vty0\n\ttype = R\n\tgeneric =\n\trep = s\n\tnls_index = 0"; if ( open(ODMSCRIPT, ">$odmscript") ) { @@ -314,9 +416,21 @@ sub dsklsimage # Copy the xcatdsklspost script to the SPOT/COSI and add an entry for it # to the /etc/inittab file # + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Adding xcatdsklspost script to the image.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } # copy the script my $cpcmd = "mkdir -m 644 -p $::spot_loc/lpp/bos/inst_root/opt/xcat; cp /install/postscripts/xcatdsklspost $::spot_loc/lpp/bos/inst_root/opt/xcat/xcatdsklspost"; + + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Running: \'$cpcmd\'\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + my @result = xCAT::Utils->runcmd("$cpcmd", -1); if ($::RUNCMD_RC != 0) { @@ -339,7 +453,7 @@ sub dsklsimage # # - use lsnim or nim -o showres ?? my $rsp; - push @{$rsp->{data}}, "A diskless image called $spot_name was created and updated.\n"; + push @{$rsp->{data}}, "A diskless image called $spot_name was created and/or updated.\n"; xCAT::MsgUtils->message("I", $rsp, $callback); return 0; @@ -369,14 +483,14 @@ sub update_inittab my $spotinittab = "$::spot_loc/lpp/bos/inst_root/etc/inittab"; my $entry = "xcat:2:wait:/opt/xcat/xcatdsklspost\n"; - - # see if xcatdsklspost entry is already in the file - my $cmd = "cat $spotinittab | grep xcatdsklspost"; - my @result = xCAT::Utils->runcmd("$cmd", -1); + + # see if xcatdsklspost is already in the file + my $cmd = "cat $spotinittab | grep xcatdsklspost"; + my @result = xCAT::Utils->runcmd("$cmd", -1); if ($::RUNCMD_RC == 0) { - # it's already there so return - return 0; + # it's already there so return + return 0; } unless (open(INITTAB, ">>$spotinittab")) { @@ -526,7 +640,7 @@ sub update_dd_boot { return 1; } - if ($::opt_V) { + if ($::VERBOSE) { my $rsp; push @{$rsp->{data}}, "Updated $dd_boot_file.\n"; xCAT::MsgUtils->message("I", $rsp, $callback); @@ -567,9 +681,10 @@ sub dsklsnode # parse the options if(!GetOptions( + 'f|force' => \$::FORCE, 'h|help' => \$::HELP, 'c=s' => \$::opt_c, - 'verbose|V' => \$::opt_V, + 'verbose|V' => \$::VERBOSE, 'v|version' => \$::VERSION,)) { &dsklsnode_usage($callback); @@ -625,51 +740,166 @@ sub dsklsnode return 1; } + # + # Get a list of the defined machines + # + my $cmd = qq~/usr/sbin/lsnim -c machines | /usr/bin/cut -f1 -d' ' 2>/dev/nu +ll~; + my @machines = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + my $rsp; + push @{$rsp->{data}}, "Could not get NIM machine definitions."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + # + # Get a list of the defined diskless machines + # + my $cmd = qq~/usr/sbin/lsnim -t diskless | /usr/bin/cut -f1 -d' ' 2>/dev/nu +ll~; + my @dsklsnodes = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + my $rsp; + push @{$rsp->{data}}, "Could not get NIM diskless definitions."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + + my $error=0; + foreach my $node (keys %objhash) { - # need short host name for NIM client defs - my $shorthost; - ($shorthost = $node) =~ s/\..*$//; + + # need short host name for NIM cmds + my $shorthost; + ($shorthost = $node) =~ s/\..*$//; chomp $shorthost; - # get, check the node IP - my $IP = inet_ntoa(inet_aton($node)); - chomp $IP; - unless ($IP =~ /\d+\.\d+\.\d+\.\d+/) - { - next; - } + # does it already exist?? + if (grep(/^$shorthost$/, @machines)) { # already defined + if ($::FORCE) { + # get rid of the old definition + if (grep(/^$shorthost$/, @dsklsnodes)) { + # remove the diskless node - run rmts + my $rmtscmd = "rmts -f $shorthost"; + my $output = xCAT::Utils->runcmd("$rmtscmd", -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Could not remove $node.\n"; + if ($::VERBOSE) { + push @{$rsp->{data}}, "$output"; + } + xCAT::MsgUtils->message("E", $rsp, $callback); + $error++; + next; + } - # - # Create a unique post script for each node - # - mkpath "/install/postscripts/"; - xCAT::Postage->writescript($node, "/install/postscripts/".$node, "netboot", $callback); + } else { # just remove the machine def + my $rmcmd = "nim -o remove $shorthost"; + my $output = xCAT::Utils->runcmd("$rmcmd", -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Could not remove $node.\n"; + if ($::VERBOSE) { + push @{$rsp->{data}}, "$output"; + } + xCAT::MsgUtils->message("E", $rsp, $callback); + $error++; + next; + } - # - # Run the AIX mkts cmd to define and initialize a diskless client - # - my $cosi = $::opt_c; + } + } elsif ($::opt_w) { + # switch to the new image + # nim -Fo reset $node + # nim -Fo deallocate -a subclass=all $node + # nim -o dkls_init ..... $node + # - does a sync_root + # TBD + next; - my $cmd = qq~mkts -i $IP -m $nethash{$node}{'mask'} -g $nethash{$node}{'gateway'} -c $cosi -l $shorthost 2>&1~; + } else { + my $rsp; + push @{$rsp->{data}}, "The node $node is already defined. Use the force option to re-create."; + xCAT::MsgUtils->message("E", $rsp, $callback); + $error++; + next; + } - my $rsp; - push @{$rsp->{data}}, "Creating NIM diskless node definitions. This could take a while.\n"; - xCAT::MsgUtils->message("I", $rsp, $callback); - my $output = xCAT::Utils->runcmd("$cmd", -1); - if ($::RUNCMD_RC != 0) - { + } else { # not defined - so define it! + + # get, check the node IP + my $IP = inet_ntoa(inet_aton($node)); + chomp $IP; + unless ($IP =~ /\d+\.\d+\.\d+\.\d+/) + { + my $rsp; + push @{$rsp->{data}}, "Could not get valid IP address for node $node.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + $error++; + next; + } + + # + # Create a unique post script + # - this routine should handle a noderange to be more efficient! + # + mkpath "/install/postscripts/"; + xCAT::Postage->writescript($node, "/install/postscripts/".$node, "netboot", $callback); + + # + # Run the AIX mkts cmd to define and initialize a diskless client + # + my $cosi = $::opt_c; + my $cmd = qq~mkts -i $IP -m $nethash{$node}{'mask'} -g $nethash{$node}{'gateway'} -c $cosi -l $shorthost 2>&1~; + my $rsp; - push @{$rsp->{data}}, "Could not create a NIM definition for \'$node\'.\n"; - if ($::verbose) { - push @{$rsp->{data}}, "$output"; - } - xCAT::MsgUtils->message("E", $rsp, $callback); - return 1; - } + push @{$rsp->{data}}, "Creating NIM diskless node definition. This could take a while.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + + if ($::VERBOSE) { + my $rsp; + push @{$rsp->{data}}, "Running: \'$cmd\'\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + + my $output = xCAT::Utils->runcmd("$cmd", -1); + if ($::RUNCMD_RC != 0) + { + my $rsp; + push @{$rsp->{data}}, "Could not create a NIM definition for \'$node\'.\n"; + if ($::VERBOSE) { + push @{$rsp->{data}}, "$output"; + } + xCAT::MsgUtils->message("E", $rsp, $callback); + $error++; + next; + } + } + } + + my $rc = xCAT::Utils->create_postscripts_tar(); + if ( $rc != 0 ) { + my $rsp; + push @{$rsp->{data}}, "Could not create a post scripts tar file.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + + if ($error) { + my $rsp; + push @{$rsp->{data}}, "One or more errors occurred when attempting to initialize AIX NIM diskless nodes.\n"; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } else { + my $rsp; + push @{$rsp->{data}}, "AIX NIM diskless nodes were initialized.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + return 0; } - return 0; } #---------------------------------------------------------------------------- @@ -698,7 +928,7 @@ sub dsklsnode_usage push @{$rsp->{data}}, " Usage: "; push @{$rsp->{data}}, "\tmkdsklsnode [-h | --help ]"; push @{$rsp->{data}}, "or"; - push @{$rsp->{data}}, "\tmkdsklsnode [-V] -c image_name noderange"; + push @{$rsp->{data}}, "\tmkdsklsnode [-V] [-f | --force] -c cosi_name noderange"; xCAT::MsgUtils->message("I", $rsp, $callback); return 0; } @@ -726,9 +956,9 @@ sub dsklsimage_usage my $rsp; push @{$rsp->{data}}, " mkdsklsimage - Create an AIX NIM diskless image (SPOT/COSI).\n"; push @{$rsp->{data}}, " Usage: "; - push @{$rsp->{data}}, "\tmkdsklsimage [-h | --help ]"; + push @{$rsp->{data}}, "\tmkdsklsimage [-h | --help]"; push @{$rsp->{data}}, "or"; - push @{$rsp->{data}}, "\tmkdsklsimage -s source [-l ] [-V] image_name\n"; + push @{$rsp->{data}}, "\tmkdsklsimage [-V] [-f | --force] [-l ] -s image_name\n"; xCAT::MsgUtils->message("I", $rsp, $callback); return 0; } diff --git a/xCAT-server-2.0/sbin/xcatconfig b/xCAT-server-2.0/sbin/xcatconfig index cc31e387f..1ad3b1e65 100644 --- a/xCAT-server-2.0/sbin/xcatconfig +++ b/xCAT-server-2.0/sbin/xcatconfig @@ -341,8 +341,7 @@ if (( ! -r "/etc/xcat/site.sqlite" ) || $::FORCE){ $chtabcmds .= "$::XCATROOT/sbin/chtab key=timezone site.value=$timezone"; } if ($::osname eq 'AIX') { - $chtabcmds .= "$::XCATROOT/sbin/chtab key=rsh site.value=/bin/rsh;"; - $chtabcmds .= "$::XCATROOT/sbin/chtab key=rcp site.value=/bin/rcp;"; + $chtabcmds .= "$::XCATROOT/sbin/chtab key=remoteshell site.value=/bin/rsh;"; } my $outref = xCAT::Utils->runcmd("$chtabcmds", 0);