#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Starts a Hadoop kms server
#
# chkconfig: 345 90 10
# description: Hadoop kms server
#
### BEGIN INIT INFO
# Provides:          hadoop-kms-server
# Short-Description: Hadoop kms 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}/hadoop-kms ] && . ${BIGTOP_DEFAULTS_DIR}/hadoop-kms

# 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="hadoop-kms-server"
DESC="Hadoop kms server"
EXEC_PATH="/usr/lib/hadoop-kms/sbin/kms.sh"
EXEC_DIR=""
SVC_USER="kms"
DAEMON_FLAGS="kms"
CONF_DIR="/etc/hadoop-kms/conf"
PIDFILE="/var/run/hadoop-kms/hadoop-kms-kms-server.pid"
LOCKDIR="/var/lock/subsys"
LOCKFILE="$LOCKDIR/hadoop-kms-server"
WORKING_DIR="/var/lib/hadoop-kms"

install -d -m 0755 -o kms -g kms /var/run/hadoop-kms 1>/dev/null 2>&1 || :
[ -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

  export KMS_USER="$SVC_USER"
  export KMS_CONFIG="$CONF_DIR"
  export KMS_LOG=${KMS_LOG:-"/var/log/hadoop-kms/"}
  export KMS_TEMP="$(dirname $PIDFILE)"
  export CATALINA_BASE=${CATALINA_BASE:-"/var/lib/hadoop-kms/tomcat-deployment"}
  export CATALINA_PID="$PIDFILE"
  export CATALINA_TMPDIR="$KMS_TEMP"

  . /usr/lib/hadoop-kms/tomcat-deployment.sh

  su -s /bin/bash $KMS_USER -c "nohup nice ${EXEC_PATH} start $DAEMON_FLAGS > /dev/null 2>&1"

  for second in {5..0}
  do
    checkstatusofproc
    RETVAL=$?
    if [ "$RETVAL" -eq $RETVAL_SUCCESS ] ; then
	  break
    fi
    sleep 1
  done


  if [ $RETVAL -eq $STATUS_RUNNING ]; then
    touch $LOCKFILE
    log_success_msg "Started ${DESC} (${DAEMON}): "
    #Start the watchdog to monitor that kms service is running and kill the
    #Tomcat server if it is not
    daemon_pid=`cat $PIDFILE`
    wd_timeout=${KMS_WATCHDOG_TIMEOUT:-30}
    /usr/lib/bigtop-utils/bigtop-monitor-service $wd_timeout $daemon_pid > /dev/null 2>&1 &
  else
    log_failure_msg "Failed to start ${DESC}. Return value: $RETVAL"
  fi

  return $RETVAL
}
stop() {
	
  export KMS_TEMP="$(dirname $PIDFILE)"
  export CATALINA_PID="$PIDFILE"
  export CATALINA_TMPDIR="$KMS_TEMP"
	
  # FIXME: workaround for BIGTOP-537
  checkstatusofproc
  if [ "$?" = "$STATUS_RUNNING" ] ; then
    su -s /bin/bash $SVC_USER -c "${EXEC_PATH} stop $SLEEP_TIME -force > /dev/null 2>&1"
    RETVAL=$?
  else
    RETVAL=$RETVAL_SUCCESS
  fi

  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
}
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 || :
}

check_for_root() {
  if [ $(id -ur) -ne 0 ]; then
    echo 'Error: root user required'
    echo
    exit 1
  fi
}

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

service "$@"

exit $RETVAL
