mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	add support for postscripts execute after rsync update
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@8698 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -4141,7 +4141,7 @@ sub parse_and_run_dcp | ||||
|         return; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     my $synfiledir; | ||||
|     # if rsyncing the nodes or service nodes | ||||
|     if ($options{'File'}) | ||||
|     { | ||||
| @@ -4153,7 +4153,7 @@ sub parse_and_run_dcp | ||||
|         } | ||||
|  | ||||
|         # set default sync dir on service node | ||||
|         my $synfiledir = "/var/xcat/syncfiles"; | ||||
|         $synfiledir = "/var/xcat/syncfiles"; | ||||
|  | ||||
|         # get the directory on the servicenode to put the rsync files in | ||||
|         my @syndir = xCAT::Utils->get_site_attribute("SNsyncfiledir"); | ||||
| @@ -4164,6 +4164,9 @@ sub parse_and_run_dcp | ||||
|  | ||||
|         my $rc; | ||||
|         my $syncfile = $options{'File'}; | ||||
|         # the parsing of the file will fill in an array of postscripts  | ||||
|         # need to be run if the associated file is updated | ||||
|         @::postscripts=(); | ||||
|         if (xCAT::Utils->isServiceNode()) | ||||
|         {    # running on service node | ||||
|             $rc = | ||||
| @@ -4226,17 +4229,18 @@ sub parse_and_run_dcp | ||||
|  | ||||
|     # Execute the dcp api | ||||
|     @results = xCAT::DSHCLI->runDcp_api(\%options, 0); | ||||
|  | ||||
|     #if ($::RUNCMD_RC) | ||||
|     #{    # error from dcp | ||||
|     #    my $rsp = {}; | ||||
|     #    $rsp->{data}->[0] = "Error from xdcp. Return Code = $::RUNCMD_RC"; | ||||
|     #    xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|  | ||||
|     #} | ||||
|     $::FAILED_NODES = $::RUNCMD_RC; | ||||
|     return (@results); | ||||
|  | ||||
|      | ||||
|     # if not just syncing the service node SNsyncfiledir directory, | ||||
|     #  @::postscripts should be empty in this case anyway | ||||
|     # if postscripts to run after rsync, process the output and  | ||||
|     # create the xdsh command to run the ones needed | ||||
|     if ((@::postscripts) && ($::SYNCSN == 0)) { | ||||
|       my @results2 = &run_rsync_postscripts(\@results,$synfiledir);  | ||||
|       return (@results2); | ||||
|     } else { | ||||
|       return (@results); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
| @@ -4246,6 +4250,7 @@ sub parse_and_run_dcp | ||||
|  | ||||
|         This parses the -F rsync input file. and runs rsync to the input | ||||
| 		image for the files | ||||
| 		Does not process the EXECUTE statement | ||||
|  | ||||
|         File format: | ||||
|           /.../file1 ->  /.../dir1/filex | ||||
| @@ -4288,6 +4293,16 @@ sub rsync_to_image | ||||
|     while (my $line = <INPUTFILE>) | ||||
|     { | ||||
|         chomp $line; | ||||
|         if ($line =~ /^#/)    # skip commments | ||||
|         { | ||||
|             next; | ||||
|         } | ||||
|  | ||||
|         # process no more lines, do not exec | ||||
|         # do not execute postscripts when syncing servicenodes | ||||
|         if ($line =~ /EXECUTE:/) { # process no more lines | ||||
| 			last; | ||||
| 	} | ||||
|         if ($line =~ /(.+) -> (.+)/) | ||||
|         { | ||||
|             my $imageupdatedir  = $image; | ||||
| @@ -4420,6 +4435,24 @@ sub parse_rsync_input_file_on_MN | ||||
|         { | ||||
|             next; | ||||
|         } | ||||
|         # if syncing only the service node directory, do not execute | ||||
|         # postscripts | ||||
|         if ($line =~ /EXECUTE:/) { | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while (my $line = <INPUTFILE>) | ||||
|              { | ||||
|                chomp $line; | ||||
|                if ($line =~ /^#/)    # skip commments | ||||
|                { | ||||
|                  next; | ||||
|                } | ||||
|                push @::postscripts,$line; | ||||
|               } | ||||
|             | ||||
|          } | ||||
|         } | ||||
|         if ($line =~ /(.+) -> (.+)/) | ||||
|         { | ||||
|  | ||||
| @@ -4574,6 +4607,28 @@ sub parse_rsync_input_file_on_SN | ||||
|     while (my $line = <INPUTFILE>) | ||||
|     { | ||||
|         chomp $line; | ||||
|         if ($line =~ /^#/)    # skip commments | ||||
|         { | ||||
|             next; | ||||
|         } | ||||
|         # if syncing only the service node directory, do not execute | ||||
|         # postscripts | ||||
|         if ($line =~ /EXECUTE:/) { | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while (my $line = <INPUTFILE>) | ||||
|              { | ||||
|                chomp $line; | ||||
|                if ($line =~ /^#/)    # skip commments | ||||
|                { | ||||
|                  next; | ||||
|                } | ||||
|                push @::postscripts,$line; | ||||
|               } | ||||
|             | ||||
|          } | ||||
|         } | ||||
|         if ($line =~ /(.+) -> (.+)/) | ||||
|         { | ||||
|             $process_line = 1; | ||||
| @@ -4667,6 +4722,97 @@ sub parse_rsync_input_file_on_SN | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 | ||||
|        run_rsync_postscripts  | ||||
|  | ||||
|         This executes the postscript file on the nodes where | ||||
| 	    the corresponding rsync file was updated | ||||
|         rsync returns a list of files that have been updated | ||||
|         in the form   hostname: <full file path> | ||||
|         For example:  node1: tmp/test/file1  ( yes it leaves the first / off) | ||||
|         This routine must match that list to the input list of postscripts. | ||||
|         If there is a match, for example | ||||
|         The postscript file is /tmp/test/file1.post  and tmp/test/file1 was  | ||||
|         updated, then it builds a xdsh command to the node to run   | ||||
|         /tmp/test/file1.post. | ||||
|         On the service node, the file will be in $syncdir/tmp/test/file1.post. | ||||
|         Also the routine must preserve all other messages returned from rsync,  | ||||
|         to return to the admin.  It will remove the messages that the files  | ||||
|         were updated, that is all of from hostname: <full file path>.	 | ||||
|        Input: the output from the xdcp rsync run | ||||
|             : @::postscripts  to run | ||||
|  | ||||
|         Comments: | ||||
|           Needs to remove the lines from rsync that are return to let | ||||
|           me know files were updated from the output to determine which  | ||||
|           postscripts to run and leave any other messages  | ||||
|           to return to the admin. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| sub run_rsync_postscripts  | ||||
| { | ||||
|     my ($rsyncoutput,$syncdir) = @_; | ||||
|     my @rsync_output   = @$rsyncoutput; | ||||
|     my @newoutput= ();  | ||||
|     my $dshparms;  | ||||
|     my $firstpass=1; | ||||
|     foreach my $postsfile (@::postscripts) { | ||||
|        my $tmppostfile = $postsfile ; | ||||
|   | ||||
|        # remove  first character, we have to do this because the | ||||
|        # return from rsync is tmp/file1  not /tmp/file1 | ||||
|        substr($tmppostfile,0,1)="";  | ||||
|  | ||||
|        # now remove .post from the postscript file for the compare | ||||
|        # with the returned file name | ||||
|        my($tp,$post) = split(/.post/,$tmppostfile); | ||||
|  | ||||
|        $tmppostfile = $tp; | ||||
|        foreach my $line (@rsync_output) { | ||||
|          my($hostname,$ps) = split(/: /, $line); | ||||
|          chomp $ps; | ||||
|          chomp $hostname; | ||||
|          if ($ps eq "rsync") {  # this is a line that is not an update  | ||||
|              # save output , if firstpass through output | ||||
|              if ($firstpass == 1) { | ||||
|                push @newoutput, $line; | ||||
|                $firstpass = 0; | ||||
|              } | ||||
|              next; | ||||
|          } | ||||
|          if ($tmppostfile eq $ps) {  | ||||
|            # build xdsh commands | ||||
|            # if on the service node need to add the $syncdir directory  | ||||
|            # to the path | ||||
|            if (xCAT::Utils->isServiceNode()) { | ||||
|              my $tmpp=$syncdir . $postsfile; | ||||
|              $postsfile=$tmpp; | ||||
|            } | ||||
|            # build host and all scripts to execute | ||||
|            push (@{$dshparms->{'postscripts'} {$postsfile}}, $hostname); | ||||
|          } | ||||
|        } | ||||
|     } | ||||
|     # now if we have postscripts to run, run xdsh | ||||
|     my $out; | ||||
|     foreach  my $ps ( keys %{$$dshparms{'postscripts'}}) { | ||||
|          my @nodes; | ||||
|          push (@nodes, @{$$dshparms{'postscripts'}{$ps}});  | ||||
|           | ||||
|          $out=xCAT::Utils->runxcmd( { command => ['xdsh'], | ||||
|                                     node    => \@nodes, | ||||
|                                     arg     => [ "-e", $ps ] | ||||
|                              }, $::SUBREQ, 0); | ||||
|          push @newoutput,$out; | ||||
|  | ||||
|     } | ||||
|     return @newoutput; | ||||
| } | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
|   | ||||
| @@ -113,8 +113,13 @@ sub remote_copy_command | ||||
|         { | ||||
|             $sync_opt = '--rsync-path /usr/bin/rsync '; | ||||
|         } | ||||
|  | ||||
|         $sync_opt .= '-Lprotz '; | ||||
|         # if only syncing the service node or no postscripts then do not | ||||
|         # get update file notification | ||||
|         if (($::SYNCSN  == 1) || (!(defined @::postscripts))) {  | ||||
|           $sync_opt .= '-Lprotz '; | ||||
|         } else { | ||||
|            $sync_opt .= '-Liprotz --out-format=%f%L '; # add notify of update | ||||
|         } | ||||
|         $sync_opt .= $$config{'options'}; | ||||
|         if ($::SYNCSN == 1) | ||||
|         {    # syncing service node | ||||
|   | ||||
		Reference in New Issue
	
	Block a user