2 ## The contents of this file are subject to the Mozilla Public License
3 ## Version 1.1 (the "License"); you may not use this file except in
4 ## compliance with the License. You may obtain a copy of the License
5 ## at http://www.mozilla.org/MPL/
7 ## Software distributed under the License is distributed on an "AS IS"
8 ## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 ## the License for the specific language governing rights and
10 ## limitations under the License.
12 ## The Original Code is RabbitMQ.
14 ## The Initial Developer of the Original Code is VMware, Inc.
15 ## Copyright (c) 2007-2012 VMware, Inc. All rights reserved.
19 ## OCF Resource Agent compliant rabbitmq-server resource script.
22 ## OCF instance parameters
25 ## OCF_RESKEY_nodename
28 ## OCF_RESKEY_config_file
29 ## OCF_RESKEY_log_base
30 ## OCF_RESKEY_mnesia_base
31 ## OCF_RESKEY_server_start_args
32 ## OCF_RESKEY_pid_file
34 #######################################################################
37 : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
38 . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
40 #######################################################################
42 OCF_RESKEY_server_default="/usr/sbin/rabbitmq-server"
43 OCF_RESKEY_ctl_default="/usr/sbin/rabbitmqctl"
44 OCF_RESKEY_nodename_default="rabbit@localhost"
45 OCF_RESKEY_log_base_default="/var/log/rabbitmq"
46 OCF_RESKEY_pid_file_default="/var/run/rabbitmq/pid"
47 : ${OCF_RESKEY_server=${OCF_RESKEY_server_default}}
48 : ${OCF_RESKEY_ctl=${OCF_RESKEY_ctl_default}}
49 : ${OCF_RESKEY_nodename=${OCF_RESKEY_nodename_default}}
50 : ${OCF_RESKEY_log_base=${OCF_RESKEY_log_base_default}}
51 : ${OCF_RESKEY_pid_file=${OCF_RESKEY_pid_file_default}}
56 <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
57 <resource-agent name="rabbitmq-server">
58 <version>1.0</version>
61 Resource agent for RabbitMQ-server
64 <shortdesc lang="en">Resource agent for RabbitMQ-server</shortdesc>
67 <parameter name="server" unique="0" required="0">
69 The path to the rabbitmq-server script
71 <shortdesc lang="en">Path to rabbitmq-server</shortdesc>
72 <content type="string" default="${OCF_RESKEY_server_default}" />
75 <parameter name="ctl" unique="0" required="0">
77 The path to the rabbitmqctl script
79 <shortdesc lang="en">Path to rabbitmqctl</shortdesc>
80 <content type="string" default="${OCF_RESKEY_ctl_default}" />
83 <parameter name="nodename" unique="0" required="0">
85 The node name for rabbitmq-server
87 <shortdesc lang="en">Node name</shortdesc>
88 <content type="string" default="${OCF_RESKEY_nodename_default}" />
91 <parameter name="ip" unique="0" required="0">
93 The IP address for rabbitmq-server to listen on
95 <shortdesc lang="en">IP Address</shortdesc>
96 <content type="string" default="" />
99 <parameter name="port" unique="0" required="0">
101 The IP Port for rabbitmq-server to listen on
103 <shortdesc lang="en">IP Port</shortdesc>
104 <content type="integer" default="" />
107 <parameter name="config_file" unique="0" required="0">
109 Location of the config file (without the .config suffix)
111 <shortdesc lang="en">Config file path (without the .config suffix)</shortdesc>
112 <content type="string" default="" />
115 <parameter name="log_base" unique="0" required="0">
117 Location of the directory under which logs will be created
119 <shortdesc lang="en">Log base path</shortdesc>
120 <content type="string" default="${OCF_RESKEY_log_base_default}" />
123 <parameter name="mnesia_base" unique="0" required="0">
125 Location of the directory under which mnesia will store data
127 <shortdesc lang="en">Mnesia base path</shortdesc>
128 <content type="string" default="" />
131 <parameter name="server_start_args" unique="0" required="0">
133 Additional arguments provided to the server on startup
135 <shortdesc lang="en">Server start arguments</shortdesc>
136 <content type="string" default="" />
139 <parameter name="pid_file" unique="0" required="0">
141 Location of the file in which the pid will be stored
143 <shortdesc lang="en">Pid file path</shortdesc>
144 <content type="string" default="${OCF_RESKEY_pid_file_default}" />
150 <action name="start" timeout="600" />
151 <action name="stop" timeout="120" />
152 <action name="status" timeout="20" interval="10" />
153 <action name="monitor" timeout="20" interval="10" />
154 <action name="validate-all" timeout="30" />
155 <action name="meta-data" timeout="5" />
163 usage: $0 {start|stop|status|monitor|validate-all|meta-data}
165 Expects to have a fully populated OCF RA-compliant environment set.
169 RABBITMQ_SERVER=$OCF_RESKEY_server
170 RABBITMQ_CTL=$OCF_RESKEY_ctl
171 RABBITMQ_NODENAME=$OCF_RESKEY_nodename
172 RABBITMQ_NODE_IP_ADDRESS=$OCF_RESKEY_ip
173 RABBITMQ_NODE_PORT=$OCF_RESKEY_port
174 RABBITMQ_CONFIG_FILE=$OCF_RESKEY_config_file
175 RABBITMQ_LOG_BASE=$OCF_RESKEY_log_base
176 RABBITMQ_MNESIA_BASE=$OCF_RESKEY_mnesia_base
177 RABBITMQ_SERVER_START_ARGS=$OCF_RESKEY_server_start_args
178 RABBITMQ_PID_FILE=$OCF_RESKEY_pid_file
179 [ ! -z $RABBITMQ_NODENAME ] && NODENAME_ARG="-n $RABBITMQ_NODENAME"
180 [ ! -z $RABBITMQ_NODENAME ] && export RABBITMQ_NODENAME
183 PID_DIR=`dirname ${RABBITMQ_PID_FILE}`
184 if [ ! -d ${PID_DIR} ] ; then
186 chown -R rabbitmq:rabbitmq ${PID_DIR}
193 rm -f ${RABBITMQ_PID_FILE}
194 rmdir `dirname ${RABBITMQ_PID_FILE}` || :
198 [ ! -z $RABBITMQ_NODE_IP_ADDRESS ] && export RABBITMQ_NODE_IP_ADDRESS
199 [ ! -z $RABBITMQ_NODE_PORT ] && export RABBITMQ_NODE_PORT
200 [ ! -z $RABBITMQ_CONFIG_FILE ] && export RABBITMQ_CONFIG_FILE
201 [ ! -z $RABBITMQ_LOG_BASE ] && export RABBITMQ_LOG_BASE
202 [ ! -z $RABBITMQ_MNESIA_BASE ] && export RABBITMQ_MNESIA_BASE
203 [ ! -z $RABBITMQ_SERVER_START_ARGS ] && export RABBITMQ_SERVER_START_ARGS
204 [ ! -z $RABBITMQ_PID_FILE ] && ensure_pid_dir && export RABBITMQ_PID_FILE
207 rabbit_validate_partial() {
208 if [ ! -x $RABBITMQ_SERVER ]; then
209 ocf_log err "rabbitmq-server server $RABBITMQ_SERVER does not exist or is not executable";
210 exit $OCF_ERR_INSTALLED;
213 if [ ! -x $RABBITMQ_CTL ]; then
214 ocf_log err "rabbitmq-server ctl $RABBITMQ_CTL does not exist or is not executable";
215 exit $OCF_ERR_INSTALLED;
219 rabbit_validate_full() {
220 if [ ! -z $RABBITMQ_CONFIG_FILE ] && [ ! -e "${RABBITMQ_CONFIG_FILE}.config" ]; then
221 ocf_log err "rabbitmq-server config_file ${RABBITMQ_CONFIG_FILE}.config does not exist or is not a file";
222 exit $OCF_ERR_INSTALLED;
225 if [ ! -z $RABBITMQ_LOG_BASE ] && [ ! -d $RABBITMQ_LOG_BASE ]; then
226 ocf_log err "rabbitmq-server log_base $RABBITMQ_LOG_BASE does not exist or is not a directory";
227 exit $OCF_ERR_INSTALLED;
230 if [ ! -z $RABBITMQ_MNESIA_BASE ] && [ ! -d $RABBITMQ_MNESIA_BASE ]; then
231 ocf_log err "rabbitmq-server mnesia_base $RABBITMQ_MNESIA_BASE does not exist or is not a directory";
232 exit $OCF_ERR_INSTALLED;
235 rabbit_validate_partial
241 rabbitmqctl_action "status"
245 rabbitmqctl_action "wait" $1
248 rabbitmqctl_action() {
252 $RABBITMQ_CTL $NODENAME_ARG $action > /dev/null 2> /dev/null
256 ocf_log debug "RabbitMQ server is running normally"
260 ocf_log debug "RabbitMQ server is not running"
261 return $OCF_NOT_RUNNING
264 ocf_log err "Unexpected return from rabbitmqctl $NODENAME_ARG $action: $rc"
265 exit $OCF_ERR_GENERIC
272 if rabbit_status; then
273 ocf_log info "Resource already running."
279 setsid sh -c "$RABBITMQ_SERVER > ${RABBITMQ_LOG_BASE}/startup_log 2> ${RABBITMQ_LOG_BASE}/startup_err" &
281 # Wait for the server to come up.
282 # Let the CRM/LRM time us out if required
283 rabbit_wait $RABBITMQ_PID_FILE
285 if [ "$rc" != $OCF_SUCCESS ]; then
287 ocf_log info "rabbitmq-server start failed: $rc"
288 exit $OCF_ERR_GENERIC
297 if ! rabbit_status; then
298 ocf_log info "Resource not running."
305 if [ "$rc" != 0 ]; then
306 ocf_log err "rabbitmq-server stop command failed: $RABBITMQ_CTL stop, $rc"
310 # Spin waiting for the server to shut down.
311 # Let the CRM/LRM time us out if required
313 while [ $stop_wait = 1 ]; do
316 if [ "$rc" = $OCF_NOT_RUNNING ]; then
320 elif [ "$rc" != $OCF_SUCCESS ]; then
321 ocf_log info "rabbitmq-server stop failed: $rc"
322 exit $OCF_ERR_GENERIC
335 case $__OCF_ACTION in
346 if ocf_is_probe; then
347 rabbit_validate_partial
352 case $__OCF_ACTION in
367 exit $OCF_ERR_UNIMPLEMENTED