Statistics
| Branch: | Tag: | Revision:

root / daemons / daemon-util.in @ 4b42c3d6

History | View | Annotate | Download (6.7 kB)

1 f154a7a3 Michael Hanselmann
#!/bin/bash
2 f154a7a3 Michael Hanselmann
#
3 f154a7a3 Michael Hanselmann
4 5ad68a23 Michael Hanselmann
# Copyright (C) 2009, 2011, 2012 Google Inc.
5 f154a7a3 Michael Hanselmann
#
6 f154a7a3 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 f154a7a3 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 f154a7a3 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 f154a7a3 Michael Hanselmann
# (at your option) any later version.
10 f154a7a3 Michael Hanselmann
#
11 f154a7a3 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 f154a7a3 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 f154a7a3 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 f154a7a3 Michael Hanselmann
# General Public License for more details.
15 f154a7a3 Michael Hanselmann
#
16 f154a7a3 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 f154a7a3 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 f154a7a3 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 f154a7a3 Michael Hanselmann
# 02110-1301, USA.
20 f154a7a3 Michael Hanselmann
21 f154a7a3 Michael Hanselmann
set -e
22 f154a7a3 Michael Hanselmann
23 f154a7a3 Michael Hanselmann
defaults_file=@SYSCONFDIR@/default/ganeti
24 f154a7a3 Michael Hanselmann
25 5d8acbdd Michael Hanselmann
# This is a list of all daemons and the order in which they're started. The
26 5d8acbdd Michael Hanselmann
# order is important as there are dependencies between them. On shutdown,
27 5d8acbdd Michael Hanselmann
# they're stopped in reverse order.
28 5d8acbdd Michael Hanselmann
DAEMONS=(
29 5d8acbdd Michael Hanselmann
  ganeti-noded
30 5d8acbdd Michael Hanselmann
  ganeti-masterd
31 5d8acbdd Michael Hanselmann
  ganeti-rapi
32 5d8acbdd Michael Hanselmann
  )
33 5d8acbdd Michael Hanselmann
34 c4e5d11e Iustin Pop
if [[ "@CUSTOM_ENABLE_CONFD@" == True ]]; then
35 c4e5d11e Iustin Pop
  DAEMONS+=( ganeti-confd )
36 c4e5d11e Iustin Pop
fi
37 c4e5d11e Iustin Pop
38 f154a7a3 Michael Hanselmann
NODED_ARGS=
39 f154a7a3 Michael Hanselmann
MASTERD_ARGS=
40 f154a7a3 Michael Hanselmann
CONFD_ARGS=
41 f154a7a3 Michael Hanselmann
RAPI_ARGS=
42 f154a7a3 Michael Hanselmann
43 f154a7a3 Michael Hanselmann
# Read defaults file if it exists
44 f154a7a3 Michael Hanselmann
if [[ -s $defaults_file ]]; then
45 f154a7a3 Michael Hanselmann
  . $defaults_file
46 f154a7a3 Michael Hanselmann
fi
47 f154a7a3 Michael Hanselmann
48 4b42c3d6 Jun Futagawa
# Meant to facilitate use utilities in /etc/rc.d/init.d/functions in case
49 4b42c3d6 Jun Futagawa
# start-stop-daemon is not available.
50 4b42c3d6 Jun Futagawa
_ignore_error() {
51 4b42c3d6 Jun Futagawa
  eval "$@" || :
52 4b42c3d6 Jun Futagawa
}
53 4b42c3d6 Jun Futagawa
54 f154a7a3 Michael Hanselmann
_daemon_pidfile() {
55 f154a7a3 Michael Hanselmann
  echo "@LOCALSTATEDIR@/run/ganeti/$1.pid"
56 f154a7a3 Michael Hanselmann
}
57 f154a7a3 Michael Hanselmann
58 a34d8cc0 Michael Hanselmann
_daemon_executable() {
59 a34d8cc0 Michael Hanselmann
  echo "@PREFIX@/sbin/$1"
60 a34d8cc0 Michael Hanselmann
}
61 a34d8cc0 Michael Hanselmann
62 cbccd9ca René Nussbaumer
_daemon_usergroup() {
63 cbccd9ca René Nussbaumer
  case "$1" in
64 cbccd9ca René Nussbaumer
    masterd)
65 cbccd9ca René Nussbaumer
      echo "@GNTMASTERUSER@:@GNTMASTERDGROUP@"
66 cbccd9ca René Nussbaumer
      ;;
67 cbccd9ca René Nussbaumer
    confd)
68 cbccd9ca René Nussbaumer
      echo "@GNTCONFDUSER@:@GNTCONFDGROUP@"
69 cbccd9ca René Nussbaumer
      ;;
70 cbccd9ca René Nussbaumer
    rapi)
71 cbccd9ca René Nussbaumer
      echo "@GNTRAPIUSER@:@GNTRAPIGROUP@"
72 cbccd9ca René Nussbaumer
      ;;
73 cbccd9ca René Nussbaumer
    noded)
74 cbccd9ca René Nussbaumer
      echo "@GNTNODEDUSER@:@GNTDAEMONSGROUP@"
75 cbccd9ca René Nussbaumer
      ;;
76 cbccd9ca René Nussbaumer
    *)
77 cbccd9ca René Nussbaumer
      echo "root:@GNTDAEMONSGROUP@"
78 cbccd9ca René Nussbaumer
      ;;
79 cbccd9ca René Nussbaumer
  esac
80 cbccd9ca René Nussbaumer
}
81 cbccd9ca René Nussbaumer
82 d2baa21d Michael Hanselmann
# Checks whether the local machine is part of a cluster
83 d2baa21d Michael Hanselmann
check_config() {
84 d2baa21d Michael Hanselmann
  local server_pem=@LOCALSTATEDIR@/lib/ganeti/server.pem
85 d2baa21d Michael Hanselmann
  local fname
86 d2baa21d Michael Hanselmann
87 d2baa21d Michael Hanselmann
  for fname in $server_pem; do
88 d2baa21d Michael Hanselmann
    if [[ ! -f $fname ]]; then
89 d2baa21d Michael Hanselmann
      echo "Missing configuration file $fname" >&2
90 d2baa21d Michael Hanselmann
      return 1
91 d2baa21d Michael Hanselmann
    fi
92 d2baa21d Michael Hanselmann
  done
93 d2baa21d Michael Hanselmann
94 d2baa21d Michael Hanselmann
  return 0
95 d2baa21d Michael Hanselmann
}
96 d2baa21d Michael Hanselmann
97 10c5c1c3 Michael Hanselmann
# Checks the exit code of a daemon
98 10c5c1c3 Michael Hanselmann
check_exitcode() {
99 10c5c1c3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
100 10c5c1c3 Michael Hanselmann
    echo 'Missing exit code.' >&2
101 10c5c1c3 Michael Hanselmann
    return 1
102 10c5c1c3 Michael Hanselmann
  fi
103 10c5c1c3 Michael Hanselmann
104 10c5c1c3 Michael Hanselmann
  local rc="$1"; shift
105 10c5c1c3 Michael Hanselmann
106 10c5c1c3 Michael Hanselmann
  case "$rc" in
107 10c5c1c3 Michael Hanselmann
    0) ;;
108 10c5c1c3 Michael Hanselmann
    11)
109 10c5c1c3 Michael Hanselmann
      echo "not master"
110 10c5c1c3 Michael Hanselmann
    ;;
111 10c5c1c3 Michael Hanselmann
    *)
112 10c5c1c3 Michael Hanselmann
      echo "exit code $rc"
113 10c5c1c3 Michael Hanselmann
      return 1
114 10c5c1c3 Michael Hanselmann
    ;;
115 10c5c1c3 Michael Hanselmann
  esac
116 10c5c1c3 Michael Hanselmann
117 10c5c1c3 Michael Hanselmann
  return 0
118 10c5c1c3 Michael Hanselmann
}
119 10c5c1c3 Michael Hanselmann
120 8e2ed2e8 Michael Hanselmann
# Prints path to PID file for a daemon.
121 8e2ed2e8 Michael Hanselmann
daemon_pidfile() {
122 8e2ed2e8 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
123 8e2ed2e8 Michael Hanselmann
    echo 'Missing daemon name.' >&2
124 8e2ed2e8 Michael Hanselmann
    return 1
125 8e2ed2e8 Michael Hanselmann
  fi
126 8e2ed2e8 Michael Hanselmann
127 8e2ed2e8 Michael Hanselmann
  local name="$1"; shift
128 8e2ed2e8 Michael Hanselmann
129 8e2ed2e8 Michael Hanselmann
  _daemon_pidfile $name
130 8e2ed2e8 Michael Hanselmann
}
131 8e2ed2e8 Michael Hanselmann
132 8e2ed2e8 Michael Hanselmann
# Prints path to daemon executable.
133 8e2ed2e8 Michael Hanselmann
daemon_executable() {
134 8e2ed2e8 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
135 8e2ed2e8 Michael Hanselmann
    echo 'Missing daemon name.' >&2
136 8e2ed2e8 Michael Hanselmann
    return 1
137 8e2ed2e8 Michael Hanselmann
  fi
138 8e2ed2e8 Michael Hanselmann
139 8e2ed2e8 Michael Hanselmann
  local name="$1"; shift
140 8e2ed2e8 Michael Hanselmann
141 8e2ed2e8 Michael Hanselmann
  _daemon_executable $name
142 8e2ed2e8 Michael Hanselmann
}
143 8e2ed2e8 Michael Hanselmann
144 5d8acbdd Michael Hanselmann
# Prints a list of all daemons in the order in which they should be started
145 5d8acbdd Michael Hanselmann
list_start_daemons() {
146 5d8acbdd Michael Hanselmann
  local name
147 5d8acbdd Michael Hanselmann
148 5d8acbdd Michael Hanselmann
  for name in "${DAEMONS[@]}"; do
149 5d8acbdd Michael Hanselmann
    echo "$name"
150 5d8acbdd Michael Hanselmann
  done
151 5d8acbdd Michael Hanselmann
}
152 5d8acbdd Michael Hanselmann
153 5d8acbdd Michael Hanselmann
# Prints a list of all daemons in the order in which they should be stopped
154 5d8acbdd Michael Hanselmann
list_stop_daemons() {
155 5d8acbdd Michael Hanselmann
  list_start_daemons | tac
156 5d8acbdd Michael Hanselmann
}
157 5d8acbdd Michael Hanselmann
158 5d8acbdd Michael Hanselmann
# Checks whether a daemon name is known
159 5d8acbdd Michael Hanselmann
is_daemon_name() {
160 5d8acbdd Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
161 5d8acbdd Michael Hanselmann
    echo 'Missing daemon name.' >&2
162 5d8acbdd Michael Hanselmann
    return 1
163 5d8acbdd Michael Hanselmann
  fi
164 5d8acbdd Michael Hanselmann
165 5d8acbdd Michael Hanselmann
  local name="$1"; shift
166 5d8acbdd Michael Hanselmann
167 5d8acbdd Michael Hanselmann
  for i in "${DAEMONS[@]}"; do
168 5d8acbdd Michael Hanselmann
    if [[ "$i" == "$name" ]]; then
169 5d8acbdd Michael Hanselmann
      return 0
170 5d8acbdd Michael Hanselmann
    fi
171 5d8acbdd Michael Hanselmann
  done
172 5d8acbdd Michael Hanselmann
173 5d8acbdd Michael Hanselmann
  echo "Unknown daemon name '$name'" >&2
174 5d8acbdd Michael Hanselmann
  return 1
175 5d8acbdd Michael Hanselmann
}
176 5d8acbdd Michael Hanselmann
177 f154a7a3 Michael Hanselmann
# Checks whether daemon is running
178 f154a7a3 Michael Hanselmann
check() {
179 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
180 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
181 49d43244 Michael Hanselmann
    return 1
182 f154a7a3 Michael Hanselmann
  fi
183 f154a7a3 Michael Hanselmann
184 f154a7a3 Michael Hanselmann
  local name="$1"; shift
185 4b42c3d6 Jun Futagawa
  local pidfile=$(_daemon_pidfile $name)
186 4b42c3d6 Jun Futagawa
  local daemonexec=$(_daemon_executable $name)
187 4b42c3d6 Jun Futagawa
188 4b42c3d6 Jun Futagawa
  if type -p start-stop-daemon >/dev/null; then
189 4b42c3d6 Jun Futagawa
    start-stop-daemon --stop --signal 0 --quiet \
190 4b42c3d6 Jun Futagawa
      --pidfile $pidfile
191 4b42c3d6 Jun Futagawa
  else
192 4b42c3d6 Jun Futagawa
    _ignore_error status \
193 4b42c3d6 Jun Futagawa
      -p $pidfile \
194 4b42c3d6 Jun Futagawa
      $daemonexec
195 4b42c3d6 Jun Futagawa
  fi
196 f154a7a3 Michael Hanselmann
}
197 f154a7a3 Michael Hanselmann
198 f154a7a3 Michael Hanselmann
# Starts a daemon
199 f154a7a3 Michael Hanselmann
start() {
200 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
201 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
202 49d43244 Michael Hanselmann
    return 1
203 f154a7a3 Michael Hanselmann
  fi
204 f154a7a3 Michael Hanselmann
205 f154a7a3 Michael Hanselmann
  local name="$1"; shift
206 4b42c3d6 Jun Futagawa
  local pidfile=$(_daemon_pidfile $name)
207 4b42c3d6 Jun Futagawa
  local usergroup=$(_daemon_usergroup $plain_name)
208 4b42c3d6 Jun Futagawa
  local daemonexec=$(_daemon_executable $name)
209 f154a7a3 Michael Hanselmann
210 c4e5d11e Iustin Pop
  if [[ "$name" == ganeti-confd &&
211 c4e5d11e Iustin Pop
        "@CUSTOM_ENABLE_CONFD@" == False ]]; then
212 c4e5d11e Iustin Pop
    echo 'ganeti-confd disabled at build time' >&2
213 c4e5d11e Iustin Pop
    return 1
214 c4e5d11e Iustin Pop
  fi
215 c4e5d11e Iustin Pop
216 f154a7a3 Michael Hanselmann
  # Convert daemon name to uppercase after removing "ganeti-" prefix
217 cbccd9ca René Nussbaumer
  local plain_name=${name#ganeti-}
218 cbccd9ca René Nussbaumer
  local ucname=$(tr a-z A-Z <<<$plain_name)
219 f154a7a3 Michael Hanselmann
220 f154a7a3 Michael Hanselmann
  # Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
221 03956d39 Michael Hanselmann
  eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
222 f154a7a3 Michael Hanselmann
223 46a8da3b René Nussbaumer
  @PKGLIBDIR@/ensure-dirs
224 46a8da3b René Nussbaumer
225 4b42c3d6 Jun Futagawa
  if type -p start-stop-daemon >/dev/null; then
226 4b42c3d6 Jun Futagawa
    start-stop-daemon --start --quiet --oknodo \
227 4b42c3d6 Jun Futagawa
      --pidfile $pidfile \
228 4b42c3d6 Jun Futagawa
      --startas $daemonexec \
229 4b42c3d6 Jun Futagawa
      --chuid $usergroup \
230 4b42c3d6 Jun Futagawa
      -- $args "$@"
231 4b42c3d6 Jun Futagawa
  else
232 4b42c3d6 Jun Futagawa
    # TODO: Find a way to start daemon with a group, until then the group must
233 4b42c3d6 Jun Futagawa
    # be removed
234 4b42c3d6 Jun Futagawa
    _ignore_error daemon \
235 4b42c3d6 Jun Futagawa
      --pidfile $pidfile \
236 4b42c3d6 Jun Futagawa
      --user ${usergroup%:*} \
237 4b42c3d6 Jun Futagawa
      $daemonexec $args "$@"
238 4b42c3d6 Jun Futagawa
  fi
239 f154a7a3 Michael Hanselmann
}
240 f154a7a3 Michael Hanselmann
241 f154a7a3 Michael Hanselmann
# Stops a daemon
242 f154a7a3 Michael Hanselmann
stop() {
243 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
244 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
245 49d43244 Michael Hanselmann
    return 1
246 f154a7a3 Michael Hanselmann
  fi
247 f154a7a3 Michael Hanselmann
248 f154a7a3 Michael Hanselmann
  local name="$1"; shift
249 4b42c3d6 Jun Futagawa
  local pidfile=$(_daemon_pidfile $name)
250 f154a7a3 Michael Hanselmann
251 4b42c3d6 Jun Futagawa
  if type -p start-stop-daemon >/dev/null; then
252 4b42c3d6 Jun Futagawa
    start-stop-daemon --stop --quiet --oknodo --retry 30 \
253 4b42c3d6 Jun Futagawa
      --pidfile $pidfile
254 4b42c3d6 Jun Futagawa
  else
255 4b42c3d6 Jun Futagawa
    _ignore_error killproc -p $pidfile $name
256 4b42c3d6 Jun Futagawa
  fi
257 f154a7a3 Michael Hanselmann
}
258 f154a7a3 Michael Hanselmann
259 f154a7a3 Michael Hanselmann
# Starts a daemon if it's not yet running
260 f154a7a3 Michael Hanselmann
check_and_start() {
261 f154a7a3 Michael Hanselmann
  local name="$1"
262 f154a7a3 Michael Hanselmann
263 f154a7a3 Michael Hanselmann
  if ! check $name; then
264 f154a7a3 Michael Hanselmann
    start $name
265 f154a7a3 Michael Hanselmann
  fi
266 f154a7a3 Michael Hanselmann
}
267 f154a7a3 Michael Hanselmann
268 f154a7a3 Michael Hanselmann
# Starts the master role
269 f154a7a3 Michael Hanselmann
start_master() {
270 f154a7a3 Michael Hanselmann
  start ganeti-masterd
271 f154a7a3 Michael Hanselmann
  start ganeti-rapi
272 f154a7a3 Michael Hanselmann
}
273 f154a7a3 Michael Hanselmann
274 f154a7a3 Michael Hanselmann
# Stops the master role
275 f154a7a3 Michael Hanselmann
stop_master() {
276 f154a7a3 Michael Hanselmann
  stop ganeti-rapi
277 f154a7a3 Michael Hanselmann
  stop ganeti-masterd
278 f154a7a3 Michael Hanselmann
}
279 f154a7a3 Michael Hanselmann
280 2250afb3 Michael Hanselmann
# Start all daemons
281 2250afb3 Michael Hanselmann
start_all() {
282 2250afb3 Michael Hanselmann
  for i in $(list_start_daemons); do
283 2250afb3 Michael Hanselmann
    local rc=0
284 2250afb3 Michael Hanselmann
285 2250afb3 Michael Hanselmann
    # Try to start daemon
286 2250afb3 Michael Hanselmann
    start $i || rc=$?
287 2250afb3 Michael Hanselmann
288 2250afb3 Michael Hanselmann
    if ! errmsg=$(check_exitcode $rc); then
289 2250afb3 Michael Hanselmann
      echo "$errmsg" >&2
290 2250afb3 Michael Hanselmann
      return 1
291 2250afb3 Michael Hanselmann
    fi
292 2250afb3 Michael Hanselmann
  done
293 2250afb3 Michael Hanselmann
294 2250afb3 Michael Hanselmann
  return 0
295 2250afb3 Michael Hanselmann
}
296 2250afb3 Michael Hanselmann
297 2250afb3 Michael Hanselmann
# Stop all daemons
298 2250afb3 Michael Hanselmann
stop_all() {
299 2250afb3 Michael Hanselmann
  for i in $(list_stop_daemons); do
300 2250afb3 Michael Hanselmann
    stop $i
301 2250afb3 Michael Hanselmann
  done
302 2250afb3 Michael Hanselmann
}
303 2250afb3 Michael Hanselmann
304 7e1fac25 Michael Hanselmann
# Reloads the SSH keys
305 7e1fac25 Michael Hanselmann
reload_ssh_keys() {
306 7e1fac25 Michael Hanselmann
  @RPL_SSH_INITD_SCRIPT@ restart
307 7e1fac25 Michael Hanselmann
}
308 7e1fac25 Michael Hanselmann
309 4b42c3d6 Jun Futagawa
# Read @SYSCONFDIR@/rc.d/init.d/functions if start-stop-daemon not available
310 4b42c3d6 Jun Futagawa
if ! type -p start-stop-daemon >/dev/null && \
311 4b42c3d6 Jun Futagawa
   [[ -f @SYSCONFDIR@/rc.d/init.d/functions ]]; then
312 4b42c3d6 Jun Futagawa
  _ignore_error . @SYSCONFDIR@/rc.d/init.d/functions
313 4b42c3d6 Jun Futagawa
fi
314 4b42c3d6 Jun Futagawa
315 f154a7a3 Michael Hanselmann
if [[ "$#" -lt 1 ]]; then
316 f154a7a3 Michael Hanselmann
  echo "Usage: $0 <action>" >&2
317 f154a7a3 Michael Hanselmann
  exit 1
318 f154a7a3 Michael Hanselmann
fi
319 f154a7a3 Michael Hanselmann
320 f154a7a3 Michael Hanselmann
orig_action=$1; shift
321 f154a7a3 Michael Hanselmann
322 7289c16e Michael Hanselmann
if [[ "$orig_action" == *_* ]]; then
323 7289c16e Michael Hanselmann
  echo "Command must not contain underscores" >&2
324 7289c16e Michael Hanselmann
  exit 1
325 7289c16e Michael Hanselmann
fi
326 7289c16e Michael Hanselmann
327 f154a7a3 Michael Hanselmann
# Replace all dashes (-) with underlines (_)
328 f154a7a3 Michael Hanselmann
action=${orig_action//-/_}
329 f154a7a3 Michael Hanselmann
330 f154a7a3 Michael Hanselmann
# Is it a known function?
331 f154a7a3 Michael Hanselmann
if ! declare -F "$action" >/dev/null 2>&1; then
332 f154a7a3 Michael Hanselmann
  echo "Unknown command: $orig_action" >&2
333 f154a7a3 Michael Hanselmann
  exit 1
334 f154a7a3 Michael Hanselmann
fi
335 f154a7a3 Michael Hanselmann
336 f154a7a3 Michael Hanselmann
# Call handler function
337 f154a7a3 Michael Hanselmann
$action "$@"