mirror_corosync/init/corosync.in
Jan Friesse 0d1a1b1329 init: Use cpgtool instead of cfgtool
Init script used to use corosync-cfgtool -s to wait till
corosync accepts ipc connection. Problem with this approach
is that error code is returned not only if ipc cannot be initialized,
but also when one of the ring is marked as failed, making corosync
service not to start. Corosync with one failed ring can work just
fine and there is no need to fail startup.

Patch is changing call of corosync-cfgtool to corosync-cpgtool. Also to
make spotting of broken ring easier, corosync-cfgtool -s is called after
successful return of the cpgtool, and warning is issued if cfgtool
fails.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
2019-07-08 16:00:39 +02:00

228 lines
4.1 KiB
Plaintext
Executable File

#!@BASHPATH@
# Authors:
# Andrew Beekhof <abeekhof@redhat.com>
# Fabio M. Di Nitto <fdinitto@redhat.com>
#
# License: Revised BSD
# chkconfig: - 20 80
# description: Corosync Cluster Engine
# processname: corosync
#
### BEGIN INIT INFO
# Provides: corosync
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Short-Description: Starts and stops Corosync Cluster Engine.
# Description: Starts and stops Corosync Cluster Engine.
### END INIT INFO
desc="Corosync Cluster Engine"
prog="corosync"
prog_pid_file="@LOCALSTATEDIR@/run/$prog.pid"
# set secure PATH
PATH="/sbin:/bin:/usr/sbin:/usr/bin:@SBINDIR@"
success()
{
echo -ne "[ OK ]\r"
}
failure()
{
echo -ne "[FAILED]\r"
}
warning()
{
echo -ne "[WARNING]\r"
}
# pid_var_run pid_file
# Echo pid from given pid_file.
# Returns LSB exit code for the 'status' action.
pid_var_run()
{
local pid_file="$1"
local pid
if [ -f "$pid_file" ]; then
[ ! -r "$pid_file" ] && return 4
pid=$(cat "$pid_file")
[ -z "$pid" ] && return 1
[ -n "${pid//[0-9]/}" ] && return 1
if kill -n 0 "$pid" 2>/dev/null;then
echo "$pid"
return 0
else
return 1
fi
fi
return 3
}
# status [-p pid_file] {program}
status()
{
local pid_file
if [ "$1" = "-p" ]; then
pid_file=$2
shift 2
fi
pid=$(pid_var_run "$pid_file" 2>/dev/null)
res=$?
if [ $res -ne 0 -a -z "$pid_file" ]; then
pid=$(__pids_pidof "$1")
[ -n "$pid" ]
res=$?
fi
if [ $res -ne 0 ]; then
echo "$1 is stopped"
else
echo "$1 (pid $pid) is running..."
fi
return $res
}
[ -f @INITCONFIGDIR@/$prog ] && . @INITCONFIGDIR@/$prog
case '@INITCONFIGDIR@' in
*/sysconfig) # rpm based distros
[ -f @INITDDIR@/functions ] && . @INITDDIR@/functions
[ -z "$LOCK_FILE" ] && LOCK_FILE="@LOCALSTATEDIR@/lock/subsys/$prog";;
*/default) # deb based distros
[ -z "$LOCK_FILE" ] && LOCK_FILE="@LOCALSTATEDIR@/lock/$prog";;
esac
# The version of __pids_pidof in /etc/init.d/functions calls pidof with -x
# This means it matches scripts, including this one.
# Redefine it here so that status (from the same file) works.
# Otherwise simultaneous calls to stop() will loop forever
__pids_pidof() {
pidof -c -o $$ -o $PPID -o %PPID "$1" || \
pidof -c -o $$ -o $PPID -o %PPID "${1##*/}"
}
cluster_disabled_at_boot()
{
if grep -q nocluster /proc/cmdline && \
[ "$(tty)" = "/dev/console" ]; then
echo -e "not configured to run at boot"
failure
return 1
fi
return 0
}
wait_for_ipc()
{
try=0
max_try=$((COROSYNC_INIT_TIMEOUT*2-1))
[ "$max_try" -le "0" ] && max_try=120
while [ "$try" -le "$max_try" ]; do
if corosync-cpgtool > /dev/null 2>&1; then
return 0
fi
sleep 0.5
try=$((try + 1))
done
return 1
}
start()
{
echo -n "Starting $desc ($prog): "
! cluster_disabled_at_boot && return
# most recent distributions use tmpfs for @LOCALSTATEDIR@/run
# to avoid to clean it up on every boot.
# they also assume that init scripts will create
# required subdirectories for proper operations
mkdir -p @LOCALSTATEDIR@/run
if status -p "$prog_pid_file" "$prog" > /dev/null 2>&1; then
success
else
$prog $COROSYNC_OPTIONS > /dev/null 2>&1
if [ "$?" != 0 ] || ! wait_for_ipc; then
failure
rtrn=1
else
touch $LOCK_FILE
if corosync-cfgtool -s > /dev/null 2>&1; then
success
else
warning
fi
fi
fi
echo
}
stop()
{
! status -p "$prog_pid_file" "$prog" > /dev/null 2>&1 && return
echo -n "Signaling $desc ($prog) to terminate: "
kill -TERM "$(pid_var_run $prog_pid_file)" > /dev/null 2>&1
success
echo
echo -n "Waiting for $prog services to unload:"
while status -p "$prog_pid_file" "$prog" > /dev/null 2>&1; do
sleep 1
echo -n "."
done
rm -f $LOCK_FILE
success
echo
}
restart()
{
stop
start
}
rtrn=0
case "$1" in
start)
start
;;
restart|reload|force-reload)
restart
;;
condrestart|try-restart)
if status -p "$prog_pid_file" "$prog" > /dev/null 2>&1; then
restart
fi
;;
status)
status -p "$prog_pid_file" "$prog"
rtrn=$?
;;
stop)
stop
;;
*)
echo "usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
rtrn=2
;;
esac
exit $rtrn