#!/bin/sh 
#####################################################################
# 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.
#####################################################################
#
# ofbiz        This shell script takes care of starting and stopping
#              the OFBiz subsystem. This version is for Ubuntu systems
#
# chkconfig: - 80 10
# description: OFBiz server

# the userlogin the script should run under and is the home dirname, in this case /home/ofbiz/ofbiz
OFBIZUSER="ofbiz"
OFBIZDIR="ofbiz"

#============== no need to change anything below this line =======================

# Start OFBiz
start() {
    if [ "$USER" = "" ]; then
        echo "Mounting data disk at boottime here"
#        mount /dev/sdg /data
    fi
    running
    if [ "$OFBIZ_PROCS" = "" ]; then
        echo "Ofbiz is already running..."
        return 0
    fi
    if [ "$USER" = "$OFBIZUSER" ]; then
        echo "starting standard /home/$OFBIZUSER/$OFBIZDIR/startofbiz.sh"
        cd /home/$OFBIZUSER/$OFBIZDIR
        ./startofbiz.sh
        if [ $? = 0 ]; then 
            echo "start success"
        else
            echo "starting ofbiz user: $OFBIZUSER in dir: $OFBIZDIR failed return code: $?"
        fi
        return 0
    fi
}

stop() {
    if [ "$USER" = "$OFBIZUSER" ]; then
        echo "stopping standard /home/$OFBIZUSER/$OFBIZDIR/stopofbiz.sh"
        cd /home/$OFBIZUSER/$OFBIZDIR
	    MAXCOUNT=10
        COUNTER=0
        until [ $COUNTER -gt $MAXCOUNT ]; do
             COUNTER=$((COUNTER+1))
             echo "Attempt number: $COUNTER"

            ./stopofbiz.sh
            if [ $? = 1 ]; then
                echo "stop success" 
                return 0
            fi
            sleep 3
        done
        echo "stopping ofbiz from user: $OFBIZUSER failed after $MAXCOUNT attemps"
        return 1
    fi
}

#check for user, if wrong try to change to 'OFBIZUSER' and re-execute.
checkUser() {
    if [ "$USER" != "$OFBIZUSER" ]; then
        if [ "$USER" = "" ]; then
            exec su - $OFBIZUSER -c "$0 $1 "
	    else
	        exec sudo -u $OFBIZUSER $0 $1 
	    fi
        exit $?
    fi
}

# OFBiz processes running
running() {
    OFBIZ_PROCS=`/bin/ps h -o pid,args -C java -u $OFBIZUSER | /bin/grep -e "-jar ofbiz.jar" | /bin/egrep -o "^[[:space:]]*[[:digit:]]*"`
}

#========= main program ===============
checkUser $1
case "$1" in
    "start")
        start
    ;;
    "stop")
        stop
    ;;
    "restart")
        stop
        start
    ;;
    "status")
        running
        if [ "$OFBIZ_PROCS" = "" ]; then
            echo "OFBiz for user: $OFBIZUSER in dir: $OFBIZDIR is stopped"
            exit 1
        else
            echo "OFBiz for user: $OFBIZUSER in dir: $OFBIZDIR is running"
            exit 0
        fi
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|status|help} not: $1"
        exit 1
    ;;
esac
exit $?

