1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| | 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
|