import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-class BaseTransportChannelListener implements TransportChannelListener {
+public class BaseTransportChannelListener implements TransportChannelListener {
private static final Logger LOG = LoggerFactory.getLogger(BaseTransportChannelListener.class);
@Override
import static java.util.Objects.requireNonNull;
import com.google.common.util.concurrent.ListenableFuture;
-import java.util.List;
import org.opendaylight.netconf.server.api.NetconfServerFactory;
-import org.opendaylight.netconf.shaded.sshd.server.SshServer;
import org.opendaylight.netconf.transport.api.TransportChannelListener;
import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
import org.opendaylight.netconf.transport.ssh.SSHServer;
public ListenableFuture<SSHServer> createSshServer(final TcpServerGrouping tcpParams,
final SshServerGrouping sshParams, final ServerFactoryManagerConfigurator configurator)
throws UnsupportedConfigurationException {
- return factory.listenServer(EMPTY_LISTENER, tcpParams, sshParams, factoryManager -> {
- if (configurator != null) {
- configurator.configureServerFactoryManager(factoryManager);
- }
- if (factoryManager instanceof SshServer server) {
- server.setSubsystemFactories(List.of(new NetconfSubsystemFactory(channelInitializer)));
- }
- });
+ return factory.listenServer(EMPTY_LISTENER, new NetconfSubsystemFactory(channelInitializer), tcpParams,
+ sshParams, configurator);
}
}
import org.opendaylight.netconf.shaded.sshd.common.io.IoHandler;
import org.opendaylight.netconf.shaded.sshd.server.ServerFactoryManager;
import org.opendaylight.netconf.shaded.sshd.server.session.SessionFactory;
+import org.opendaylight.netconf.shaded.sshd.server.subsystem.SubsystemFactory;
import org.opendaylight.netconf.transport.api.TransportChannelListener;
import org.opendaylight.netconf.transport.api.TransportStack;
import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
}
static SSHServer of(final EventLoopGroup group, final TransportChannelListener listener,
- final SshServerGrouping serverParams, final ServerFactoryManagerConfigurator configurator)
- throws UnsupportedConfigurationException {
- return new SSHServer(listener, new TransportSshServer.Builder(group)
+ final SubsystemFactory subsystemFactory, final SshServerGrouping serverParams,
+ final ServerFactoryManagerConfigurator configurator) throws UnsupportedConfigurationException {
+ return new SSHServer(listener, new TransportSshServer.Builder(group, subsystemFactory)
.serverParams(serverParams)
.configurator(configurator)
.buildChecked());
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.EventLoopGroup;
import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.netconf.shaded.sshd.server.subsystem.SubsystemFactory;
import org.opendaylight.netconf.transport.api.TransportChannelListener;
import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
import org.opendaylight.netconf.transport.tcp.NettyTransportSupport;
}
public @NonNull ListenableFuture<SSHServer> connectServer(final TransportChannelListener listener,
- final TcpClientGrouping connectParams, final SshServerGrouping serverParams)
- throws UnsupportedConfigurationException {
- return SSHServer.of(group, listener, requireNonNull(serverParams), null).connect(newBootstrap(), connectParams);
+ final SubsystemFactory subsystemFactory, final TcpClientGrouping connectParams,
+ final SshServerGrouping serverParams) throws UnsupportedConfigurationException {
+ return SSHServer.of(group, listener, subsystemFactory, requireNonNull(serverParams), null)
+ .connect(newBootstrap(), connectParams);
}
public @NonNull ListenableFuture<SSHServer> listenServer(final TransportChannelListener listener,
- final TcpServerGrouping connectParams, final SshServerGrouping serverParams)
- throws UnsupportedConfigurationException {
- return listenServer(listener, connectParams, requireNonNull(serverParams), null);
+ final SubsystemFactory subsystemFactory, final TcpServerGrouping connectParams,
+ final SshServerGrouping serverParams) throws UnsupportedConfigurationException {
+ return listenServer(listener, subsystemFactory, connectParams, requireNonNull(serverParams), null);
}
/**
* Builds and starts SSH Server.
*
* @param listener server channel listener, required
+ * @param subsystemFactory A {@link SubsystemFactory} for the hosted subsystem
* @param listenParams TCP transport configuration, required
* @param serverParams SSH overlay configuration, optional if configurator is defined, required otherwise
* @param configurator server factory manager configurator, optional if serverParams is defined, required otherwise
* @throws IllegalArgumentException if both configurator and serverParams are null
*/
public @NonNull ListenableFuture<SSHServer> listenServer(final TransportChannelListener listener,
- final TcpServerGrouping listenParams, final SshServerGrouping serverParams,
- final ServerFactoryManagerConfigurator configurator) throws UnsupportedConfigurationException {
+ final SubsystemFactory subsystemFactory, final TcpServerGrouping listenParams,
+ final SshServerGrouping serverParams, final ServerFactoryManagerConfigurator configurator)
+ throws UnsupportedConfigurationException {
checkArgument(serverParams != null || configurator != null,
"Neither server parameters nor factory configurator is defined");
- return SSHServer.of(group, listener, serverParams, configurator).listen(newServerBootstrap(), listenParams);
+ return SSHServer.of(group, listener, subsystemFactory, serverParams, configurator)
+ .listen(newServerBootstrap(), listenParams);
}
/**
import org.opendaylight.netconf.shaded.sshd.server.auth.hostbased.UserAuthHostBasedFactory;
import org.opendaylight.netconf.shaded.sshd.server.auth.password.UserAuthPasswordFactory;
import org.opendaylight.netconf.shaded.sshd.server.auth.pubkey.UserAuthPublicKeyFactory;
+import org.opendaylight.netconf.shaded.sshd.server.subsystem.SubsystemFactory;
import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.server.rev230417.SshServerGrouping;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.server.rev230417.ssh.server.grouping.ClientAuthentication;
*/
static final class Builder extends ServerBuilder {
private final EventLoopGroup group;
+ private final SubsystemFactory subsystemFactory;
private ServerFactoryManagerConfigurator configurator;
private ClientAuthentication clientAuthentication;
private ServerIdentity serverIdentity;
private Keepalives keepAlives;
- Builder(final EventLoopGroup group) {
+ Builder(final EventLoopGroup group, final SubsystemFactory subsystemFactory) {
this.group = requireNonNull(group);
+ this.subsystemFactory = requireNonNull(subsystemFactory);
}
Builder serverParams(final SshServerGrouping serverParams) throws UnsupportedConfigurationException {
if (configurator != null) {
configurator.configureServerFactoryManager(ret);
}
+
+ ret.setSubsystemFactories(List.of(subsystemFactory));
ret.setScheduledExecutorService(group);
+
try {
ret.checkConfig();
} catch (IllegalArgumentException e) {
import org.opendaylight.netconf.shaded.sshd.server.auth.password.UserAuthPasswordFactory;
import org.opendaylight.netconf.shaded.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.opendaylight.netconf.shaded.sshd.server.session.ServerSession;
+import org.opendaylight.netconf.shaded.sshd.server.subsystem.SubsystemFactory;
import org.opendaylight.netconf.transport.api.TransportChannel;
import org.opendaylight.netconf.transport.api.TransportChannelListener;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
private SshServerGrouping sshServerConfig;
@Mock
private TransportChannelListener serverListener;
+ @Mock
+ private SubsystemFactory subsystemFactory;
@Captor
ArgumentCaptor<TransportChannel> clientTransportChannelCaptor;
private void integrationTest() throws Exception {
// start server
- final var server = FACTORY.listenServer(serverListener, tcpServerConfig, sshServerConfig)
+ final var server = FACTORY.listenServer(serverListener, subsystemFactory, tcpServerConfig, sshServerConfig)
.get(2, TimeUnit.SECONDS);
try {
// connect with client
// Accept all keys
when(sshClientConfig.getServerAuthentication()).thenReturn(null);
- final var server = FACTORY.listenServer(serverListener, tcpServerConfig, null,
+ final var server = FACTORY.listenServer(serverListener, subsystemFactory, tcpServerConfig, null,
factoryManager -> {
// authenticate user by credentials and generate host key
factoryManager.setUserAuthFactories(List.of(new UserAuthPasswordFactory()));