#!/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 build/libs/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 $?

