X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-ssh%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fosgi%2FNetconfSSHActivator.java;h=1bce3143d5a8fc29831bc5b90a62fdad8d9376ad;hp=6f164f93d9c9482613a286352a6868e41cf649c3;hb=675309c1e47b406be2b0e6da46bd0b5cfdfd77e7;hpb=f75b60147b1e6b4f47e4837480c1ed8bac963edb diff --git a/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/osgi/NetconfSSHActivator.java b/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/osgi/NetconfSSHActivator.java index 6f164f93d9..1bce3143d5 100644 --- a/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/osgi/NetconfSSHActivator.java +++ b/opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/netconf/osgi/NetconfSSHActivator.java @@ -8,11 +8,18 @@ package org.opendaylight.controller.netconf.osgi; import com.google.common.base.Optional; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.net.InetSocketAddress; import org.opendaylight.controller.netconf.ssh.NetconfSSHServer; +import org.opendaylight.controller.netconf.ssh.authentication.AuthProvider; import org.opendaylight.controller.netconf.util.osgi.NetconfConfigUtil; +import org.opendaylight.controller.usermanager.IUserManager; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,17 +38,78 @@ public class NetconfSSHActivator implements BundleActivator{ private NetconfSSHServer server; private static final Logger logger = LoggerFactory.getLogger(NetconfSSHActivator.class); private static final String EXCEPTION_MESSAGE = "Netconf ssh bridge is not available."; + private IUserManager iUserManager; + private BundleContext context = null; + + ServiceTrackerCustomizer customizer = new ServiceTrackerCustomizer(){ + @Override + public IUserManager addingService(ServiceReference reference) { + logger.info("Service {} added, let there be SSH bridge.", reference); + iUserManager = context.getService(reference); + try { + onUserManagerFound(iUserManager); + } catch (Exception e) { + logger.trace("Can't start SSH server due to {}",e); + } + return iUserManager; + } + @Override + public void modifiedService(ServiceReference reference, IUserManager service) { + logger.info("Replacing modified service {} in netconf SSH.", reference); + server.addUserManagerService(service); + } + @Override + public void removedService(ServiceReference reference, IUserManager service) { + logger.info("Removing service {} from netconf SSH. " + + "SSH won't authenticate users until IUserManeger service will be started.", reference); + removeUserManagerService(); + } + }; + @Override public void start(BundleContext context) throws Exception { + this.context = context; + listenForManagerService(); + } + @Override + public void stop(BundleContext context) throws Exception { + if (server != null){ + server.stop(); + logger.trace("Netconf SSH bridge is down ..."); + } + } + private void startSSHServer() throws Exception { logger.trace("Starting netconf SSH bridge."); - - Optional sshSocketAddressOptional = NetconfConfigUtil.extractSSHNetconfAddress(context,EXCEPTION_MESSAGE); - InetSocketAddress tcpSocketAddress = NetconfConfigUtil.extractTCPNetconfAddress(context,EXCEPTION_MESSAGE); + Optional sshSocketAddressOptional = NetconfConfigUtil.extractSSHNetconfAddress(context, EXCEPTION_MESSAGE); + InetSocketAddress tcpSocketAddress = NetconfConfigUtil.extractTCPNetconfAddress(context, + EXCEPTION_MESSAGE, true); if (sshSocketAddressOptional.isPresent()){ - server = NetconfSSHServer.start(sshSocketAddressOptional.get().getPort(),tcpSocketAddress); + String path = NetconfConfigUtil.getPrivateKeyPath(context); + path = path.replace("\\", "/"); + if (path.equals("")){ + throw new Exception("Missing netconf.ssh.pk.path key in configuration file."); + } + FileInputStream fis = null; + try { + fis = new FileInputStream(path); + } catch (FileNotFoundException e){ + throw new Exception("Missing file described by netconf.ssh.pk.path key in configuration file."); + } catch (SecurityException e){ + throw new Exception("Read access denied to file described by netconf.ssh.pk.path key in configuration file."); + } + AuthProvider authProvider = null; + try { + authProvider = new AuthProvider(iUserManager,fis); + } catch (Exception e){ + if (fis!=null){ + fis.close(); + } + throw (e); + } + this.server = NetconfSSHServer.start(sshSocketAddressOptional.get().getPort(),tcpSocketAddress,authProvider); Thread serverThread = new Thread(server,"netconf SSH server thread"); serverThread.setDaemon(true); serverThread.start(); @@ -51,13 +119,18 @@ public class NetconfSSHActivator implements BundleActivator{ throw new Exception("No valid connection configuration for SSH bridge found."); } } - - @Override - public void stop(BundleContext context) throws Exception { - if (server != null){ - logger.trace("Netconf SSH bridge going down ..."); - server.stop(); - logger.trace("Netconf SSH bridge is down ..."); + private void onUserManagerFound(IUserManager userManager) throws Exception{ + if (server!=null && server.isUp()){ + server.addUserManagerService(userManager); + } else { + startSSHServer(); } } + private void removeUserManagerService(){ + this.server.removeUserManagerService(); + } + private void listenForManagerService(){ + ServiceTracker listenerTracker = new ServiceTracker<>(context, IUserManager.class,customizer); + listenerTracker.open(); + } }