mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-10-25 03:03:04 +00:00
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>
228 lines
4.1 KiB
Plaintext
Executable File
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
|