1#!@BASH_PATH@
2
3# Authors:
4#  Andrew Beekhof <abeekhof@redhat.com>
5#  Fabio M. Di Nitto <fdinitto@redhat.com>
6#
7# License: Revised BSD
8
9# chkconfig: - 99 01
10# description: Pacemaker Cluster Manager
11# processname: pacemakerd
12#
13### BEGIN INIT INFO
14# Provides:		pacemaker
15# Required-Start:	$network $remote_fs corosync
16# Should-Start:		$syslog
17# Required-Stop:	$network $remote_fs corosync
18# Default-Start:
19# Default-Stop:
20# Short-Description:	Starts and stops Pacemaker Cluster Manager.
21# Description:		Starts and stops Pacemaker Cluster Manager.
22### END INIT INFO
23
24desc="Pacemaker Cluster Manager"
25prog="pacemakerd"
26
27# set secure PATH
28PATH="/sbin:/bin:/usr/sbin:/usr/bin:@sbindir@"
29
30checkrc() {
31    if [ $? = 0 ]; then
32	success
33    else
34	failure
35    fi
36}
37
38success()
39{
40	echo -ne "[  OK  ]\r"
41}
42
43failure()
44{
45	echo -ne "[FAILED]\r"
46}
47
48log()
49{
50    logger -t pacemaker -p daemon.notice "$*"
51}
52
53notify()
54{
55    log "$*"
56    echo -n "$*"
57}
58
59status()
60{
61	pid=$(pidof $1 2>/dev/null)
62	local rtrn=$?
63	if [ $rtrn -ne 0 ]; then
64		echo "$1 is stopped"
65		if [ -f "@localstatedir@/run/$prog.pid" ]; then
66			rtrn=1
67		else
68			rtrn=3
69		fi
70	else
71		echo "$1 (pid $pid) is running..."
72	fi
73	return $rtrn
74}
75
76if [ -d @CONFIGDIR@ ]; then
77	[ -f @INITDIR@/functions ] && . @INITDIR@/functions
78set -a
79	[ -f @CONFIGDIR@/pacemaker ] && . @CONFIGDIR@/pacemaker
80	[ -f @CONFIGDIR@/sbd ] && . @CONFIGDIR@/sbd
81set +a
82fi
83
84LOCK_DIR="."
85if [ -d "@localstatedir@/lock/subsys" ]; then
86	LOCK_DIR="@localstatedir@/lock/subsys"
87elif [ -d "@localstatedir@/lock" ]; then
88	LOCK_DIR="@localstatedir@/lock"
89fi
90[ -z "$LOCK_FILE" ] && LOCK_FILE="$LOCK_DIR/pacemaker"
91
92# Check if there is a valid watchdog-device configured in sbd config
93if [ x != "x$SBD_WATCHDOG_DEV" -a "/dev/null" != "$SBD_WATCHDOG_DEV" -a -c "$SBD_WATCHDOG_DEV" ]; then
94	# enhance for unavailable chkconfig - don't touch sbd for now
95	if chkconfig --list sbd_helper 2>/dev/null | grep -q ":on"; then
96		SBD_SERVICE=sbd_helper
97	fi
98fi
99
100start()
101{
102	notify "Starting $desc"
103
104	# most recent distributions use tmpfs for $@localstatedir@/run
105	# to avoid to clean it up on every boot.
106	# they also assume that init scripts will create
107	# required subdirectories for proper operations
108	mkdir -p "@localstatedir@/run"
109
110	if status $prog > /dev/null 2>&1; then
111		success
112	else
113		$prog > /dev/null 2>&1 &
114
115		# Time to connect to corosync and fail
116		sleep 5
117
118		if status $prog > /dev/null 2>&1; then
119			touch "$LOCK_FILE"
120			pidof $prog > "@localstatedir@/run/$prog.pid"
121			success
122		else
123			failure
124			rtrn=1
125		fi
126	fi
127	echo
128}
129
130stop()
131{
132	shutdown_prog=$prog
133	if ! status $prog > /dev/null 2>&1; then
134	    shutdown_prog="pacemaker-controld"
135	fi
136
137	if status $shutdown_prog > /dev/null 2>&1; then
138	    notify "Signaling $desc to terminate"
139	    kill -TERM $(pidof $prog) > /dev/null 2>&1
140	    checkrc
141	    echo
142
143	    notify "Waiting for cluster services to unload"
144	    while status $prog > /dev/null 2>&1; do
145		sleep 1
146		echo -n "."
147	    done
148	else
149	    echo -n "$desc is already stopped"
150	fi
151
152	rm -f "$LOCK_FILE"
153	rm -f "@localstatedir@/run/$prog.pid"
154	killall -q -9 pacemakerd pacemaker-attrd pacemaker-based \
155		pacemaker-controld pacemaker-execd pacemaker-fenced \
156		pacemaker-schedulerd
157	success
158	echo
159}
160
161rtrn=0
162
163case "$1" in
164start)
165	start
166;;
167restart|reload|force-reload)
168	stop
169	start
170;;
171condrestart|try-restart)
172	if status $prog > /dev/null 2>&1; then
173	    stop
174	    start
175	fi
176;;
177status)
178	status $prog
179	rtrn=$?
180;;
181stop)
182	stop
183	[ "x$SBD_SERVICE" != x ] && service $SBD_SERVICE stop
184;;
185*)
186	echo "usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
187	rtrn=2
188;;
189esac
190
191exit $rtrn
192