Rabbitmq server repackaged for 7.0
[packages/centos6/rabbitmq-server.git] / rabbitmq-server.ocf
1 #!/bin/sh
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/
6 ##
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.
11 ##
12 ##  The Original Code is RabbitMQ.
13 ##
14 ##  The Initial Developer of the Original Code is GoPivotal, Inc.
15 ##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
16 ##
17
18 ##
19 ##   OCF Resource Agent compliant rabbitmq-server resource script.
20 ##
21
22 ## OCF instance parameters
23 ##   OCF_RESKEY_server
24 ##   OCF_RESKEY_ctl
25 ##   OCF_RESKEY_nodename
26 ##   OCF_RESKEY_ip
27 ##   OCF_RESKEY_port
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
33
34 #######################################################################
35 # Initialization:
36
37 : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
38 . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
39
40 #######################################################################
41
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}}
52
53 meta_data() {
54     cat <<END
55 <?xml version="1.0"?>
56 <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
57 <resource-agent name="rabbitmq-server">
58 <version>1.0</version>
59
60 <longdesc lang="en">
61 Resource agent for RabbitMQ-server
62 </longdesc>
63
64 <shortdesc lang="en">Resource agent for RabbitMQ-server</shortdesc>
65
66 <parameters>
67 <parameter name="server" unique="0" required="0">
68 <longdesc lang="en">
69 The path to the rabbitmq-server script
70 </longdesc>
71 <shortdesc lang="en">Path to rabbitmq-server</shortdesc>
72 <content type="string" default="${OCF_RESKEY_server_default}" />
73 </parameter>
74
75 <parameter name="ctl" unique="0" required="0">
76 <longdesc lang="en">
77 The path to the rabbitmqctl script
78 </longdesc>
79 <shortdesc lang="en">Path to rabbitmqctl</shortdesc>
80 <content type="string" default="${OCF_RESKEY_ctl_default}" />
81 </parameter>
82
83 <parameter name="nodename" unique="0" required="0">
84 <longdesc lang="en">
85 The node name for rabbitmq-server
86 </longdesc>
87 <shortdesc lang="en">Node name</shortdesc>
88 <content type="string" default="${OCF_RESKEY_nodename_default}" />
89 </parameter>
90
91 <parameter name="ip" unique="0" required="0">
92 <longdesc lang="en">
93 The IP address for rabbitmq-server to listen on
94 </longdesc>
95 <shortdesc lang="en">IP Address</shortdesc>
96 <content type="string" default="" />
97 </parameter>
98
99 <parameter name="port" unique="0" required="0">
100 <longdesc lang="en">
101 The IP Port for rabbitmq-server to listen on
102 </longdesc>
103 <shortdesc lang="en">IP Port</shortdesc>
104 <content type="integer" default="" />
105 </parameter>
106
107 <parameter name="config_file" unique="0" required="0">
108 <longdesc lang="en">
109 Location of the config file (without the .config suffix)
110 </longdesc>
111 <shortdesc lang="en">Config file path (without the .config suffix)</shortdesc>
112 <content type="string" default="" />
113 </parameter>
114
115 <parameter name="log_base" unique="0" required="0">
116 <longdesc lang="en">
117 Location of the directory under which logs will be created
118 </longdesc>
119 <shortdesc lang="en">Log base path</shortdesc>
120 <content type="string" default="${OCF_RESKEY_log_base_default}" />
121 </parameter>
122
123 <parameter name="mnesia_base" unique="0" required="0">
124 <longdesc lang="en">
125 Location of the directory under which mnesia will store data
126 </longdesc>
127 <shortdesc lang="en">Mnesia base path</shortdesc>
128 <content type="string" default="" />
129 </parameter>
130
131 <parameter name="server_start_args" unique="0" required="0">
132 <longdesc lang="en">
133 Additional arguments provided to the server on startup
134 </longdesc>
135 <shortdesc lang="en">Server start arguments</shortdesc>
136 <content type="string" default="" />
137 </parameter>
138
139 <parameter name="pid_file" unique="0" required="0">
140 <longdesc lang="en">
141 Location of the file in which the pid will be stored
142 </longdesc>
143 <shortdesc lang="en">Pid file path</shortdesc>
144 <content type="string" default="${OCF_RESKEY_pid_file_default}" />
145 </parameter>
146
147 </parameters>
148
149 <actions>
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" />
156 </actions>
157 </resource-agent>
158 END
159 }
160
161 rabbit_usage() {
162     cat <<END
163 usage: $0 {start|stop|status|monitor|validate-all|meta-data}
164
165 Expects to have a fully populated OCF RA-compliant environment set.
166 END
167 }
168
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
181
182 ensure_pid_dir () {
183     PID_DIR=`dirname ${RABBITMQ_PID_FILE}`
184     if [ ! -d ${PID_DIR} ] ; then
185         mkdir -p ${PID_DIR}
186         chown -R rabbitmq:rabbitmq ${PID_DIR}
187         chmod 755 ${PID_DIR}
188     fi
189     return $OCF_SUCCESS
190 }
191
192 remove_pid () {
193     rm -f ${RABBITMQ_PID_FILE}
194     rmdir `dirname ${RABBITMQ_PID_FILE}` || :
195 }
196
197 export_vars() {
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
205 }
206
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;
211     fi
212
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;
216     fi
217 }
218
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;
223     fi
224
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;
228     fi
229
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;
233     fi
234
235     rabbit_validate_partial
236
237     return $OCF_SUCCESS
238 }
239
240 rabbit_status() {
241     rabbitmqctl_action "status"
242 }
243
244 rabbit_wait() {
245     rabbitmqctl_action "wait" $1
246 }
247
248 rabbitmqctl_action() {
249     local rc
250     local action
251     action=$@
252     $RABBITMQ_CTL $NODENAME_ARG $action > /dev/null 2> /dev/null
253     rc=$?
254     case "$rc" in
255         0)
256             ocf_log debug "RabbitMQ server is running normally"
257             return $OCF_SUCCESS
258             ;;
259         2)
260             ocf_log debug "RabbitMQ server is not running"
261             return $OCF_NOT_RUNNING
262             ;;
263         *)
264             ocf_log err "Unexpected return from rabbitmqctl $NODENAME_ARG $action: $rc"
265             exit $OCF_ERR_GENERIC
266     esac
267 }
268
269 rabbit_start() {
270     local rc
271
272     if rabbit_status; then
273         ocf_log info "Resource already running."
274         return $OCF_SUCCESS
275     fi
276
277     export_vars
278
279     setsid sh -c "$RABBITMQ_SERVER > ${RABBITMQ_LOG_BASE}/startup_log 2> ${RABBITMQ_LOG_BASE}/startup_err" &
280
281     # Wait for the server to come up.
282     # Let the CRM/LRM time us out if required
283     rabbit_wait $RABBITMQ_PID_FILE
284     rc=$?
285     if [ "$rc" != $OCF_SUCCESS ]; then
286         remove_pid
287         ocf_log info "rabbitmq-server start failed: $rc"
288         exit $OCF_ERR_GENERIC
289     fi
290
291     return $OCF_SUCCESS
292 }
293
294 rabbit_stop() {
295     local rc
296
297     if ! rabbit_status; then
298         ocf_log info "Resource not running."
299         return $OCF_SUCCESS
300     fi
301
302     $RABBITMQ_CTL stop
303     rc=$?
304
305     if [ "$rc" != 0 ]; then
306         ocf_log err "rabbitmq-server stop command failed: $RABBITMQ_CTL stop, $rc"
307         return $rc
308     fi
309
310     # Spin waiting for the server to shut down.
311     # Let the CRM/LRM time us out if required
312     stop_wait=1
313     while [ $stop_wait = 1 ]; do
314         rabbit_status
315         rc=$?
316         if [ "$rc" = $OCF_NOT_RUNNING ]; then
317             remove_pid
318             stop_wait=0
319             break
320         elif [ "$rc" != $OCF_SUCCESS ]; then
321             ocf_log info "rabbitmq-server stop failed: $rc"
322             exit $OCF_ERR_GENERIC
323         fi
324         sleep 1
325     done
326
327     return $OCF_SUCCESS
328 }
329
330 rabbit_monitor() {
331     rabbit_status
332     return $?
333 }
334
335 case $__OCF_ACTION in
336     meta-data)
337         meta_data
338         exit $OCF_SUCCESS
339         ;;
340     usage|help)
341         rabbit_usage
342         exit $OCF_SUCCESS
343         ;;
344 esac
345
346 if ocf_is_probe; then
347     rabbit_validate_partial
348 else
349     rabbit_validate_full
350 fi
351
352 case $__OCF_ACTION in
353     start)
354         rabbit_start
355         ;;
356     stop)
357         rabbit_stop
358         ;;
359     status|monitor)
360         rabbit_monitor
361         ;;
362     validate-all)
363         exit $OCF_SUCCESS
364         ;;
365     *)
366         rabbit_usage
367         exit $OCF_ERR_UNIMPLEMENTED
368         ;;
369 esac
370
371 exit $?