mirror of https://github.com/apache/jclouds.git
Issue 79: ssh key support
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2232 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
faf79d4fa3
commit
8fab264dd4
|
@ -184,8 +184,13 @@ public class GaeHttpCommandExecutorServiceTest {
|
||||||
private void testHoot(HttpRequest request) throws IOException {
|
private void testHoot(HttpRequest request) throws IOException {
|
||||||
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, "text/plain");
|
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, "text/plain");
|
||||||
HTTPRequest gaeRequest = client.convert(request);
|
HTTPRequest gaeRequest = client.convert(request);
|
||||||
|
try {
|
||||||
assertEquals(gaeRequest.getHeaders().get(0).getName(), HttpHeaders.CONTENT_TYPE);
|
assertEquals(gaeRequest.getHeaders().get(0).getName(), HttpHeaders.CONTENT_TYPE);
|
||||||
assertEquals(gaeRequest.getHeaders().get(0).getValue(), "text/plain");
|
assertEquals(gaeRequest.getHeaders().get(0).getValue(), "text/plain");
|
||||||
|
} catch (AssertionError e) {
|
||||||
|
assertEquals(gaeRequest.getHeaders().get(1).getName(), HttpHeaders.CONTENT_TYPE);
|
||||||
|
assertEquals(gaeRequest.getHeaders().get(1).getValue(), "text/plain");
|
||||||
|
}
|
||||||
assertEquals(new String(gaeRequest.getPayload()), "hoot!");
|
assertEquals(new String(gaeRequest.getPayload()), "hoot!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,9 +79,12 @@ public class JschSshClient implements SshClient {
|
||||||
private final int port;
|
private final int port;
|
||||||
private final String username;
|
private final String username;
|
||||||
private final String password;
|
private final String password;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
private Session session;
|
private Session session;
|
||||||
|
private final byte[] privateKey;
|
||||||
|
final byte[] emptyPassPhrase = new byte[0];
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public JschSshClient(InetSocketAddress socket, String username, String password) {
|
public JschSshClient(InetSocketAddress socket, String username, String password) {
|
||||||
|
@ -90,6 +93,17 @@ public class JschSshClient implements SshClient {
|
||||||
this.port = socket.getPort();
|
this.port = socket.getPort();
|
||||||
this.username = checkNotNull(username, "username");
|
this.username = checkNotNull(username, "username");
|
||||||
this.password = checkNotNull(password, "password");
|
this.password = checkNotNull(password, "password");
|
||||||
|
this.privateKey = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public JschSshClient(InetSocketAddress socket, String username, byte[] privateKey) {
|
||||||
|
this.host = checkNotNull(socket, "socket").getAddress();
|
||||||
|
checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort());
|
||||||
|
this.port = socket.getPort();
|
||||||
|
this.username = checkNotNull(username, "username");
|
||||||
|
this.password = null;
|
||||||
|
this.privateKey = checkNotNull(privateKey, "privateKey");
|
||||||
}
|
}
|
||||||
|
|
||||||
public InputStream get(String path) {
|
public InputStream get(String path) {
|
||||||
|
@ -125,12 +139,16 @@ public class JschSshClient implements SshClient {
|
||||||
session = null;
|
session = null;
|
||||||
try {
|
try {
|
||||||
session = jsch.getSession(username, host.getHostAddress(), port);
|
session = jsch.getSession(username, host.getHostAddress(), port);
|
||||||
|
logger.debug("%s@%s:%d: Session created.", username, host.getHostAddress(), port);
|
||||||
|
if (password != null) {
|
||||||
|
session.setPassword(password);
|
||||||
|
} else {
|
||||||
|
jsch.addIdentity(username, privateKey, null, emptyPassPhrase);
|
||||||
|
}
|
||||||
} catch (JSchException e) {
|
} catch (JSchException e) {
|
||||||
throw new SshException(String.format("%s@%s:%d: Error creating session.", username, host
|
throw new SshException(String.format("%s@%s:%d: Error creating session.", username, host
|
||||||
.getHostAddress(), port), e);
|
.getHostAddress(), port), e);
|
||||||
}
|
}
|
||||||
logger.debug("%s@%s:%d: Session created.", username, host.getHostAddress(), port);
|
|
||||||
session.setPassword(password);
|
|
||||||
java.util.Properties config = new java.util.Properties();
|
java.util.Properties config = new java.util.Properties();
|
||||||
config.put("StrictHostKeyChecking", "no");
|
config.put("StrictHostKeyChecking", "no");
|
||||||
session.setConfig(config);
|
session.setConfig(config);
|
||||||
|
|
|
@ -49,5 +49,9 @@ public class JschSshClientModule extends AbstractModule {
|
||||||
return new JschSshClient(socket, username, password);
|
return new JschSshClient(socket, username, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SshClient create(InetSocketAddress socket, String username, byte[] privateKey) {
|
||||||
|
return new JschSshClient(socket, username, privateKey);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,6 +25,8 @@ package org.jclouds.ssh.jsch;
|
||||||
|
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
@ -53,14 +55,16 @@ public class JschSshClientLiveTest {
|
||||||
protected static final String sshPort = System.getProperty("jclouds.test.ssh.port");
|
protected static final String sshPort = System.getProperty("jclouds.test.ssh.port");
|
||||||
protected static final String sshUser = System.getProperty("jclouds.test.ssh.username");
|
protected static final String sshUser = System.getProperty("jclouds.test.ssh.username");
|
||||||
protected static final String sshPass = System.getProperty("jclouds.test.ssh.password");
|
protected static final String sshPass = System.getProperty("jclouds.test.ssh.password");
|
||||||
|
protected static final String sshKeyFile = System.getProperty("jclouds.test.ssh.keyfile");
|
||||||
|
|
||||||
@BeforeGroups(groups = { "live" })
|
@BeforeGroups(groups = { "live" })
|
||||||
public SshClient setupClient() throws NumberFormatException, UnknownHostException {
|
public SshClient setupClient() throws NumberFormatException, FileNotFoundException, IOException {
|
||||||
int port = (sshPort != null) ? Integer.parseInt(sshPort) : 22;
|
int port = (sshPort != null) ? Integer.parseInt(sshPort) : 22;
|
||||||
InetAddress host = (sshHost != null) ? InetAddress.getByName(sshHost) : InetAddress
|
InetAddress host = (sshHost != null) ? InetAddress.getByName(sshHost) : InetAddress
|
||||||
.getLocalHost();
|
.getLocalHost();
|
||||||
if (sshUser == null || sshPass == null || sshUser.trim().equals("")
|
if (sshUser == null
|
||||||
|| sshPass.trim().equals("")) {
|
|| ((sshPass == null || sshPass.trim().equals("")) && (sshKeyFile == null || sshKeyFile
|
||||||
|
.trim().equals(""))) || sshUser.trim().equals("")) {
|
||||||
System.err.println("ssh credentials not present. Tests will be lame");
|
System.err.println("ssh credentials not present. Tests will be lame");
|
||||||
return new SshClient() {
|
return new SshClient() {
|
||||||
|
|
||||||
|
@ -92,7 +96,13 @@ public class JschSshClientLiveTest {
|
||||||
} else {
|
} else {
|
||||||
Injector i = Guice.createInjector(new JschSshClientModule());
|
Injector i = Guice.createInjector(new JschSshClientModule());
|
||||||
SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
|
SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
|
||||||
SshClient connection = factory.create(new InetSocketAddress(host, port), sshUser, sshPass);
|
SshClient connection;
|
||||||
|
if (sshKeyFile != null && !sshKeyFile.trim().equals("")) {
|
||||||
|
connection = factory.create(new InetSocketAddress(host, port), sshUser, Utils
|
||||||
|
.toStringAndClose(new FileInputStream(sshKeyFile)).getBytes());
|
||||||
|
} else {
|
||||||
|
connection = factory.create(new InetSocketAddress(host, port), sshUser, sshPass);
|
||||||
|
}
|
||||||
connection.connect();
|
connection.connect();
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
<jclouds.test.ssh.port>22</jclouds.test.ssh.port>
|
<jclouds.test.ssh.port>22</jclouds.test.ssh.port>
|
||||||
<jclouds.test.ssh.username />
|
<jclouds.test.ssh.username />
|
||||||
<jclouds.test.ssh.password />
|
<jclouds.test.ssh.password />
|
||||||
|
<jclouds.test.ssh.keyfile />
|
||||||
</properties>
|
</properties>
|
||||||
<profiles>
|
<profiles>
|
||||||
<profile>
|
<profile>
|
||||||
|
@ -89,6 +90,10 @@
|
||||||
<name>jclouds.test.ssh.username</name>
|
<name>jclouds.test.ssh.username</name>
|
||||||
<value>${jclouds.test.ssh.username}</value>
|
<value>${jclouds.test.ssh.username}</value>
|
||||||
</property>
|
</property>
|
||||||
|
<property>
|
||||||
|
<name>jclouds.test.ssh.keyfile</name>
|
||||||
|
<value>${jclouds.test.ssh.keyfile}</value>
|
||||||
|
</property>
|
||||||
<property>
|
<property>
|
||||||
<name>jclouds.test.ssh.password</name>
|
<name>jclouds.test.ssh.password</name>
|
||||||
<value>${jclouds.test.ssh.password}</value>
|
<value>${jclouds.test.ssh.password}</value>
|
||||||
|
|
Loading…
Reference in New Issue