1#!/bin/sh
2
3DIRNAME=`dirname "$0"`
4PROGNAME=`basename "$0"`
5GREP="grep"
6
7# Use the maximum available, or set MAX_FD != -1 to use that
8MAX_FD="maximum"
9
10# Process passed in parameters
11while [ "$#" -gt 0 ]
12do
13    case "$1" in
14      -secmgr)
15          SECMGR="true"
16          ;;
17      -Djava.security.manager=*)
18          echo "ERROR: The use of -Djava.security.manager has been removed. Please use the -secmgr command line argument or SECMGR=true environment variable."
19          exit 1
20          ;;
21      *)
22          SERVER_OPTS="$SERVER_OPTS '$1'"
23          ;;
24    esac
25    shift
26done
27
28# tell linux glibc how many memory pools can be created that are used by malloc
29MALLOC_ARENA_MAX="${MALLOC_ARENA_MAX:-1}"
30export MALLOC_ARENA_MAX
31
32# OS specific support (must be 'true' or 'false').
33cygwin=false;
34darwin=false;
35linux=false;
36solaris=false;
37other=false;
38case "`uname`" in
39    CYGWIN*)
40        cygwin=true
41        ;;
42
43    Darwin*)
44        darwin=true
45        ;;
46
47    Linux)
48        linux=true
49        ;;
50    SunOS*)
51        solaris=true
52        ;;
53    *)
54        other=true
55        ;;
56esac
57
58# For Cygwin, ensure paths are in UNIX format before anything is touched
59if $cygwin ; then
60    [ -n "$JBOSS_HOME" ] &&
61        JBOSS_HOME=`cygpath --unix "$JBOSS_HOME"`
62    [ -n "$JAVA_HOME" ] &&
63        JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
64    [ -n "$JAVAC_JAR" ] &&
65        JAVAC_JAR=`cygpath --unix "$JAVAC_JAR"`
66fi
67
68# Setup JBOSS_HOME
69RESOLVED_JBOSS_HOME=`cd "$DIRNAME/.."; pwd`
70if [ "x$JBOSS_HOME" = "x" ]; then
71    # get the full path (without any relative bits)
72    JBOSS_HOME=$RESOLVED_JBOSS_HOME
73else
74 SANITIZED_JBOSS_HOME=`cd "$JBOSS_HOME"; pwd`
75 if [ "$RESOLVED_JBOSS_HOME" != "$SANITIZED_JBOSS_HOME" ]; then
76   echo "WARNING JBOSS_HOME may be pointing to a different installation - unpredictable results may occur."
77   echo ""
78 fi
79fi
80export JBOSS_HOME
81
82# Read an optional running configuration file
83if [ "x$DOMAIN_CONF" = "x" ]; then
84    DOMAIN_CONF="$DIRNAME/domain.conf"
85fi
86if [ -r "$DOMAIN_CONF" ]; then
87    . "$DOMAIN_CONF"
88fi
89
90# Setup the JVM
91if [ "x$JAVA" = "x" ]; then
92    if [ "x$JAVA_HOME" != "x" ]; then
93        JAVA="$JAVA_HOME/bin/java"
94    else
95        JAVA="java"
96    fi
97fi
98
99# Check for -d32/-d64 in JAVA_OPTS
100JVM_OPTVERSION="-version"
101JVM_D64_OPTION=`echo $JAVA_OPTS | $GREP "\-d64"`
102JVM_D32_OPTION=`echo $JAVA_OPTS | $GREP "\-d32"`
103test "x$JVM_D64_OPTION" != "x" && JVM_OPTVERSION="-d64 $JVM_OPTVERSION"
104test "x$JVM_D32_OPTION" != "x" && JVM_OPTVERSION="-d32 $JVM_OPTVERSION"
105
106# If -server not set in JAVA_OPTS, set it, if supported
107SERVER_SET=`echo $JAVA_OPTS | $GREP "\-server"`
108if [ "x$SERVER_SET" = "x" ]; then
109
110    # Check for SUN(tm) JVM w/ HotSpot support
111    if [ "x$HAS_HOTSPOT" = "x" ]; then
112        HAS_HOTSPOT=`"$JAVA" $JVM_OPTVERSION -version 2>&1 | $GREP -i HotSpot`
113    fi
114
115    # Check for OpenJDK JVM w/server support
116    if [ "x$HAS_OPENJDK" = "x" ]; then
117        HAS_OPENJDK=`"$JAVA" $JVM_OPTVERSION 2>&1 | $GREP -i OpenJDK`
118    fi
119
120    # Check for IBM JVM w/server support
121    if [ "x$HAS_IBM" = "x" ]; then
122        HAS_IBM=`"$JAVA" $JVM_OPTVERSION 2>&1 | $GREP -i "IBM J9"`
123    fi
124
125    # Enable -server if we have Hotspot or OpenJDK, unless we can't
126    if [ "x$HAS_HOTSPOT" != "x" -o "x$HAS_OPENJDK" != "x" -o "x$HAS_IBM" != "x" ]; then
127        # MacOS does not support -server flag
128        if [ "$darwin" != "true" ]; then
129            PROCESS_CONTROLLER_JAVA_OPTS="-server $PROCESS_CONTROLLER_JAVA_OPTS"
130            HOST_CONTROLLER_JAVA_OPTS="-server $HOST_CONTROLLER_JAVA_OPTS"
131            JVM_OPTVERSION="-server $JVM_OPTVERSION"
132        fi
133    fi
134else
135    JVM_OPTVERSION="-server $JVM_OPTVERSION"
136fi
137
138if [ "x$JBOSS_MODULEPATH" = "x" ]; then
139    JBOSS_MODULEPATH="$JBOSS_HOME/modules"
140fi
141
142if $linux; then
143    # consolidate the host-controller and command line opts
144    HOST_CONTROLLER_OPTS="$HOST_CONTROLLER_JAVA_OPTS $SERVER_OPTS"
145    # process the host-controller options
146    for var in $HOST_CONTROLLER_OPTS
147    do
148       # Remove quotes
149      p=`echo $var | tr -d "'"`
150      case $p in
151        -Djboss.domain.base.dir=*)
152             JBOSS_BASE_DIR=`readlink -m ${p#*=}`
153             ;;
154        -Djboss.domain.log.dir=*)
155             JBOSS_LOG_DIR=`readlink -m ${p#*=}`
156             ;;
157        -Djboss.domain.config.dir=*)
158             JBOSS_CONFIG_DIR=`readlink -m ${p#*=}`
159             ;;
160      esac
161    done
162fi
163
164if $solaris; then
165    # consolidate the host-controller and command line opts
166    HOST_CONTROLLER_OPTS="$HOST_CONTROLLER_JAVA_OPTS $SERVER_OPTS"
167    # process the host-controller options
168    for var in $HOST_CONTROLLER_OPTS
169    do
170       # Remove quotes
171      p=`echo $var | tr -d "'"`
172      case $p in
173        -Djboss.domain.base.dir=*)
174             JBOSS_BASE_DIR=`echo $p | awk -F= '{print $2}'`
175             ;;
176        -Djboss.domain.log.dir=*)
177             JBOSS_LOG_DIR=`echo $p | awk -F= '{print $2}'`
178             ;;
179        -Djboss.domain.config.dir=*)
180             JBOSS_CONFIG_DIR=`echo $p | awk -F= '{print $2}'`
181             ;;
182      esac
183    done
184fi
185
186# No readlink -m on BSD and possibly other distros
187if $darwin || $other ; then
188    # consolidate the host-controller and command line opts
189    HOST_CONTROLLER_OPTS="$HOST_CONTROLLER_JAVA_OPTS $SERVER_OPTS"
190    # process the host-controller options
191    for var in $HOST_CONTROLLER_OPTS
192    do
193       # Remove quotes
194       p=`echo $var | tr -d "'"`
195       case $p in
196        -Djboss.domain.base.dir=*)
197             JBOSS_BASE_DIR=`cd ${p#*=} ; pwd -P`
198             ;;
199        -Djboss.domain.log.dir=*)
200             if [ -d "${p#*=}" ]; then
201                JBOSS_LOG_DIR=`cd ${p#*=} ; pwd -P`
202             else
203                #since the specified directory doesn't exist we don't validate it
204                JBOSS_LOG_DIR=${p#*=}
205             fi
206             ;;
207        -Djboss.domain.config.dir=*)
208             JBOSS_CONFIG_DIR=`cd ${p#*=} ; pwd -P`
209             ;;
210      esac
211    done
212fi
213# determine the default base dir, if not set
214if [ "x$JBOSS_BASE_DIR" = "x" ]; then
215   JBOSS_BASE_DIR="$JBOSS_HOME/domain"
216fi
217# determine the default log dir, if not set
218if [ "x$JBOSS_LOG_DIR" = "x" ]; then
219   JBOSS_LOG_DIR="$JBOSS_BASE_DIR/log"
220fi
221# determine the default configuration dir, if not set
222if [ "x$JBOSS_CONFIG_DIR" = "x" ]; then
223   JBOSS_CONFIG_DIR="$JBOSS_BASE_DIR/configuration"
224fi
225
226# Setup the java path to invoke from JVM
227# Needed to start domain from cygwin when the JAVA path will result in an invalid path
228JAVA_FROM_JVM="$JAVA"
229
230# For Cygwin, switch paths to Windows format before running java
231if $cygwin; then
232    JBOSS_HOME=`cygpath --path --windows "$JBOSS_HOME"`
233    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
234    JAVA_FROM_JVM=`cygpath --path --absolute --windows "$JAVA_FROM_JVM"`
235    JBOSS_BASE_DIR=`cygpath --path --windows "$JBOSS_BASE_DIR"`
236    JBOSS_LOG_DIR=`cygpath --path --windows "$JBOSS_LOG_DIR"`
237    JBOSS_CONFIG_DIR=`cygpath --path --windows "$JBOSS_CONFIG_DIR"`
238    JBOSS_MODULEPATH=`cygpath --path --windows "$JBOSS_MODULEPATH"`
239fi
240
241# If the -Djava.security.manager is found, enable the -secmgr and include a bogus security manager for JBoss Modules to replace
242# Note that HOST_CONTROLLER_JAVA_OPTS will not need to be handled here
243SECURITY_MANAGER_SET=`echo $PROCESS_CONTROLLER_JAVA_OPTS | $GREP "java\.security\.manager"`
244if [ "x$SECURITY_MANAGER_SET" != "x" ]; then
245    echo "ERROR: The use of -Djava.security.manager has been removed. Please use the -secmgr command line argument or SECMGR=true environment variable."
246    exit 1
247fi
248
249# Set up the module arguments
250MODULE_OPTS=""
251if [ "$SECMGR" = "true" ]; then
252    MODULE_OPTS="$MODULE_OPTS -secmgr";
253fi
254
255# Display our environment
256echo "========================================================================="
257echo ""
258echo "  JBoss Bootstrap Environment"
259echo ""
260echo "  JBOSS_HOME: $JBOSS_HOME"
261echo ""
262echo "  JAVA: $JAVA"
263echo ""
264echo "  JAVA_OPTS: $PROCESS_CONTROLLER_JAVA_OPTS"
265echo ""
266echo "========================================================================="
267echo ""
268
269while true; do
270   if [ "x$LAUNCH_JBOSS_IN_BACKGROUND" = "x" ]; then
271      # Execute the JVM in the foreground
272      eval \"$JAVA\" -D\"[Process Controller]\" $PROCESS_CONTROLLER_JAVA_OPTS \
273         \"-Dorg.jboss.boot.log.file="$JBOSS_LOG_DIR"/process-controller.log\" \
274         \"-Dlogging.configuration=file:"$JBOSS_CONFIG_DIR"/logging.properties\" \
275         -jar \""$JBOSS_HOME"/jboss-modules.jar\" \
276         $MODULE_OPTS \
277         -mp \""${JBOSS_MODULEPATH}"\" \
278         org.jboss.as.process-controller \
279         -jboss-home \""$JBOSS_HOME"\" \
280         -jvm \"$JAVA_FROM_JVM\" \
281         $MODULE_OPTS \
282         -mp \""${JBOSS_MODULEPATH}"\" \
283         -- \
284         \"-Dorg.jboss.boot.log.file="$JBOSS_LOG_DIR"/host-controller.log\" \
285         \"-Dlogging.configuration=file:"$JBOSS_CONFIG_DIR"/logging.properties\" \
286         $HOST_CONTROLLER_JAVA_OPTS \
287         -- \
288         -default-jvm \"$JAVA_FROM_JVM\" \
289         "$SERVER_OPTS"
290      JBOSS_STATUS=$?
291   else
292      # Execute the JVM in the background
293      eval \"$JAVA\" -D\"[Process Controller]\" $PROCESS_CONTROLLER_JAVA_OPTS \
294         \"-Dorg.jboss.boot.log.file="$JBOSS_LOG_DIR"/process-controller.log\" \
295         \"-Dlogging.configuration=file:"$JBOSS_CONFIG_DIR"/logging.properties\" \
296         -jar \""$JBOSS_HOME"/jboss-modules.jar\" \
297         $MODULE_OPTS \
298         -mp \""${JBOSS_MODULEPATH}"\" \
299         org.jboss.as.process-controller \
300         -jboss-home \""$JBOSS_HOME"\" \
301         -jvm \"$JAVA_FROM_JVM\" \
302         $MODULE_OPTS \
303         -mp \""${JBOSS_MODULEPATH}"\" \
304         -- \
305         \"-Dorg.jboss.boot.log.file="$JBOSS_LOG_DIR"/host-controller.log\" \
306         \"-Dlogging.configuration=file:"$JBOSS_CONFIG_DIR"/logging.properties\" \
307         $HOST_CONTROLLER_JAVA_OPTS \
308         -- \
309         -default-jvm \"$JAVA_FROM_JVM\" \
310         "$SERVER_OPTS" "&"
311      JBOSS_PID=$!
312      # Trap common signals and relay them to the jboss process
313      trap "kill -HUP  $JBOSS_PID" HUP
314      trap "kill -TERM $JBOSS_PID" INT
315      trap "kill -QUIT $JBOSS_PID" QUIT
316      trap "kill -PIPE $JBOSS_PID" PIPE
317      trap "kill -TERM $JBOSS_PID" TERM
318      if [ "x$JBOSS_PIDFILE" != "x" ]; then
319        echo $JBOSS_PID > $JBOSS_PIDFILE
320      fi
321      # Wait until the background process exits
322      WAIT_STATUS=128
323      while [ "$WAIT_STATUS" -ge 128 ]; do
324         wait $JBOSS_PID 2>/dev/null
325         WAIT_STATUS=$?
326         if [ "$WAIT_STATUS" -gt 128 ]; then
327            SIGNAL=`expr $WAIT_STATUS - 128`
328            SIGNAL_NAME=`kill -l $SIGNAL`
329            echo "*** JBossAS process ($JBOSS_PID) received $SIGNAL_NAME signal ***" >&2
330         fi
331      done
332      if [ "$WAIT_STATUS" -lt 127 ]; then
333         JBOSS_STATUS=$WAIT_STATUS
334      else
335         JBOSS_STATUS=0
336      fi
337      if [ "$JBOSS_STATUS" -ne 10 ]; then
338            # Wait for a complete shudown
339            wait $JBOSS_PID 2>/dev/null
340      fi
341      if [ "x$JBOSS_PIDFILE" != "x" ]; then
342            grep "$JBOSS_PID" $JBOSS_PIDFILE && rm $JBOSS_PIDFILE
343      fi
344   fi
345   if [ "$JBOSS_STATUS" -eq 10 ]; then
346      echo "Restarting JBoss..."
347   else
348      exit $JBOSS_STATUS
349   fi
350done
351