Browse Source

BZ-65089 support setting arbitrary configs for JSch Session

master
Stefan Bodewig 4 years ago
parent
commit
b01e7008ba
5 changed files with 99 additions and 4 deletions
  1. +5
    -0
      WHATSNEW
  2. +25
    -0
      manual/Tasks/scp.html
  3. +27
    -0
      manual/Tasks/sshexec.html
  4. +25
    -0
      manual/Tasks/sshsession.html
  5. +17
    -4
      src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java

+ 5
- 0
WHATSNEW View File

@@ -56,6 +56,11 @@ Other changes:
individually before concatenating them. individually before concatenating them.
Bugzilla Report 64855 Bugzilla Report 64855


* the ssh tasks now share a new nested element additionalConfig that
can be used to set config values for the jsch Session used by the
task.
Bugzilla Report 65089

Changes from Ant 1.10.8 TO Ant 1.10.9 Changes from Ant 1.10.8 TO Ant 1.10.9
===================================== =====================================




+ 25
- 0
manual/Tasks/scp.html View File

@@ -217,6 +217,31 @@ set.</p>


<p>Prior to Ant 1.9.7 only <code>&lt;fileset&gt;</code> has been supported as a nested element.</p> <p>Prior to Ant 1.9.7 only <code>&lt;fileset&gt;</code> has been supported as a nested element.</p>


<h4 id="additionalConfig">additionalConfig</h4>

<p><em>since Ant 1.10.10</em></p>

<p>Adds configuration settings for the JSch Session created that are
not directly supported by specific Ant attributes.</p>

<table class="attr">
<tr>
<th scope="col">Attribute</th>
<th scope="col">Description</th>
<th scope="col">Required</th>
</tr>
<tr>
<td>key</td>
<td>The key of the configuration setting.</td>
<td>Yes</td>
</tr>
<tr>
<td>value</td>
<td>The value of the configuration setting.</td>
<td>Yes</td>
</tr>
</table>

<h3>Examples</h3> <h3>Examples</h3>
<p>Copy a single local file to a remote machine:</p> <p>Copy a single local file to a remote machine:</p>
<pre>&lt;scp file=&quot;myfile.txt&quot; todir=&quot;user:password@somehost:/home/chuck&quot;/&gt;</pre> <pre>&lt;scp file=&quot;myfile.txt&quot; todir=&quot;user:password@somehost:/home/chuck&quot;/&gt;</pre>


+ 27
- 0
manual/Tasks/sshexec.html View File

@@ -230,6 +230,33 @@ JSCh earlier than 0.1.28.</p>
</tr> </tr>
</table> </table>


<h3>Parameters specified as nested elements</h3>

<h4 id="additionalConfig">additionalConfig</h4>

<p><em>since Ant 1.10.10</em></p>

<p>Adds configuration settings for the JSch Session created that are
not directly supported by specific Ant attributes.</p>

<table class="attr">
<tr>
<th scope="col">Attribute</th>
<th scope="col">Description</th>
<th scope="col">Required</th>
</tr>
<tr>
<td>key</td>
<td>The key of the configuration setting.</td>
<td>Yes</td>
</tr>
<tr>
<td>value</td>
<td>The value of the configuration setting.</td>
<td>Yes</td>
</tr>
</table>

<h3>Examples</h3> <h3>Examples</h3>


<p>Run a command on a remote machine using password authentication</p> <p>Run a command on a remote machine using password authentication</p>


+ 25
- 0
manual/Tasks/sshsession.html View File

@@ -186,6 +186,31 @@ both sets of tunnels will be established.</p>
</tr> </tr>
</table> </table>


<h4 id="additionalConfig">additionalConfig</h4>

<p><em>since Ant 1.10.10</em></p>

<p>Adds configuration settings for the JSch Session created that are
not directly supported by specific Ant attributes.</p>

<table class="attr">
<tr>
<th scope="col">Attribute</th>
<th scope="col">Description</th>
<th scope="col">Required</th>
</tr>
<tr>
<td>key</td>
<td>The key of the configuration setting.</td>
<td>Yes</td>
</tr>
<tr>
<td>value</td>
<td>The value of the configuration setting.</td>
<td>Yes</td>
</tr>
</table>

<h4 id="Sequential">sequential</h4> <h4 id="Sequential">sequential</h4>
<p>The <code>sequential</code> element is a required parameter. It is a container for nested Tasks <p>The <code>sequential</code> element is a required parameter. It is a container for nested Tasks
which are to be executed once the SSH connection is established and all local and/or remote tunnels which are to be executed once the SSH connection is established and all local and/or remote tunnels


+ 17
- 4
src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java View File

@@ -20,12 +20,15 @@ package org.apache.tools.ant.taskdefs.optional.ssh;


import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


import com.jcraft.jsch.ConfigRepository; import com.jcraft.jsch.ConfigRepository;
import com.jcraft.jsch.OpenSSHConfig; import com.jcraft.jsch.OpenSSHConfig;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Environment.Variable;


import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException; import com.jcraft.jsch.JSchException;
@@ -50,6 +53,7 @@ public abstract class SSHBase extends Task implements LogListener {
private String sshConfig; private String sshConfig;
private int serverAliveCountMax = 3; private int serverAliveCountMax = 3;
private int serverAliveIntervalSeconds = 0; private int serverAliveIntervalSeconds = 0;
private final Map<String, String> additionalConfig = new HashMap<>();


/** /**
* Constructor for SSHBase. * Constructor for SSHBase.
@@ -247,6 +251,10 @@ public abstract class SSHBase extends Task implements LogListener {
return port; return port;
} }


public void addConfiguredAdditionalConfig(final Variable v) {
additionalConfig.put(v.getKey(), v.getValue());
}

/** /**
* Initialize the task. * Initialize the task.
* This initializes the known hosts and sets the default port. * This initializes the known hosts and sets the default port.
@@ -268,7 +276,7 @@ public abstract class SSHBase extends Task implements LogListener {
if (!new File(sshConfig).exists()) { if (!new File(sshConfig).exists()) {
throw new BuildException("The SSH configuration file specified doesn't exist: " + sshConfig); throw new BuildException("The SSH configuration file specified doesn't exist: " + sshConfig);
} }
log("Loading SSH configuration file " + sshConfig, Project.MSG_DEBUG); log("Loading SSH configuration file " + sshConfig, Project.MSG_DEBUG);
ConfigRepository.Config config = null; ConfigRepository.Config config = null;
try { try {
@@ -276,15 +284,15 @@ public abstract class SSHBase extends Task implements LogListener {
} catch (IOException e) { } catch (IOException e) {
throw new BuildException("Failed to load the SSH configuration file " + sshConfig, e); throw new BuildException("Failed to load the SSH configuration file " + sshConfig, e);
} }
if (config.getHostname() != null) { if (config.getHostname() != null) {
host = config.getHostname(); host = config.getHostname();
} }
if (userInfo.getName() == null) { if (userInfo.getName() == null) {
userInfo.setName(config.getUser()); userInfo.setName(config.getUser());
} }
if (userInfo.getKeyfile() == null) { if (userInfo.getKeyfile() == null) {
log("Using SSH key file " + config.getValue("IdentityFile") + " for host " + host, Project.MSG_INFO); log("Using SSH key file " + config.getValue("IdentityFile") + " for host " + host, Project.MSG_INFO);
userInfo.setKeyfile(config.getValue("IdentityFile")); userInfo.setKeyfile(config.getValue("IdentityFile"));
@@ -332,6 +340,11 @@ public abstract class SSHBase extends Task implements LogListener {
session.setServerAliveInterval(getServerAliveIntervalSeconds() * 1000); session.setServerAliveInterval(getServerAliveIntervalSeconds() * 1000);
} }


additionalConfig.forEach((k,v) -> {
log("Setting additional config value " + k, Project.MSG_DEBUG);
session.setConfig(k, v);
});

log("Connecting to " + host + ":" + port); log("Connecting to " + host + ":" + port);
session.connect(); session.connect();
return session; return session;


Loading…
Cancel
Save