Author: gnodet
Date: Thu Feb 11 14:32:17 2010
New Revision: 908998
URL: http://svn.apache.org/viewvc?rev=908998&view=rev
Log:
SSHD-68: Support subsystem on the client side
Added:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
Modified:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientChannel.java
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientSession.java
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
Modified:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientChannel.java
URL:
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientChannel.java?rev=908998&r1=908997&r2=908998&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientChannel.java
(original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientChannel.java
Thu Feb 11 14:32:17 2010
@@ -35,6 +35,7 @@
String CHANNEL_EXEC = "exec";
String CHANNEL_SHELL = "shell";
+ String CHANNEL_SUBSYSTEM = "subsystem";
int TIMEOUT = 0x0001;
int CLOSED = 0x0002;
Modified:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientSession.java
URL:
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientSession.java?rev=908998&r1=908997&r2=908998&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientSession.java
(original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/ClientSession.java
Thu Feb 11 14:32:17 2010
@@ -22,6 +22,9 @@
import java.security.KeyPair;
import java.security.PublicKey;
+import org.apache.sshd.client.channel.ChannelExec;
+import org.apache.sshd.client.channel.ChannelSession;
+import org.apache.sshd.client.channel.ChannelSubsystem;
import org.apache.sshd.client.future.AuthFuture;
import org.apache.sshd.common.future.CloseFuture;
@@ -61,6 +64,14 @@
ClientChannel createChannel(String type) throws Exception;
+ ClientChannel createChannel(String type, String subType) throws Exception;
+
+ ChannelSession createShellChannel() throws Exception;
+
+ ChannelExec createExecChannel(String command) throws Exception;
+
+ ChannelSubsystem createSubsystemChannel(String subsystem) throws Exception;
+
int waitFor(int mask, long timeout);
CloseFuture close(boolean immediately);
Modified:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
URL:
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java?rev=908998&r1=908997&r2=908998&view=diff
==============================================================================
---
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
(original)
+++
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
Thu Feb 11 14:32:17 2010
@@ -18,8 +18,6 @@
*/
package org.apache.sshd.client.channel;
-import java.io.ByteArrayOutputStream;
-
import org.apache.sshd.common.SshConstants;
import org.apache.sshd.common.util.Buffer;
@@ -30,59 +28,23 @@
*/
public class ChannelExec extends ChannelSession {
- protected void doOpen() throws Exception {
- super.doOpen();
-
- Buffer buffer;
+ private final String command;
-// log.info("Send SSH_MSG_CHANNEL_REQUEST pty-req");
-// buffer =
session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_REQUEST);
-// buffer.putInt(recipient);
-// buffer.putString("pty-req");
-// buffer.putBoolean(false);
-// buffer.putString(System.getProperty("TERM", "dummy"));
-// buffer.putInt(80);
-// buffer.putInt(24);
-// buffer.putInt(640);
-// buffer.putInt(480);
-// Buffer modes = new Buffer();
-// modes.putByte((byte) 50); // ISIG
-// modes.putInt(1);
-// modes.putByte((byte) 51); // ICANON
-// modes.putInt(1);
-// modes.putByte((byte) 53); // ECHO
-// modes.putInt(1);
-// modes.putByte((byte) 54); // ECHOE
-// modes.putInt(1);
-// modes.putByte((byte) 55); // ECHOK
-// modes.putInt(1);
-// modes.putByte((byte) 56); // ECHONL
-// modes.putInt(0);
-// modes.putByte((byte) 57); // NOFLSH
-// modes.putInt(0);
-// modes.putByte((byte) 0);
-// buffer.putBytes(modes.getCompactData());
-// session.writePacket(buffer);
-
-// log.info("Send SSH_MSG_CHANNEL_REQUEST env");
-// buffer =
session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_REQUEST);
-// buffer.putInt(recipient);
-// buffer.putString("env");
-// session.writePacket(buffer);
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[8192];
- while (in.available() > 0) {
- int l = in.read(buf);
- baos.write(buf, 0, l);
+ public ChannelExec(String command) {
+ if (command == null) {
+ throw new IllegalArgumentException("command must not be null");
}
+ this.command = command;
+ }
+ protected void doOpen() throws Exception {
+ super.doOpen();
log.info("Send SSH_MSG_CHANNEL_REQUEST exec");
- buffer =
session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_REQUEST, 0);
+ Buffer buffer =
session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_REQUEST, 0);
buffer.putInt(recipient);
buffer.putString("exec");
buffer.putBoolean(false);
- buffer.putString(baos.toString());
+ buffer.putString(command);
session.writePacket(buffer);
}
Added:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
URL:
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java?rev=908998&view=auto
==============================================================================
---
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
(added)
+++
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
Thu Feb 11 14:32:17 2010
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.client.channel;
+
+import org.apache.sshd.common.SshConstants;
+import org.apache.sshd.common.util.Buffer;
+
+/**
+ * Client channel to run a subsystem
+ *
+ * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a>
+ */
+public class ChannelSubsystem extends ChannelSession {
+
+ private final String subsystem;
+
+ public ChannelSubsystem(String subsystem) {
+ if (subsystem == null) {
+ throw new IllegalArgumentException("subsystem must not be null");
+ }
+ this.subsystem = subsystem;
+ }
+
+ protected void doOpen() throws Exception {
+ super.doOpen();
+ log.info("Send SSH_MSG_CHANNEL_REQUEST exec");
+ Buffer buffer =
session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_REQUEST, 0);
+ buffer.putInt(recipient);
+ buffer.putString("subsystem");
+ buffer.putBoolean(false);
+ buffer.putString(subsystem);
+ session.writePacket(buffer);
+
+ }
+}
Modified:
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
URL:
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java?rev=908998&r1=908997&r2=908998&view=diff
==============================================================================
---
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
(original)
+++
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
Thu Feb 11 14:32:17 2010
@@ -31,6 +31,7 @@
import org.apache.sshd.client.channel.AbstractClientChannel;
import org.apache.sshd.client.channel.ChannelShell;
import org.apache.sshd.client.channel.ChannelExec;
+import org.apache.sshd.client.channel.ChannelSubsystem;
import org.apache.sshd.client.future.AuthFuture;
import org.apache.sshd.client.future.DefaultAuthFuture;
import org.apache.sshd.client.future.OpenFuture;
@@ -134,15 +135,35 @@
}
public ClientChannel createChannel(String type) throws Exception {
- // TODO: use NamedFactory to create channel
- AbstractClientChannel channel;
+ return createChannel(type, null);
+ }
+
+ public ClientChannel createChannel(String type, String subType) throws
Exception {
if (ClientChannel.CHANNEL_SHELL.equals(type)) {
- channel = new ChannelShell();
+ return createShellChannel();
} else if (ClientChannel.CHANNEL_EXEC.equals(type)) {
- channel = new ChannelExec();
+ return createExecChannel(subType);
+ } else if (ClientChannel.CHANNEL_SUBSYSTEM.equals(type)) {
+ return createSubsystemChannel(subType);
} else {
throw new IllegalArgumentException("Unsupported channel type " +
type);
}
+ }
+
+ public ChannelShell createShellChannel() throws Exception {
+ ChannelShell channel = new ChannelShell();
+ registerChannel(channel);
+ return channel;
+ }
+
+ public ChannelExec createExecChannel(String command) throws Exception {
+ ChannelExec channel = new ChannelExec(command);
+ registerChannel(channel);
+ return channel;
+ }
+
+ public ChannelSubsystem createSubsystemChannel(String subsystem) throws
Exception {
+ ChannelSubsystem channel = new ChannelSubsystem(subsystem);
registerChannel(channel);
return channel;
}