123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636 |
- #!/bin/sh
- ###############################################################################
- # WebSphere Application Client liberty launch script
- #
- # Copyright IBM Corp. 2011, 2014
- # The source code for this program is not published or other-
- # wise divested of its trade secrets, irrespective of what has
- # been deposited with the U.S. Copyright Office.
- #
- # ----------------------------------------------------------------------------
- #
- # To customize the use of this script (for example with /etc/init.d system
- # service managers), use the following environment variables:
- #
- # JAVA_HOME - The java executable is found in ${JAVA_HOME}/bin
- #
- # JVM_ARGS - A list of JVM command line options,
- # e.g. system properties or -X parameters
- # The value will be expanded by the shell (use quotes for spaces)
- #
- # LOG_DIR - The log file directory
- # The default value is ${WLP_CLIENT_OUTPUT_DIR}/clientName/logs
- #
- # LOG_FILE - The log file name
- # This log file is only used if the client is run in the
- # background via the start action. This is not supported in client.
- # The default value is console.log
- #
- # WLP_USER_DIR - The user/custom configuration directory used to store
- # shared and client-specific configuration.
- # See README.TXT for details about shared resource locations.
- # A client's configuration is at ${WLP_USER_DIR}/clients/clientName
- # The default value is the usr directory in the install directory.
- #
- # WLP_CLIENT_OUTPUT_DIR - The directory containing output files for defined clients.
- # This directory must have both read and write permissions for
- # the user or users that start clients.
- # By default, a client's output logs and workarea are stored
- # in the ${WLP_USER_DIR}/clients/clientName directory
- # (alongside configuration and applications).
- # If this variable is set, the output logs and workarea
- # would be stored in ${WLP_CLIENT_OUTPUT_DIR}/clientName.
- #
- # WLP_DEBUG_ADDRESS - The port to use when running the client in debug mode.
- # The default value is 7778.
- #
- # WLP_SKIP_UMASK - Skip setting the umask value to allow the default value
- # to be used.
- ###############################################################################
- ##
- ## Determine the platform and absolute path of the installation directory.
- ##
- case $OSTYPE in
- cygwin)
- uname=CYGWIN_NT
- # Determine the installation directory without forking if possible. Use
- # eval to hide ${var//find/replace}, ${var%suffix}, and ${var:first:length}
- # syntaxes from shells that can't parse them.
- eval '
- # cd to the install directory.
- savePWD=$PWD
- script=${0//\\/\/}
- unset CDPATH; cd "${script%/*}"/..
- # Convert the install (current working) directory to a Windows path.
- case $PWD in
- /cygdrive/?/*)
- # Use ${var:first:length} to avoid forking for cygpath.
- WLP_INSTALL_DIR=${PWD:10:1}:${PWD:11}
- ;;
- *)
- WLP_INSTALL_DIR=`cygpath -ma .`
- esac
- cd "$savePWD"
- '
- ;;
- *)
- uname=`uname`
- case $uname in
- CYGWIN_*)
- WLP_INSTALL_DIR=`cygpath -ma "${0}"/../..`
- ;;
- *)
- dirname=`dirname "$0"`
- WLP_INSTALL_DIR=`unset CDPATH; cd "$dirname/.." && pwd`
- esac
- esac
- ##
- ## Platform specific setup
- ##
- UMASK_O='umask o='
- tryShellExtensions=true
- shareclassesCacheDirPerm=true
- defaultFileEncoding=
- newline='
- '
- nativeEBCDIC=false
- case ${uname} in
- CYGWIN_*)
- # java.exe is a non-Cygwin process, so we need to pass -W.
- shareclassesCacheDirPerm=false
- ;;
- OS/390)
- defaultFileEncoding=iso8859-1
- nativeEBCDIC=true # Auto-convert client.env/client.jvm.options from ASCII-to-EBCDIC, if necessary.
- _BPXK_WLM_PROPAGATE=NO # Prevent WLM enclave propagation to spawned processes
- _EDC_PTHREAD_YIELD=-2 # Disable sleeps inside of pthread_yield
- JAVA_PROPAGATE=NO # Prevent WLM enclave propagation to new threads
- export _BPXK_WLM_PROPAGATE _EDC_PTHREAD_YIELD JAVA_PROPAGATE
- WLP_NLS_PATH="${WLP_INSTALL_DIR}/lib/native/zos/s390x/nls/%N.cat"
- if [ ${NLSPATH} ]
- then
- NLSPATH="${WLP_NLS_PATH}:${NLSPATH}"
- else
- NLSPATH="${WLP_NLS_PATH}"
- fi
- ;;
- esac
- ##
- ## safeEcho: Portable echo that can handle backslashes and leading dashes.
- safeEcho()
- {
- cat <<EOF
- $*
- EOF
- }
- # Define escapeForEval functions using ${var//find/replace} and ${var#suffix}
- # if possible since those constructs are significantly faster than safeEcho+sed
- # since they avoid forks. Use eval (to hide the syntax from shells that don't
- # support them) in a subshell (to avoid exiting the shell process on error) to
- # test if the shell has support.
- if ${tryShellExtensions} && (eval 'true ${1//b/c} ${1#*=}') 2> /dev/null; then
- # The shell has support. Define the functions using eval, again to hide the
- # syntax from shells that don't support it.
- eval "
- escapeForEval()
- {
- escapeForEvalResult=\\'\${1//\\'/\\'\\\"\\'\\\"\\'}\\'
- }
- extractValueAndEscapeForEval()
- {
- escapeForEval \"\${1#*=}\"
- }
- substitutePrefixVar()
- {
- case \$1 in
- @\$2@*) substitutePrefixVarResult=\$3\${1#@\$2@};;
- *) substitutePrefixVarResult=\$1
- esac
- }
- "
- else
- ##
- ## escapeForEval: Escape the first parameter to be safe for use in eval,
- ## and set escapeForEvalResult with the result.
- ##
- escapeForEval()
- {
- escapeForEvalResult=\'`safeEcho "$1" | sed s/\'/\'\"\'\"\'/g`\'
- }
- ##
- ## extractValueAndEscapeForEval: Extract the value of a var=value string,
- ## and set escapeForEvalResult with the result.
- ##
- extractValueAndEscapeForEval()
- {
- escapeForEvalResult=\'`safeEcho "$1" | sed -e 's/[^=]*=//' -e s/\'/\'\"\'\"\'/g`\'
- }
- ##
- ## substitutePrefixVar: If $1 has a prefix @$2@, set substitutePrefixVarResult
- ## to $1 with the prefix replaced by $3. Otherwise, set
- ## to $1.
- substitutePrefixVar()
- {
- case $1 in
- @$2@*) substitutePrefixVarResult=$3`safeEcho "$1" | sed -e "s/^@$2@//"`;;
- *) substitutePrefixVarResult=$1
- esac
- }
- fi
- ##
- ## Quote ${WLP_INSTALL_DIR} for eval.
- ##
- escapeForEval "${WLP_INSTALL_DIR}"
- WLP_INSTALL_DIR_QUOTED=${escapeForEvalResult}
- READ_ETC=1
- ##
- ## Consume script parameters:
- ## action is required/positional,
- ## clientName is optional, --options following
- ##
- if [ $# -lt 1 ]
- then
- ACTION=help:usage
- else
- ACTION=$1
- shift #consume
- if [ $# -ge 1 ]
- then
- # Only use if it isn't something that looks like an option
- case $1 in
- -*);;
- *)
- CLIENT_NAME=$1
- shift #consume
- esac
- fi
- fi
- ##
- ## Set client name and directory
- ##
- if [ -z "$CLIENT_NAME" ]
- then
- CLIENT_NAME=defaultClient
- fi
- ##
- ## Set JAVA_AGENT_QUOTED if WLP_SKIP_BOOTSTRAP_AGENT is unset.
- ##
- JAVA_AGENT_QUOTED=-javaagent:${WLP_INSTALL_DIR_QUOTED}/bin/tools/ws-javaagent.jar
- if [ -n "${WLP_SKIP_BOOTSTRAP_AGENT}" ]; then
- JAVA_AGENT_QUOTED=
- fi
- ##
- ## createClient: Function to launch client create
- ##
- createClient()
- {
- javaCmd "${CLIENT_NAME}" --create "$@"
- rc=$?
- return $rc
- }
- ##
- ## mkdirs: Create a directory and all parent directories, if necessary.
- ##
- mkdirs()
- {
- if [ ! -d "$1" ]; then
- mkdir -p "$1"
- fi
- }
- ##
- ## checkClient: Check for created/existing client. If it does not, issue an
- ## error message if the first argument is true, and then exit the
- ## script regardless.
- checkClient()
- {
- if [ -d "${CLIENT_CONFIG_DIR}" ] || [ "defaultClient" = "${CLIENT_NAME}" ]
- then
- return 0
- fi
- if $1
- then
- javaCmd --message:info.clientNotExist "${CLIENT_NAME}"
- rc=$?
- if [ $rc = 0 ]
- then
- rc=1
- fi
- else
- rc=1
- fi
- return $rc
- }
- ##
- ## installEnv: Set variables for a non-client or nonexistent client command.
- installEnv()
- {
- readClientEnv "${WLP_INSTALL_DIR}/etc/client.env"
- installEnvDefaults
- clientEnvDefaults
- }
- ##
- ## installEnvDefaults: Set variable defaults for a non-client or nonexistent
- ## client command.
- installEnvDefaults()
- {
- readClientEnv "${WLP_INSTALL_DIR}/java/java.env"
- readClientEnv "${WLP_INSTALL_DIR}/etc/default.env"
- if [ -z "${WLP_USER_DIR}" ]
- then
- if [ -z "${WLP_DEFAULT_USER_DIR}" ]
- then
- WLP_DEFAULT_USER_DIR=${WLP_INSTALL_DIR}/usr
- fi
- WLP_USER_DIR=${WLP_DEFAULT_USER_DIR}
- fi
- if [ -z "${WLP_CLIENT_OUTPUT_DIR}" ]
- then
- if [ -z "${WLP_DEFAULT_OUTPUT_DIR}" ]
- then
- WLP_DEFAULT_OUTPUT_DIR=${WLP_USER_DIR}/clients
- fi
- WLP_CLIENT_OUTPUT_DIR=${WLP_DEFAULT_OUTPUT_DIR}
- fi
- CLIENT_CONFIG_DIR=${WLP_USER_DIR}/clients/${CLIENT_NAME}
-
- export WLP_USER_DIR
- export WLP_CLIENT_OUTPUT_DIR
- }
- ##
- ## clientEnvDefaults: Set defaults for client variables.
- clientEnvDefaults()
- {
- CLIENT_OUTPUT_DIR=${WLP_CLIENT_OUTPUT_DIR}/${CLIENT_NAME}
- # Unset set/tested variables to prevent collisions with nested process invocations
- if [ -z "$LOG_DIR" ]
- then
- X_LOG_DIR=${CLIENT_OUTPUT_DIR}/logs
- else
- X_LOG_DIR=${LOG_DIR}
- unset LOG_DIR
- fi
- export X_LOG_DIR
- if [ -z "$LOG_FILE" ]
- then
- X_LOG_FILE=console.log
- else
- X_LOG_FILE=${LOG_FILE}
- unset LOG_FILE
- fi
- export X_LOG_FILE
-
- if [ -z "${JAVA_HOME}" ]
- then
- if [ -z "${JRE_HOME}" ]
- then
- if [ -z "${WLP_DEFAULT_JAVA_HOME}" ]
- then
- # Use whatever java is on the path
- JAVA_CMD=java
- else
- substitutePrefixVar "${WLP_DEFAULT_JAVA_HOME}" WLP_INSTALL_DIR "${WLP_INSTALL_DIR}"
- JAVA_HOME=${substitutePrefixVarResult}
- JAVA_CMD=${JAVA_HOME}/bin/java
- fi
- else
- JAVA_HOME=${JRE_HOME}
- JAVA_CMD=${JRE_HOME}/bin/java
- fi
- else
- if [ -f "${JAVA_HOME}/jre/bin/java" ]
- then
- JAVA_CMD=${JAVA_HOME}/jre/bin/java
- else
- JAVA_CMD=${JAVA_HOME}/bin/java
- fi
- fi
- # Set a default file encoding if needed
- if [ -n "$defaultFileEncoding" ]; then
- if ! expr "${JVM_OPTIONS_QUOTED} ${JVM_ARGS}" : '.*\(-Dfile\.encoding\=[^[:space:]]\)' > /dev/null; then
- JVM_ARGS="${JVM_ARGS} -Dfile.encoding=$defaultFileEncoding"
- fi
- fi
-
- clientUmask
- }
- ##
- ## clientEnv: Set variables for an existing client.
- clientEnv()
- {
- readClientEnv "${WLP_INSTALL_DIR}/etc/client.env"
- installEnvDefaults
- readClientEnv "${CLIENT_CONFIG_DIR}/client.env"
- clientEnvDefaults
- }
- ##
- ## clientEnvAndJVMOptions: Read client.env files and set environment variables.
- ## Read client.jvm.options file into ${JVM_OPTIONS_QUOTED}
- clientEnvAndJVMOptions()
- {
- clientEnv
- # Allow Headless mode for running AWT application.
- JVM_OPTIONS_QUOTED=-Djava.awt.headless=true
- rc=0
- mergeJVMOptions "${CLIENT_CONFIG_DIR}/client.jvm.options"
- if [ $rc -ne 0 ]; then
- return $rc
- fi
-
- # If ${CLIENT_CONFIG_DIR}/client.jvm.options did not exist, then
- # try to read ${WLP_INSTALL_DIR}/etc/client.jvm.options.
- if [ $READ_ETC -eq 1 ]; then
- mergeJVMOptions "${WLP_INSTALL_DIR}/etc/client.jvm.options"
- fi
-
- JPMS_MODULE_FILE_LOCATION="${JAVA_HOME}/lib/modules"
- if [ -z "${JAVA_HOME}" ]; then
- JPMS_MODULE_FILE_LOCATION=$(dirname $(dirname $(which java)))/lib/modules
- fi
- # If we are running on Java 9, apply Liberty's built-in java 9 options
- if [ -f "${JPMS_MODULE_FILE_LOCATION}" ]; then
- mergeJVMOptions "${WLP_INSTALL_DIR}/lib/platform/java/java9.options"
- fi
- return $rc
- }
- mergeJVMOptions()
- {
- jvmOptions=$1
-
- if [ -f "$jvmOptions" ]; then
- READ_ETC=0
- saveIFS=$IFS
- IFS=$newline
-
- for option in `readNativeFile "$jvmOptions" '[#-]' | tr -d '\r'`; do
- if [ -n "$option" ]; then
- case $option in
- \#*);;
- *)
- escapeForEval "${option}"
- JVM_OPTIONS_QUOTED="${JVM_OPTIONS_QUOTED} ${escapeForEvalResult}"
- ;;
- esac
- fi
- done
- IFS=$saveIFS
- fi
- }
- ##
- ## readClientEnv: Read client.env file and export environment variables.
- readClientEnv()
- {
- if [ -f "$1" ]; then
- saveIFS=$IFS
- IFS=$newline
- for line in `readNativeFile "$1" '[#_A-Za-z=]' | tr -d '\r'`; do
- case $line in
- \#*);;
- *=*)
- # Only accept alphanumeric variable names to avoid eval complexities.
- if var=`safeEcho "$line" | sed -e 's/^\([a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/'`; then
- extractValueAndEscapeForEval "${line}"
- eval "${var}=${escapeForEvalResult}; export ${var}"
- fi
- esac
- done
- IFS=$saveIFS
- fi
- }
- ##
- ## Detects the code page of the file and converts to EBCDIC,
- ## if necessary, before cat'ing.
- ##
- ## Only applicable if running in a native EBCDIC environment (z/OS).
- ##
- ## $1 the file name
- ## $2 pattern denoting the expected first char of file
- readNativeFile() {
- if ${nativeEBCDIC}; then
- # ASCII 'm' overlaps with EBCDIC '_', so strip it out before detecting the codepage.
- # Note: cat used here to handle ASCII-tagged files.
- filecontents=`cat "$1" | iconv -f ISO8859-1 -t IBM-1047 | tr -d 'm\r\n'`
- case $filecontents in
- $2*) iconv -f ISO8859-1 -t IBM-1047 "$1" ;; # ASCII file.
- *) cat "$1" # EBCDIC file or ASCII-tagged file.
- esac
- else
- cat "$1"
- fi
- }
- ##
- ## clientWorkingDirectory: Change the working directory to ${CLIENT_OUTPUT_DIR}
- clientWorkingDirectory()
- {
- # Change the working directory to ${CLIENT_OUTPUT_DIR}.
- mkdirs "${CLIENT_OUTPUT_DIR}"
- cd "${CLIENT_OUTPUT_DIR}"
- }
- ## set the umask value to remove all permissions for the Other category
- ## but leave existing values for User and Group unaltered
- ##
- ## If the WLP_SKIP_UMASK variable is set then do not set umask
- clientUmask()
- {
- if [ -z "${WLP_SKIP_UMASK}" ]; then
- $UMASK_O
- fi
- }
- ##
- ## javaCmd: Execute a java-based command. Arguments are:
- ##
- ## "$@"
- ## All command-line arguments to be passed to the command
- ##
- ## The following variables must be set:
- ## ${JAVA_CMD} - the java command
- ## ${JAVA_DEBUG} - JVM options to enable debug, or empty
- ## ${JAVA_AGENT_QUOTED} - The -javaagent argument quoted for eval
- ## ${JVM_OPTIONS_QUOTED} - jvm.options quoted for eval
- ## ${WLP_INSTALL_DIR_QUOTED} - ${WLP_INSTALL_DIR} quoted for eval
- javaCmd()
- {
- # Set all the parameters for the java command. We use eval so that each line
- # in client.jvm.options is treated as a distinct argument.
- eval "set -- ${JAVA_AGENT_QUOTED} ${JVM_OPTIONS_QUOTED} ${JAVA_DEBUG} ${JVM_ARGS} -jar ${WLP_INSTALL_DIR_QUOTED}/bin/tools/ws-client.jar "'"$@"'
- ARGS="$@"
- # Do not add extra logic after the commands without preserving $?
- "${JAVA_CMD}" "$@"
- }
- ##
- ## clientCmd: Launch a client process.
- ##
- ##
- clientCmd()
- {
- X_CMD="${JAVA_CMD} ${ARGS}"
- export X_CMD
- javaCmd "${CLIENT_NAME}" "$@"
- rc=$?
- return $rc
- }
- JAVA_DEBUG=
- JVM_OPTIONS_QUOTED=
- INVOKED="$0"
- export INVOKED
- case "$ACTION" in
- # Start the client in the foreground
- run | debug)
- if clientEnvAndJVMOptions
- then
- :
- else
- exit $?
- fi
- if checkClient true
- then
- if [ "${ACTION}" = "debug" ]
- then
- if [ -z "${WLP_DEBUG_ADDRESS}" ]
- then
- WLP_DEBUG_ADDRESS=7778
- fi
- JAVA_DEBUG="-Dwas.debug.mode=true -Dcom.ibm.websphere.ras.inject.at.transform=true -Dsun.reflect.noInflation=true -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=${WLP_DEBUG_ADDRESS}"
- fi
- clientWorkingDirectory
- clientCmd "$@"
- exit $?
- else
- exit 2
- fi
- ;;
-
- create)
- installEnv
- createClient "$@"
- exit $rc
- ;;
- # Package up the runtime and target client configuration
- package)
- clientEnv
- # Check to see if the client exists
- if checkClient true
- then
- javaCmd "${CLIENT_NAME}" --package "$@"
- exit $?
- else
- exit 2
- fi
- ;;
-
- help)
- installEnv
- javaCmd --help "${CLIENT_NAME}"
- ;;
- help:usage)
- installEnv
- javaCmd --help:usage
- ;;
-
- *)
- installEnv
- javaCmd --help:actions:${ACTION}
- ;;
- esac
- exit 0
|