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:
parent
5cf83aad5b
commit
7c48ae3e2e
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user