mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +00:00 
			
		
		
		
	The code drop of Syncing File function
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@3785 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -17,7 +17,7 @@ require xCAT::NodeRange; | ||||
| require DBI; | ||||
|  | ||||
| our @ISA       = qw(Exporter); | ||||
| our @EXPORT_OK = qw(genpassword); | ||||
| our @EXPORT_OK = qw(genpassword getsynclistfile); | ||||
|  | ||||
| my $utildata; #data to persist locally | ||||
| #-------------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -5,7 +5,7 @@ use File::Path; | ||||
| use File::Copy; | ||||
| use Cwd; | ||||
| use File::Temp; | ||||
| use xCAT::Utils qw(genpassword); | ||||
| use xCAT::Utils qw(genpassword getsynclistfile); | ||||
| Getopt::Long::Configure("bundling"); | ||||
| Getopt::Long::Configure("pass_through"); | ||||
|  | ||||
| @@ -134,6 +134,13 @@ sub process_request { | ||||
|       } | ||||
|    } | ||||
|  | ||||
|     # sync fils configured in the synclist to the rootimage | ||||
|     my $syncfile = xCAT::Utils->getsynclistfile(undef, $osver, $arch, $profile, "netboot"); | ||||
|     if (defined ($syncfile) && -f $syncfile | ||||
|         && -d "$installroot/netboot/$osver/$arch/$profile/rootimg") { | ||||
|         print "sync files from $syncfile to the $installroot/netboot/$osver/$arch/$profile/rootimg\n"; | ||||
|         `$::XCATROOT/bin/xdcp -i "$installroot/netboot/$osver/$arch/$profile/rootimg" -F $syncfile`; | ||||
|     } | ||||
|  | ||||
|     my $verb = "Packing"; | ||||
|     if ($method =~ /nfs/) { | ||||
|   | ||||
| @@ -57,11 +57,6 @@ sub process_request | ||||
|     } | ||||
|  | ||||
|     require xCAT::Postage; | ||||
|     my $rc = xCAT::Postage->syncfiles($client,$callback,$subreq); | ||||
|     if ($rc) { | ||||
|         xCAT::MsgUtils->message("S","Sync files to node $client completed"); | ||||
|     } else { | ||||
|         xCAT::MsgUtils->message("S","Encountered error when using xdcp sync files to $client"); | ||||
|     } | ||||
|     xCAT::Postage->syncfiles($client,$callback,$subreq); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -133,11 +133,14 @@ sub preprocess_updatenode { | ||||
|     my $cb=shift; | ||||
|     my $rsp={}; | ||||
|     $rsp->{data}->[0]= "Usage:"; | ||||
|     $rsp->{data}->[1]= "  updatenode <noderange> [-s | -S] [posts]"; | ||||
|     $rsp->{data}->[1]= "  updatenode <noderange> [-F] [-S] [-P] [postscript,...]"; | ||||
|     $rsp->{data}->[2]= "  updatenode [-h|--help|-v|--version]"; | ||||
|     $rsp->{data}->[3]= "     noderange is a list of nodes or groups."; | ||||
|     $rsp->{data}->[4]= "     posts is a comma separated list of postscript names."; | ||||
|     $rsp->{data}->[5]= "     if omitted, all the postscripts will be run."; | ||||
|     $rsp->{data}->[3]= "     <noderange> is a list of nodes or groups."; | ||||
|     $rsp->{data}->[4]= "     -F: Perform File Syncing."; | ||||
|     $rsp->{data}->[5]= "     -S: Perform Software Maintenance."; | ||||
|     $rsp->{data}->[6]= "     -p: Re-run Postscripts listed in postscript."; | ||||
|     $rsp->{data}->[7]= "     [postscript,...] is a comma separated list of postscript names."; | ||||
|     $rsp->{data}->[8]= "         If omitted, all the postscripts defined for the nodes will be run."; | ||||
|     $cb->($rsp); | ||||
|   } | ||||
|    | ||||
| @@ -151,10 +154,11 @@ sub preprocess_updatenode { | ||||
|   Getopt::Long::Configure("bundling"); | ||||
|   Getopt::Long::Configure("no_pass_through"); | ||||
|   if(!GetOptions( | ||||
|       'h|help'     => \$::HELP, | ||||
|       'h|help'      => \$::HELP, | ||||
|       'v|version'  => \$::VERSION, | ||||
|       's'          => \$::SYNCSN, | ||||
|       'S'          => \$::SKIPSYNCFILE )) | ||||
|       'F'              => \$::FILESYNC, | ||||
|       'S'              => \$::SWMAINTENANCE, | ||||
|       'P:s'           => \$::RERUNPS)) | ||||
|   { | ||||
|     &updatenode_usage($callback); | ||||
|     return  \@requests;; | ||||
| @@ -187,40 +191,44 @@ sub preprocess_updatenode { | ||||
|   if (@nodes == 0) { return \@requests; } | ||||
|  | ||||
|   if (@ARGV > 0) { | ||||
|     $postscripts=$ARGV[0]; | ||||
|     my @posts=split(',',$postscripts); | ||||
|     foreach (@posts) {  | ||||
|       if ( ! -e "/install/postscripts/$_") { | ||||
|         my $rsp={}; | ||||
|         $rsp->{data}->[0]= "The postcript /install/postscripts/$_ does not exist."; | ||||
|         $callback->($rsp); | ||||
|         return \@requests; | ||||
|     &updatenode_usage($callback); | ||||
|     return  \@requests; | ||||
|   } | ||||
|  | ||||
|   # If -F option specified, sync files to the noderange. | ||||
|   # Note: This action only happens on MN, since xdcp handles the hierarchical scenario | ||||
|   if ($::FILESYNC) { | ||||
|     my $reqcopy = {%$request}; | ||||
|     $reqcopy->{FileSyncing} = "yes"; | ||||
|     push @requests, $reqcopy; | ||||
|   } | ||||
|  | ||||
|   # handle the re-run postscripts option -P | ||||
|   if (defined ($::RERUNPS)) { | ||||
|     if ($::RERUNPS eq "") { | ||||
|       $postscripts = ""; | ||||
|     } else { | ||||
|       $postscripts=$::RERUNPS; | ||||
|       my @posts=split(',',$postscripts); | ||||
|       foreach (@posts) {  | ||||
|         if ( ! -e "/install/postscripts/$_") { | ||||
|           my $rsp={}; | ||||
|           $rsp->{data}->[0]= "The postcript /install/postscripts/$_ does not exist."; | ||||
|           $callback->($rsp); | ||||
|           return \@requests; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   # If -s argument specified, sync files to the service nodes firstly | ||||
|   if ($::SYNCSN) { | ||||
|     my %syncfile_node = (); | ||||
|     my $node_syncfile = xCAT::Utils->getsynclistfile($nodes); | ||||
|     foreach my $node (@$nodes) { | ||||
|       my $synclist = $$node_syncfile{$node}; | ||||
|  | ||||
|       if ($synclist) { | ||||
|         push @{$syncfile_node{$synclist}}, $node; | ||||
|         next; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     foreach my $syncfile (keys %syncfile_node) { | ||||
|       my $arg = ["-s", "-F", "$syncfile"]; | ||||
|       my $env = ["RSYNCSN=yes", "DSH_RSYNC_FILE=$syncfile"]; | ||||
|       $subreq->({command=>['xdcp'], node=>$syncfile_node{$syncfile}, arg=>$arg, env=>$env}, $callback); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   # when specified -S or -P | ||||
|   # find service nodes for requested nodes | ||||
|   # build an individual request for each service node | ||||
|   unless (defined($::SWMAINTENANCE) || defined($::RERUNPS)) { | ||||
|     return \@requests;  | ||||
|   } | ||||
|    | ||||
|   my $sn = xCAT::Utils->get_ServiceNode(\@nodes, "xcat", "MN"); | ||||
|      | ||||
|   # build each request for each service node | ||||
| @@ -229,11 +237,18 @@ sub preprocess_updatenode { | ||||
|     my $reqcopy = {%$request}; | ||||
|     $reqcopy->{node} = $sn->{$snkey}; | ||||
|     $reqcopy->{'_xcatdest'} = $snkey; | ||||
|     $reqcopy->{postscripts} = [$postscripts]; | ||||
|     if (defined ($::SWMAINTENANCE)) { | ||||
|       $reqcopy->{swmaintenance} = "yes"; | ||||
|     } | ||||
|     if (defined ($::RERUNPS)) { | ||||
|       $reqcopy->{rerunps} = "yes"; | ||||
|       $reqcopy->{postscripts} = [$postscripts]; | ||||
|     } | ||||
|      | ||||
|     push @requests, $reqcopy; | ||||
|   } | ||||
|   return \@requests;     | ||||
|    | ||||
|   return \@requests;     | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -253,13 +268,11 @@ sub updatenode { | ||||
|   my $request = shift; | ||||
|   my $callback = shift; | ||||
|   my $subreq = shift; | ||||
|   my $postscripts=""; | ||||
|   if (($request->{postscripts}) && ($request->{postscripts}->[0])) {  $postscripts=$request->{postscripts}->[0];} | ||||
|  | ||||
|   my $nodes      =$request->{node};   | ||||
|   my $localhostname=hostname(); | ||||
|  | ||||
|   # if not specifying -S, do the sync file operation | ||||
|   unless ($::SKIPSYNCFILE) { | ||||
|   if ($request->{FileSyncing} && $request->{FileSyncing} eq "yes") { | ||||
|     my %syncfile_node = (); | ||||
|     my %syncfile_rootimage = (); | ||||
|     my $node_syncfile = xCAT::Utils->getsynclistfile($nodes); | ||||
| @@ -269,21 +282,6 @@ sub updatenode { | ||||
|       if ($synclist) { | ||||
|         push @{$syncfile_node{$synclist}}, $node; | ||||
|       } | ||||
|  | ||||
|       # Figure out the directory of the root image | ||||
|       # one $synclist will only map to one root image, so  | ||||
|       # just find the root image one time | ||||
|       # only for netboot node (diskless) | ||||
|       if ($synclist && $synclist =~ /\/netboot\//) { | ||||
|         if (! defined($syncfile_rootimage{$synclist})) { | ||||
|           my $root_dir = xCAT::Utils->getrootimage($node); | ||||
|           if (-d $root_dir) { | ||||
|             $syncfile_rootimage{$synclist} = $root_dir; | ||||
|           } else { | ||||
|             $syncfile_rootimage{$synclist} = "no_root_image"; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # Sync files to the target nodes | ||||
| @@ -292,28 +290,18 @@ sub updatenode { | ||||
|       my $env = ["DSH_RSYNC_FILE=$synclist"]; | ||||
|       $subreq->({command=>['xdcp'], node=>$syncfile_node{$synclist}, arg=>$args, env=>$env}, $callback); | ||||
|     } | ||||
|  | ||||
|     # Sync files to the root image for the diskless nodes | ||||
|     foreach my $synclist (keys %syncfile_rootimage) { | ||||
|       if ($syncfile_rootimage{$synclist} eq "no_root_image") { | ||||
|         next; | ||||
|       } | ||||
|       my $args = ["-i", $syncfile_rootimage{$synclist}, "-F", $synclist]; | ||||
|       my $env = ["DSH_RSYNC_FILE=$synclist"]; | ||||
|       $subreq->({command=>['xdcp'], arg=>$args, env=>$env}, $callback); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   my $nodestring=join(',', @$nodes); | ||||
|   #print "postscripts=$postscripts, nodestring=$nodestring\n"; | ||||
|  | ||||
|   if ($nodestring) { | ||||
|   if ($request->{swmaintenance} && $request->{swmaintenance} eq "yes") { | ||||
|     my $cmd; | ||||
|     my $nodestring=join(',', @$nodes); | ||||
|     if (xCAT::Utils->isLinux()) { | ||||
|       $cmd="XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -s -e /install/postscripts/xcatdsklspost 1 $postscripts 2>&1"; | ||||
|       $cmd="XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -s -e /install/postscripts/xcatdsklspost 2 otherpkgs 2>&1"; | ||||
|     } | ||||
|     else { | ||||
|       $cmd="XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -s -e /install/postscripts/xcataixpost -c 1 $postscripts 2>&1"; | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]= "Dose not support Software Maintenance for AIX nodes"; | ||||
|       $callback->($rsp);  | ||||
|     } | ||||
|     if (! open (CMD, "$cmd |")) { | ||||
|       my $rsp={}; | ||||
| @@ -329,8 +317,37 @@ sub updatenode { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
|   if ($request->{rerunps} && $request->{rerunps} eq "yes") { | ||||
|     my $postscripts=""; | ||||
|     if (($request->{postscripts}) && ($request->{postscripts}->[0])) {  $postscripts=$request->{postscripts}->[0];} | ||||
|  | ||||
|     my $nodestring=join(',', @$nodes); | ||||
|     #print "postscripts=$postscripts, nodestring=$nodestring\n"; | ||||
|    | ||||
|     if ($nodestring) { | ||||
|       my $cmd; | ||||
|       if (xCAT::Utils->isLinux()) { | ||||
|         $cmd="XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -s -e /install/postscripts/xcatdsklspost 1 $postscripts 2>&1"; | ||||
|       } | ||||
|       else { | ||||
|         $cmd="XCATBYPASS=Y $::XCATROOT/bin/xdsh $nodestring -s -e /install/postscripts/xcataixpost -c 1 $postscripts 2>&1"; | ||||
|       } | ||||
|       if (! open (CMD, "$cmd |")) { | ||||
|         my $rsp={}; | ||||
|         $rsp->{data}->[0]= "Cannot run command $cmd"; | ||||
|         $callback->($rsp);     | ||||
|       } else { | ||||
|         while (<CMD>) { | ||||
|           my $rsp={}; | ||||
|           $rsp->{data}->[0]= "$_"; | ||||
|           $callback->($rsp); | ||||
|         } | ||||
|         close(CMD); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return 0;   | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -9,32 +9,46 @@ | ||||
| # | ||||
| ##################################################### | ||||
|  | ||||
| use XML::Simple; | ||||
|  | ||||
| use IO::Socket; | ||||
| my $useSocketSSL=eval { require IO::Socket::SSL; }; | ||||
| if ($useSocketSSL) { | ||||
|         require IO::Socket::SSL; | ||||
| } | ||||
|  | ||||
| my $port = "3002"; | ||||
| my $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr  => $ENV{MASTER}, PeerPort  => $port, ); | ||||
| my $port = "3001"; | ||||
| my $remote = IO::Socket::SSL->new( Proto => "tcp", PeerAddr => $ENV{MASTER}, PeerPort  => $port, ); | ||||
| unless ($remote) { | ||||
|   `logger -t xCAT "startsyncfiles: Cannot connect to host $ENV{MASTER}"`; | ||||
|   exit 0; | ||||
| } | ||||
|  | ||||
| $remote->autoflush(1); | ||||
| # Send Syncing File request to the xcatd | ||||
| print $remote "<xcatrequest>\n"; | ||||
| print $remote "   <command>syncfiles</command>\n"; | ||||
| print $remote "</xcatrequest>\n"; | ||||
|  | ||||
| while (defined (my $line = <$remote>)) { | ||||
|   chomp($line); | ||||
|  | ||||
|   if ($line =~ /ready/) { | ||||
|     print $remote "syncfiles\n"; | ||||
|   } | ||||
| my $response=''; | ||||
| my $rsp; | ||||
| while (<$remote>) { | ||||
|   $response .= $_; | ||||
|   if ($response =~ m/<\/xcatresponse>/) { | ||||
|     $rsp = eval { XMLin($response,SuppressEmpty=>undef,ForceArray=>1) }; | ||||
|     if ($rsp->{serverdone}) { | ||||
|       close $remote; | ||||
|       exit 1; | ||||
|     } | ||||
|  | ||||
|   if ($line =~ /syncfiles done/) { | ||||
|     close $remote; | ||||
|     exit 1; | ||||
|     if ($rsp->{errorcode} || $rsp->{error}) { | ||||
|       close $remote; | ||||
|       exit 0; | ||||
|     } | ||||
|     $response=''; | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| close $remote; | ||||
|  | ||||
| exit 1; | ||||
| exit 0; | ||||
|  | ||||
|   | ||||
| @@ -1,20 +1,25 @@ | ||||
| #!/usr/bin/awk -f | ||||
| BEGIN { | ||||
|         server = "openssl s_client -quiet -connect " ENVIRON["XCATSERVER"] | ||||
|   server = "openssl s_client -quiet -connect " ENVIRON["XCATSERVER"] | ||||
|  | ||||
|         quit = "no" | ||||
|   quit = "no" | ||||
|   exitcode = 1 | ||||
|  | ||||
|         print "<xcatrequest>" |& server | ||||
|         print "   <command>syncfiles</command>" |& server | ||||
|         print "</xcatrequest>" |& server | ||||
|   print "<xcatrequest>" |& server | ||||
|   print "   <command>syncfiles</command>" |& server | ||||
|   print "</xcatrequest>" |& server | ||||
|  | ||||
|         while (server |& getline) { | ||||
|                 if (match($0,"<syncfiles done>")) { | ||||
|                   quit = "yes" | ||||
|                 } | ||||
|                 if (match($0,"</xcatresponse>") && match(quit,"yes")) { | ||||
|                   close(server) | ||||
|                   exit | ||||
|                } | ||||
|         } | ||||
|   while (server |& getline) { | ||||
|     if (match($0,"<serverdone>")) { | ||||
|       quit = "yes" | ||||
|     } | ||||
|     if (match($0,"<errorcode>") || match($0,"<error>")) { | ||||
|       exitcode = 0 | ||||
|     } | ||||
|  | ||||
|     if (match($0,"</xcatresponse>") && match(quit,"yes")) { | ||||
|       close(server) | ||||
|       exit exitcode | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -21,12 +21,21 @@ osname=`uname` | ||||
| # run the xdcp on the MN/SN | ||||
| xcatpostdir="/xcatpost" | ||||
|  | ||||
| if [ $osname="Linux" ]  | ||||
| if [ $osname = "Linux" ]  | ||||
| then | ||||
|   `$xcatpostdir/startsyncfiles.awk` | ||||
| elif [ $osname="AIX" ] | ||||
| `$xcatpostdir/startsyncfiles.awk` | ||||
| returncode=$? | ||||
| elif [ $osname = "AIX" ] | ||||
| then | ||||
|   `$xcatpostdir/startsyncfiles.aix` | ||||
| `$xcatpostdir/startsyncfiles.aix` | ||||
| returncode=$? | ||||
| fi | ||||
|  | ||||
| if [ $returncode -eq 1 ] | ||||
| then | ||||
|   logger -t xCAT "Perform Syncing File action successfully" | ||||
| else | ||||
|   logger -t xCAT "Perform Syncing File action encountered error" | ||||
| fi | ||||
|  | ||||
| exit 0 | ||||
|   | ||||
| @@ -174,8 +174,8 @@ if (-f $scriptname) { | ||||
| my $nodesetstat="standalone"; | ||||
| if (-f $scriptname) | ||||
| { | ||||
| 	# when called by the updatenode command, | ||||
|     #	modify the UPDATENODE flag to 1 | ||||
|     # when called by the updatenode command, | ||||
|     # modify the UPDATENODE flag to 1 | ||||
|     if (@ARGV > 0) { | ||||
|       $TMP=`sed -e 's/UPDATENODE=0/UPDATENODE=1/g' $scriptname`; | ||||
|       `echo "$TMP" > $scriptname`; | ||||
| @@ -190,10 +190,18 @@ if (-f $scriptname) | ||||
|       `echo "$TMP" > $scriptname`; | ||||
|       #add requested postscripts in | ||||
|       `echo "$POSTS" | tr "," "\n" >> $scriptname`; | ||||
|    } | ||||
|     } | ||||
|  | ||||
|    $nodesetstat=`grep "NODESETSTATE=" $scriptname|awk -F \= '{print \$2}'`; | ||||
|    chomp($nodesetstat); | ||||
|     # when called by the updatenode command, | ||||
|     # if the first parameter equals 1, remove the otherpkgs postscript, | ||||
|     # since the otherpkgs only run for Linux software maintenance | ||||
|     if (@ARGV > 0 && $ARGV[0] == 1) { | ||||
|       my $TMP=`sed "/otherpkgs/ d" $scriptname`; | ||||
|       `echo "$TMP" > $scriptname`; | ||||
|     } | ||||
|  | ||||
|     $nodesetstat=`grep "NODESETSTATE=" $scriptname|awk -F \= '{print \$2}'`; | ||||
|     chomp($nodesetstat); | ||||
|     $ENV{PATH}="/xcatpost:$ENV{PATH}"; | ||||
|     &runcmd("cd /xcatpost;$scriptname"); | ||||
| } else { | ||||
|   | ||||
| @@ -88,6 +88,16 @@ fi | ||||
| #MYCONT=`cat /tmp/mypostscript` | ||||
| #echo "$MYCONT" | ||||
|  | ||||
| # when called by the updatenode command, | ||||
| # if the first parameter equals 1, remove the otherpkgs postscript, | ||||
| # since the otherpkgs only run for software maintenance: xcatdsklspost 2 otherpkgs  | ||||
| if [ $# -gt 0 ]; then | ||||
| if [ $1 -eq 1 ]; then | ||||
|   TMP=`sed "/otherpkgs/ d" /tmp/mypostscript` | ||||
|   echo "$TMP" > /tmp/mypostscript | ||||
| fi | ||||
| fi | ||||
|  | ||||
| if [ $# -eq 0 ]; then | ||||
|   #notify the server that we are done with netbooting | ||||
|   CNS=`grep NODESTATUS= /tmp/mypostscript |awk -F = '{print $2}'` | ||||
|   | ||||
		Reference in New Issue
	
	Block a user