BUG-3553 Introduce custom java.security config file
[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 "
279
280     #Set the JVM_VENDOR specific JVM flags
281     if [ "$JVM_VENDOR" = "SUN" ]; then
282         #
283         # Check some easily accessible MIN/MAX params for JVM mem usage
284         #
285         if [ "x$JAVA_PERM_MEM" != "x" ]; then
286             DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:PermSize=$JAVA_PERM_MEM"
287         fi
288         if [ "x$JAVA_MAX_PERM_MEM" != "x" ]; then
289             DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:MaxPermSize=$JAVA_MAX_PERM_MEM"
290         fi
291         DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
292     elif [ "$JVM_VENDOR" = "IBM" ]; then
293         if $os400; then
294             DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
295         elif $aix; then
296             DEFAULT_JAVA_OPTS="-Xverify:none -Xdump:heap -Xlp $DEFAULT_JAVA_OPTS"
297         else
298             DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
299         fi
300     fi
301
302     # Add default security file option
303     if [ "x$ODL_JAVA_SECURITY_PROPERTIES" != "x" ]; then
304         DEFAULT_JAVA_OPTS="-Djava.security.properties="${ODL_JAVA_SECURITY_PROPERTIES}" $DEFAULT_JAVA_OPTS"
305     else
306         DEFAULT_JAVA_OPTS="-Djava.security.properties="${KARAF_ETC}/odl.java.security" $DEFAULT_JAVA_OPTS"
307     fi
308
309     # Add the jars in the lib dir
310     for file in "$KARAF_HOME"/lib/karaf*.jar
311     do
312         if [ -z "$CLASSPATH" ]; then
313             CLASSPATH="$file"
314         else
315             CLASSPATH="$CLASSPATH:$file"
316         fi
317     done
318
319     DEFAULT_JAVA_DEBUG_PORT="5005"
320     if [ "x$JAVA_DEBUG_PORT" = "x" ]; then
321         JAVA_DEBUG_PORT="$DEFAULT_JAVA_DEBUG_PORT"
322     fi
323     DEFAULT_JAVA_DEBUG_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$JAVA_DEBUG_PORT"
324
325     ##
326     ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
327     ##
328     # Uncomment to enable YourKit profiling
329     #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
330 }
331
332 init() {
333     # Determine if there is special OS handling we must perform
334     detectOS
335
336     # Unlimit the number of file descriptors if possible
337     unlimitFD
338
339     # Locate the Karaf home directory
340     locateHome
341
342     # Locate the Karaf base directory
343     locateBase
344
345     # Locate the Karaf data directory
346     locateData
347
348     # Locate the Karaf etc directory
349     locateEtc
350
351     # Setup the native library path
352     setupNativePath
353
354     # Locate the Java VM to execute
355     locateJava
356
357     # Determine the JVM vendor
358     detectJVM
359
360     # Determine the JVM version >= 1.6
361     checkJvmVersion
362
363     # Setup default options
364     setupDefaults
365
366     # Install debug options
367     setupDebugOptions
368
369 }
370
371 run() {
372     OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
373     MAIN=org.apache.karaf.main.Main
374     while [ "$1" != "" ]; do
375         case $1 in
376             'clean')
377                 rm -Rf "$KARAF_DATA"
378                 shift
379                 ;;
380             'debug')
381                 if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
382                     JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
383                 fi
384                 JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
385                 shift
386                 ;;
387             'status')
388                 MAIN=org.apache.karaf.main.Status
389                 shift
390                 ;;
391             'stop')
392                 MAIN=org.apache.karaf.main.Stop
393                 shift
394                 ;;
395             'console')
396                 shift
397                 ;;
398             'server')
399                 OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
400                 shift
401                 ;;
402             'client')
403                 OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
404                 shift
405                 ;;
406             *)
407                 break
408                 ;;
409         esac
410     done
411
412     JAVA_ENDORSED_DIRS="${JAVA_HOME}/jre/lib/endorsed:${JAVA_HOME}/lib/endorsed:${KARAF_HOME}/lib/endorsed"
413     JAVA_EXT_DIRS="${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:${KARAF_HOME}/lib/ext"
414     if $cygwin; then
415         KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
416         KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
417         KARAF_DATA=`cygpath --path --windows "$KARAF_DATA"`
418         KARAF_ETC=`cygpath --path --windows "$KARAF_ETC"`
419         CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
420         JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
421         JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
422         JAVA_EXT_DIRS=`cygpath --path --windows "$JAVA_EXT_DIRS"`
423     fi
424     cd "$KARAF_BASE"
425
426     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 "$@"
427 }
428
429 main() {
430     init
431     run "$@"
432 }
433
434 main "$@"