#!/usr/bin/env 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.
#
#
# qpidd        Startup script for the Qpid messaging daemon.
#

### BEGIN INIT INFO
# Provides: qpidd
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start or stop qpidd
# Description: Qpidd is an AMQP broker. It receives, stores, routes and	forwards messages using the AMQP protcol.
### END INIT INFO

# chkconfig: - 85 15
# description: Qpidd is an AMQP broker. It receives, stores, routes and forwards messages using the AMQP protcol.
# processname: qpidd

prog=qpidd
lockfile=/var/lock/subsys/$prog
pidfile=/var/run/qpidd.pid

# The following variables can be overridden in @sysconfdir@/sysconfig/$prog
QPID_INIT=@initdir@/$prog
QPID_BIN=@sbindir@/$prog
QPID_DATA_DIR=/var/lib/qpidd
QPID_CONFIG=@confdir@/qpidd.conf
QPID_HA=@bindir@/qpid-ha
QPID_HA_OPTIONS="--config $QPID_CONFIG"

# Source configuration
test -f @sysconfdir@/sysconfig/$prog && source @sysconfdir@/sysconfig/$prog
source /etc/rc.d/init.d/functions

# Data dir: respect the config file if set.
grep -q '^ *data-dir *=' $QPID_CONFIG || QPIDD_OPTIONS="$QPIDD_OPTIONS --data-dir=$QPID_DATA_DIR"

# Check for HA configuration
if grep -iq '^ *ha-cluster *= *\(true\|on\|1\|yes\)' $QPID_CONFIG; then
    # HA is configured, do some extra checks.
    test -x  $QPID_HA || { echo "HA configured but $QPID_HA not found"; return 5; }

    ha_ping() {	$QPID_HA $QPID_HA_OPTIONS ping >/dev/null 2>&1; }

    ha_allow_stop() {
        # Primary script does not stop backup brokers and vice versa.
	if $QPID_HA $QPID_HA_OPTIONS status --is-primary 2>&1 > /dev/null; then
	    [ "$1" = primary ] || { echo -n "stop primary broker with 'qpidd-primary stop'"; return 1; }
	else
	    [ "$1" = primary ] && { echo -n "stop backup broker with 'qpidd stop'"; return 1; }
	fi
	return 0
    }
else
    # No HA configuration, HA checks are no-ops.
    ha_ping() { true; }
    ha_allow_stop() { true; }
fi

# Check presence of executables/scripts
for f in $QPID_BIN; do
    test -x $f || { echo "$f not found or not executable"; exit 5; }
done

RETVAL=0

# Ensure user has sufficient permissions
runuser -s /bin/sh qpidd -c "echo x > /dev/null" 2> /dev/null || RETVAL=4
if [ $RETVAL = 4 ]; then
    echo "user had insufficient privilege";
    exit $RETVAL
fi

do_status() {
    # Check PID file and ping for liveness
    MESSAGE=$(status -p $pidfile $prog) && {
	ha_ping || return 1
    }
    RC=$?
    echo $MESSAGE
    return $RC
}

FLOCK_FD=9
# Ensure no concurrent start/stop of services.
lock() {
    [ "$QPID_HA_LOCK_HELD" ] || { # Held by caller
	exec 9< $QPID_INIT
	flock $FLOCK_FD
    }
}

start() {
    lock
    echo -n $"Starting Qpid AMQP daemon: "
    touch $pidfile
    chown qpidd.qpidd $pidfile
    [ -x /sbin/restorecon ] && /sbin/restorecon $pidfile
    daemon --pidfile $pidfile --check $prog --user qpidd $QPID_BIN --config $QPID_CONFIG --daemon $QPIDD_OPTIONS --close-fd $FLOCK_FD --pidfile $pidfile
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch $lockfile
    return $RETVAL
}

stop() {
    lock
    if ha_allow_stop $1; then
	echo -n $"Stopping Qpid AMQP daemon: "
	killproc -p ${pidfile} $prog
	RETVAL=$?
	[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
    fi
    [ "$RETVAL" = 0 ] && success
    echo
    return $RETVAL
}


reload() {
    echo 1>&2 $"$0: reload not supported"
    return 3
}

restart() {
    stop && start
}

# See how we were called.
case "$1" in
    start|stop|restart|reload)
	$1 $2
	;;
    status)
	do_status
	RETVAL=$?
	;;
    force-reload)
	restart
	;;
    try-restart|condrestart)
	[ -e $lockfile ] && restart || :
	;;
    *)
	echo 1>&2 $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|force-reload}"
	exit 2
esac

exit $RETVAL
