#!/bin/bash
#
# controlling script for gc-executor
export LC_ALL="en_US.UTF-8"

# assume that the current script is in the bin folder
readonly SERVICE_HOME=$(dirname "$(dirname "$(readlink -f "$0")")")
readonly SERVICE_NAME=gc-executor
readonly CONFIG=${SERVICE_HOME}/gc.config
readonly PATH_TO_JAR="${SERVICE_HOME}/${SERVICE_NAME}.jar"
readonly PID_FILE="${SERVICE_HOME}/bin/${SERVICE_NAME}-pid"

usage() {
  me=$(basename "$0")
  echo "Usage: $me {start|stop [--now]|restart [--now]|status|check}" >&2
  exit 1
}

is_running() {
  [[ -f ${PID_FILE} && $(cat "${PID_FILE}") == $(pgrep -f "${SERVICE_NAME}.jar") ]]
}

get_config() {
  if [[ -f "${CONFIG}" ]]; then
    git config --file "${CONFIG}" "$1" "$2"
  fi
}

start() {
  echo "Starting ${SERVICE_NAME} ..."
  if is_running; then
    echo "${SERVICE_NAME} is already running"
  else
    java_home=$(get_config --get jvm.javaHome)
    if [[ -z "${java_home}" ]]; then
      java_home="/opt/gerrit/jdk8"
    fi
    java_options=($(get_config --get-all jvm.javaOptions))

    nohup "${java_home}/bin/java" "${java_options[@]}" -DconfigFile="${CONFIG}" \
      -jar "${PATH_TO_JAR}" > "${SERVICE_HOME}"/startup.log 2>&1&
    echo "${!}" > "${PID_FILE}"
    echo "${SERVICE_NAME} started"
  fi
}

stop(){
  if is_running; then
    PID=$(cat "${PID_FILE}");
    echo -n "${SERVICE_NAME} stopping ..."
    kill "${kill_options}" "${PID}";
    # wait for the process to die
    while kill -0 "${PID}" >/dev/null 2>&1; do
      sleep 1
      echo -n "."
    done
    echo -e "\n${SERVICE_NAME} stopped"
    rm -f "${PID_FILE}"
  else
    echo "${SERVICE_NAME} is not running"
  fi
}

restart(){
  stop
  start
}

status(){
  if is_running; then
    echo "${SERVICE_NAME} is up."
  else
    echo "Looks like ${SERVICE_NAME} is down!"
  fi
}

check(){
  tail -100f /opt/gerrit/review_site/logs/gc/gc.log
}

main(){
  action=$1
  shift
  kill_options="-TERM"

  while [[ $# -gt 0 ]]; do
    case "$1" in
    --now)
      kill_options="-KILL"
      shift
      ;;
    *)
      usage
    esac
  done

  case "${action}" in
    start)
      start
      ;;
    stop)
      stop
      ;;
    restart)
      restart
      ;;
    status)
      status
      ;;
    check)
      check
      ;;
    *)
      echo "${action} is not a known command."
      usage
  esac
  exit 0
}

main "$@"
