#!/bin/bash

CMD=$1
NOHUP=${NOHUP:=$(which nohup)}
PS=${PS:=$(which ps)}

# default java
JAVA_CMD=${JAVA_CMD:=$(which java)}

get_pid() {
    cat "${CALM_PID}" 2> /dev/null
}

pid_running() {
    kill -0 $1 2> /dev/null
}

die() {
    echo $*
    exit 1
}

if [ -n "$JAVA_HOME" ]
then
    # try to use $JAVA_HOME
    if [ -x "$JAVA_HOME"/bin/java ]
    then
        JAVA_CMD="$JAVA_HOME"/bin/java
    else
        die "$JAVA_HOME"/bin/java is not executable
    fi
fi

# resolve links - $0 may be a softlink
CALMCTL="$0"

while [ -h "$CALMCTL" ]; do
    ls=$(ls -ld "$CALMCTL")
    link=$(expr "$ls" : '.*-> \(.*\)$')
    if expr "$link" : '/.*' > /dev/null; then
        CALMCTL="$link"
    else
        CALMCTL=$(dirname "$CALMCTL")/"$link"
    fi
done

# take variables from environment if set
CALMCTL_DIR=${CALMCTL_DIR:=$(dirname "$CALMCTL")}
CALM_SERVER_JAR=${CALM_SERVER_JAR:=calm.jar}
CALM_CONF=${CALM_CONF:=/etc/calm/server/server.conf}
CALM_PID=${CALM_PID:=/tmp/calm.pid}
CALM_LOG_FILE=${CALM_LOG_FILE:=/var/log/calm-server/calm-server.log}
LOG4J=${LOG4J:="-Dlog4j.configurationFile=file:///etc/calm/server/log4j2.xml"}
DEFAULT_JAVA_OPTS="-Djava.library.path=${CALMCTL_DIR}/../lib/sigar -Xms1g -Xmx8g -XX:NewRatio=1 -server -XX:+ResizeTLAB -XX:+UseConcMarkSweepGC -XX:+CMSConcurrentMTEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow"
CALM_SERVER_JAVA_OPTS="${CALM_SERVER_JAVA_OPTS:="$DEFAULT_JAVA_OPTS"}"

start() {
    echo "Starting calm-server ..."
    cd "$CALMCTL_DIR/.."
    "${NOHUP}" "${JAVA_CMD}" ${CALM_SERVER_JAVA_OPTS} ${LOG4J} -jar "${CALM_SERVER_JAR}" server -f "${CALM_CONF}" -p "${CALM_PID}" ${CALM_SERVER_ARGS} >> "${CALM_LOG_FILE}" 2>> "${CALM_LOG_FILE}" &
}

run() {
    echo "Running calm-server ..."
    cd "$CALMCTL_DIR/.."
    exec "${JAVA_CMD}" ${CALM_SERVER_JAVA_OPTS} ${LOG4J} -jar "${CALM_SERVER_JAR}" server -f "${CALM_CONF}" -p "${CALM_PID}" ${CALM_SERVER_ARGS}
}

runCommand()
{
    echo "Running calm-server ..."
    cd "$CALMCTL_DIR/.."
    exec "${JAVA_CMD}" ${CALM_SERVER_JAVA_OPTS} ${LOG4J} -jar "${CALM_SERVER_JAR}" ${CALM_SERVER_ARGS} $@

}

stop() {
    if [ ! -f "${CALM_PID}" ]; then
      die "Not stopping. PID file not found: ${CALM_PID}"
    fi

    PID=$(get_pid)

    echo "Stopping calm-server ($PID) ..."
    echo "Waiting for calm-server to halt."

    kill $PID

    while "$PS" -p $PID > /dev/null; do sleep 1; done;
    rm -f "${CALM_PID}"
    rm -f /etc/calm/.want-restart

    echo "calm-server stopped"
}

restart() {
    echo "Restarting calm-server ..."
    stop
    start
}

status() {
    PID=$(get_pid)
    if [ ! -z $PID ]; then
        if pid_running $PID; then
            echo "calm-server running with PID ${PID}"
            return 0
        else
            rm "${CALM_PID}"
            die "Removed stale PID file ${CALM_PID} with ${PID}."
        fi
    fi

    die "calm-server not running"
}

case "$CMD" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    run)
        run
        ;;
    cmd)
        shift
        runCommand "$@"
        ;;
    *)
        echo "Usage $0 {start|stop|restart|status|run|cmd}"
esac
