You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2014/01/06 16:41:13 UTC

svn commit: r1555866 - in /ant/core/trunk: WHATSNEW manual/Tasks/sshexec.html src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java

Author: bodewig
Date: Mon Jan  6 15:41:13 2014
New Revision: 1555866

URL: http://svn.apache.org/r1555866
Log:
various new attributes around System.err handling in sshexec.  Submitted by Gilbert Rebhan.  PR 48478

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/manual/Tasks/sshexec.html
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1555866&r1=1555865&r2=1555866&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Mon Jan  6 15:41:13 2014
@@ -81,6 +81,10 @@ Other changes:
  * <sshexec> can optionally pass System.in to the remote process
    Bugzilla Report 55393
 
+ * <sshexec> now supports capturing error output of the executed
+   process and setting a property from the return code.
+   Bugzilla Report 48478
+
 Changes from Ant 1.9.2 TO Ant 1.9.3
 ===================================
 

Modified: ant/core/trunk/manual/Tasks/sshexec.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/manual/Tasks/sshexec.html?rev=1555866&r1=1555865&r2=1555866&view=diff
==============================================================================
--- ant/core/trunk/manual/Tasks/sshexec.html (original)
+++ ant/core/trunk/manual/Tasks/sshexec.html Mon Jan  6 15:41:13 2014
@@ -122,16 +122,35 @@ and won't work with versions of jsch ear
     <td align="center" valign="top">No, defaults to false</td>
   </tr>
   <tr>
+    <td valign="top">suppresssystemerr</td>
+    <td valign="top">Whether to suppress system err.
+      <em>since Ant 1.9.4</em></td>
+    <td align="center" valign="top">No, defaults to false</td>
+  </tr>
+  <tr>
     <td valign="top">output</td>
     <td valign="top">Name of a file to which to write the output.</td>
     <td align="center" valign="top">No</td>
   </tr>
   <tr>
+    <td valign="top">errorOutput</td>
+    <td valign="top">The file to which the standard error of the
+    command should be redirected.  <em>since Ant 1.9.4</em></td>
+    <td align="center" valign="top">No</td>
+  </tr>
+  <tr>
     <td valign="top">append</td>
     <td valign="top">Whether output file should be appended to or overwritten. Defaults to false, meaning overwrite any existing file.</td>
     <td align="center" valign="top">No</td>
   </tr>
   <tr>
+    <td valign="top">errAppend</td>
+    <td valign="top">Whether errorOutput file should be appended to or
+    overwritten. Defaults to false, meaning overwrite any existing
+    file.  <em>since Ant 1.9.4</em></td>
+    <td align="center" valign="top">No</td>
+  </tr>
+  <tr>
     <td valign="top">outputproperty</td>
     <td valign="top">The name of a property in which the output of the 
       command should be stored.  If you use the commandResource
@@ -140,6 +159,19 @@ and won't work with versions of jsch ear
     <td align="center" valign="top">No</td>
   </tr>
   <tr>
+    <td valign="top">errorproperty</td>
+    <td valign="top">The name of a property in which the standard error of the
+      command should be stored.  <em>since Ant 1.9.4</em></td>
+    <td align="center" valign="top">No</td>
+  </tr>
+  <tr>
+    <td valign="top">resultproperty</td>
+    <td valign="top">the name of a property in which the return code
+      of the command should be stored. Only of interest if
+      failonerror=false.  <em>since Ant 1.9.4</em></td>
+    <td align="center" valign="top">No</td>
+  </tr>
+  <tr>
     <td valign="top">timeout</td>
     <td valign="top">Stop the command if it doesn't finish within the
       specified time (given in milliseconds <b>unlike telnet, which

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java?rev=1555866&r1=1555865&r2=1555866&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java Mon Jan  6 15:41:13 2014
@@ -62,11 +62,15 @@ public class SSHExec extends SSHBase {
     private Thread thread = null;
 
     private String outputProperty = null;   // like <exec>
+    private String errorProperty = null;
+    private String resultProperty = null;
     private File outputFile = null;   // like <exec>
+    private File errorFile = null;
     private String inputProperty = null;
     private String inputString = null;   // like <exec>
     private File inputFile = null;   // like <exec>
     private boolean append = false;   // like <exec>
+    private boolean appenderr = false;
     private boolean usePty = false;
     private boolean useSystemIn = false;
 
@@ -76,9 +80,14 @@ public class SSHExec extends SSHBase {
         "Timeout period exceeded, connection dropped.";
 
     /**
-     * To supress writing logs to System.out
+     * To suppress writing logs to System.out
      */
     private boolean suppressSystemOut = false;
+
+    /**
+     * To suppress writing logs to System.err
+     */
+    private boolean suppressSystemErr = false;
     
     /**
      * Constructor for SSHExecTask.
@@ -126,6 +135,16 @@ public class SSHExec extends SSHBase {
     }
 
     /**
+     * If used, stores the erroutput of the command to the given file.
+     *
+     * @param output  The file to write to.
+     * @since Apache Ant 1.9.4
+     */
+    public void setErrorOutput(File output) {
+      errorFile = output;
+    }
+
+    /**
      * If used, the content of the file is piped to the remote command
      *
      * @param input  The file which provides the input data for the remote command
@@ -169,6 +188,18 @@ public class SSHExec extends SSHBase {
     public void setAppend(boolean append) {
         this.append = append;
     }
+    
+    /**
+     * Determines if the output is appended to the file given in
+     * <code>setErrorOutput</code>. Default is false, that is, overwrite
+     * the file.
+     *
+     * @param append  True to append to an existing file, false to overwrite.
+     * @since Apache Ant 1.9.4
+     */    
+    public void setErrAppend(boolean appenderr) {
+      this.appenderr = appenderr;
+    }
 
     /**
      * If set, the output of the command will be stored in the given property.
@@ -179,6 +210,28 @@ public class SSHExec extends SSHBase {
     public void setOutputproperty(String property) {
         outputProperty = property;
     }
+    
+    /**
+     * If set, the erroroutput of the command will be stored in the given property.
+     *
+     * @param property  The name of the property in which the command erroroutput
+     *      will be stored.
+     * @since Apache Ant 1.9.4
+     */    
+    public void setErrorproperty (String property) {
+      errorProperty = property;
+    }
+    
+    /**
+     * If set, the exitcode of the command will be stored in the given property.
+     *
+     * @param property  The name of the property in which the exitcode
+     *      will be stored.
+     * @since Apache Ant 1.9.4
+     */    
+    public void setResultproperty(String property) {
+      resultProperty = property;
+    }
 
     /**
      * Whether a pseudo-tty should be allocated.
@@ -207,6 +260,17 @@ public class SSHExec extends SSHBase {
     {
         this.suppressSystemOut = suppressSystemOut;
     }
+    
+    /**
+     * If suppressSystemErr is <code>true</code>, output will not be sent to System.err<br/>
+     * If suppressSystemErr is <code>false</code>, normal behavior
+     * @since Ant 1.9.4
+     */
+    public void setSuppressSystemErr(boolean suppressSystemErr)
+    {
+        this.suppressSystemErr = suppressSystemErr;
+    }
+    
     /**
      * Execute the command on the remote host.
      *
@@ -290,6 +354,8 @@ public class SSHExec extends SSHBase {
     private void executeCommand(Session session, String cmd, StringBuffer sb)
         throws BuildException {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ByteArrayOutputStream errout = new ByteArrayOutputStream();
+        OutputStream teeErr = suppressSystemErr ? errout : new TeeOutputStream(out, KeepAliveOutputStream.wrapSystemErr());
         OutputStream tee = suppressSystemOut ? out : new TeeOutputStream(out, KeepAliveOutputStream.wrapSystemOut());
 
         InputStream istream = null ;
@@ -326,6 +392,7 @@ public class SSHExec extends SSHBase {
             channel.setCommand(cmd);
             channel.setOutputStream(tee);
             channel.setExtOutputStream(tee);
+            channel.setErrStream(teeErr);
             if (istream != null) {
                 channel.setInputStream(istream);
             }
@@ -360,14 +427,25 @@ public class SSHExec extends SSHBase {
                     log(TIMEOUT_MESSAGE, Project.MSG_ERR);
                 }
             } else {
-                //success
+                // stdout to outputFile
                 if (outputFile != null) {
                     writeToFile(out.toString(), append, outputFile);
                 }
-
+                // set errorProperty
+                if (errorProperty != null) {
+                    getProject().setNewProperty(errorProperty, errout.toString());    
+                }
+                // stderr to errorFile
+                if (errorFile != null) {
+                    writeToFile(errout.toString(), appenderr, errorFile);
+                }
                 // this is the wrong test if the remote OS is OpenVMS,
                 // but there doesn't seem to be a way to detect it.
                 int ec = channel.getExitStatus();
+                // set resultproperty
+                if (resultProperty != null) {
+                    getProject().setNewProperty(resultProperty, Integer.toString(ec));
+                }
                 if (ec != 0) {
                     String msg = "Remote command failed with exit status " + ec;
                     if (getFailonerror()) {