#!/bin/bash
# Starts a Hive HCatalog server daemon
# chkconfig: 345 85 15
# description: HCatalog server
# pidfile: /var/lib/hive-hcatalog/hcat.pid
### BEGIN INIT INFO
# Provides:          hive-hcatalog-server
# Short-Description: HCatalog server
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Should-Start:
# Should-Stop:
### END INIT INFO

. /lib/lsb/init-functions

BIGTOP_DEFAULTS_DIR=${BIGTOP_DEFAULTS_DIR-/etc/default}
[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/hadoop ] && . ${BIGTOP_DEFAULTS_DIR}/hadoop
[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/hive-hcatalog-server ] && . ${BIGTOP_DEFAULTS_DIR}/hive-hcatalog-server

# Load env and configure LOG_DIR with fallback
[ -r /etc/hive/conf/hive-env.sh ] && . /etc/hive/conf/hive-env.sh
LOG_DIR=${LOG_DIR:-${HIVE_LOG_DIR}}
LOG_DIR=${LOG_DIR:-/var/log/hive}
export LOG_DIR
export HIVE_LOG_DIR=${HIVE_LOG_DIR:-$LOG_DIR}
install -d -m 0755 -o hive -g hive "$LOG_DIR" 1>/dev/null 2>&1 || :

# Autodetect JAVA_HOME if not defined
. /usr/lib/bigtop-utils/bigtop-detect-javahome

RETVAL_SUCCESS=0

STATUS_RUNNING=0
STATUS_DEAD=1
STATUS_DEAD_AND_LOCK=2
STATUS_NOT_RUNNING=3
STATUS_OTHER_ERROR=102

ERROR_PROGRAM_NOT_INSTALLED=5
ERROR_PROGRAM_NOT_CONFIGURED=6

RETVAL=0
SLEEP_TIME=5
PROC_NAME="java"

DAEMON="hive-hcatalog-server"
DESC="HCatalog server"
EXEC_PATH="/usr/lib/hive-hcatalog/sbin/hcat_server.sh"
DAEMON_FLAGS=""
CONF_DIR="/etc/hive-hcatalog/conf"
PIDFILE="/var/lib/hive-hcatalog/hcat.pid"
LOCKDIR="/var/lock"
LOCKFILE="$LOCKDIR/hive-hcatalog-server"
WORKING_DIR="/var/lib/hive-hcatalog"

[ -d "$LOCKDIR" ] || install -d -m 0755 $LOCKDIR 1>/dev/null 2>&1 || :

start() {
    [ -x $EXEC_PATH ] || exit $ERROR_PROGRAM_NOT_INSTALLED
    [ -d $CONF_DIR ] || exit $ERROR_PROGRAM_NOT_CONFIGURED

    LOG_FILE="$LOG_DIR/${DAEMON}.out"
    /bin/bash -c "cd $WORKING_DIR && nohup nice -n 0 $EXEC_PATH start >> \"$LOG_FILE\" 2>&1 < /dev/null &"

    sleep $SLEEP_TIME
    checkstatusofproc
    RETVAL=$?
    if [ $RETVAL -eq $STATUS_RUNNING ]; then
      touch $LOCKFILE
      log_success_msg "Started ${DESC}: "
    else
      log_failure_msg "Failed to start ${DESC}. Return value: $RETVAL"
    fi
    return $RETVAL
}

stop() {
    killproc -p $PIDFILE java
    RETVAL=$?
    if [ $RETVAL -eq $RETVAL_SUCCESS ]; then
      log_success_msg "Stopped ${DESC}: "
      rm -f $LOCKFILE $PIDFILE
    else
      log_failure_msg "Failure to stop ${DESC}. Return value: $RETVAL"
    fi
    return $RETVAL
}

restart() {
  stop
  start
}

checkstatusofproc(){
  pidofproc -p $PIDFILE $PROC_NAME > /dev/null
}

checkstatus(){
  checkstatusofproc
  status=$?

  case "$status" in
    $STATUS_RUNNING)
      log_success_msg "${DESC} is running"
      ;;
    $STATUS_DEAD)
      log_failure_msg "${DESC} is dead and pid file exists"
      ;;
    $STATUS_DEAD_AND_LOCK)
      log_failure_msg "${DESC} is dead and lock file exists"
      ;;
    $STATUS_NOT_RUNNING)
      log_failure_msg "${DESC} is not running"
      ;;
    *)
      log_failure_msg "${DESC} status is unknown"
      ;;
  esac
  return $status
}

condrestart(){
  [ -e $LOCKFILE ] && restart || :
}

service() {
  case "$1" in
    start)
      start
      ;;
    stop)
      stop
      ;;
    status)
      checkstatus
      RETVAL=$?
      ;;
    restart|force-reload)
      restart
      ;;
    condrestart|try-restart)
      condrestart
      ;;
    *)
      echo $"Usage: $0 {start|stop|status|restart|try-restart|condrestart|force-reload}"
      exit 1
  esac
}

service "$1"

exit $RETVAL


