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