#! /bin/bash
### BEGIN INIT INFO
# Provides:          crate
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:
# Default-Stop:      0 1 6
# Short-Description: Starts crate
# chkconfig: - 80 15
# Description: CrateDB
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Pull in sysconfig settings
[ -f /etc/sysconfig/crate ] && . /etc/sysconfig/crate


CRATE_HOME=/opt/crate
CRATE_USER=crate

DAEMON=${CRATE_HOME}/bin/crate
NAME=crate
PID_FILE=${PIDFILE-/var/run/${NAME}/${NAME}.pid}
LOCK_FILE=${LOCKFILE-/var/lock/subsys/${NAME}}

CRATE_PATH_LOG=${CRATE_PATH_LOG-/var/log/${NAME}}
CRATE_GC_LOG_DIR=${CRATE_GC_LOG_DIR-/var/log/${NAME}}
CRATE_HEAP_DUMP_PATH=${CRATE_HEAP_DUMP_PATH-/var/lib/crate}
CRATE_PATH_CONF=${CRATE_PATH_CONF-/etc/${NAME}}

DAEMON_OPTS="-d -p ${PID_FILE} \
    -Cpath.conf=${CRATE_PATH_CONF} \
    -Cpath.logs=${CRATE_PATH_LOG}"

# These environment variables are passed over.
CRATE_HEAP_SIZE=${CRATE_HEAP_SIZE-512m}

CRATE_INCLUDE=${CRATE_INCLUDE-${CRATE_HOME}/bin/crate.in.sh}
JAVA_OPTS=-XX:+UseCompressedOops

checkJava() {
  if [ -d "$JAVA_HOME" ]; then
    JAVA="$JAVA_HOME/bin/java"
  else
    JAVA=`which java`
  fi

  if [ ! -x "$JAVA" ]; then
    log_pogress_msg "Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME"
    exit 1
  fi

  JAVA_FULL=`$JAVA -version 2>&1 | awk '/version/ {gsub(/"/, "", $3); print $3}'`
  JAVA_VERSION=`echo $JAVA_FULL | awk '{split($1, parts, ".")} END {print (parts[1] == 1 ? parts[2] : parts[1])}'`
  JAVA_UPDATE=`echo $JAVA_FULL | awk '{split($1, parts, "_")} END {print parts[2]}'`

  if [ $JAVA_VERSION -ge 9 ] || ([ $JAVA_VERSION -eq 8 ] && [ $JAVA_UPDATE -ge 20 ]); then
    log_pogress_msg "Running CrateDB with Java $JAVA_VERSION."
  else
    log_pogress_msg "CrateDB requires Java 8 update 20 or later!"
    exit 1
  fi
}

start() {
    checkJava

    echo -n $"Starting ${NAME}: "
    daemon --pidfile=${PID_FILE} --user $CRATE_USER \
        CRATE_HOME=$CRATE_HOME \
        CRATE_INCLUDE=$CRATE_INCLUDE \
        CRATE_HEAP_SIZE=$CRATE_HEAP_SIZE \
        CRATE_GC_LOG_DIR=$CRATE_GC_LOG_DIR \
        JAVA_HOME=$JAVA_HOME \
        JAVA_OPTS=$JAVA_OPTS \
        $DAEMON $DAEMON_OPTS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch $LOCK_FILE
    return $RETVAL
}

stop() {
    echo -n $"Stopping ${NAME}: "
    killproc -p ${PID_FILE} -d 10 $DAEMON
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${LOCK_FILE} ${PID_FILE}
    return $RETVAL
}

graceful_stop() {
    echo -n $"Gracefully stopping ${NAME}: "
    killproc -p ${PID_FILE} $DAEMON -USR2
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${LOCK_FILE} ${PID_FILE}
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    graceful-stop)
        graceful_stop
        ;;
    status)
        status -p ${PID_FILE} $DAEMON
        RETVAL=$?
        ;;
    restart|force-reload)
        stop
        start
        ;;
    *)
        N=/etc/init.d/${NAME}
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        RETVAL=2
        ;;
esac

exit $RETVAL
