#!/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-primary
# Required-Start: $qpidd
# Required-Stop: $qpidd
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: promote qpidd to cluster primary
# Description: Qpidd can be run in an active/passive cluster. Promote a running qpidd to primary.
### END INIT INFO

# chkconfig: - 85 15
# description: Qpidd can be run in an active/passive cluster. Promote a running qpidd to primary.
# processname: qpidd

prog=qpidd

# The following variables can be overridden in @sysconfdir@/sysconfig/$prog
QPID_INIT=@initdir@/$prog
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

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

QPID_HA="$QPID_HA $QPID_HA_OPTIONS"

RETVAL=0

status() {
    if $QPID_HA status --is-primary ; then
	echo "qpidd is primary"
    else
	echo "qpidd is not primary"
	return 1
    fi
}

# Ensure no concurrent start/stop of services.
lock() {
    export QPID_HA_LOCK_HELD=1	# For calls to the qpidd script
    exec 9< $QPID_INIT
    flock 9
}

start() {
    lock
    $QPID_INIT start primary || return $?
    echo -n $"Promoting to primary: "
    err=$($QPID_HA promote --cluster-manager 2>&1)
    RETVAL=$?
    [ $RETVAL = 0 ] && success || { echo -n "$err: "; failure; }
    echo
    return $RETVAL
}

stop() {
    $QPID_INIT stop primary
}

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

restart() {
    stop && start
}

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

exit $RETVAL
