#! /bin/sh

# 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.

### BEGIN INIT INFO
# Provides:		hcatalog-server	
# Required-Start:	$remote_fs $syslog
# Required-Stop:	$remote_fs $syslog
# Default-Start:	2 3 4 5
# Default-Stop:		
# Short-Description:	Apache HCatalog Server
### END INIT INFO

set -e

# /etc/init.d/hcatalog-server: start and stop the Apache HCatalog Server daemon

test -x /usr/sbin/hcat_server.sh || exit 0
( /usr/bin/hcat.sh 2>&1 | grep -q hcat ) 2>/dev/null || exit 0

umask 022

. /lib/lsb/init-functions
. /etc/hcatalog/hcat-env.sh

# Are we running from init?
run_by_init() {
    ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]
}

check_for_no_start() {
    # forget it if we're trying to start, and /etc/hcatalog/hcatalog-server_not_to_be_run exists
    if [ -e /etc/hcatalog/hcatalog-server_not_to_be_run ]; then 
	if [ "$1" = log_end_msg ]; then
	    log_end_msg 0
	fi
	if ! run_by_init; then
	    log_action_msg "Apache HCatalog server not in use (/etc/hcatalog/hcatalog-server_not_to_be_run)"
	fi
	exit 0
    fi
}

check_privsep_dir() {
    # Create the PrivSep empty dir if necessary
    if [ ! -d ${HCAT_PID_DIR} ]; then
	mkdir -p ${HCAT_PID_DIR}
        chown root:hadoop ${HCAT_PID_DIR}
	chmod 0775 ${HCAT_PID_DIR} 
    fi
}

export PATH="${PATH:+$PATH:}/usr/sbin:/usr/bin"

case "$1" in
  start)
	check_privsep_dir
	check_for_no_start
	log_daemon_msg "Starting Apache HCatalog Server" "hcatalog-server"
	if start-stop-daemon --start --quiet --oknodo --pidfile ${HCAT_PID_DIR}/hcat.pid -c hcat -x /usr/sbin/hcat_server.sh -- --config ${HCAT_CONF_DIR} start; then
	    log_end_msg 0
	else
	    log_end_msg 1
	fi
	;;
  stop)
	log_daemon_msg "Stopping Apache HCatalog Server" "hcatalog-server"
	if start-stop-daemon --stop --quiet --oknodo --pidfile ${HCAT_PID_DIR}/hcat.pid; then
	    log_end_msg 0
	else
	    log_end_msg 1
	fi
	;;

  restart)
	check_privsep_dir
	log_daemon_msg "Restarting Apache HCatalog Server" "hcatalog-server"
	start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile ${HCAT_PID_DIR}/hcat.pid
	check_for_no_start log_end_msg
	if start-stop-daemon --start --quiet --oknodo --pidfile ${HCAT_PID_DIR}/hcat.pid -c hcat -x /usr/sbin/hcat_server.sh -- --config ${HCAT_CONF_DIR} start; then
	    log_end_msg 0
	else
	    log_end_msg 1
	fi
	;;

  try-restart)
	check_privsep_dir
	log_daemon_msg "Restarting Apache HCatalog Server" "hcatalog-server"
	set +e
	start-stop-daemon --stop --quiet --retry 30 --pidfile ${HCAT_PID_DIR}/hcat.pid
	RET="$?"
	set -e
	case $RET in
	    0)
		# old daemon stopped
		check_for_no_start log_end_msg
		if start-stop-daemon --start --quiet --oknodo --pidfile ${HCAT_PID_DIR}/hcat.pid -c hcat -x /usr/sbin/hcat_server.sh -- --config ${HADOOP_CONF_DIR} start; then
		    log_end_msg 0
		else
		    log_end_msg 1
		fi
		;;
	    1)
		# daemon not running
		log_progress_msg "(not running)"
		log_end_msg 0
		;;
	    *)
		# failed to stop
		log_progress_msg "(failed to stop)"
		log_end_msg 1
		;;
	esac
	;;

  status)
	status_of_proc -p ${HCAT_PID_DIR}/hcat.pid ${JAVA_HOME}/bin/java hcat-server && exit 0 || exit $?
	;;

  *)
	log_action_msg "Usage: /etc/init.d/hcatalog-server {start|stop|restart|try-restart|status}"
	exit 1
esac

exit 0
