add EXECUTEALWAYS clause in syncfile for xdcp -F
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@12371 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -4212,6 +4212,7 @@ sub parse_and_run_dcp | ||||
|         # the parsing of the file will fill in an array of postscripts  | ||||
|         # need to be run if the associated file is updated | ||||
|         @::postscripts=(); | ||||
|         @::alwayspostscripts=(); | ||||
|         if (xCAT::Utils->isServiceNode()) | ||||
|         {    # running on service node | ||||
|             $rc = | ||||
| @@ -4280,12 +4281,26 @@ sub parse_and_run_dcp | ||||
|     #  @::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 | ||||
|     my  @results2; | ||||
|     my  @results3; | ||||
|     if ((@::postscripts) && ($::SYNCSN == 0)) { | ||||
|       my @results2 = &run_rsync_postscripts(\@results,$synfiledir);  | ||||
|       return (@results2); | ||||
|        @results2 = &run_rsync_postscripts(\@results,$synfiledir);  | ||||
|     } | ||||
|     if ((@::alwayspostscripts) && ($::SYNCSN == 0)) { | ||||
|        @results3 = &run_always_rsync_postscripts(\@nodelist,$synfiledir);  | ||||
|     } | ||||
|     my @newresults; | ||||
|     if (@results2) { | ||||
|       @newresults = (@results2); | ||||
|     } | ||||
|     if (@results3) { | ||||
|       @newresults = (@newresults,@results3); | ||||
|     } | ||||
|     if (@newresults) { | ||||
|       return (@newresults); | ||||
|     } else { | ||||
|       return (@results); | ||||
|     } | ||||
|     }     | ||||
| } | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
| @@ -4295,7 +4310,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 | ||||
| 		Does not process the EXECUTE or EXECUTEALWAYS statement | ||||
|  | ||||
|         File format: | ||||
|           /.../file1 ->  /.../dir1/filex | ||||
| @@ -4345,7 +4360,8 @@ sub rsync_to_image | ||||
|  | ||||
|         # process no more lines, do not exec | ||||
|         # do not execute postscripts when syncing servicenodes | ||||
|         if ($line =~ /EXECUTE:/) { # process no more lines | ||||
|         if (($line =~ /EXECUTE:/) || ($line =~ /EXECUTEALWAYS:/)) | ||||
|         { # process no more lines | ||||
| 			last; | ||||
| 	} | ||||
|         if ($line =~ /(.+) -> (.+)/) | ||||
| @@ -4440,6 +4456,15 @@ sub rsync_to_image | ||||
|           /.../file1 ->  /.../dir1 | ||||
|           /.../*     ->  /.../dir1 | ||||
|           /.../file1 /..../filex  -> /...../dir1 | ||||
|           /tmp/file2  ->  /tmp/file2 | ||||
|           /tmp/file2.post -> /tmp/file2.post | ||||
|           EXECUTE:  | ||||
|           /tmp/file2.post | ||||
|           EXECUTEALWAYS: | ||||
|           /tmp/myscript1 | ||||
|           /tmp/myscript2 | ||||
|           . | ||||
|           . | ||||
|  | ||||
|         Arguments: | ||||
| 		  Input nodelist,options, pointer to the sync file,flag is  | ||||
| @@ -4476,25 +4501,71 @@ sub parse_rsync_input_file_on_MN | ||||
|     while (my $line = <INPUTFILE>) | ||||
|     { | ||||
|         chomp $line; | ||||
|         if ($line =~ /^#/)    # skip commments | ||||
|         if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|         { | ||||
|             next; | ||||
|         } | ||||
|         # if syncing only the service node directory, do not execute | ||||
|         # postscripts | ||||
|         if ($line =~ /EXECUTE:/) { | ||||
|         if ($line =~ /EXECUTE:/) {  # execute if files sync'd | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while (my $line = <INPUTFILE>) | ||||
|              while ( $line = <INPUTFILE>) | ||||
|              { | ||||
|                if ($line =~ /EXECUTEALWAYS:/) {   | ||||
|                   # finished with EXECUTE clause  | ||||
|                   while ( $line = <INPUTFILE>) | ||||
|                   { | ||||
|                     chomp $line; | ||||
|                     if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                     { | ||||
|                      next; | ||||
|                     } | ||||
|                     push @::alwayspostscripts,$line; | ||||
|                   } | ||||
|                     | ||||
|                } | ||||
|                chomp $line; | ||||
|                if ($line =~ /^#/)    # skip commments | ||||
|                if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                { | ||||
|                  next; | ||||
|                } | ||||
|                push @::postscripts,$line; | ||||
|               } | ||||
|              } | ||||
|             | ||||
|          } | ||||
|         } | ||||
|         if ($line =~ /EXECUTEALWAYS:/) {  # execute always  | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while ( $line = <INPUTFILE>) | ||||
|              { | ||||
|                if ($line =~ /EXECUTE:/) {   | ||||
|                   # finished with EXECUTEALWAYS clause  | ||||
|                   while ( $line = <INPUTFILE>) | ||||
|                   { | ||||
|                     chomp $line; | ||||
|                     if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                     { | ||||
|                      next; | ||||
|                     } | ||||
|                     push @::postscripts,$line; | ||||
|                   } | ||||
|                } | ||||
|                chomp $line; | ||||
|                if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                { | ||||
|                  next; | ||||
|                } | ||||
|                push @::alwayspostscripts,$line; | ||||
|              } | ||||
|             | ||||
|          } | ||||
|         } | ||||
| @@ -4652,18 +4723,33 @@ sub parse_rsync_input_file_on_SN | ||||
|     while (my $line = <INPUTFILE>) | ||||
|     { | ||||
|         chomp $line; | ||||
|         if ($line =~ /^#/)    # skip commments | ||||
|         if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|         { | ||||
|             next; | ||||
|         } | ||||
|         # if syncing only the service node directory, do not execute | ||||
|         # postscripts | ||||
|         if ($line =~ /EXECUTE:/) { | ||||
|         if ($line =~ /EXECUTE:/) {  # these we execute only if file is sync'd | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while (my $line = <INPUTFILE>) | ||||
|              { | ||||
|                if ($line =~ /EXECUTEALWAYS:/) {   | ||||
|                   # finished with EXECUTE clause  | ||||
|                   while ( $line = <INPUTFILE>) | ||||
|                   { | ||||
|                     chomp $line; | ||||
|                     if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                     { | ||||
|                      next; | ||||
|                     } | ||||
|                     push @::alwayspostscripts,$line; | ||||
|                   } | ||||
|                     | ||||
|                } | ||||
|                chomp $line; | ||||
|                if ($line =~ /^#/)    # skip commments | ||||
|                { | ||||
| @@ -4674,6 +4760,37 @@ sub parse_rsync_input_file_on_SN | ||||
|             | ||||
|          } | ||||
|         } | ||||
|         # These we always execute | ||||
|         if ($line =~ /EXECUTEALWAYS:/) { | ||||
|           if ($::SYNCSN == 1) { | ||||
|         	last; | ||||
|           } else { | ||||
|              while ( $line = <INPUTFILE>) | ||||
|              { | ||||
|                if ($line =~ /EXECUTE:/) {   | ||||
|                   # finished with EXECUTEALWAYS clause  | ||||
|                   while ( $line = <INPUTFILE>) | ||||
|                   { | ||||
|                     chomp $line; | ||||
|                     if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                     { | ||||
|                      next; | ||||
|                     } | ||||
|                     push @::postscripts,$line; | ||||
|                   } | ||||
|                } | ||||
|                chomp $line; | ||||
|                if (($line =~ /^#/) || ( $line =~ /^\s*$/ )) | ||||
|                         # skip commments  and blanks | ||||
|                { | ||||
|                  next; | ||||
|                } | ||||
|                push @::alwayspostscripts,$line; | ||||
|               } | ||||
|             | ||||
|          } | ||||
|         } | ||||
|         if ($line =~ /(.+) -> (.+)/) | ||||
|         { | ||||
|             $process_line = 1; | ||||
| @@ -4774,6 +4891,7 @@ sub parse_rsync_input_file_on_SN | ||||
|  | ||||
|         This executes the postscript file on the nodes where | ||||
| 	    the corresponding rsync file was updated | ||||
|         These are the scripts after EXECUTE: in the syncfile | ||||
|         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) | ||||
| @@ -4809,13 +4927,13 @@ sub run_rsync_postscripts | ||||
|     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 | ||||
|        # if service node need to add the SNsyncfiledir to the path | ||||
|        if (xCAT::Utils->isServiceNode()) { | ||||
|          my $tmpp=$syncdir . $tmppostfile; | ||||
|          $tmppostfile = $tmpp; | ||||
|        } | ||||
|        # remove  first character for the compare, 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 | ||||
| @@ -4869,6 +4987,65 @@ sub run_rsync_postscripts | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 | ||||
|      run_always_rsync_postscript  | ||||
|  | ||||
|   This subroutine runs the xdsh command for all the scripts listed in the | ||||
|   EXECUTEALWAYS: clause of the synclist file.  | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| sub run_always_rsync_postscripts  | ||||
| { | ||||
|     my ($hostnames,$syncdir) = @_; | ||||
|     my @hosts   = @$hostnames; | ||||
|     my @newoutput= ();  | ||||
|     my $dshparms;  | ||||
|     foreach my $postsfile (@::alwayspostscripts) { | ||||
|        my $tmppostfile = $postsfile ; | ||||
|   | ||||
|        # if service node need to add the SNsyncfiledir to the path | ||||
|        if (xCAT::Utils->isServiceNode()) { | ||||
|          my $tmpp=$syncdir . $tmppostfile; | ||||
|          $tmppostfile = $tmpp; | ||||
|        } | ||||
|  | ||||
|        foreach my $host (@hosts) { | ||||
|          # build xdsh queue  | ||||
|          # build host and all scripts to execute | ||||
|          push (@{$dshparms->{'postscripts'} {$postsfile}}, $host); | ||||
|        } | ||||
|     } | ||||
|     # now if we have postscripts to run, run xdsh | ||||
|     my $out; | ||||
|     foreach  my $ps ( keys %{$$dshparms{'postscripts'}}) { | ||||
|         my @nodes; | ||||
|         push (@nodes, @{$$dshparms{'postscripts'}{$ps}});  | ||||
|         # if on the service node need to add the $syncdir directory  | ||||
|         # to the path | ||||
|         if (xCAT::Utils->isServiceNode()) { | ||||
|          my $tmpp=$syncdir . $ps; | ||||
|          $ps=$tmpp; | ||||
|         } | ||||
|           | ||||
|          $out=xCAT::Utils->runxcmd( { command => ['xdsh'], | ||||
|                                     node    => \@nodes, | ||||
|                                     arg     => [ "-e", $ps ] | ||||
|                              }, $::SUBREQ, 0,1); | ||||
|         foreach my $r (@$out){ | ||||
|                 push(@newoutput, $r); | ||||
|  | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|     return @newoutput; | ||||
| } | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| =head3 | ||||
|       runlocal_on_rootimg | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user