Author: gnodet
Date: Fri Oct 4 12:21:27 2013
New Revision: 1529140
URL: http://svn.apache.org/r1529140
Log:
[KARAF-2501] Break some bundle dependencies in the console
Added:
karaf/trunk/shell/ssh/src/main/resources/karaf.key
Modified:
karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml
karaf/trunk/shell/console/pom.xml
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/SingleCommandHelpProvider.java
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
Modified: karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml
URL:
http://svn.apache.org/viewvc/karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
--- karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml
(original)
+++ karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml Fri
Oct 4 12:21:27 2013
@@ -21,6 +21,7 @@
<repository>mvn:org.ops4j.pax.web/pax-web-features/${pax.web.version}/xml/features</repository>
<feature name="standard" description="Karaf standard feature"
version="${project.version}">
+ <bundle
start-level="30">mvn:org.apache.felix/org.apache.felix.gogo.runtime/${felix.gogo.version}</bundle>
<bundle
start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/${project.version}</bundle>
<bundle
start-level="30">mvn:org.apache.karaf.features/org.apache.karaf.features.core/${project.version}</bundle>
<bundle
start-level="30">mvn:org.apache.karaf.features/org.apache.karaf.features.command/${project.version}</bundle>
Modified: karaf/trunk/shell/console/pom.xml
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/pom.xml?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
--- karaf/trunk/shell/console/pom.xml (original)
+++ karaf/trunk/shell/console/pom.xml Fri Oct 4 12:21:27 2013
@@ -128,6 +128,7 @@
<configuration>
<instructions>
<Import-Package>
+ !org.apache.felix.gogo.runtime.*,
org.osgi.service.event;resolution:=optional,
org.apache.karaf.branding;resolution:=optional,
org.apache.sshd.agent*;resolution:=optional,
@@ -146,19 +147,10 @@
</Export-Package>
<Private-Package>
org.apache.karaf.shell.console.impl*,
-
org.apache.felix.gogo.runtime*;-split-package:=first
</Private-Package>
- <Bundle-Activator>
- org.apache.felix.gogo.runtime.activator.Activator
- </Bundle-Activator>
<Main-Class>
org.apache.karaf.shell.console.impl.Main
</Main-Class>
- <Export-Service>
- org.apache.felix.service.threadio.ThreadIO,
- org.apache.felix.service.command.CommandProcessor,
- org.apache.felix.service.command.Converter
- </Export-Service>
</instructions>
<unpackBundle>true</unpackBundle>
</configuration>
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
Fri Oct 4 12:21:27 2013
@@ -24,7 +24,6 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.apache.karaf.shell.console.CommandSessionHolder;
@@ -39,6 +38,8 @@ import org.osgi.framework.ServiceListene
*/
public class CommandNamesCompleter implements Completer {
+ public static final String COMMANDS = ".commands";
+
private CommandSession session;
private final Set<String> commands = new CopyOnWriteArraySet<String>();
@@ -70,7 +71,7 @@ public class CommandNamesCompleter imple
@SuppressWarnings("unchecked")
protected void checkData() {
if (commands.isEmpty()) {
- Set<String> names = new HashSet<String>((Set<String>)
session.get(CommandSessionImpl.COMMANDS));
+ Set<String> names = new HashSet<String>((Set<String>)
session.get(COMMANDS));
for (String name : names) {
commands.add(name);
if (name.indexOf(':') > 0) {
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
Fri Oct 4 12:21:27 2013
@@ -18,6 +18,7 @@
*/
package org.apache.karaf.shell.console.completer;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -25,13 +26,12 @@ import java.util.List;
import java.util.Set;
import org.apache.karaf.shell.commands.CommandWithAction;
-import org.apache.felix.gogo.runtime.Closure;
-import org.apache.felix.gogo.runtime.CommandProxy;
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
import org.apache.felix.service.command.CommandSession;
import org.apache.felix.service.command.Function;
import org.apache.karaf.shell.console.CommandSessionHolder;
import org.apache.karaf.shell.console.Completer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,6 +41,8 @@ import org.slf4j.LoggerFactory;
*/
public class CommandsCompleter implements Completer {
+ public static final String COMMANDS = ".commands";
+
private static final Logger LOGGER =
LoggerFactory.getLogger(CommandsCompleter.class);
private CommandSession session;
@@ -73,7 +75,7 @@ public class CommandsCompleter implement
// get the current sub-shell
String subshell = (String) session.get("SUBSHELL");
- Set<String> names = new HashSet<String>((Set<String>)
session.get(CommandSessionImpl.COMMANDS));
+ Set<String> names = new HashSet<String>((Set<String>)
session.get(COMMANDS));
Set<String> filteredNames = new HashSet<String>();
for (String command : names) {
if (subshell == null || command.startsWith(subshell)) {
@@ -134,7 +136,7 @@ public class CommandsCompleter implement
Set<String> aliases = new HashSet<String>();
for (String var : vars) {
Object content = session.get(var);
- if (content instanceof Closure) {
+ if
("org.apache.felix.gogo.runtime.Closure".equals(content.getClass().getName()))
{
aliases.add(var);
}
}
@@ -142,20 +144,28 @@ public class CommandsCompleter implement
}
protected Function unProxy(Function function) {
- if (function instanceof CommandProxy) {
- CommandProxy proxy = (CommandProxy) function;
- Object target = proxy.getTarget();
- Function result;
- if (target instanceof Function) {
- result = (Function) target;
- } else {
- result = function;
+ try {
+ if
("org.apache.felix.gogo.runtime.CommandProxy".equals(function.getClass().getName()))
{
+ Field contextField =
function.getClass().getDeclaredField("context");
+ Field referenceField =
function.getClass().getDeclaredField("reference");
+ contextField.setAccessible(true);
+ referenceField.setAccessible(true);
+ BundleContext context = (BundleContext)
contextField.get(function);
+ ServiceReference reference = (ServiceReference)
referenceField.get(function);
+ Object target = context != null ?
context.getService(reference) : null;
+ try {
+ if (target instanceof Function) {
+ function = (Function) target;
+ }
+ } finally {
+ if (context != null) {
+ context.ungetService(reference);
+ }
+ }
}
- proxy.ungetTarget();
- return result;
- } else {
- return function;
+ } catch (Throwable t) {
}
+ return function;
}
}
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
Fri Oct 4 12:21:27 2013
@@ -38,7 +38,6 @@ import jline.Terminal;
import jline.UnsupportedTerminal;
import jline.console.ConsoleReader;
import jline.console.history.PersistentHistory;
-import org.apache.felix.gogo.runtime.Parser;
import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.apache.felix.service.command.Converter;
@@ -221,23 +220,33 @@ public class ConsoleImpl implements Cons
if (reader.getHistory().size()==0) {
reader.getHistory().add(command);
} else {
- // jline doesn't add blank lines to the history so we don't
+ // jline doesn't add blank lines to the history so we don't
// need to replace the command in jline's console history with
// an indented one
if (command.length() > 0 && !" ".equals(command)) {
- reader.getHistory().replace(command);
- }
+ reader.getHistory().replace(command);
+ }
}
- try {
- new Parser(command).program();
- loop = false;
- } catch (Exception e) {
- loop = true;
- first = false;
- }
- }
- return command;
- }
+ if (command.length() > 0 && command.charAt(command.length() - 1)
== '\\') {
+ loop = true;
+ first = false;
+ } else {
+ try {
+ Class<?> cl =
CommandSession.class.getClassLoader().loadClass("org.apache.felix.gogo.runtime.Parser");
+ Object parser =
cl.getConstructor(CharSequence.class).newInstance(command);
+ cl.getMethod("program").invoke(parser);
+ loop = false;
+ } catch (Exception e) {
+ loop = true;
+ first = false;
+ } catch (Throwable t) {
+ // Reflection problem ? just quit
+ loop = false;
+ }
+ }
+ }
+ return command;
+ }
private void executeScript(String scriptFileName) {
if (scriptFileName != null) {
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
Fri Oct 4 12:21:27 2013
@@ -18,21 +18,16 @@
*/
package org.apache.karaf.shell.console.impl.jline;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.net.URL;
import java.nio.charset.Charset;
-import java.security.KeyPair;
-import java.util.Hashtable;
+
import javax.security.auth.Subject;
import jline.Terminal;
import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
import org.apache.karaf.jaas.boot.principal.UserPrincipal;
import org.apache.karaf.shell.console.Console;
import org.apache.karaf.shell.console.ConsoleFactory;
-import org.apache.sshd.agent.SshAgent;
-import org.apache.sshd.agent.local.AgentImpl;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
@@ -50,7 +45,6 @@ public class LocalConsoleManager {
private final int defaultStartLevel;
private CommandProcessor commandProcessor;
private ServiceRegistration registration;
- private SshAgent local;
public LocalConsoleManager(boolean start,
String defaultStartLevel,
@@ -84,7 +78,6 @@ public class LocalConsoleManager {
}
}
};
- String agentId = startAgent("karaf");
String ctype = System.getenv("LC_CTYPE");
String encoding = ctype;
if (encoding != null && encoding.indexOf('.') > 0) {
@@ -93,8 +86,9 @@ public class LocalConsoleManager {
encoding = System.getProperty("input.encoding",
Charset.defaultCharset().name());
}
this.console = consoleFactory.createLocal(this.commandProcessor,
terminal, encoding, callback);
- this.console.getSession().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME,
agentId);
-
+
+ registration = bundleContext.registerService(CommandSession.class,
console.getSession(), null);
+
Runnable consoleStarter = new Runnable() {
public void run() {
consoleFactory.startConsoleAs(console, subject, "Local");
@@ -110,20 +104,6 @@ public class LocalConsoleManager {
}
}
- protected String startAgent(String user) {
- try {
- local = SshAgentLoader.load(bundleContext);
- String agentId = "local:" + user;
- Hashtable properties = new Hashtable();
- properties.put("id", agentId);
- registration =
bundleContext.registerService(SshAgent.class.getName(), local, properties);
- return agentId;
- } catch (Throwable e) {
- LOGGER.warn("Error starting ssh agent for local console", e);
- return null;
- }
- }
-
public void stop() throws Exception {
if (registration != null) {
registration.unregister();
@@ -136,21 +116,4 @@ public class LocalConsoleManager {
}
}
- static class SshAgentLoader {
- static SshAgent load(BundleContext bundleContext) {
- try {
- SshAgent agent = new AgentImpl();
- URL url = bundleContext.getBundle().getResource("karaf.key");
- InputStream is = url.openStream();
- ObjectInputStream r = new ObjectInputStream(is);
- KeyPair keyPair = (KeyPair) r.readObject();
- agent.addIdentity(keyPair, "karaf");
- return agent;
- } catch (Throwable e) {
- LOGGER.warn("Error starting ssh agent for local console", e);
- return null;
- }
- }
- }
-
}
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
Fri Oct 4 12:21:27 2013
@@ -27,7 +27,6 @@ import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
-import org.apache.felix.gogo.runtime.CommandNotFoundException;
import org.apache.felix.service.command.CommandSession;
import org.apache.karaf.shell.commands.CommandException;
import org.apache.karaf.shell.console.SessionProperties;
@@ -233,7 +232,8 @@ public class ShellUtil {
public static void logException(CommandSession session, Throwable t) {
try {
- if (t instanceof CommandNotFoundException) {
+ boolean isCommandNotFound =
"org.apache.felix.gogo.runtime.CommandNotFoundException".equals(t.getClass().getName());
+ if (isCommandNotFound) {
LOGGER.debug("Unknown command entered", t);
} else if (t instanceof CommandException ) {
LOGGER.debug("Command exception (Undefined option, ...)", t);
@@ -243,12 +243,12 @@ public class ShellUtil {
session.put(SessionProperties.LAST_EXCEPTION, t);
if (t instanceof CommandException) {
session.getConsole().println(((CommandException)
t).getNiceHelp());
- } else if (t instanceof CommandNotFoundException) {
+ } else if (isCommandNotFound) {
String str = Ansi.ansi()
.fg(Ansi.Color.RED)
.a("Command not found: ")
.a(Ansi.Attribute.INTENSITY_BOLD)
- .a(((CommandNotFoundException) t).getCommand())
+ .a(t.getClass().getMethod("getCommand").invoke(t))
.a(Ansi.Attribute.INTENSITY_BOLD_OFF)
.fg(Ansi.Color.DEFAULT).toString();
session.getConsole().println(str);
@@ -258,7 +258,7 @@ public class ShellUtil {
t.printStackTrace(session.getConsole());
session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
}
- else if (!(t instanceof CommandException) && !(t instanceof
CommandNotFoundException)) {
+ else if (!(t instanceof CommandException) && !isCommandNotFound) {
session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
session.getConsole().println("Error executing command: "
+ (t.getMessage() != null ? t.getMessage() :
t.getClass().getName()));
Modified:
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
(original)
+++
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
Fri Oct 4 12:21:27 2013
@@ -26,8 +26,6 @@ import java.util.SortedMap;
import java.util.TreeMap;
import jline.Terminal;
-
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
import org.apache.felix.service.command.CommandSession;
import org.apache.felix.service.command.Function;
import org.apache.karaf.shell.commands.Action;
@@ -44,6 +42,8 @@ import org.osgi.framework.ServiceReferen
public class CommandListHelpProvider implements HelpProvider {
+ public static final String COMMANDS = ".commands";
+
public String getHelp(CommandSession session, String path) {
if (path.indexOf('|') > 0) {
if (path.startsWith("command-list|")) {
@@ -59,7 +59,7 @@ public class CommandListHelpProvider imp
}
private SortedMap<String, String> getCommandDescriptions(CommandSession
session, String command) {
- Set<String> names = (Set<String>)
session.get(CommandSessionImpl.COMMANDS);
+ Set<String> names = (Set<String>) session.get(COMMANDS);
SortedMap<String,String> commands = new TreeMap<String,String>();
for (String name : names) {
if (command != null && !name.startsWith(command)) {
Modified:
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/SingleCommandHelpProvider.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/SingleCommandHelpProvider.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/SingleCommandHelpProvider.java
(original)
+++
karaf/trunk/shell/help/src/main/java/org/apache/karaf/shell/help/impl/SingleCommandHelpProvider.java
Fri Oct 4 12:21:27 2013
@@ -22,13 +22,14 @@ import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Set;
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
import org.apache.felix.service.command.CommandSession;
import org.apache.felix.service.threadio.ThreadIO;
import org.apache.karaf.shell.console.HelpProvider;
public class SingleCommandHelpProvider implements HelpProvider {
+ public static final String COMMANDS = ".commands";
+
private ThreadIO io;
public SingleCommandHelpProvider(ThreadIO io) {
@@ -43,8 +44,7 @@ public class SingleCommandHelpProvider i
return null;
}
}
- @SuppressWarnings("unchecked")
- Set<String> names = (Set<String>)
session.get(CommandSessionImpl.COMMANDS);
+ Set<String> names = (Set<String>) session.get(COMMANDS);
if (path != null && names.contains(path)) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
io.setStreams(new ByteArrayInputStream(new byte[0]), new
PrintStream(baos, true), new PrintStream(baos, true));
Modified:
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
---
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
(original)
+++
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
Fri Oct 4 12:21:27 2013
@@ -19,25 +19,46 @@
package org.apache.karaf.shell.ssh;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.net.URL;
+import java.security.KeyPair;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.felix.service.command.CommandSession;
import org.apache.sshd.agent.SshAgent;
import org.apache.sshd.agent.SshAgentFactory;
import org.apache.sshd.agent.SshAgentServer;
import org.apache.sshd.agent.common.AgentDelegate;
+import org.apache.sshd.agent.local.AgentImpl;
import org.apache.sshd.agent.local.AgentServerProxy;
import org.apache.sshd.agent.local.ChannelAgentForwarding;
import org.apache.sshd.common.Channel;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.Session;
import org.apache.sshd.server.session.ServerSession;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class KarafAgentFactory implements SshAgentFactory {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(KarafAgentFactory.class);
+
private final Map<String, AgentServerProxy> proxies = new
ConcurrentHashMap<String, AgentServerProxy>();
private final Map<String, SshAgent> locals = new ConcurrentHashMap<String,
SshAgent>();
+ private BundleContext bundleContext;
+
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
public NamedFactory<Channel> getChannelForwardingFactory() {
return new ChannelAgentForwarding.Factory();
}
@@ -75,23 +96,32 @@ public class KarafAgentFactory implement
};
}
- public void registerAgent(SshAgent agent, Map<String, ?> properties) {
- if (agent != null) {
- Object id = properties.get("id");
- if (id == null) {
- throw new IllegalStateException("Local agent can't be
registered with no 'id' property");
- }
- locals.put(id.toString(), agent);
+ public void registerCommandSession(CommandSession session) {
+ try {
+ String user = (String) session.get("USER");
+ SshAgent agent = new AgentImpl();
+ URL url = bundleContext.getBundle().getResource("karaf.key");
+ InputStream is = url.openStream();
+ ObjectInputStream r = new ObjectInputStream(is);
+ KeyPair keyPair = (KeyPair) r.readObject();
+ agent.addIdentity(keyPair, "karaf");
+ String agentId = "local:" + user;
+ session.put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, agentId);
+ locals.put(agentId, agent);
+ } catch (Throwable e) {
+ LOGGER.warn("Error starting ssh agent for local console", e);
}
}
- public void unregisterAgent(SshAgent agent, Map<String, ?> properties) {
- if (agent != null) {
- Object id = properties.get("id");
- if (id == null) {
- throw new IllegalStateException("Local agent can't be
unregistered with no 'id' property");
+ public void unregisterCommandSession(CommandSession session) {
+ try {
+ String agentId = (String)
session.get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+ session.put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, null);
+ if (agentId != null) {
+ locals.remove(agentId);
}
- locals.remove(id.toString());
+ } catch (Throwable e) {
+ LOGGER.warn("Error stopping ssh agent for local console", e);
}
}
Modified:
karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml?rev=1529140&r1=1529139&r2=1529140&view=diff
==============================================================================
--- karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
(original)
+++ karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
Fri Oct 4 12:21:27 2013
@@ -108,9 +108,11 @@
<property name="agentFactory" ref="agentFactory" />
</bean>
- <bean id="agentFactory"
class="org.apache.karaf.shell.ssh.KarafAgentFactory" />
- <reference-list id="agents" interface="org.apache.sshd.agent.SshAgent"
availability="optional" activation="eager">
- <reference-listener ref="agentFactory" bind-method="registerAgent"
unbind-method="unregisterAgent" />
+ <bean id="agentFactory"
class="org.apache.karaf.shell.ssh.KarafAgentFactory">
+ <property name="bundleContext" ref="blueprintBundleContext" />
+ </bean>
+ <reference-list id="commandSessions"
interface="org.apache.felix.service.command.CommandSession"
availability="optional" activation="eager">
+ <reference-listener ref="agentFactory"
bind-method="registerCommandSession" unbind-method="unregisterCommandSession" />
</reference-list>
<bean id="keyPairProvider"
class="org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider">
Added: karaf/trunk/shell/ssh/src/main/resources/karaf.key
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/resources/karaf.key?rev=1529140&view=auto
==============================================================================
Files karaf/trunk/shell/ssh/src/main/resources/karaf.key (added) and
karaf/trunk/shell/ssh/src/main/resources/karaf.key Fri Oct 4 12:21:27 2013
differ