blob: 5aa925ca40c1dbbfa913bfaab0663c11654f9dda [file] [log] [blame]
#!/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.
#
realpath() {
# Use in priority xpg4 awk or nawk on SunOS as standard awk is outdated
AWK=awk
if ${solaris}; then
if [ -x /usr/xpg4/bin/awk ]; then
AWK=/usr/xpg4/bin/awk
elif [ -x /usr/bin/nawk ]; then
AWK=/usr/bin/nawk
fi
fi
READLINK_EXISTS=`command -v readlink &> /dev/null`
BINARY_NAME=`basename "${1}"`
if [ -z "$READLINK_EXISTS" ]; then
OURPWD="`pwd`"
cd "`dirname "${1}"`" || exit 2
LINK=`ls -l "${BINARY_NAME}" | ${AWK} -F"-> " '{print $2}'`
while [ "${LINK}" ]; do
echo "link: ${LINK}" >&2
cd "`dirname "${LINK}"`" || exit 2
LINK=`ls -l "${BINARY_NAME}" | ${AWK} -F"-> " '{print $2}'`
done
REALPATH="`pwd`/${BINARY_NAME}"
cd "${OURPWD}" || exit 2
echo "${REALPATH}"
else
OURPWD="`pwd`"
cd "`dirname "${1}"`" || exit 2
LINK=`readlink "${BINARY_NAME}"`
while [ "${LINK}" ]; do
echo "link: ${LINK}" >&2
cd "`dirname "${LINK}"`" || exit 2
LINK=`readlink "${BINARY_NAME}"`
done
REALPATH="`pwd`/${BINARY_NAME}"
cd "${OURPWD}" || exit 2
echo "${REALPATH}"
fi
}
REALNAME=`realpath "$0"`
DIRNAME=`dirname "${REALNAME}"`
PROGNAME=`basename "${REALNAME}"`
LOCAL_CLASSPATH=$CLASSPATH
#
# Load common functions
#
. "${DIRNAME}/inc"
#
# Sourcing environment settings for karaf similar to tomcats setenv
#
KARAF_SCRIPT="${PROGNAME}"
export KARAF_SCRIPT
if [ -f "${DIRNAME}/setenv" ]; then
. "${DIRNAME}/setenv"
fi
forceNoRoot() {
# If configured, prevent execution as root
if [ "${KARAF_NOROOT}" ] && [ "`id -u`" -eq 0 ]; then
die "Do not run as root!"
fi
}
setupClassPath() {
# Add the jars in the lib dir
for file in "${KARAF_HOME}"/lib/boot/*.jar
do
if [ -z "${CLASSPATH}" ]; then
CLASSPATH="${file}"
else
CLASSPATH="${CLASSPATH}:${file}"
fi
done
if [ "${VERSION}" -gt "8" ] ; then
for file in "${KARAF_HOME}"/lib/jdk9plus/*.jar
do
if [ -z "${CLASSPATH}" ]; then
CLASSPATH="${file}"
else
CLASSPATH="${CLASSPATH}:${file}"
fi
done
fi
}
checkRootInstance() {
ROOT_INSTANCE_RUNNING=false
if [ -f "${KARAF_HOME}/instances/instance.properties" ];
then
ROOT_INSTANCE_PID=`sed -n -e '/item.0.pid/ s/.*\= *//p' "${KARAF_HOME}/instances/instance.properties"`
ROOT_INSTANCE_NAME=`sed -n -e '/item.0.name/ s/.*\= *//p' "${KARAF_HOME}/instances/instance.properties"`
if [ "${ROOT_INSTANCE_PID}" -ne "0" ]; then
if ps -p "${ROOT_INSTANCE_PID}" > /dev/null
then
MAIN=org.apache.karaf.main.Main
PID_COMMAND=`"${PS_PREFIX}"ps -p "${ROOT_INSTANCE_PID}" -o args | sed 1d`
if [ "${PID_COMMAND#*$MAIN}" != "$PID_COMMAND" ]; then
ROOT_INSTANCE_RUNNING=true
fi
fi
fi
fi
}
init() {
# Prevent root execution if configured
forceNoRoot
# 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
# Locate the Karaf data directory
locateData
# Locate the Karaf etc directory
locateEtc
# Locate the Karaf log directory
locateLog
# Setup the native library path
setupNativePath
# Locate the Java VM to execute
locateJava
# Determine the JVM vendor
detectJVM
# Determine the JVM version >= 1.6
checkJvmVersion
# Check if a root instance is already running
checkRootInstance
# Setup default options
setupDefaults
# Setup classpath
setupClassPath
# Install debug options
setupDebugOptions
}
run() {
OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
MAIN=org.apache.karaf.main.Main
if [ "x$CHECK_ROOT_INSTANCE_RUNNING" = "x" ]; then
CHECK_ROOT_INSTANCE_RUNNING=true
fi
JAVA_ENDORSED_DIRS="${JAVA_HOME}/jre/lib/endorsed:${JAVA_HOME}/lib/endorsed:${KARAF_HOME}/lib/endorsed"
JAVA_EXT_DIRS="${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:${KARAF_HOME}/lib/ext"
if ${cygwin}; then
JAVA_HOME=`cygpath --path --windows "${JAVA_HOME}"`
JAVA_ENDORSED_DIRS=`cygpath --path --windows "${JAVA_ENDORSED_DIRS}"`
JAVA_EXT_DIRS=`cygpath --path --windows "${JAVA_EXT_DIRS}"`
fi
convertPaths
cd "${KARAF_BASE}" || exit 2
if [ -z "${KARAF_EXEC}" ]; then
KARAF_EXEC=""
fi
debug=false
debugs=false
nodebug=false
while [ "${1}" != "" ]; do
case "${1}" in
'clean')
rm -rf "${KARAF_DATA:?}"
shift
;;
'debug')
debug=true
shift
;;
'debugs')
debug=true
debugs=true
shift
;;
'status')
MAIN=org.apache.karaf.main.Status
CHECK_ROOT_INSTANCE_RUNNING=false
nodebug=true
shift
;;
'stop')
MAIN=org.apache.karaf.main.Stop
CHECK_ROOT_INSTANCE_RUNNING=false
nodebug=true
shift
;;
'console')
CHECK_ROOT_INSTANCE_RUNNING=false
shift
;;
'server')
OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
shift
;;
'run')
OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true -Dkaraf.log.console=ALL"
shift
;;
'daemon')
OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
KARAF_DAEMON="true"
KARAF_EXEC="exec"
shift
;;
'client')
OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
CHECK_ROOT_INSTANCE_RUNNING=false
nodebug=true
shift
;;
'classpath')
echo "Classpath: ${CLASSPATH}"
shift
;;
*)
break
;;
esac
done
if ${nodebug}; then
debug=false
fi
if ${debug}; then
if [ "x${JAVA_DEBUG_OPTS}" = "x" ]; then
if ${debugs}; then
JAVA_DEBUG_OPTS="${DEFAULT_JAVA_DEBUGS_OPTS}"
else
JAVA_DEBUG_OPTS="${DEFAULT_JAVA_DEBUG_OPTS}"
fi
fi
JAVA_OPTS="${JAVA_DEBUG_OPTS} ${JAVA_OPTS}"
fi
while true; do
# When users want to update the lib version of, they just need to create
# a lib.next directory and on the new restart, it will replace the current lib directory.
if [ -d "${KARAF_HOME:?}/lib.next" ] ; then
echo "Updating libs..."
rm -rf "${KARAF_HOME:?}/lib"
mv -f "${KARAF_HOME:?}/lib.next" "${KARAF_HOME}/lib"
echo "Updating classpath..."
CLASSPATH=$LOCAL_CLASSPATH
setupClassPath
fi
# Ensure the log directory exists
# We may need to have a place to redirect stdout/stderr
if [ ! -d "${KARAF_LOG}" ]; then
mkdir -p "${KARAF_LOG}"
fi
if [ ! -d "${KARAF_DATA}/tmp" ]; then
mkdir -p "${KARAF_DATA}/tmp"
fi
if [ "${ROOT_INSTANCE_RUNNING}" = "false" ] || [ "${CHECK_ROOT_INSTANCE_RUNNING}" = "false" ] ; then
if [ "${VERSION}" -gt "8" ]; then
${KARAF_EXEC} "${JAVA}" ${JAVA_OPTS} \
--add-reads=java.xml=java.logging \
--add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED \
--patch-module java.base=lib/endorsed/org.apache.karaf.specs.locator-@@project.version@@.jar \
--patch-module java.xml=lib/endorsed/org.apache.karaf.specs.java.xml-@@project.version@@.jar \
--add-opens java.base/java.security=ALL-UNNAMED \
--add-opens java.base/java.net=ALL-UNNAMED \
--add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.util=ALL-UNNAMED \
--add-opens java.naming/javax.naming.spi=ALL-UNNAMED \
--add-opens java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED \
--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED \
--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED \
--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED \
--add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED \
--add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED \
-Dkaraf.instances="${KARAF_HOME}/instances" \
-Dkaraf.home="${KARAF_HOME}" \
-Dkaraf.base="${KARAF_BASE}" \
-Dkaraf.data="${KARAF_DATA}" \
-Dkaraf.etc="${KARAF_ETC}" \
-Dkaraf.log="${KARAF_LOG}" \
-Dkaraf.restart.jvm.supported=true \
-Djava.io.tmpdir="${KARAF_DATA}/tmp" \
-Djava.util.logging.config.file="${KARAF_BASE}/etc/java.util.logging.properties" \
${KARAF_SYSTEM_OPTS} \
${KARAF_OPTS} \
${OPTS} \
-classpath "${CLASSPATH}" \
${MAIN} "$@"
else
${KARAF_EXEC} "${JAVA}" ${JAVA_OPTS} \
-Djava.endorsed.dirs="${JAVA_ENDORSED_DIRS}" \
-Djava.ext.dirs="${JAVA_EXT_DIRS}" \
-Dkaraf.instances="${KARAF_HOME}/instances" \
-Dkaraf.home="${KARAF_HOME}" \
-Dkaraf.base="${KARAF_BASE}" \
-Dkaraf.data="${KARAF_DATA}" \
-Dkaraf.etc="${KARAF_ETC}" \
-Dkaraf.log="${KARAF_LOG}" \
-Dkaraf.restart.jvm.supported=true \
-Djava.io.tmpdir="${KARAF_DATA}/tmp" \
-Djava.util.logging.config.file="${KARAF_BASE}/etc/java.util.logging.properties" \
${KARAF_SYSTEM_OPTS} \
${KARAF_OPTS} \
${OPTS} \
-classpath "${CLASSPATH}" \
${MAIN} "$@"
fi
else
die "There is a Root instance already running with name ${ROOT_INSTANCE_NAME} and pid ${ROOT_INSTANCE_PID}. If you know what you are doing and want to force the run anyway, export CHECK_ROOT_INSTANCE_RUNNING=false and re run the command."
fi
KARAF_RC=$?
if [ ${KARAF_DAEMON} ] ; then
exit ${KARAF_RC}
else
if [ "${KARAF_RC}" -eq 10 ]; then
echo "Restarting JVM..."
else
exit ${KARAF_RC}
fi
fi
done
}
nothing() {
# nothing to do here
a=a
}
main() {
init
trap 'nothing' TSTP
run "$@"
}
main "$@"