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


Reply via email to