#!/bin/bash

# ============LICENSE_START=======================================================
# ONAP POLICY
# ================================================================================
# Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
# ================================================================================
# Licensed 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.
# ============LICENSE_END=========================================================

source ${POLICY_HOME}/etc/profile.d/env.sh

SNAME="Policy Management"
PNAME=policy-management
CLASS=org.onap.policy.drools.system.Main

function start() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    um_start
    if [[ ${RETVAL} != 0 ]]; then
        update_monitor off
    else
        update_monitor on
    fi
}

function preRunning() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    mkdir -p $_LOGS
    CP=$(ls $_DIR/lib/*.jar | xargs -I X printf ":%s" X)

    # pick up any new changes in the environment every time we start
    source ${POLICY_HOME}/etc/profile.d/env.sh

    ${POLICY_HOME}/bin/configure-maven
    JVM_OPTS=(${JVM_OPTIONS})

    # If 'system.properties' exists, convert it into "-D" JVM arguments.
    # Note that the following also handles property values with spaces.
    IFS=$'\n'
    systemProperties=($(
        if [[ -f $_DIR/config/system.properties ]]; then
            sed -n -e 's/^[ \t]*\([^ \t#]*\)[ \t]*=[ \t]*\(.*\)$/-D\1=\2/p' \
                $_DIR/config/system.properties
        fi
    ))

    cd $_DIR

}

function exec_start() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    status
    echo "$_STATUS"
    if [ "$_RUNNING" = "1" ]; then
        exit 1
    fi

    preRunning
    exec $JAVA_HOME/bin/java "${JVM_OPTS[@]}" -cp $_DIR/config:$_DIR/lib:$CP "${systemProperties[@]}" "$@" $CLASS
}

# unmonitored start, does not change monitor status (immutable)
function um_start() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    status
    if [ "$_RUNNING" = "1" ]; then
        echo ""
        RETVAL=1
        return
    fi

    preRunning
    if [ -e $_LOGS/$PNAME.out.1 ]; then mv $_LOGS/$PNAME.out.1 $_LOGS/$PNAME.out.2; fi
    if [ -e $_LOGS/$PNAME.err.1 ]; then mv $_LOGS/$PNAME.err.1 $_LOGS/$PNAME.err.2; fi
    if [ -e $_LOGS/$PNAME.out ]; then mv $_LOGS/$PNAME.out $_LOGS/$PNAME.out.1; fi
    if [ -e $_LOGS/$PNAME.err ]; then mv $_LOGS/$PNAME.err $_LOGS/$PNAME.err.1; fi

    (
        if [[ "${cfg}" != "" ]]; then
            # need to make sure that we don't pass the lock file descriptor
            # to subprocesses
            exec {cfg}>&-
        fi
        nohup $JAVA_HOME/bin/java "${JVM_OPTS[@]}" -cp $_DIR/config:$_DIR/lib:$CP "${systemProperties[@]}" "$@" $CLASS > >(while read line; do echo "$(date): ${line}"; done >$_LOGS/$PNAME.out) 2> >(while read line; do echo "$(date): ${line}"; done >$_LOGS/$PNAME.err) &

        _PID=$!
        echo $_PID >$_PIDFILE
    )
    sleep 5
    status
    echo $_STATUS
    if [ "$_RUNNING" = "1" ]; then
        RETVAL=0
    else
        echo "Failed to start"
        remove_pid_file
        RETVAL=1
    fi
}

function stop() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    um_stop
    update_monitor off
}

# unmonitored stop, does not change monitor status (immutable)
function um_stop() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    status
    if [ "$_RUNNING" = "0" ]; then
        echo $_STATUS
        remove_pid_file
    else
        if [[ -n ${TELEMETRY_PASSWORD} ]]; then
            http_proxy= timeout 10 curl -k --silent --user ${TELEMETRY_USER}:${TELEMETRY_PASSWORD} -X DELETE https://localhost:${TELEMETRY_PORT}/policy/pdp/engine -o /dev/null
        else
            http_proxy= timeout 10 curl -k --silent -X DELETE https://localhost:${TELEMETRY_PORT}/policy/pdp/engine -o /dev/null
        fi
        sleep 5
        echo "Stopping $SNAME..."
        _PID_TO_KILL=$_PID
        echo "$SNAME (pid=${_PID_TO_KILL}) is stopping..."
        kill -TERM $_PID_TO_KILL 2>/dev/null
        sleep 5
        check_status_of_pid $_PID_TO_KILL
        if [ "$_RUNNING" = "1" ]; then
            kill -TERM $_PID_TO_KILL
        fi
        while [ "$_RUNNING" = "1" ]; do
            sleep 2
            check_status_of_pid $_PID_TO_KILL
        done
        remove_pid_file
        echo "$SNAME has stopped."
    fi
    RETVAL=0
}

function status() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    if [ -f "${_PIDFILE}" ]; then
        _PID=$(cat "${_PIDFILE}")
        check_status_of_pid "$_PID"
    elif [[ ${POLICY_DOCKER} == true ]] && _PID=$(pidof -s java); then
        echo "${_PID}" > ${_PIDFILE}
        check_status_of_pid "$_PID"
    else
        _STATUS="$SNAME (no pidfile) is NOT running"
        _RUNNING=0
    fi

    if [[ $_RUNNING == 1 ]]; then
        RETVAL=0
    else
        RETVAL=1
    fi
}

function check_status_of_pid() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    if [ -n "$1" ] && kill -0 $1 2>/dev/null; then
        _STATUS="$SNAME (pid $1) is running"
        _RUNNING=1
    else
        _STATUS="$SNAME (pid $1) is NOT running"
        _RUNNING=0
    fi
}

function remove_pid_file() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    if [ -f "${_PIDFILE}" ]; then
        rm "${_PIDFILE}"
    fi
}

function update_monitor() {
    if [[ $DEBUG == y ]]; then
        echo "-- ${FUNCNAME[0]} --"
        set -x
    fi

    STATUS=$1
    if [[ -f ${POLICY_HOME}/etc/monitor/monitor.cfg ]]; then
        /bin/sed -i.bak \
            -e "s/^${CONTROLLER}=.*/${CONTROLLER}=${STATUS}/g" \
            ${POLICY_HOME}/etc/monitor/monitor.cfg
    fi
}

# main

if [[ ${DEBUG} == y ]]; then
    echo "-- $0 $* --"
    set -x
fi

_DIR=${POLICY_HOME}
_LOGS=${POLICY_LOGS}

if [[ -z ${POLICY_LOGS} ]]; then
    _LOGS="${POLICY_HOME}"/logs
fi

CONTROLLER=policy-management-controller

RETVAL=0

_PIDFILE=${POLICY_HOME}/PID

case "$1" in
status)
    status
    echo "$_STATUS"
    ;;
start)
    if flock ${cfg}; then
        start
    fi {cfg}>>${POLICY_HOME}/etc/monitor/monitor.cfg.lock
    ;;
umstart)
    um_start
    ;;
exec)
    exec_start
    ;;
stop)
    if flock ${cfg}; then
        stop
    fi {cfg}>>${POLICY_HOME}/etc/monitor/monitor.cfg.lock
    ;;
umstop)
    um_stop
    ;;
restart)
    if flock ${cfg}; then
        stop
        sleep 2
        start
    fi {cfg}>>${POLICY_HOME}/etc/monitor/monitor.cfg.lock
    ;;
*)
    echo "error: invalid option $@"
    echo "Usage: $0 status|start|stop|restart"
    RETVAL=1
    ;;
esac

exit ${RETVAL}