#!/bin/sh

ws="server"
#ws="watch"

if [ "server" = "${ws}" ]; then
    WS="Server"
else
    WS="Watch"
fi

pid_file_wait() {
    while :
    do
        [ -z "${PIDFILEWAIT}" -o ! -e "${PIDFILEWAIT}" ] && exit 0
        sleep 1
    done
}

get_pids() {
    if [ -n "${PSCMD}" ]; then
        ${PSCMD} ${PSOPT} | grep m${ws}\.jar | grep -v grep | awk '{print $1}'
    else
        grep -l m${ws}\\.jar /proc/*/cmdline | cut -f3 -d'/'
    fi
}

PSCMD="ps"
hash ps 2>/dev/null || PSCMD=""
if [ -n "${PSCMD}" ]; then
    PSOPT="-eo pid,user,vsz,stat,args"
    ps ${PSOPT} >/dev/null 2>&1 || PSOPT=""
fi

PIDS="$(get_pids)"
if [ -z "${PIDS}" ]; then
    echo "No Minim${WS} instances are running"
    exit 0
fi

SCRIPTNAME="$(readlink -f "$0")"
SCRIPTDIR="$(dirname "${SCRIPTNAME}")"
SCRIPTDIRBASE="$(basename "${SCRIPTDIR}")"
if [ "${SCRIPTDIRBASE}" != "bin" ]; then
    echo "Script location error: ${SCRIPTNAME}" 1>&2
    exit 1
fi
INSTALLDIR="$(dirname "${SCRIPTDIR}")"
MINIMDIR="$(dirname "${INSTALLDIR}")"
MINIMDIRBASE="$(basename "${MINIMDIR}")"
if [ "${MINIMDIRBASE}" != "minim${ws}" ]; then
    echo "Script location error: ${SCRIPTNAME}" 1>&2
    exit 1
fi
MINIMPIDFILE="${MINIMDIR}/data/minim${ws}.pid"

if [ -f "${MINIMPIDFILE}" ]; then
    MYPID="$(cat ${MINIMPIDFILE})"
    if [ -n "${MYPID}" -a "$(echo "${PIDS}" | grep ${MYPID})" = "${MYPID}" ]; then
        PIDFILEWAIT="${MINIMPIDFILE}"
    fi
fi

NUMPIDS=$(echo ${PIDS} | wc -w)
if [ ${NUMPIDS} -eq 1 ]; then
    PROCS="process"
else
    PROCS="processes"
fi
echo "Stopping Minim${WS} ${PROCS}" ${PIDS}
kill ${PIDS} 2>/dev/null
kill_time=0
max_kill_time=10
while :
do
    sleep 1
    PIDS="$(get_pids)"
    if [ -z "${PIDS}" ]; then
        pid_file_wait
    fi
    kill_time=$((kill_time+1))
    if [ ${kill_time} -eq ${max_kill_time} ]; then
        break
    fi
done

NUMPIDS=$(echo ${PIDS} | wc -w)
if [ ${NUMPIDS} -eq 1 ]; then
    PROCS="process"
else
    PROCS="processes"
fi
echo "Forcibly stopping Minim${WS} ${PROCS}" ${PIDS}
kill -9 ${PIDS} 2>/dev/null
kill_time=0
max_kill_time=5
while :
do
    sleep 1
    PIDS="$(get_pids)"
    if [ -z "${PIDS}" ]; then
        pid_file_wait
    fi
    kill_time=$((kill_time+1))
    if [ ${kill_time} -eq ${max_kill_time} ]; then
        break
    fi
done

NUMPIDS=$(echo ${PIDS} | wc -w)
if [ ${NUMPIDS} -eq 1 ]; then
    PROCS="process"
else
    PROCS="processes"
fi
echo "Unable to stop Minim${WS} ${PROCS}" ${PIDS} 1>&2
exit 1
