#!/bin/sh
# Copyright (c) 2014 Carlos Ruiz - GlobalQSS
# All rights reserved.
#
# System startup script for iDempiere
#
# LSB compatible service control script; see http://www.linuxbase.org/spec/
#
### BEGIN INIT INFO
# Provides:       idempiere
# Required-Start:
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# Description:    Start the iDempiere server
### END INIT INFO

# initialization
# adjust these variables to your environment
IDEMPIERE_HOME=/opt/idempiere-server
IDEMPIEREUSER=idempiere
export TELNET_PORT=12612
# Instead of using ENVFILE you can set JAVA_HOME, IDEMPIERE_HOME and add JAVA_HOME/bin to PATH
# in this case you can comment the source lines for ENVFILE below
# detected some problems with Hardy Heron ubuntu using the bash source command
ENVFILE=$IDEMPIERE_HOME/utils/myEnvironment.sh

# Shell functions sourced from /etc/rc.status:
#      rc_check         check and set local and overall rc status
#      rc_status        check and set local and overall rc status
#      rc_status -v     ditto but be verbose in local rc status
#      rc_status -v -r  ditto and clear the local rc status
#      rc_failed        set local and overall rc status to failed
#      rc_reset         clear local rc status (overall remains)
#      rc_exit          exit appropriate to overall rc status
. /etc/rc.status

# The echo return value for success (defined in /etc/rc.config).
rc_reset

# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - insufficient privilege
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signalling is not supported) are
# considered a success.

#
IDEMPIERESTATUS=
MAXITERATIONS=60

getidempierestatus() {
    IDEMPIERESTATUSSTRING=$(ps ax | grep java | grep ${IDEMPIERE_HOME} | grep -v grep)
    echo "$IDEMPIERESTATUSSTRING" | grep -q ${IDEMPIERE_HOME}
    IDEMPIERESTATUS=$?
}

start () {
    getidempierestatus
    if [ $IDEMPIERESTATUS -eq 0 ] ; then
        echo "iDempiere is already running"
        rc_failed 0
	return
    fi
    echo -n "Starting iDempiere ERP: "
    cd $IDEMPIERE_HOME/utils || exit
    export ID_ENV=Server
    . $ENVFILE
    export LOGFILE=$IDEMPIERE_HOME/log/idempiere_$(date +%Y%m%d%H%M%S).log
    su $IDEMPIEREUSER -c "mkdir -p $IDEMPIERE_HOME/log"
    su $IDEMPIEREUSER -c "export TELNET_PORT=$TELNET_PORT;cd $IDEMPIERE_HOME;$IDEMPIERE_HOME/idempiere-server.sh &> $LOGFILE &"
    RETVAL=$?
    if [ $RETVAL -eq 0 ] ; then
        # wait for server to be confirmed as started in logfile
        STATUSTEST=0
        ITERATIONS=0
        while [ $STATUSTEST -eq 0 ] ; do
            sleep 2
            grep -q '.*LoggedSessionListener.contextInitialized: iDempiere context initialized.*' < "$LOGFILE" && STATUSTEST=1
            echo -n "."
            ITERATIONS=$((ITERATIONS + 1))
            if [ $ITERATIONS -gt $MAXITERATIONS ]
                then
                break
            fi
        done
        if [ $STATUSTEST -eq 0 ]
        then
            echo "Service hasn't started within the timeout allowed, please review file $LOGFILE to see the status of the service"
	    rc_failed 1
        else
            echo "Service started"
        fi
        echo
    else
        echo "Service not started"
	rc_failed 1
    fi
    rc_status -v
}

stop () {
    getidempierestatus
    if [ $IDEMPIERESTATUS -ne 0 ] ; then
	echo "iDempiere is already stopped"
	rc_failed 0
	return
    fi
    echo -n "Stopping iDempiere ERP: "
    cd $IDEMPIERE_HOME/utils || exit
    export ID_ENV=Server
    . $ENVFILE
    # try shutdown from OSGi console, then direct kill with signal 15, then signal 9
    log_warning_msg "Trying shutdown from OSGi console"
    ( echo exit; echo y; sleep 5 ) | telnet localhost ${TELNET_PORT} > /dev/null 2>&1
    getidempierestatus
    if [ $IDEMPIERESTATUS -ne 0 ] ; then
        echo "Service stopped with OSGi shutdown"
    else
        echo "Trying direct kill with signal -15"
        kill -15 -$(ps ax o pgid,command | grep ${IDEMPIERE_HOME} | grep -v grep | sed -e 's/^ *//g' | cut -f 1 -d " " | sort -u)
        sleep 5
        getidempierestatus
        if [ $IDEMPIERESTATUS -ne 0 ] ; then
            echo "Service stopped with kill -15"
        else
            echo "Trying direct kill with signal -9"
            kill -9 -$(ps ax o pgid,command | grep ${IDEMPIERE_HOME} | grep -v grep | sed -e 's/^ *//g' | cut -f 1 -d " " | sort -u)
            sleep 5
            getidempierestatus
            if [ $IDEMPIERESTATUS -ne 0 ] ; then
                echo "Service stopped with kill -9"
            else
                echo "Service hasn't stopped"
                rc_failed 1
            fi
        fi
    fi
    rc_status -v
}

restart () {
    stop
    sleep 2
    start
    rc_status
}

condrestart () {
    getidempierestatus
    if [ $IDEMPIERESTATUS -eq 0 ] ; then
	restart
    else
	rc_reset        # Not running is not a failure.
    fi
    rc_status
}

status () {
    getidempierestatus
    if [ $IDEMPIERESTATUS -eq 0 ] ; then
	echo
	echo "iDempiere is running:"
	ps ax | grep ${IDEMPIERE_HOME} | grep -v grep | sed 's/^[[:space:]]*\([[:digit:]]*\).*:[[:digit:]][[:digit:]][[:space:]]\(.*\)/\1 \2/'
	echo
    else
	echo "iDempiere is stopped"
	rc_failed 3
    fi
    rc_status -v
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	restart
	;;
    condrestart)
	condrestart
	;;
    status)
	status
	;;
    *)
	echo "Usage: $0 {start|stop|restart|condrestart|status}"
	exit 1
esac

# Inform the caller not only verbosely and set an exit status.
rc_exit
