88 lines
2.6 KiB
Diff
88 lines
2.6 KiB
Diff
|
Ganeti uses an internal tool to start/stop daemons during init and
|
||
|
upgrade. This patch makes the tool use native Shepherd facilities.
|
||
|
|
||
|
diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
|
||
|
--- a/daemons/daemon-util.in
|
||
|
+++ b/daemons/daemon-util.in
|
||
|
@@ -184,6 +184,21 @@ use_systemctl() {
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
+# Checks if we should use the Shepherd to start/stop daemons
|
||
|
+use_shepherd() {
|
||
|
+ # Is Shepherd running as PID 1?
|
||
|
+ ps --no-headers -p 1 -o cmd | grep -q shepherd || return 1
|
||
|
+
|
||
|
+ type -p herd >/dev/null || return 1
|
||
|
+
|
||
|
+ # Does Shepherd know about Ganeti at all?
|
||
|
+ if herd status | grep -q ganeti; then
|
||
|
+ return 0
|
||
|
+ fi
|
||
|
+
|
||
|
+ return 1
|
||
|
+}
|
||
|
+
|
||
|
# Prints path to PID file for a daemon.
|
||
|
daemon_pidfile() {
|
||
|
if [[ "$#" -lt 1 ]]; then
|
||
|
@@ -261,6 +276,13 @@ check() {
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
+ elif use_shepherd; then
|
||
|
+ activestate="$(herd status ${name})"
|
||
|
+ if echo $activestate | grep -q Running ; then
|
||
|
+ return 0
|
||
|
+ else
|
||
|
+ return 1
|
||
|
+ fi
|
||
|
elif type -p start-stop-daemon >/dev/null; then
|
||
|
start-stop-daemon --stop --signal 0 --quiet \
|
||
|
--pidfile $pidfile --name "$name"
|
||
|
@@ -291,6 +313,20 @@ start() {
|
||
|
return $?
|
||
|
fi
|
||
|
|
||
|
+ if use_shepherd; then
|
||
|
+ if herd status "$name" | grep -q "disabled"; then
|
||
|
+ # The Shepherd will disable a service that has stopped, even if it exits
|
||
|
+ # gracefully. Thus, we must re-enable it in case of a master failover.
|
||
|
+ herd enable "${name}"
|
||
|
+ fi
|
||
|
+ # Note: unlike systemd, which happily starts a service and returns success
|
||
|
+ # even if the daemon immediately exits, the Shepherd actually waits for it
|
||
|
+ # to come up. Thus, ignore the exit status from 'herd start' in case of
|
||
|
+ # master daemons running on the wrong node, or ganeti-kvmd disabled, etc.
|
||
|
+ herd start "${name}"
|
||
|
+ return 0
|
||
|
+ fi
|
||
|
+
|
||
|
# Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
|
||
|
eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
|
||
|
|
||
|
@@ -336,6 +372,13 @@ stop() {
|
||
|
|
||
|
if use_systemctl; then
|
||
|
systemctl stop "${name}.service"
|
||
|
+ elif use_shepherd; then
|
||
|
+ if herd status | grep -q "$name"; then
|
||
|
+ herd stop "$name"
|
||
|
+ else
|
||
|
+ # Do not raise an error if the service has not been enabled.
|
||
|
+ return 0
|
||
|
+ fi
|
||
|
elif type -p start-stop-daemon >/dev/null; then
|
||
|
start-stop-daemon --stop --quiet --oknodo --retry 30 \
|
||
|
--pidfile $pidfile --name "$name"
|
||
|
@@ -352,6 +395,9 @@ check_and_start() {
|
||
|
if use_systemctl; then
|
||
|
echo "${name} supervised by systemd but not running, will not restart."
|
||
|
return 1
|
||
|
+ elif use_shepherd; then
|
||
|
+ echo "${name} supervised by shepherd but not running, will not restart."
|
||
|
+ return 1
|
||
|
fi
|
||
|
|
||
|
start $name
|