Repository: karaf
Updated Branches:
  refs/heads/karaf-4.0.x d8ff3a3ca -> 4f600555c


KARAF-4157: Provide system script templates to start karaf without service 
wrapper

(cherry picked from commit f8d510f59e3453cd648b378c079c2231e9fd4bea)


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/4f600555
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/4f600555
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/4f600555

Branch: refs/heads/karaf-4.0.x
Commit: 4f600555c986d18990f884512e8d1fdaa2ca8c35
Parents: d8ff3a3
Author: lburgazzoli <[email protected]>
Authored: Tue Dec 1 14:59:55 2015 +0100
Committer: Freeman Fang <[email protected]>
Committed: Fri Jan 15 11:11:52 2016 +0800

----------------------------------------------------------------------
 .../bin/contrib/karaf-service-template.conf     |  17 ++
 .../bin/contrib/karaf-service-template.init     | 129 +++++++++++
 .../contrib/karaf-service-template.init-debian  | 223 +++++++++++++++++++
 .../contrib/karaf-service-template.init-redhat  | 142 ++++++++++++
 .../contrib/karaf-service-template.solaris-smf  |  76 +++++++
 .../bin/contrib/karaf-service-template.systemd  |  28 +++
 .../resources/bin/contrib/karaf-service-win.exe | Bin 0 -> 59392 bytes
 .../resources/bin/contrib/karaf-service-win.xml |  46 ++++
 .../resources/bin/contrib/karaf-service.sh      | 144 ++++++++++++
 .../base/src/main/resources/resources/bin/karaf |  35 ++-
 .../src/main/resources/resources/bin/karaf.bat  |  26 ++-
 11 files changed, 855 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.conf
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.conf
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.conf
new file mode 100644
index 0000000..abf103e
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.conf
@@ -0,0 +1,17 @@
+#
+# Karaf Service
+#
+KARAF_SERVICE_PATH="${KARAF_SERVICE_PATH}"
+KARAF_SERVICE_NAME="${KARAF_SERVICE_NAME}"
+KARAF_SERVICE_LOG="${KARAF_SERVICE_LOG}"
+KARAF_SERVICE_USER="${KARAF_SERVICE_USER}"
+KARAF_SERVICE_GROUP="${KARAF_SERVICE_GROUP}"
+KARAF_LOCKFILE="/var/lock/subsys/$KARAF_SERVICE_NAME"
+KARAF_SERVICE_PIDFILE=${KARAF_SERVICE_PIDFILE}
+#
+# Karaf
+#
+
+#
+# User
+#

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init
new file mode 100644
index 0000000..6ba799e
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init
@@ -0,0 +1,129 @@
+#!/bin/sh
+#
+# Karaf control script
+# description: Karaf startup script
+# processname: ${KARAF_SERVICE_NAME}
+# pidfile: ${KARAF_SERVICE_PIDFILE}
+# config: ${KARAF_SERVICE_CONF}
+#
+
+# Location of JDK
+if [ -n "$JAVA_HOME" ]; then
+    export JAVA_HOME
+fi
+
+# Setup the JVM
+if [ -z "$JAVA" ]; then
+    if [ -n "$JAVA_HOME" ]; then
+        JAVA="$JAVA_HOME/bin/java"
+    else
+        JAVA="java"
+    fi
+fi
+
+if [ -r "${KARAF_SERVICE_CONF}" ]; then
+    . "${KARAF_SERVICE_CONF}"
+else
+    echo "Error KARAF_SERVICE_CONF not defined"
+    exit -1
+fi
+
+if [ -z "$STARTUP_WAIT" ]; then
+    STARTUP_WAIT=30
+fi
+
+if [ -z "$SHUTDOWN_WAIT" ]; then
+    SHUTDOWN_WAIT=30
+fi
+
+prog=${KARAF_SERVICE_NAME}
+currenttime=$(date +%s%N | cut -b1-13)
+
+do_start() {
+    echo "Starting $prog: "
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read ppid < $KARAF_SERVICE_PIDFILE
+        if [ `ps -p $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' 
]; then
+            echo "$prog is already running"
+            return 1
+        else
+            rm -f $KARAF_SERVICE_PIDFILE
+        fi
+    fi
+    
+    mkdir -p $(dirname $KARAF_SERVICE_LOG)
+    cat /dev/null > $KARAF_SERVICE_LOG
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP  $KARAF_SERVICE_LOG
+
+    mkdir -p $(dirname $KARAF_SERVICE_PIDFILE)
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP $(dirname 
$KARAF_SERVICE_PIDFILE) || true
+
+    if [ ! -z "$KARAF_SERVICE_USER" ]; then
+        su - $KARAF_SERVICE_USER \
+            -c " { $KARAF_SERVICE_PATH/bin/karaf daemon >> $KARAF_SERVICE_LOG 
2>&1 & } ; echo \$! >| $KARAF_SERVICE_PIDFILE "
+    fi
+ 
+    RETVAL=$?    
+    return $RETVAL
+}
+
+do_stop() {
+    echo $"Stopping $prog: "
+    count=0;
+
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read kpid < $KARAF_SERVICE_PIDFILE
+        let kwait=$SHUTDOWN_WAIT
+
+        # Try issuing SIGTERM
+        su - $KARAF_SERVICE_USER -c $KARAF_SERVICE_PATH/bin/stop
+        until [ `ps -p $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq 
'0' ] || [ $count -gt $kwait ]
+        do
+            sleep 1
+            let count=$count+1;
+        done
+
+        if [ $count -gt $kwait ]; then
+            kill -9 $kpid
+        fi
+    fi
+
+    rm -f $KARAF_SERVICE_PIDFILE
+    rm -f $KARAF_LOCKFILE
+}
+
+do_status() {
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read ppid < $KARAF_SERVICE_PIDFILE
+        if [ `ps -p $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' 
]; then
+            echo "$prog is running (pid $ppid)"
+            return 0
+        else
+            echo "$prog dead but pid file exists"
+            return 1
+        fi
+    fi
+    echo "$prog is not running"
+    return 3
+}
+
+case "$1" in
+    start)
+        do_start
+        ;;
+    stop)
+        do_stop
+        ;;
+    restart)
+        do_stop
+        do_start
+        ;;
+    status)
+        do_status
+        ;;
+    *)
+        ## If no parameters are given, print which are avaiable.
+        echo "Usage: $0 {start|stop|status|restart}"
+        exit 1
+        ;;
+esac

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-debian
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-debian
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-debian
new file mode 100644
index 0000000..4d2ddba
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-debian
@@ -0,0 +1,223 @@
+#!/bin/sh
+#
+# /etc/init.d/${KARAF_SERVICE_NAME} -- startup script for Karaf
+#
+#
+### BEGIN INIT INFO
+# Provides:             ${KARAF_SERVICE_NAME} 
+# Required-Start:       $remote_fs $network
+# Required-Stop:        $remote_fs $network
+# Should-Start:         $named
+# Should-Stop:          $named
+# Default-Start:        2 3 4 5
+# Default-Stop:         0 1 6
+# Short-Description:    Karaf
+# Description:          Provide Karaf startup/shutdown script
+### END INIT INFO
+
+NAME=${KARAF_SERVICE_NAME} 
+DESC="Karaf"
+DEFAULT="/etc/default/$NAME"
+
+# Check privileges
+if [ `id -u` -ne 0 ]; then
+    echo "You need root privileges to run this script"
+    exit 1
+fi
+
+# Make sure karaf is started with system locale
+if [ -r /etc/default/locale ]; then
+    . /etc/default/locale
+    export LANG
+fi
+
+. /lib/lsb/init-functions
+
+if [ -r /etc/default/rcS ]; then
+    . /etc/default/rcS
+fi
+
+# Overwrite settings from default file
+if [ -f "$DEFAULT" ]; then
+    . "$DEFAULT"
+fi
+
+if [ -r "${KARAF_SERVICE_CONF}" ]; then
+    . "${KARAF_SERVICE_CONF}"
+else
+    echo "Error KARAF_SERVICE_CONF not defined"
+    exit -1
+fi
+
+# Location of JDK
+if [ -n "$JAVA_HOME" ]; then
+    export JAVA_HOME
+fi
+
+# Setup the JVM
+if [ -z "$JAVA" ]; then
+    if [ -n "$JAVA_HOME" ]; then
+        JAVA="$JAVA_HOME/bin/java"
+    else
+        JAVA="java"
+    fi
+fi
+
+# Check karaf user
+id $KARAF_SERVICE_USER > /dev/null 2>&1
+if [ $? -ne 0 -o -z "$KARAF_SERVICE_USER" ]; then
+    echo "User \"$KARAF_SERVICE_USER\" does not exist..." >&2
+    exit 1
+fi
+
+# Check owner of KARAF_SERVICE_PATH
+if [ ! $(stat -L -c "%U" "$KARAF_SERVICE_PATH") = $KARAF_SERVICE_USER ]; then
+    echo "The user \"$KARAF_SERVICE_USER\" is not owner of 
\"$KARAF_SERVICE_PATH\"" >&2
+    exit 1
+fi
+
+# The amount of time to wait for startup
+if [ -z "$STARTUP_WAIT" ]; then
+    STARTUP_WAIT=30
+fi
+
+# The amount of time to wait for shutdown
+if [ -z "$SHUTDOWN_WAIT" ]; then
+    SHUTDOWN_WAIT=30
+fi
+
+
+# Helper function to check status of karaf service
+check_status() {
+    pidofproc -p "$KARAF_SERVICE_PIDFILE" "$JAVA" >/dev/null 2>&1
+}
+
+case "$1" in
+ start)
+    echo "Starting $DESC" "$NAME"
+
+    # PID file
+    mkdir -p $(dirname "$KARAF_SERVICE_PIDFILE")
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP $(dirname 
"$KARAF_SERVICE_PIDFILE") || true
+
+    # Console log
+    mkdir -p $(dirname "$KARAF_SERVICE_LOG")
+    cat /dev/null > "$KARAF_SERVICE_LOG"
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP $(dirname 
"$KARAF_SERVICE_LOG")
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP $KARAF_SERVICE_LOG
+    
+    start-stop-daemon \
+        --start \
+        --user "$KARAF_SERVICE_USER" \
+        --chuid "$KARAF_SERVICE_USER" \
+        --chdir "$KARAF_SERVICE_PATH" \
+        --pidfile "$KARAF_SERVICE_PIDFILE" \
+        --make-pidfile \
+        --exec "$KARAF_SERVICE_PATH/bin/karaf" -- "daemon" \
+    >> "$KARAF_SERVICE_LOG" 2>&1 &
+
+    count=0
+    launched=0
+    until [ $count -gt $STARTUP_WAIT ]
+    do
+        sleep 1
+        count=$((count + 1));
+        if check_status; then
+            launched=1
+            break
+        fi
+    done
+
+    if check_status; then
+        log_end_msg 0
+    else
+        log_end_msg 1
+    fi
+
+    if [ $launched -eq 0 ]; then
+        log_warning_msg "$DESC hasn't started within the timeout allowed"
+        log_warning_msg "please review file \"$KARAF_SERVICE_LOG\" to see the 
status of the service"
+    fi
+ ;;
+ stop)
+    check_status
+    status_stop=$?
+    if [ $status_stop -eq 0 ]; then
+        kwait=$SHUTDOWN_WAIT
+        read kpid < "$KARAF_SERVICE_PIDFILE"
+        log_daemon_msg "Stopping $DESC" "$NAME"
+        
+        children_pids=$(pgrep -P $kpid)
+
+        su - $KARAF_SERVICE_USER -c $KARAF_SERVICE_PATH/bin/stop
+
+        count=0
+        until [ `ps --pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq 
'0' ] || [ $count -gt $kwait ]
+        do
+            sleep 1
+            count=$((count + 1));
+        done
+
+        if check_status; then
+            start-stop-daemon \
+                --stop \
+                --quiet \
+                --pidfile "$KARAF_SERVICE_PIDFILE" \
+                --remove-pidfile
+                --user "$KARAF_SERVICE_USER" \
+                --retry=TERM/$SHUTDOWN_WAIT/KILL/5 \
+            > /dev/null 2>&1
+        
+            if [ $? -eq 2 ]; then
+                log_failure_msg "$DESC can't be stopped"
+                exit 1
+            fi
+        fi
+        
+        for child in $children_pids; do
+            /bin/kill -9 $child >/dev/null 2>&1
+        done
+        
+        log_end_msg 0
+
+        rm -rf $KARAF_SERVICE_PIDFILE
+    elif [ $status_stop -eq 1 ]; then
+        log_action_msg "$DESC is not running but the pid file exists, cleaning 
up"
+        rm -f $KARAF_SERVICE_PIDFILE
+    elif [ $status_stop -eq 3 ]; then
+        log_action_msg "$DESC is not running"
+    fi
+ ;;
+ restart)
+    check_status
+    status_restart=$?
+    if [ $status_restart -eq 0 ]; then
+        $0 stop
+    fi
+    $0 start
+ ;;
+ status)
+    check_status
+    status=$?
+    if [ $status -eq 0 ]; then
+        read pid < $KARAF_SERVICE_PIDFILE
+        log_action_msg "$DESC is running with pid $pid"
+        exit 0
+    elif [ $status -eq 1 ]; then
+        log_action_msg "$DESC is not running and the pid file exists"
+        exit 1
+    elif [ $status -eq 3 ]; then
+        log_action_msg "$DESC is not running"
+        exit 3
+    else
+        log_action_msg "Unable to determine $NAME status"
+        exit 4
+    fi
+ ;;
+ *)
+ log_action_msg "Usage: $0 {start|stop|restart|status}"
+ exit 2
+ ;;
+esac
+
+exit 0

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-redhat
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-redhat
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-redhat
new file mode 100644
index 0000000..2f75d0b
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.init-redhat
@@ -0,0 +1,142 @@
+#!/bin/sh
+#
+# Karaf control script
+#
+# chkconfig: - 80 20
+# description: Karaf startup script
+# processname: ${KARAF_SERVICE_NAME}
+# pidfile: ${KARAF_SERVICE_PIDFILE}
+# config: ${KARAF_SERVICE_CONF}
+#
+
+# Source function library.
+. /etc/init.d/functions
+
+# Load Java configuration.
+[ -r /etc/java/java.conf ] && . /etc/java/java.conf
+export JAVA_HOME
+
+if [ -r "${KARAF_SERVICE_CONF}" ]; then
+    . "${KARAF_SERVICE_CONF}"
+else
+    echo "Error KARAF_SERVICE_CONF not defined"
+    exit -1
+fi
+
+if [ -z "$STARTUP_WAIT" ]; then
+    STARTUP_WAIT=30
+fi
+
+if [ -z "$SHUTDOWN_WAIT" ]; then
+    SHUTDOWN_WAIT=30
+fi
+
+prog=${KARAF_SERVICE_NAME}
+currenttime=$(date +%s%N | cut -b1-13)
+
+start() {
+    echo -n "Starting $prog: "
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read ppid < $KARAF_SERVICE_PIDFILE
+        if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq 
'1' ]; then
+            echo -n "$prog is already running"
+            failure
+            echo
+            return 1
+        else
+            rm -f $KARAF_SERVICE_PIDFILE
+        fi
+    fi
+    
+    mkdir -p $(dirname $KARAF_SERVICE_LOG)
+    cat /dev/null > $KARAF_SERVICE_LOG
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP  $KARAF_SERVICE_LOG
+
+    mkdir -p $(dirname $KARAF_SERVICE_PIDFILE)
+    chown $KARAF_SERVICE_USER:$KARAF_SERVICE_GROUP $(dirname 
$KARAF_SERVICE_PIDFILE) || true
+
+    if [ ! -z "$KARAF_SERVICE_USER" ]; then
+        if [ -r /etc/rc.d/init.d/functions ]; then
+            daemon \
+                --user="$KARAF_SERVICE_USER" \
+                --pidfile="$KARAF_SERVICE_PIDFILE" \
+                " { $KARAF_SERVICE_PATH/bin/karaf daemon >> $KARAF_SERVICE_LOG 
2>&1 & } ; echo \$! >| $KARAF_SERVICE_PIDFILE "
+        else
+            su - $KARAF_SERVICE_USER \
+                -c " { $KARAF_SERVICE_PATH/bin/karaf daemon >> 
$KARAF_SERVICE_LOG 2>&1 & } ; echo \$! >| $KARAF_SERVICE_PIDFILE "
+        fi
+    fi
+ 
+    RETVAL=$?
+    echo
+    
+    if [ $RETVAL -eq 0 ]; then
+        touch $KARAF_LOCKFILE
+    fi
+    
+    return $RETVAL
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    count=0;
+
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read kpid < $KARAF_SERVICE_PIDFILE
+        let kwait=$SHUTDOWN_WAIT
+
+        # Try issuing SIGTERM
+        su - $KARAF_SERVICE_USER -c $KARAF_SERVICE_PATH/bin/stop
+        until [ `ps --pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq 
'0' ] || [ $count -gt $kwait ]
+        do
+            sleep 1
+            let count=$count+1;
+        done
+
+        if [ $count -gt $kwait ]; then
+            kill -9 $kpid
+        fi
+    fi
+
+    rm -f $KARAF_SERVICE_PIDFILE
+    rm -f $KARAF_LOCKFILE
+
+    success
+    echo
+}
+
+status() {
+    if [ -f $KARAF_SERVICE_PIDFILE ]; then
+        read ppid < $KARAF_SERVICE_PIDFILE
+        if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq 
'1' ]; then
+            echo "$prog is running (pid $ppid)"
+            return 0
+        else
+            echo "$prog dead but pid file exists"
+            return 1
+        fi
+    fi
+    echo "$prog is not running"
+    return 3
+}
+
+case "$1" in
+    start)
+        start
+        ;;
+    stop)
+        stop
+        ;;
+    restart)
+        $0 stop
+        $0 start
+        ;;
+    status)
+        status
+        ;;
+    *)
+        ## If no parameters are given, print which are avaiable.
+        echo "Usage: $0 {start|stop|status|restart}"
+        exit 1
+        ;;
+esac

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.solaris-smf
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.solaris-smf
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.solaris-smf
new file mode 100644
index 0000000..6bea436
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.solaris-smf
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle
+  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+
+<service_bundle type="manifest" name="application/${KARAF_SERVICE_NAME}">
+    <service version="1" type="service" 
name="application/${KARAF_SERVICE_NAME}">
+        
+        <create_default_instance enabled='false' />
+        <single_instance />      
+
+        <dependency 
+            restart_on="none" 
+            type="service"
+            name="multi_user_dependency" 
+            grouping="require_all">
+            
+            <service_fmri value="svc:/milestone/multi-user"/>
+        </dependency>
+
+        <method_context>
+            <method_credential user='${KARAF_SERVICE_USER}' 
group='${KARAF_SERVICE_GROUP}'/>
+            <method_environment>
+                <envvar name="JAVA_HOME" value="/usr/java"/>
+            </method_environment>
+        </method_context>
+
+        <!-- *************************************************************** 
-->
+        <!-- STOP/START                                                      
-->
+        <!-- *************************************************************** 
-->
+
+        <exec_method 
+            timeout_seconds="60" 
+            type="method" 
+            name="start"
+            exec="${KARAF_SERVICE_PATH}/bin/karaf daemon &amp;">
+        </exec_method>
+
+        <exec_method 
+            timeout_seconds="60" 
+            type="method" 
+            name="stop"
+            exec="${KARAF_SERVICE_PATH}/bin/stop">
+        </exec_method>
+        
+        <!-- *************************************************************** 
-->
+        <!--                                                                 
-->
+        <!-- *************************************************************** 
-->
+
+        <!-- do not restart the service in case of errors -->
+        <property_group name='startd' type='framework'>
+            <propval name='duration' 
+                     type='astring' 
+                     value='transient'/>
+            <propval name='ignore_error' 
+                     type='astring' 
+                     value='core,signal'/>
+        </property_group>
+
+        <stability value='Evolving' />
+        
+        <template>
+            <common_name>
+                <loctext xml:lang="C">
+                    ${KARAF_SERVICE_NAME}
+                </loctext>
+            </common_name>
+            <description>
+                <loctext xml:lang="C">
+                    ${KARAF_SERVICE_NAME}
+                </loctext>
+            </description>
+        </template>
+
+    </service>
+</service_bundle>
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.systemd
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.systemd
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.systemd
new file mode 100644
index 0000000..012ec02
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-template.systemd
@@ -0,0 +1,28 @@
+[Unit]
+Description=Karaf - ${KARAF_SERVICE_NAME}
+After=syslog.target network.target
+
+[Service]
+EnvironmentFile=${KARAF_SERVICE_CONF}
+Environment="KARAF_OPTS=-Dkaraf.systemd.enabled=true"
+
+User=${KARAF_SERVICE_USER}
+Group=${KARAF_SERVICE_GROUP}
+PIDFile=${KARAF_SERVICE_PIDFILE}
+ExecStart=${KARAF_SERVICE_PATH}/bin/karaf daemon
+ExecStop=${KARAF_SERVICE_PATH}/bin/stop
+
+Restart=on-failure
+RestartSec=5s
+StartLimitInterval=60s
+StartLimitBurst=3
+
+SuccessExitStatus=0 143
+
+LimitNOFILE=102642
+
+#WatchdogSec=60
+
+[Install]
+WantedBy=multi-user.target
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.exe
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.exe
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.exe
new file mode 100644
index 0000000..c6e8fc2
Binary files /dev/null and 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.exe
 differ

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.xml
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.xml
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.xml
new file mode 100644
index 0000000..5b2f420
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service-win.xml
@@ -0,0 +1,46 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<service>
+  
+  <!--
+    This script is provided as a template you can quckly customize by 
replacing 
+    the following variables:
+
+      KARAF_SERVICE_NAME
+      KARAF_SERVICE_PATH
+  -->
+
+  <id>%KARAF_SERVICE_NAME%</id>
+  <name>%KARAF_SERVICE_NAME%</name>
+  <description>Apache Karaf %KARAF_SERVICE_NAME%</description>
+
+  <!-- start -->
+  <executable>%KARAF_SERVICE_PATH%\bin\karaf.bat</executable>
+  <startargument>daemon</startargument>
+  
+  <!-- stop -->
+  <stopexecutable>%KARAF_SERVICE_PATH%\bin\karaf.bat</stopexecutable>
+  <stopargument>stop</stopargument>
+  <stoptimeout>10sec</stoptimeout>
+
+  <!-- logging -->  
+  <logpath>%KARAF_SERVICE_PATH%\data\log</logpath>  
+  <log mode="roll-by-time">
+    <pattern>yyyyMMdd</pattern>
+  </log>
+
+</service>

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service.sh
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service.sh
 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service.sh
new file mode 100755
index 0000000..7929668
--- /dev/null
+++ 
b/assemblies/features/base/src/main/resources/resources/bin/contrib/karaf-service.sh
@@ -0,0 +1,144 @@
+#!/usr/bin/env bash
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+function usage {
+    cat <<-END >&2
+    USAGE: $0 [-k KARAF_SERVICE_PATH] [-d KARAF_SERVICE_DATA] [-p 
KARAF_SERVICE_PIDFILE] [-n KARAF_SERVICE_NAME] [-e KARAF_ENV, ...]
+            -k KARAF_SERVICE_PATH     # Karaf installation path
+            -d KARAF_SERVICE_DATA     # Karaf data path (default to 
\${KARAF_SERVICE_PATH}/data)
+            -c KARAF_SERVICE_CONF     # Karaf configuration file
+            -t KARAF_SERVICE_ETC      # Karaf etc path (default to 
\${KARAF_SERVICE_PATH/etc}
+            -p KARAF_SERVICE_PIDFILE  # Karaf pid path (default to 
\${KARAF_SERVICE_DATA}/\${KARAF_SERVICE_NAME}.pid)
+            -n KARAF_SERVICE_NAME     # Karaf service name (default karaf)
+            -e KARAF_ENV              # Karaf environment variable (can be 
repeated)
+            -u KARAF_SERVICE_USER     # Karaf user
+            -g KARAF_SERVICE_GROUP    # Karaf group (default 
\${KARAF_SERVICE_USER)
+            -l KARAF_SERVICE_LOG      # Karaf console log (default to 
\${KARAF_SERVICE_DATA}/log/\${KARAF_SERVICE_NAME}-console.log)
+            -f KARAF_SERVICE_TEMPLATE # Template file to use
+            -h                        # this usage message
+END
+    exit
+}
+
+CONF_TEMPLATE="karaf-service-template.conf"
+SYSTEMD_TEMPLATE="karaf-service-template.systemd"
+INIT_REDHAT_TEMPLATE="karaf-service-template.init-redhat"
+INIT_DEBIAN_TEMPLATE="karaf-service-template.init-debian"
+SOLARIS_SMF_TEMPLATE="karaf-service-template.solaris-smf"
+
+################################################################################
+#
+################################################################################
+
+KARAF_ENV=()
+
+while getopts k:d:c:p:n:u:g:l:t:e:f:h opt
+do
+    case $opt in
+    k)  export KARAF_SERVICE_PATH=$OPTARG ;;
+    d)  export KARAF_SERVICE_DATA=$OPTARG ;;    
+    c)  export KARAF_SERVICE_CONF=$OPTARG ;;    
+    p)  export KARAF_SERVICE_PIDFILE=$OPTARG ;;
+    n)  export KARAF_SERVICE_NAME=$OPTARG ;;
+    u)  export KARAF_SERVICE_USER=$OPTARG ;;
+    g)  export KARAF_SERVICE_GROUP=$OPTARG ;;
+    l)  export KARAF_SERVICE_LOG=$OPTARG ;;
+    t)  export KARAF_SERVICE_ETC=$OPTARG ;;
+    f)  export KARAF_SERVICE_TEMPLATE=$OPTARG ;;
+    e)  KARAF_ENV+=($OPTARG) ;;
+    h|?) usage ;;
+    esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+if [[ ! $KARAF_SERVICE_PATH ]]; then 
+    echo "Warning, KARAF_SERVICE_PATH is required"
+    usage
+fi
+
+if [[ ! $KARAF_SERVICE_DATA ]]; then 
+    export KARAF_SERVICE_DATA=${KARAF_SERVICE_PATH}/data
+fi
+
+if [[ ! $KARAF_SERVICE_ETC ]]; then 
+    export KARAF_SERVICE_ETC=${KARAF_SERVICE_PATH}/etc
+fi
+
+if [[ ! $KARAF_SERVICE_CONF ]]; then 
+    export 
KARAF_SERVICE_CONF=${KARAF_SERVICE_PATH}/etc/${KARAF_SERVICE_NAME}.conf
+fi
+
+if [[ ! $KARAF_SERVICE_NAME ]]; then 
+    export KARAF_SERVICE_NAME="karaf"
+fi
+
+if [[ ! $KARAF_SERVICE_PIDFILE ]]; then 
+    export 
KARAF_SERVICE_PIDFILE=${KARAF_SERVICE_DATA}/${KARAF_SERVICE_NAME}.pid
+fi
+
+if [[ ! $KARAF_SERVICE_LOG ]]; then 
+    export 
KARAF_SERVICE_LOG=${KARAF_SERVICE_DATA}/log/${KARAF_SERVICE_NAME}-console.log
+fi
+
+if [[ ! $KARAF_SERVICE_USER ]]; then 
+    export KARAF_SERVICE_USER="root"
+fi
+
+if [[ ! $KARAF_SERVICE_GROUP ]]; then 
+    export KARAF_SERVICE_GROUP=${KARAF_SERVICE_USER}
+fi
+
+################################################################################
+#
+################################################################################
+
+function generate_service_descriptor {
+    perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < $1 > $2
+    perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < 
${CONF_TEMPLATE} > ${KARAF_SERVICE_CONF}
+
+    for var in "${KARAF_ENV[@]}"; do
+      echo "${var}" >> ${KARAF_SERVICE_CONF}
+    done
+}
+
+################################################################################
+#
+################################################################################
+
+if [[ ! $KARAF_SERVICE_TEMPLATE ]]; then
+    case $(uname | tr [:upper:] [:lower:]) in
+        sunos)
+            # smc vs initv
+            generate_service_descriptor $SOLARIS_SMF_TEMPLATE 
${PWD}/${KARAF_SERVICE_NAME}.xml
+            ;;
+        linux)
+            if [ -d /run/systemd/system ]; then
+                generate_service_descriptor $SYSTEMD_TEMPLATE 
${PWD}/${KARAF_SERVICE_NAME}.service
+            elif [ -f /etc/redhat-release ]; then
+                generate_service_descriptor $INIT_REDHAT_TEMPLATE 
${PWD}/${KARAF_SERVICE_NAME}
+                chmod 755 ${PWD}/${KARAF_SERVICE_NAME}
+            elif [ -f /etc/debian-release ]; then
+                generate_service_descriptor $INIT_DEBIAN_TEMPLATE 
${PWD}/${KARAF_SERVICE_NAME}
+                chmod 755 ${PWD}/${KARAF_SERVICE_NAME}
+            fi
+            ;;
+    esac
+else
+    generate_service_descriptor $KARAF_SERVICE_TEMPLATE 
${PWD}/${KARAF_SERVICE_NAME}
+fi

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/karaf
----------------------------------------------------------------------
diff --git a/assemblies/features/base/src/main/resources/resources/bin/karaf 
b/assemblies/features/base/src/main/resources/resources/bin/karaf
index 4bdc6a7..6a8e500 100755
--- a/assemblies/features/base/src/main/resources/resources/bin/karaf
+++ b/assemblies/features/base/src/main/resources/resources/bin/karaf
@@ -191,9 +191,9 @@ locateJava() {
         [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
     fi
 
-       if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
-               JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
-       fi
+    if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
+        JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
+    fi
     if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
         JAVA_HOME=`java-config --jre-home`
     fi
@@ -324,6 +324,8 @@ setupDefaults() {
     #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
 }
 
+
+
 init() {
     # Determine if there is special OS handling we must perform
     detectOS
@@ -394,6 +396,12 @@ run() {
                 OPTS="-Dkaraf.startLocalConsole=false 
-Dkaraf.startRemoteShell=true"
                 shift
                 ;;
+            'daemon')
+                OPTS="-Dkaraf.startLocalConsole=false 
-Dkaraf.startRemoteShell=true"
+                KARAF_DAEMON="true"
+                KARAF_EXEC="exec"
+                shift
+                ;;
             'client')
                 OPTS="-Dkaraf.startLocalConsole=true 
-Dkaraf.startRemoteShell=false"
                 shift
@@ -425,7 +433,6 @@ run() {
     fi
 
     while true; do
-
         # When users want to update the lib version of, they just need to 
create
         # a lib.next directory and on the new restart, it will replace the 
current lib directory.
         if [ -d ${KARAF_HOME}/lib.next ] ; then
@@ -434,6 +441,12 @@ run() {
             mv -f "${KARAF_HOME}/lib.next" "${KARAF_HOME}/lib"
         fi
 
+        # Ensure the log directory exists 
+        # We may need to have a place to redirect stdout/stderr
+        if [ ! -d "$KARAF_DATA/log" ]; then
+            mkdir -p "$KARAF_DATA/log"
+        fi
+
         $KARAF_EXEC "$JAVA" $JAVA_OPTS \
             -Djava.endorsed.dirs="${JAVA_ENDORSED_DIRS}" \
             -Djava.ext.dirs="${JAVA_EXT_DIRS}" \
@@ -445,15 +458,21 @@ run() {
             -Dkaraf.restart.jvm.supported=true \
             -Djava.io.tmpdir="$KARAF_DATA/tmp" \
             
-Djava.util.logging.config.file="$KARAF_BASE/etc/java.util.logging.properties" \
-            $KARAF_OPTS $OPTS \
+            $KARAF_SYSTEM_OPTS \
+            $KARAF_OPTS \
+            $OPTS \
             -classpath "$CLASSPATH" \
             $MAIN "$@"
 
         KARAF_RC=$?
-        if [ "$KARAF_RC" -eq 10 ]; then
-           echo "Restarting JVM..."
+        if [ $KARAF_DAEMON ] ; then
+            exit $KARAF_RC
         else
-           exit $KARAF_RC
+            if [ "$KARAF_RC" -eq 10 ]; then
+               echo "Restarting JVM..."
+            else
+               exit $KARAF_RC
+            fi
         fi
     done
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4f600555/assemblies/features/base/src/main/resources/resources/bin/karaf.bat
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/resources/resources/bin/karaf.bat 
b/assemblies/features/base/src/main/resources/resources/bin/karaf.bat
index c365ba7..8901cad 100644
--- a/assemblies/features/base/src/main/resources/resources/bin/karaf.bat
+++ b/assemblies/features/base/src/main/resources/resources/bin/karaf.bat
@@ -284,6 +284,7 @@ if "%KARAF_PROFILER%" == "" goto :RUN
     if "%1" == "status" goto :EXECUTE_STATUS
     if "%1" == "console" goto :EXECUTE_CONSOLE
     if "%1" == "server" goto :EXECUTE_SERVER
+    if "%1" == "daemon" goto :EXECUTE_DAEMON
     if "%1" == "client" goto :EXECUTE_CLIENT
     if "%1" == "clean" goto :EXECUTE_CLEAN
     if "%1" == "debug" goto :EXECUTE_DEBUG
@@ -308,6 +309,12 @@ if "%KARAF_PROFILER%" == "" goto :RUN
     shift
     goto :RUN_LOOP
 
+:EXECUTE_DAEMON
+    SET OPTS=-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true
+    SET KARAF_DAEMON=true
+    shift
+    goto :RUN_LOOP
+
 :EXECUTE_CLIENT
     SET OPTS=-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false
     shift
@@ -351,9 +358,22 @@ if "%KARAF_PROFILER%" == "" goto :RUN
         
-Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" 
^
         %KARAF_OPTS% %MAIN% %ARGS%
 
-    if ERRORLEVEL 10 (
-        echo Restarting JVM...
-        goto EXECUTE
+    rem If KARAF_DAEMON is defined, auto-restart is bypassed and control given
+    rem back to the operating system
+    if defined "%KARAF_DAEMON%" (
+        rem If Karaf has been started by winsw, the process can be restarted
+        rem by executing KARAF_DAEMON% restart!
+        rem   https://github.com/kohsuke/winsw#restarting-service-from-itself
+        if defined "%WINSW_EXECUTABLE%" (
+            if ERRORLEVEL 10 (
+                echo Restarting ...
+                %KARAF_DAEMON% restart!
+        )
+    ) else (
+        if ERRORLEVEL 10 (
+            echo Restarting JVM...
+            goto EXECUTE
+        )
     )
 
 rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Reply via email to