7d96b2b
#!/bin/sh
7d96b2b
##
7d96b2b
##   OCF Resource Agent compliant rabbitmq-server resource script.
7d96b2b
##
7d96b2b
7d96b2b
##   The contents of this file are subject to the Mozilla Public License
7d96b2b
##   Version 1.1 (the "License"); you may not use this file except in
7d96b2b
##   compliance with the License. You may obtain a copy of the License at
7d96b2b
##   http://www.mozilla.org/MPL/
7d96b2b
##
7d96b2b
##   Software distributed under the License is distributed on an "AS IS"
7d96b2b
##   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
7d96b2b
##   License for the specific language governing rights and limitations
7d96b2b
##   under the License.
7d96b2b
##
7d96b2b
##   The Original Code is RabbitMQ.
7d96b2b
##
7d96b2b
##   The Initial Developers of the Original Code are LShift Ltd,
7d96b2b
##   Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd.
7d96b2b
##
7d96b2b
##   Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd,
7d96b2b
##   Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd
7d96b2b
##   are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial
7d96b2b
##   Technologies LLC, and Rabbit Technologies Ltd.
7d96b2b
##
7d96b2b
##   Portions created by LShift Ltd are Copyright (C) 2007-2010 LShift
7d96b2b
##   Ltd. Portions created by Cohesive Financial Technologies LLC are
7d96b2b
##   Copyright (C) 2007-2010 Cohesive Financial Technologies
7d96b2b
##   LLC. Portions created by Rabbit Technologies Ltd are Copyright
7d96b2b
##   (C) 2007-2010 Rabbit Technologies Ltd.
7d96b2b
##
7d96b2b
##   All Rights Reserved.
7d96b2b
##
7d96b2b
##   Contributor(s): ______________________________________.
7d96b2b
##
7d96b2b
7d96b2b
## OCF instance parameters
7d96b2b
##   OCF_RESKEY_multi
7d96b2b
##   OCF_RESKEY_ctl
7d96b2b
##   OCF_RESKEY_nodename
7d96b2b
##   OCF_RESKEY_ip
7d96b2b
##   OCF_RESKEY_port
7d96b2b
##   OCF_RESKEY_config_file
7d96b2b
##   OCF_RESKEY_log_base
7d96b2b
##   OCF_RESKEY_mnesia_base
7d96b2b
##   OCF_RESKEY_server_start_args
7d96b2b
7d96b2b
#######################################################################
7d96b2b
# Initialization:
7d96b2b
7d96b2b
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
7d96b2b
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
7d96b2b
7d96b2b
#######################################################################
7d96b2b
7d96b2b
OCF_RESKEY_multi_default="/usr/sbin/rabbitmq-multi"
7d96b2b
OCF_RESKEY_ctl_default="/usr/sbin/rabbitmqctl"
7d96b2b
OCF_RESKEY_nodename_default="rabbit@localhost"
7d96b2b
OCF_RESKEY_log_base_default="/var/log/rabbitmq"
7d96b2b
: ${OCF_RESKEY_multi=${OCF_RESKEY_multi_default}}
7d96b2b
: ${OCF_RESKEY_ctl=${OCF_RESKEY_ctl_default}}
7d96b2b
: ${OCF_RESKEY_nodename=${OCF_RESKEY_nodename_default}}
7d96b2b
: ${OCF_RESKEY_log_base=${OCF_RESKEY_log_base_default}}
7d96b2b
7d96b2b
meta_data() {
7d96b2b
    cat <
7d96b2b
7d96b2b
7d96b2b
<resource-agent name="rabbitmq-server">
7d96b2b
<version>1.0</version>
7d96b2b
7d96b2b
<longdesc lang="en">
7d96b2b
Resource agent for RabbitMQ-server
7d96b2b
</longdesc>
7d96b2b
7d96b2b
<shortdesc lang="en">Resource agent for RabbitMQ-server</shortdesc>
7d96b2b
7d96b2b
<parameters>
7d96b2b
<parameter name="multi" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
The path to the rabbitmq-multi script
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Path to rabbitmq-multi</shortdesc>
7d96b2b
<content type="string" default="${OCF_RESKEY_multi_default}" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="ctl" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
The path to the rabbitmqctl script
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Path to rabbitmqctl</shortdesc>
7d96b2b
<content type="string" default="${OCF_RESKEY_ctl_default}" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="nodename" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
The node name for rabbitmq-server
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Node name</shortdesc>
7d96b2b
<content type="string" default="${OCF_RESKEY_nodename_default}" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="ip" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
The IP address for rabbitmq-server to listen on
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">IP Address</shortdesc>
7d96b2b
<content type="string" default="" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="port" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
The IP Port for rabbitmq-server to listen on
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">IP Port</shortdesc>
7d96b2b
<content type="integer" default="" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="config_file" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
Location of the config file
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Config file path</shortdesc>
7d96b2b
<content type="string" default="" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="log_base" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
Location of the directory under which logs will be created
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Log base path</shortdesc>
7d96b2b
<content type="string" default="${OCF_RESKEY_log_base_default}" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="mnesia_base" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
Location of the directory under which mnesia will store data
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Mnesia base path</shortdesc>
7d96b2b
<content type="string" default="" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
<parameter name="server_start_args" unique="0" required="0">
7d96b2b
<longdesc lang="en">
7d96b2b
Additional arguments provided to the server on startup
7d96b2b
</longdesc>
7d96b2b
<shortdesc lang="en">Server start arguments</shortdesc>
7d96b2b
<content type="string" default="" />
7d96b2b
</parameter>
7d96b2b
7d96b2b
</parameters>
7d96b2b
7d96b2b
<actions>
7d96b2b
<action name="start"        timeout="600" />
7d96b2b
<action name="stop"         timeout="120" />
7d96b2b
<action name="status"       timeout="20" interval="10" />
7d96b2b
<action name="monitor"      timeout="20" interval="10" />
7d96b2b
<action name="validate-all" timeout="30" />
7d96b2b
<action name="meta-data"    timeout="5" />
7d96b2b
</actions>
7d96b2b
</resource-agent>
7d96b2b
END
7d96b2b
}
7d96b2b
7d96b2b
rabbit_usage() {
7d96b2b
    cat <
7d96b2b
usage: $0 {start|stop|status|monitor|validate-all|meta-data}
7d96b2b
7d96b2b
Expects to have a fully populated OCF RA-compliant environment set.
7d96b2b
END
7d96b2b
}
7d96b2b
7d96b2b
RABBITMQ_MULTI=$OCF_RESKEY_multi
7d96b2b
RABBITMQ_CTL=$OCF_RESKEY_ctl
7d96b2b
RABBITMQ_NODENAME=$OCF_RESKEY_nodename
7d96b2b
RABBITMQ_NODE_IP_ADDRESS=$OCF_RESKEY_ip
7d96b2b
RABBITMQ_NODE_PORT=$OCF_RESKEY_port
7d96b2b
RABBITMQ_CONFIG_FILE=$OCF_RESKEY_config_file
7d96b2b
RABBITMQ_LOG_BASE=$OCF_RESKEY_log_base
7d96b2b
RABBITMQ_MNESIA_BASE=$OCF_RESKEY_mnesia_base
7d96b2b
RABBITMQ_SERVER_START_ARGS=$OCF_RESKEY_server_start_args
7d96b2b
[ ! -z $RABBITMQ_NODENAME ] && NODENAME_ARG="-n $RABBITMQ_NODENAME"
7d96b2b
[ ! -z $RABBITMQ_NODENAME ]            && export RABBITMQ_NODENAME
7d96b2b
7d96b2b
export_vars() {
7d96b2b
    [ ! -z $RABBITMQ_NODE_IP_ADDRESS ]     && export RABBITMQ_NODE_IP_ADDRESS
7d96b2b
    [ ! -z $RABBITMQ_NODE_PORT ]           && export RABBITMQ_NODE_PORT
7d96b2b
    [ ! -z $RABBITMQ_CONFIG_FILE ]         && export RABBITMQ_CONFIG_FILE
7d96b2b
    [ ! -z $RABBITMQ_LOG_BASE ]            && export RABBITMQ_LOG_BASE
7d96b2b
    [ ! -z $RABBITMQ_MNESIA_BASE ]         && export RABBITMQ_MNESIA_BASE
7d96b2b
    [ ! -z $RABBITMQ_SERVER_START_ARGS ]   && export RABBITMQ_SERVER_START_ARGS
7d96b2b
}
7d96b2b
7d96b2b
rabbit_validate_partial() {
7d96b2b
    if [ ! -x $RABBITMQ_MULTI ]; then
7d96b2b
        ocf_log err "rabbitmq-server multi $RABBITMQ_MULTI does not exist or is not executable";
7d96b2b
        exit $OCF_ERR_INSTALLED;
7d96b2b
    fi
7d96b2b
7d96b2b
    if [ ! -x $RABBITMQ_CTL ]; then
7d96b2b
        ocf_log err "rabbitmq-server ctl $RABBITMQ_CTL does not exist or is not executable";
7d96b2b
        exit $OCF_ERR_INSTALLED;
7d96b2b
    fi
7d96b2b
}
7d96b2b
7d96b2b
rabbit_validate_full() {
7d96b2b
    if [ ! -z $RABBITMQ_CONFIG_FILE ] && [ ! -e $RABBITMQ_CONFIG_FILE ]; then
7d96b2b
        ocf_log err "rabbitmq-server config_file $RABBITMQ_CONFIG_FILE does not exist or is not a file";
7d96b2b
        exit $OCF_ERR_INSTALLED;
7d96b2b
    fi
7d96b2b
7d96b2b
    if [ ! -z $RABBITMQ_LOG_BASE ] && [ ! -d $RABBITMQ_LOG_BASE ]; then
7d96b2b
        ocf_log err "rabbitmq-server log_base $RABBITMQ_LOG_BASE does not exist or is not a directory";
7d96b2b
        exit $OCF_ERR_INSTALLED;
7d96b2b
    fi
7d96b2b
7d96b2b
    if [ ! -z $RABBITMQ_MNESIA_BASE ] && [ ! -d $RABBITMQ_MNESIA_BASE ]; then
7d96b2b
        ocf_log err "rabbitmq-server mnesia_base $RABBITMQ_MNESIA_BASE does not exist or is not a directory";
7d96b2b
        exit $OCF_ERR_INSTALLED;
7d96b2b
    fi
7d96b2b
7d96b2b
    rabbit_validate_partial
7d96b2b
7d96b2b
    return $OCF_SUCCESS
7d96b2b
}
7d96b2b
7d96b2b
rabbit_status() {
7d96b2b
    local rc
7d96b2b
    $RABBITMQ_CTL $NODENAME_ARG status > /dev/null 2> /dev/null
7d96b2b
    rc=$?
7d96b2b
    case "$rc" in
7d96b2b
        0)
7d96b2b
            ocf_log debug "RabbitMQ server is running normally"
7d96b2b
            return $OCF_SUCCESS
7d96b2b
            ;;
7d96b2b
        2)
7d96b2b
            ocf_log debug "RabbitMQ server is not running"
7d96b2b
            return $OCF_NOT_RUNNING
7d96b2b
            ;;
7d96b2b
        *)
7d96b2b
            ocf_log err "Unexpected return from rabbitmqctl $NODENAME_ARG status: $rc"
7d96b2b
            exit $OCF_ERR_GENERIC
7d96b2b
    esac
7d96b2b
}
7d96b2b
7d96b2b
rabbit_start() {
7d96b2b
    local rc
7d96b2b
7d96b2b
    if rabbit_status; then
7d96b2b
        ocf_log info "Resource already running."
7d96b2b
        return $OCF_SUCCESS
7d96b2b
    fi
7d96b2b
7d96b2b
    export_vars
7d96b2b
7d96b2b
    $RABBITMQ_MULTI start_all 1 > ${RABBITMQ_LOG_BASE}/startup_log 2> ${RABBITMQ_LOG_BASE}/startup_err &
7d96b2b
    rc=$?
7d96b2b
7d96b2b
    if [ "$rc" != 0 ]; then
7d96b2b
        ocf_log err "rabbitmq-server start command failed: $RABBITMQ_MULTI start_all 1, $rc"
7d96b2b
        return $rc
7d96b2b
    fi
7d96b2b
7d96b2b
    # Spin waiting for the server to come up.
7d96b2b
    # Let the CRM/LRM time us out if required
7d96b2b
    start_wait=1
7d96b2b
    while [ $start_wait = 1 ]; do
7d96b2b
        rabbit_status
7d96b2b
        rc=$?
7d96b2b
        if [ "$rc" = $OCF_SUCCESS ]; then
7d96b2b
            start_wait=0
7d96b2b
        elif [ "$rc" != $OCF_NOT_RUNNING ]; then
7d96b2b
            ocf_log info "rabbitmq-server start failed: $rc"
7d96b2b
            exit $OCF_ERR_GENERIC
7d96b2b
        fi
7d96b2b
        sleep 1
7d96b2b
    done
7d96b2b
7d96b2b
    return $OCF_SUCCESS
7d96b2b
}
7d96b2b
7d96b2b
rabbit_stop() {
7d96b2b
    local rc
7d96b2b
7d96b2b
    if ! rabbit_status; then
7d96b2b
        ocf_log info "Resource not running."
7d96b2b
        return $OCF_SUCCESS
7d96b2b
    fi
7d96b2b
7d96b2b
    $RABBITMQ_MULTI stop_all &
7d96b2b
    rc=$?
7d96b2b
7d96b2b
    if [ "$rc" != 0 ]; then
7d96b2b
        ocf_log err "rabbitmq-server stop command failed: $RABBITMQ_MULTI stop_all, $rc"
7d96b2b
        return $rc
7d96b2b
    fi
7d96b2b
7d96b2b
    # Spin waiting for the server to shut down.
7d96b2b
    # Let the CRM/LRM time us out if required
7d96b2b
    stop_wait=1
7d96b2b
    while [ $stop_wait = 1 ]; do
7d96b2b
        rabbit_status
7d96b2b
        rc=$?
7d96b2b
        if [ "$rc" = $OCF_NOT_RUNNING ]; then
7d96b2b
            stop_wait=0
7d96b2b
            break
7d96b2b
        elif [ "$rc" != $OCF_SUCCESS ]; then
7d96b2b
            ocf_log info "rabbitmq-server stop failed: $rc"
7d96b2b
            exit $OCF_ERR_GENERIC
7d96b2b
        fi
7d96b2b
        sleep 1
7d96b2b
    done
7d96b2b
7d96b2b
    return $OCF_SUCCESS
7d96b2b
}
7d96b2b
7d96b2b
rabbit_monitor() {
7d96b2b
    rabbit_status
7d96b2b
    return $?
7d96b2b
}
7d96b2b
7d96b2b
case $__OCF_ACTION in
7d96b2b
    meta-data)
7d96b2b
        meta_data
7d96b2b
        exit $OCF_SUCCESS
7d96b2b
        ;;
7d96b2b
    usage|help)
7d96b2b
        rabbit_usage
7d96b2b
        exit $OCF_SUCCESS
7d96b2b
        ;;
7d96b2b
esac
7d96b2b
7d96b2b
if ocf_is_probe; then
7d96b2b
    rabbit_validate_partial
7d96b2b
else
7d96b2b
    rabbit_validate_full
7d96b2b
fi
7d96b2b
7d96b2b
case $__OCF_ACTION in
7d96b2b
    start)
7d96b2b
        rabbit_start
7d96b2b
        ;;
7d96b2b
    stop)
7d96b2b
        rabbit_stop
7d96b2b
        ;;
7d96b2b
    status|monitor)
7d96b2b
        rabbit_monitor
7d96b2b
        ;;
7d96b2b
    validate-all)
7d96b2b
        exit $OCF_SUCCESS
7d96b2b
        ;;
7d96b2b
    *)
7d96b2b
        rabbit_usage
7d96b2b
        exit $OCF_ERR_UNIMPLEMENTED
7d96b2b
        ;;
7d96b2b
esac
7d96b2b
7d96b2b
exit $?