9b061b7c9d8079546b3c3562c9052b7d25f50f37
[controller.git] / karaf / opendaylight-karaf-resources / src / main / resources / bin / karaf
1 #!/bin/sh
2 #
3 #    Licensed to the Apache Software Foundation (ASF) under one or more
4 #    contributor license agreements.  See the NOTICE file distributed with
5 #    this work for additional information regarding copyright ownership.
6 #    The ASF licenses this file to You under the Apache License, Version 2.0
7 #    (the "License"); you may not use this file except in compliance with
8 #    the License.  You may obtain a copy of the License at
9 #
10 #       http://www.apache.org/licenses/LICENSE-2.0
11 #
12 #    Unless required by applicable law or agreed to in writing, software
13 #    distributed under the License is distributed on an "AS IS" BASIS,
14 #    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 #    See the License for the specific language governing permissions and
16 #    limitations under the License.
17 #
18
19 DIRNAME=`dirname "$0"`
20 PROGNAME=`basename "$0"`
21
22 #
23 # Sourcing environment settings for karaf similar to tomcats setenv
24 #
25 KARAF_SCRIPT="karaf"
26 export KARAF_SCRIPT
27 if [ -f "$DIRNAME/setenv" ]; then
28   . "$DIRNAME/setenv"
29 fi
30
31 #
32 # Set up some easily accessible MIN/MAX params for JVM mem usage
33 #
34 if [ "x$JAVA_MIN_MEM" = "x" ]; then
35     JAVA_MIN_MEM=128M
36     export JAVA_MIN_MEM
37 fi
38 if [ "x$JAVA_MAX_MEM" = "x" ]; then
39     JAVA_MAX_MEM=512M
40     export JAVA_MAX_MEM
41 fi
42
43 #
44 # Check the mode that initiated the script
45 #
46 if [ "x$1" != "x" ]; then
47     MODE=$1
48 fi
49
50 warn() {
51     echo "${PROGNAME}: $*"
52 }
53
54 die() {
55     warn "$*"
56     exit 1
57 }
58
59 detectOS() {
60     # OS specific support (must be 'true' or 'false').
61     cygwin=false;
62     darwin=false;
63     aix=false;
64     os400=false;
65     case "`uname`" in
66         CYGWIN*)
67             cygwin=true
68             ;;
69         Darwin*)
70             darwin=true
71             ;;
72         AIX*)
73             aix=true
74             ;;
75         OS400*)
76             os400=true
77             ;;
78     esac
79     # For AIX, set an environment variable
80     if $aix; then
81          export LDR_CNTRL=MAXDATA=0xB0000000@DSA
82          echo $LDR_CNTRL
83     fi
84 }
85
86 unlimitFD() {
87     # Use the maximum available, or set MAX_FD != -1 to use that
88     if [ "x$MAX_FD" = "x" ]; then
89         MAX_FD="maximum"
90     fi
91
92     # Increase the maximum file descriptors if we can
93     if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then
94         MAX_FD_LIMIT=`ulimit -H -n`
95         if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then
96             if [ $? -eq 0 ]; then
97                 if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then
98                     # use the system max
99                     MAX_FD="$MAX_FD_LIMIT"
100                 fi
101
102                 ulimit -n $MAX_FD > /dev/null
103                 # echo "ulimit -n" `ulimit -n`
104                 if [ $? -ne 0 ]; then
105                     warn "Could not set maximum file descriptor limit: $MAX_FD"
106                 fi
107             else
108                 warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
109             fi
110         fi
111     fi
112 }
113
114 locateHome() {
115     if [ "x$KARAF_HOME" != "x" ]; then
116         warn "Ignoring predefined value for KARAF_HOME"
117     fi
118
119     # In POSIX shells, CDPATH may cause cd to write to stdout
120     (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
121
122     KARAF_HOME=`cd "$DIRNAME/.."; pwd`
123     if [ ! -d "$KARAF_HOME" ]; then
124         die "KARAF_HOME is not valid: $KARAF_HOME"
125     fi
126 }
127
128 locateBase() {
129     if [ "x$KARAF_BASE" != "x" ]; then
130         if [ ! -d "$KARAF_BASE" ]; then
131             die "KARAF_BASE is not valid: $KARAF_BASE"
132         fi
133     else
134         KARAF_BASE=$KARAF_HOME
135     fi
136 }
137
138 locateData() {
139     if [ "x$KARAF_DATA" != "x" ]; then
140         if [ ! -d "$KARAF_DATA" ]; then
141             die "KARAF_DATA is not valid: $KARAF_DATA"
142         fi
143     else
144         KARAF_DATA=$KARAF_BASE/data
145     fi
146 }
147
148 locateEtc() {
149     if [ "x$KARAF_ETC" != "x" ]; then
150         if [ ! -d "$KARAF_ETC" ]; then
151             die "KARAF_ETC is not valid: $KARAF_ETC"
152         fi
153     else
154         KARAF_ETC=$KARAF_BASE/etc
155     fi
156 }
157
158 setupNativePath() {
159     # Support for loading native libraries
160     LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib"
161
162     # For Cygwin, set PATH from LD_LIBRARY_PATH
163     if $cygwin; then
164         LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"`
165         PATH="$PATH;$LD_LIBRARY_PATH"
166         export PATH
167     fi
168     export LD_LIBRARY_PATH
169 }
170
171 pathCanonical() {
172     local dst="${1}"
173     while [ -h "${dst}" ] ; do
174         ls=`ls -ld "${dst}"`
175         link=`expr "$ls" : '.*-> \(.*\)$'`
176         if expr "$link" : '/.*' > /dev/null; then
177             dst="$link"
178         else
179             dst="`dirname "${dst}"`/$link"
180         fi
181     done
182     local bas=`basename "${dst}"`
183     local dir=`dirname "${dst}"`
184     if [ "$bas" != "$dir" ]; then
185       dst="`pathCanonical "$dir"`/$bas"
186     fi
187     echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g'
188 }
189
190 locateJava() {
191     # Setup the Java Virtual Machine
192     if $cygwin ; then
193         [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"`
194         [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
195     fi
196
197         if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
198                 JAVA_HOME="$(/usr/libexec/java_home -v 1.7)"
199         fi
200     if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
201         JAVA_HOME=`java-config --jre-home`
202     fi
203     if [ "x$JAVA" = "x" ]; then
204         if [ "x$JAVA_HOME" != "x" ]; then
205             if [ ! -d "$JAVA_HOME" ]; then
206                 die "JAVA_HOME is not valid: $JAVA_HOME"
207             fi
208             JAVA="$JAVA_HOME/bin/java"
209         else
210             warn "JAVA_HOME not set; results may vary"
211             JAVA=`type java`
212             JAVA=`expr "$JAVA" : '.* \(/.*\)$'`
213             if [ "x$JAVA" = "x" ]; then
214                 die "java command not found"
215             fi
216         fi
217     fi
218     if [ "x$JAVA_HOME" = "x" ]; then
219         JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))"
220     fi
221 }
222
223 detectJVM() {
224    #echo "`$JAVA -version`"
225    # This service should call `java -version`,
226    # read stdout, and look for hints
227    if $JAVA -version 2>&1 | grep "^IBM" ; then
228        JVM_VENDOR="IBM"
229    # on OS/400, java -version does not contain IBM explicitly
230    elif $os400; then
231        JVM_VENDOR="IBM"
232    else
233        JVM_VENDOR="SUN"
234    fi
235    # echo "JVM vendor is $JVM_VENDOR"
236 }
237
238 checkJvmVersion() {
239    # echo "`$JAVA -version`"
240    VERSION=`$JAVA -version 2>&1 | egrep '"([0-9].[0-9]\..*[0-9]).*"' | awk '{print substr($3,2,length($3)-2)}' | awk '{print substr($1, 3, 3)}' | sed -e 's;\.;;g'`
241    # echo $VERSION
242    if [ "$VERSION" -lt "60" ]; then
243        echo "JVM must be greater than 1.6"
244        exit 1;
245    fi
246 }
247
248 setupDebugOptions() {
249     if [ "x$JAVA_OPTS" = "x" ]; then
250         JAVA_OPTS="$DEFAULT_JAVA_OPTS"
251     fi
252     export JAVA_OPTS
253
254     if [ "x$EXTRA_JAVA_OPTS" != "x" ]; then
255         JAVA_OPTS="$JAVA_OPTS $EXTRA_JAVA_OPTS"
256     fi
257
258     # Set Debug options if enabled
259     if [ "x$KARAF_DEBUG" != "x" ]; then
260         # Ignore DEBUG in case of stop or client mode
261         if [ "x$MODE" = "xstop" ]; then
262             return
263         fi
264         if [ "x$MODE" = "xclient" ]; then
265             return
266         fi
267         # Use the defaults if JAVA_DEBUG_OPTS was not set
268         if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
269             JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
270         fi
271
272         JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
273         warn "Enabling Java debug options: $JAVA_DEBUG_OPTS"
274     fi
275 }
276
277 setupDefaults() {
278     DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass -XX:+HeapDumpOnOutOfMemoryError"
279
280     #Set the JVM_VENDOR specific JVM flags
281     if [ "$JVM_VENDOR" = "SUN" ]; then
282         DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
283     elif [ "$JVM_VENDOR" = "IBM" ]; then
284         if $os400; then
285             DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
286         elif $aix; then
287             DEFAULT_JAVA_OPTS="-Xverify:none -Xdump:heap -Xlp $DEFAULT_JAVA_OPTS"
288         else
289             DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
290         fi
291     fi
292
293     # Add default security file option
294     if [ "x$ODL_JAVA_SECURITY_PROPERTIES" != "x" ]; then
295         DEFAULT_JAVA_OPTS="-Djava.security.properties="${ODL_JAVA_SECURITY_PROPERTIES}" $DEFAULT_JAVA_OPTS"
296     else
297         DEFAULT_JAVA_OPTS="-Djava.security.properties="${KARAF_ETC}/odl.java.security" $DEFAULT_JAVA_OPTS"
298     fi
299
300     # Add the jars in the lib dir
301     for file in "$KARAF_HOME"/lib/karaf*.jar
302     do
303         if [ -z "$CLASSPATH" ]; then
304             CLASSPATH="$file"
305         else
306             CLASSPATH="$CLASSPATH:$file"
307         fi
308     done
309
310     DEFAULT_JAVA_DEBUG_PORT="5005"
311     if [ "x$JAVA_DEBUG_PORT" = "x" ]; then
312         JAVA_DEBUG_PORT="$DEFAULT_JAVA_DEBUG_PORT"
313     fi
314     DEFAULT_JAVA_DEBUG_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$JAVA_DEBUG_PORT"
315
316     ##
317     ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
318     ##
319     # Uncomment to enable YourKit profiling
320     #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
321 }
322
323 init() {
324     # Determine if there is special OS handling we must perform
325     detectOS
326
327     # Unlimit the number of file descriptors if possible
328     unlimitFD
329
330     # Locate the Karaf home directory
331     locateHome
332
333     # Locate the Karaf base directory
334     locateBase
335
336     # Locate the Karaf data directory
337     locateData
338
339     # Locate the Karaf etc directory
340     locateEtc
341
342     # Setup the native library path
343     setupNativePath
344
345     # Locate the Java VM to execute
346     locateJava
347
348     # Determine the JVM vendor
349     detectJVM
350
351     # Determine the JVM version >= 1.6
352     checkJvmVersion
353
354     # Setup default options
355     setupDefaults
356
357     # Install debug options
358     setupDebugOptions
359
360 }
361
362 run() {
363     OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
364     MAIN=org.apache.karaf.main.Main
365     while [ "$1" != "" ]; do
366         case $1 in
367             'clean')
368                 rm -Rf "$KARAF_DATA"
369                 shift
370                 ;;
371             'debug')
372                 if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
373                     JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
374                 fi
375                 JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
376                 shift
377                 ;;
378             'status')
379                 MAIN=org.apache.karaf.main.Status
380                 shift
381                 ;;
382             'stop')
383                 MAIN=org.apache.karaf.main.Stop
384                 shift
385                 ;;
386             'console')
387                 shift
388                 ;;
389             'server')
390                 OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
391                 shift
392                 ;;
393             'client')
394                 OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
395                 shift
396                 ;;
397             *)
398                 break
399                 ;;
400         esac
401     done
402
403     JAVA_ENDORSED_DIRS="${JAVA_HOME}/jre/lib/endorsed:${JAVA_HOME}/lib/endorsed:${KARAF_HOME}/lib/endorsed"
404     JAVA_EXT_DIRS="${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:${KARAF_HOME}/lib/ext"
405     if $cygwin; then
406         KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
407         KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
408         KARAF_DATA=`cygpath --path --windows "$KARAF_DATA"`
409         KARAF_ETC=`cygpath --path --windows "$KARAF_ETC"`
410         CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
411         JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
412         JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
413         JAVA_EXT_DIRS=`cygpath --path --windows "$JAVA_EXT_DIRS"`
414     fi
415     cd "$KARAF_BASE"
416
417     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" -Djava.io.tmpdir="$KARAF_DATA/tmp" -Djava.util.logging.config.file="$KARAF_BASE/etc/java.util.logging.properties" $KARAF_OPTS $OPTS -classpath "$CLASSPATH" $MAIN "$@"
418 }
419
420 main() {
421     init
422     run "$@"
423 }
424
425 main "$@"