mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +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