#!/bin/sh

### BEGIN INIT INFO
# Provides:          rasdaman
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: rasdaman initscript
# Description:       This file defines the starting/stopping procedure for the rasdaman server.
### END INIT INFO

set -u

prog="$(basename "$0")"
RETVAL=0

RASDAMAN_CFG=${RASDAMAN_CFG:-"/etc/default/rasdaman"}
# shellcheck disable=SC1090 disable=SC1091
[ -f "$RASDAMAN_CFG" ] && . "$RASDAMAN_CFG"

RMANHOME="${RMANHOME:-/opt/rasdaman}"
RMANHOME="${RMANHOME%/}"
RMANUSER="${RMANUSER:-rasdaman}"
RUNUSER="${RUNUSER:-runuser}"
RASMGR="$RMANHOME/bin/rasmgr"
RASMGR_PORT="${RASMGR_PORT:-7001}"
RASMGR_PIDFILE="${RASMGR_PIDFILE:-"/var/run/rasmgr.pid"}"
START_RASDAMAN_OPTS="${START_RASDAMAN_OPTS:-"-p $RASMGR_PORT"}"
STOP_RASDAMAN_OPTS="${STOP_RASDAMAN_OPTS:-"-p $RASMGR_PORT"}"

export RASLOGIN="${RASLOGIN:-"rasadmin:d293a15562d3e70b6fdc5ee452eaed40"}"
export JAVA_OPTS


run_as_user() {
  case "$RUNUSER" in
    runuser) runuser "$RMANUSER" -c "$@";;
    sudo)    sudo su "$RMANUSER" -c "$@";;
    *)       echo "Unknown run command, expected 'runuser' or 'sudo'." >&2; return 1;;
  esac
}

get_rasmgr_process() {
    ps -Ao user,pid,args | grep -E "^$RMANUSER +[[:digit:]]+ +$RASMGR --port $RASMGR_PORT"
}
get_rasmgr_pid() {
    get_rasmgr_process | awk '{ print $2; }' | head -n1
}
update_rasmgr_pid() {
    rasmgr_pid=$(get_rasmgr_pid)
    [ -n "$rasmgr_pid" ] && echo "$rasmgr_pid" > "$RASMGR_PIDFILE"
}

start() {
    if get_rasmgr_process > /dev/null; then
        echo "$prog is already started."
    else
        echo "Starting $prog:"
        run_as_user "$RMANHOME/bin/start_rasdaman.sh $START_RASDAMAN_OPTS $*"
        RETVAL=$?
    fi
    update_rasmgr_pid
}

stop() {
    if get_rasmgr_process > /dev/null; then
        echo "Stopping $prog:"
        run_as_user "$RMANHOME/bin/stop_rasdaman.sh $STOP_RASDAMAN_OPTS $*"
        RETVAL=$?
    else
        echo "$prog is already stopped."
    fi
    rm -f "$RASMGR_PIDFILE"
}

force_stop() {
    if get_rasmgr_process > /dev/null; then
        echo "Stopping $prog:"
        run_as_user "$RMANHOME/bin/stop_rasdaman.sh $STOP_RASDAMAN_OPTS --force $*"
        RETVAL=$?
    else
        echo "$prog is already stopped."
    fi
    rm -f "$RASMGR_PIDFILE"
}

restart() {
  echo "Restarting $prog..."
  stop "$@"
  start "$@"
  echo "$prog restarted."
}

status() {
  if get_rasmgr_process > /dev/null; then
      echo "$prog is running."
  else
      echo "$prog is stopped."
  fi
}

usage() {
  cat <<EOF
Usage: $1 {start|stop|force-stop|restart|status}

Environment configuration can be customized in $RASDAMAN_CFG; default setup:

# rasdaman installation directory
RMANHOME=/opt/rasdaman
# local user running the rasdaman server
RMANUSER=rasdaman
# runuser, or sudo for older OS
RUNUSER=runuser
# login credentials for non-interactive rasdaman start/stop
RASLOGIN=rasadmin:d293a15562d3e70b6fdc5ee452eaed40
# port on which clients connect to rasdaman
RASMGR_PORT=7001
# options to be passed on to start_rasdaman.sh
START_RASDAMAN_OPTS="-p \$RASMGR_PORT"
# options to be passed on to stop_rasdaman.sh
STOP_RASDAMAN_OPTS="-p \$RASMGR_PORT"
EOF
  RETVAL=1
}

case "$1" in
	start)   shift; start "$@";;
	stop)    shift; stop "$@";;
	force-stop) shift; force_stop "$@";;
	restart) shift; restart "$@";;
	status)  status "$@";;
	*)       usage "$0";;
esac

exit $RETVAL
