Author: gnodet Date: Tue Aug 24 09:18:50 2010 New Revision: 988445 URL: http://svn.apache.org/viewvc?rev=988445&view=rev Log: KARAF-144: Add a shell script and a mechanism to discover all the commands from the system folder
Added: karaf/trunk/assembly/src/main/filtered-resources/bin/shell karaf/trunk/assembly/src/main/filtered-resources/bin/shell.bat Modified: karaf/trunk/assembly/src/main/descriptors/unix-bin.xml karaf/trunk/assembly/src/main/descriptors/windows-bin.xml karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java Modified: karaf/trunk/assembly/src/main/descriptors/unix-bin.xml URL: http://svn.apache.org/viewvc/karaf/trunk/assembly/src/main/descriptors/unix-bin.xml?rev=988445&r1=988444&r2=988445&view=diff ============================================================================== --- karaf/trunk/assembly/src/main/descriptors/unix-bin.xml (original) +++ karaf/trunk/assembly/src/main/descriptors/unix-bin.xml Tue Aug 24 09:18:50 2010 @@ -51,6 +51,7 @@ <fileMode>0755</fileMode> <includes> <include>admin</include> + <include>shell</include> </includes> </fileSet> <fileSet> Modified: karaf/trunk/assembly/src/main/descriptors/windows-bin.xml URL: http://svn.apache.org/viewvc/karaf/trunk/assembly/src/main/descriptors/windows-bin.xml?rev=988445&r1=988444&r2=988445&view=diff ============================================================================== --- karaf/trunk/assembly/src/main/descriptors/windows-bin.xml (original) +++ karaf/trunk/assembly/src/main/descriptors/windows-bin.xml Tue Aug 24 09:18:50 2010 @@ -49,6 +49,7 @@ <lineEnding>dos</lineEnding> <includes> <include>admin.bat</include> + <include>shell.bat</include> </includes> </fileSet> <fileSet> Added: karaf/trunk/assembly/src/main/filtered-resources/bin/shell URL: http://svn.apache.org/viewvc/karaf/trunk/assembly/src/main/filtered-resources/bin/shell?rev=988445&view=auto ============================================================================== --- karaf/trunk/assembly/src/main/filtered-resources/bin/shell (added) +++ karaf/trunk/assembly/src/main/filtered-resources/bin/shell Tue Aug 24 09:18:50 2010 @@ -0,0 +1,311 @@ +#!/bin/sh +# +# 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. +# +# + +DIRNAME=`dirname $0` +PROGNAME=`basename $0` + +# +# Check/Set up some easily accessible MIN/MAX params for JVM mem usage +# + +if [ "x$JAVA_MIN_MEM" = "x" ]; then + JAVA_MIN_MEM=128M + export JAVA_MIN_MEM +fi + +if [ "x$JAVA_MAX_MEM" = "x" ]; then + JAVA_MAX_MEM=512M + export JAVA_MAX_MEM +fi + +warn() { + echo "${PROGNAME}: $*" +} + +die() { + warn "$*" + exit 1 +} + +maybeSource() { + file="$1" + if [ -f "$file" ] ; then + . $file + fi +} + +detectOS() { + # OS specific support (must be 'true' or 'false'). + cygwin=false; + darwin=false; + aix=false; + os400=false; + case "`uname`" in + CYGWIN*) + cygwin=true + ;; + Darwin*) + darwin=true + ;; + AIX*) + aix=true + ;; + OS400*) + os400=true + ;; + esac + # For AIX, set an environment variable + if $aix; then + export ldr_cntrl=maxdata=0xb0000...@dsa + export IBM_JAVA_HEAPDUMP_TEXT=true + echo $LDR_CNTRL + fi +} + +unlimitFD() { + # Use the maximum available, or set MAX_FD != -1 to use that + if [ "x$MAX_FD" = "x" ]; then + MAX_FD="maximum" + fi + + # Increase the maximum file descriptors if we can + if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then + if [ $? -eq 0 ]; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then + # use the system max + MAX_FD="$MAX_FD_LIMIT" + fi + + ulimit -n $MAX_FD > /dev/null + # echo "ulimit -n" `ulimit -n` + if [ $? -ne 0 ]; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT" + fi + fi + fi +} + +locateHome() { + if [ "x$KARAF_HOME" != "x" ]; then + warn "Ignoring predefined value for KARAF_HOME" + fi + + # In POSIX shells, CDPATH may cause cd to write to stdout + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + KARAF_HOME=`cd $DIRNAME/..; pwd` + if [ ! -d "$KARAF_HOME" ]; then + die "KARAF_HOME is not valid: $KARAF_HOME" + fi +} + +locateBase() { + if [ "x$KARAF_BASE" != "x" ]; then + if [ ! -d "$KARAF_BASE" ]; then + die "KARAF_BASE is not valid: $KARAF_BASE" + fi + else + KARAF_BASE=$KARAF_HOME + fi +} + +setupNativePath() { + # Support for loading native libraries + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib" + + # For Cygwin, set PATH from LD_LIBRARY_PATH + if $cygwin; then + LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"` + PATH="$PATH;$LD_LIBRARY_PATH" + export PATH + fi + export LD_LIBRARY_PATH +} + +pathCanonical() { + local dst="${1}" + while [ -h "${dst}" ] ; do + ls=`ls -ld "${dst}"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + dst="$link" + else + dst="`dirname "${dst}"`/$link" + fi + done + local bas=`basename "${dst}"` + local dir=`dirname "${dst}"` + if [ "$bas" != "$dir" ]; then + dst="`pathCanonical "$dir"`/$bas" + fi + echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g' +} + +locateJava() { + # Setup the Java Virtual Machine + if $cygwin ; then + [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"` + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + fi + + if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then + JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home + fi + if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi + if [ "x$JAVA" = "x" ]; then + if [ "x$JAVA_HOME" != "x" ]; then + if [ ! -d "$JAVA_HOME" ]; then + die "JAVA_HOME is not valid: $JAVA_HOME" + fi + JAVA="$JAVA_HOME/bin/java" + else + warn "JAVA_HOME not set; results may vary" + JAVA=`type java` + JAVA=`expr "$JAVA" : '.*is \(.*\)$'` + if [ "x$JAVA" = "x" ]; then + die "java command not found" + fi + fi + fi + if [ "x$JAVA_HOME" = "x" ]; then + JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))" + fi +} + +detectJVM() { + #echo "`$JAVA -version`" + # This service should call `java -version`, + # read stdout, and look for hints + if $JAVA -version 2>&1 | grep "^IBM" ; then + JVM_VENDOR="IBM" + # on OS/400, java -version does not contain IBM explicitly + elif $os400; then + JVM_VENDOR="IBM" + else + JVM_VENDOR="SUN" + fi + # echo "JVM vendor is $JVM_VENDOR" +} + +setupDebugOptions() { + if [ "x$JAVA_OPTS" = "x" ]; then + JAVA_OPTS="$DEFAULT_JAVA_OPTS" + fi + export JAVA_OPTS + + # Set Debug options if enabled + if [ "x$KARAF_DEBUG" != "x" ]; then + # Use the defaults if JAVA_DEBUG_OPTS was not set + if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then + JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS" + fi + + JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS" + warn "Enabling Java debug options: $JAVA_DEBUG_OPTS" + fi +} + +setupDefaults() { + DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM " + + #Set the JVM_VENDOR specific JVM flags + if [ "$JVM_VENDOR" = "SUN" ]; then + DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote" + elif [ "$JVM_VENDOR" = "IBM" ]; then + if $os400; then + DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS" + elif $aix; then + DEFAULT_JAVA_OPTS="-Xverify:none -Xlp $DEFAULT_JAVA_OPTS" + else + DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS" + fi + fi + + # Add the jars in the lib dir + for file in $KARAF_HOME/lib/*.jar + do + if [ -z "$CLASSPATH" ]; then + CLASSPATH="$file" + else + CLASSPATH="$CLASSPATH:$file" + fi + done + DEFAULT_JAVA_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005" + + ## + ## TODO: Move to conf/profiler/yourkit.{sh|cmd} + ## + # Uncomment to enable YourKit profiling + #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent" +} + +init() { + # Determine if there is special OS handling we must perform + detectOS + + # Unlimit the number of file descriptors if possible + unlimitFD + + # Locate the Karaf home directory + locateHome + + # Locate the Karaf base directory + locateBase + + # Setup the native library path + setupNativePath + + # Locate the Java VM to execute + locateJava + + # Determine the JVM vendor + detectJVM + + # Setup default options + setupDefaults + + # Install debug options + setupDebugOptions + +} + +run() { + + if $cygwin; then + KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"` + KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + fi + + exec $JAVA $JAVA_OPTS -Dkaraf.instances="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.karaf.shell.console.Main --classpath=system "$@" +} + +main() { + init + run "$@" +} + +main "$@" Added: karaf/trunk/assembly/src/main/filtered-resources/bin/shell.bat URL: http://svn.apache.org/viewvc/karaf/trunk/assembly/src/main/filtered-resources/bin/shell.bat?rev=988445&view=auto ============================================================================== --- karaf/trunk/assembly/src/main/filtered-resources/bin/shell.bat (added) +++ karaf/trunk/assembly/src/main/filtered-resources/bin/shell.bat Tue Aug 24 09:18:50 2010 @@ -0,0 +1,97 @@ +...@echo off +rem +rem +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. +rem +rem + +if not "%ECHO%" == "" echo %ECHO% + +setlocal +set DIRNAME=%~dp0% +set PROGNAME=%~nx0% +set ARGS=%* + +goto BEGIN + +:warn + echo %PROGNAME%: %* +goto :EOF + +:BEGIN + +rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +if not "%KARAF_HOME%" == "" ( + call :warn Ignoring predefined value for KARAF_HOME +) +set KARAF_HOME=%DIRNAME%.. +if not exist "%KARAF_HOME%" ( + call :warn KARAF_HOME is not valid: %KARAF_HOME% + goto END +) + +if not "%KARAF_BASE%" == "" ( + if not exist "%KARAF_BASE%" ( + call :warn KARAF_BASE is not valid: %KARAF_BASE% + goto END + ) +) +if "%KARAF_BASE%" == "" ( + set KARAF_BASE=%KARAF_HOME% +) + +set DEFAULT_JAVA_OPTS= +set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 + +rem Support for loading native libraries +set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib + +rem Setup the Java Virtual Machine +if not "%JAVA%" == "" goto :Check_JAVA_END + set JAVA=java + if "%JAVA_HOME%" == "" call :warn JAVA_HOME not set; results may vary + if not "%JAVA_HOME%" == "" set JAVA=%JAVA_HOME%\bin\java + if not exist "%JAVA_HOME%" ( + call :warn JAVA_HOME is not valid: "%JAVA_HOME%" + goto END + ) +:Check_JAVA_END + +if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS% + +if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END + rem Use the defaults if JAVA_DEBUG_OPTS was not set + if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS% + + set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%" + call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS% +:KARAF_DEBUG_END + +set CLASSPATH=%KARAF_HOME%\system\org\apache\karaf\shell\org.apache.karaf.shell.console\${project.version}\org.apache.karaf.shell.console-${project.version}.jar;%KARAF_HOME%\system\org\ops4j\pax\logging\pax-logging-api\${pax.logging.version}\pax-logging-api-${pax.logging.version}.jar + +:EXECUTE + if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8 + if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8 + rem Execute the Java Virtual Machine + "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dkaraf.instances="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" org.apache.karaf.shell.console.Main --classpath=system %ARGS% + +rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +:END + +endlocal + Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java?rev=988445&r1=988444&r2=988445&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java (original) +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java Tue Aug 24 09:18:50 2010 @@ -19,12 +19,15 @@ package org.apache.karaf.shell.console; import java.io.BufferedReader; +import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.lang.reflect.Method; +import java.net.MalformedURLException; import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -54,8 +57,17 @@ public class Main { commandProcessor.setThreadio(threadio); commandProcessor.setConverter(new Support()); - List<String> actions = new ArrayList<String>(); - Enumeration<URL> urls = Main.class.getClassLoader().getResources("META-INF/services/org/apache/karaf/shell/commands"); + ClassLoader cl = Main.class.getClassLoader(); + if (args.length > 0 && args[0].startsWith("--classpath=")) { + String base = args[0].substring("--classpath=".length()); + List<URL> urls = getFiles(new File(base)); + cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), cl); + String[] a = new String[args.length - 1]; + System.arraycopy(args, 1, a, 0, a.length); + args = a; + } + + Enumeration<URL> urls = cl.getResources("META-INF/services/org/apache/karaf/shell/commands"); while (urls.hasMoreElements()) { URL url = urls.nextElement(); BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream())); @@ -63,7 +75,7 @@ public class Main { while (line != null) { line = line.trim(); if (line.length() > 0 && line.charAt(0) != '#') { - final Class<Action> actionClass = (Class<Action>) Main.class.getClassLoader().loadClass(line); + final Class<Action> actionClass = (Class<Action>) cl.loadClass(line); try { Command cmd = actionClass.getAnnotation(Command.class); Function function = new AbstractCommand() { @@ -73,7 +85,6 @@ public class Main { } }; commandProcessor.addCommand(cmd.scope(), function, cmd.name()); -// System.out.println("Registering " + cmd.scope() + ":" + cmd.name()); } catch (Exception e) { } } @@ -140,4 +151,20 @@ public class Main { return stream; } } + + private static List<URL> getFiles(File base) throws MalformedURLException { + List<URL> urls = new ArrayList<URL>(); + getFiles(base, urls); + return urls; + } + + private static void getFiles(File base, List<URL> urls) throws MalformedURLException { + for (File f : base.listFiles()) { + if (f.isDirectory()) { + getFiles(f, urls); + } else if (f.getName().endsWith(".jar")) { + urls.add(f.toURI().toURL()); + } + } + } }