Statistics
| Branch: | Tag: | Revision:

root / daemons / daemon-util.in @ 8e2ed2e8

History | View | Annotate | Download (5.4 kB)

1 f154a7a3 Michael Hanselmann
#!/bin/bash
2 f154a7a3 Michael Hanselmann
#
3 f154a7a3 Michael Hanselmann
4 8e2ed2e8 Michael Hanselmann
# Copyright (C) 2009, 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
  ganeti-confd
33 5d8acbdd Michael Hanselmann
  )
34 5d8acbdd Michael Hanselmann
35 f154a7a3 Michael Hanselmann
NODED_ARGS=
36 f154a7a3 Michael Hanselmann
MASTERD_ARGS=
37 f154a7a3 Michael Hanselmann
CONFD_ARGS=
38 f154a7a3 Michael Hanselmann
RAPI_ARGS=
39 f154a7a3 Michael Hanselmann
40 f154a7a3 Michael Hanselmann
# Read defaults file if it exists
41 f154a7a3 Michael Hanselmann
if [[ -s $defaults_file ]]; then
42 f154a7a3 Michael Hanselmann
  . $defaults_file
43 f154a7a3 Michael Hanselmann
fi
44 f154a7a3 Michael Hanselmann
45 f154a7a3 Michael Hanselmann
_daemon_pidfile() {
46 f154a7a3 Michael Hanselmann
  echo "@LOCALSTATEDIR@/run/ganeti/$1.pid"
47 f154a7a3 Michael Hanselmann
}
48 f154a7a3 Michael Hanselmann
49 a34d8cc0 Michael Hanselmann
_daemon_executable() {
50 a34d8cc0 Michael Hanselmann
  echo "@PREFIX@/sbin/$1"
51 a34d8cc0 Michael Hanselmann
}
52 a34d8cc0 Michael Hanselmann
53 cbccd9ca René Nussbaumer
_daemon_usergroup() {
54 cbccd9ca René Nussbaumer
  case "$1" in
55 cbccd9ca René Nussbaumer
    masterd)
56 cbccd9ca René Nussbaumer
      echo "@GNTMASTERUSER@:@GNTMASTERDGROUP@"
57 cbccd9ca René Nussbaumer
      ;;
58 cbccd9ca René Nussbaumer
    confd)
59 cbccd9ca René Nussbaumer
      echo "@GNTCONFDUSER@:@GNTCONFDGROUP@"
60 cbccd9ca René Nussbaumer
      ;;
61 cbccd9ca René Nussbaumer
    rapi)
62 cbccd9ca René Nussbaumer
      echo "@GNTRAPIUSER@:@GNTRAPIGROUP@"
63 cbccd9ca René Nussbaumer
      ;;
64 cbccd9ca René Nussbaumer
    noded)
65 cbccd9ca René Nussbaumer
      echo "@GNTNODEDUSER@:@GNTDAEMONSGROUP@"
66 cbccd9ca René Nussbaumer
      ;;
67 cbccd9ca René Nussbaumer
    *)
68 cbccd9ca René Nussbaumer
      echo "root:@GNTDAEMONSGROUP@"
69 cbccd9ca René Nussbaumer
      ;;
70 cbccd9ca René Nussbaumer
  esac
71 cbccd9ca René Nussbaumer
}
72 cbccd9ca René Nussbaumer
73 d2baa21d Michael Hanselmann
# Checks whether the local machine is part of a cluster
74 d2baa21d Michael Hanselmann
check_config() {
75 d2baa21d Michael Hanselmann
  local server_pem=@LOCALSTATEDIR@/lib/ganeti/server.pem
76 d2baa21d Michael Hanselmann
  local fname
77 d2baa21d Michael Hanselmann
78 d2baa21d Michael Hanselmann
  for fname in $server_pem; do
79 d2baa21d Michael Hanselmann
    if [[ ! -f $fname ]]; then
80 d2baa21d Michael Hanselmann
      echo "Missing configuration file $fname" >&2
81 d2baa21d Michael Hanselmann
      return 1
82 d2baa21d Michael Hanselmann
    fi
83 d2baa21d Michael Hanselmann
  done
84 d2baa21d Michael Hanselmann
85 d2baa21d Michael Hanselmann
  return 0
86 d2baa21d Michael Hanselmann
}
87 d2baa21d Michael Hanselmann
88 10c5c1c3 Michael Hanselmann
# Checks the exit code of a daemon
89 10c5c1c3 Michael Hanselmann
check_exitcode() {
90 10c5c1c3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
91 10c5c1c3 Michael Hanselmann
    echo 'Missing exit code.' >&2
92 10c5c1c3 Michael Hanselmann
    return 1
93 10c5c1c3 Michael Hanselmann
  fi
94 10c5c1c3 Michael Hanselmann
95 10c5c1c3 Michael Hanselmann
  local rc="$1"; shift
96 10c5c1c3 Michael Hanselmann
97 10c5c1c3 Michael Hanselmann
  case "$rc" in
98 10c5c1c3 Michael Hanselmann
    0) ;;
99 10c5c1c3 Michael Hanselmann
    11)
100 10c5c1c3 Michael Hanselmann
      echo "not master"
101 10c5c1c3 Michael Hanselmann
    ;;
102 10c5c1c3 Michael Hanselmann
    *)
103 10c5c1c3 Michael Hanselmann
      echo "exit code $rc"
104 10c5c1c3 Michael Hanselmann
      return 1
105 10c5c1c3 Michael Hanselmann
    ;;
106 10c5c1c3 Michael Hanselmann
  esac
107 10c5c1c3 Michael Hanselmann
108 10c5c1c3 Michael Hanselmann
  return 0
109 10c5c1c3 Michael Hanselmann
}
110 10c5c1c3 Michael Hanselmann
111 8e2ed2e8 Michael Hanselmann
# Prints path to PID file for a daemon.
112 8e2ed2e8 Michael Hanselmann
daemon_pidfile() {
113 8e2ed2e8 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
114 8e2ed2e8 Michael Hanselmann
    echo 'Missing daemon name.' >&2
115 8e2ed2e8 Michael Hanselmann
    return 1
116 8e2ed2e8 Michael Hanselmann
  fi
117 8e2ed2e8 Michael Hanselmann
118 8e2ed2e8 Michael Hanselmann
  local name="$1"; shift
119 8e2ed2e8 Michael Hanselmann
120 8e2ed2e8 Michael Hanselmann
  _daemon_pidfile $name
121 8e2ed2e8 Michael Hanselmann
}
122 8e2ed2e8 Michael Hanselmann
123 8e2ed2e8 Michael Hanselmann
# Prints path to daemon executable.
124 8e2ed2e8 Michael Hanselmann
daemon_executable() {
125 8e2ed2e8 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
126 8e2ed2e8 Michael Hanselmann
    echo 'Missing daemon name.' >&2
127 8e2ed2e8 Michael Hanselmann
    return 1
128 8e2ed2e8 Michael Hanselmann
  fi
129 8e2ed2e8 Michael Hanselmann
130 8e2ed2e8 Michael Hanselmann
  local name="$1"; shift
131 8e2ed2e8 Michael Hanselmann
132 8e2ed2e8 Michael Hanselmann
  _daemon_executable $name
133 8e2ed2e8 Michael Hanselmann
}
134 8e2ed2e8 Michael Hanselmann
135 5d8acbdd Michael Hanselmann
# Prints a list of all daemons in the order in which they should be started
136 5d8acbdd Michael Hanselmann
list_start_daemons() {
137 5d8acbdd Michael Hanselmann
  local name
138 5d8acbdd Michael Hanselmann
139 5d8acbdd Michael Hanselmann
  for name in "${DAEMONS[@]}"; do
140 5d8acbdd Michael Hanselmann
    echo "$name"
141 5d8acbdd Michael Hanselmann
  done
142 5d8acbdd Michael Hanselmann
}
143 5d8acbdd Michael Hanselmann
144 5d8acbdd Michael Hanselmann
# Prints a list of all daemons in the order in which they should be stopped
145 5d8acbdd Michael Hanselmann
list_stop_daemons() {
146 5d8acbdd Michael Hanselmann
  list_start_daemons | tac
147 5d8acbdd Michael Hanselmann
}
148 5d8acbdd Michael Hanselmann
149 5d8acbdd Michael Hanselmann
# Checks whether a daemon name is known
150 5d8acbdd Michael Hanselmann
is_daemon_name() {
151 5d8acbdd Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
152 5d8acbdd Michael Hanselmann
    echo 'Missing daemon name.' >&2
153 5d8acbdd Michael Hanselmann
    return 1
154 5d8acbdd Michael Hanselmann
  fi
155 5d8acbdd Michael Hanselmann
156 5d8acbdd Michael Hanselmann
  local name="$1"; shift
157 5d8acbdd Michael Hanselmann
158 5d8acbdd Michael Hanselmann
  for i in "${DAEMONS[@]}"; do
159 5d8acbdd Michael Hanselmann
    if [[ "$i" == "$name" ]]; then
160 5d8acbdd Michael Hanselmann
      return 0
161 5d8acbdd Michael Hanselmann
    fi
162 5d8acbdd Michael Hanselmann
  done
163 5d8acbdd Michael Hanselmann
164 5d8acbdd Michael Hanselmann
  echo "Unknown daemon name '$name'" >&2
165 5d8acbdd Michael Hanselmann
  return 1
166 5d8acbdd Michael Hanselmann
}
167 5d8acbdd Michael Hanselmann
168 f154a7a3 Michael Hanselmann
# Checks whether daemon is running
169 f154a7a3 Michael Hanselmann
check() {
170 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
171 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
172 49d43244 Michael Hanselmann
    return 1
173 f154a7a3 Michael Hanselmann
  fi
174 f154a7a3 Michael Hanselmann
175 f154a7a3 Michael Hanselmann
  local name="$1"; shift
176 f154a7a3 Michael Hanselmann
177 f154a7a3 Michael Hanselmann
  start-stop-daemon --stop --signal 0 --quiet \
178 f154a7a3 Michael Hanselmann
    --pidfile $(_daemon_pidfile $name)
179 f154a7a3 Michael Hanselmann
}
180 f154a7a3 Michael Hanselmann
181 f154a7a3 Michael Hanselmann
# Starts a daemon
182 f154a7a3 Michael Hanselmann
start() {
183 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
184 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
185 49d43244 Michael Hanselmann
    return 1
186 f154a7a3 Michael Hanselmann
  fi
187 f154a7a3 Michael Hanselmann
188 f154a7a3 Michael Hanselmann
  local name="$1"; shift
189 f154a7a3 Michael Hanselmann
190 f154a7a3 Michael Hanselmann
  # Convert daemon name to uppercase after removing "ganeti-" prefix
191 cbccd9ca René Nussbaumer
  local plain_name=${name#ganeti-}
192 cbccd9ca René Nussbaumer
  local ucname=$(tr a-z A-Z <<<$plain_name)
193 f154a7a3 Michael Hanselmann
194 f154a7a3 Michael Hanselmann
  # Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
195 03956d39 Michael Hanselmann
  eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
196 f154a7a3 Michael Hanselmann
197 46a8da3b René Nussbaumer
  @PKGLIBDIR@/ensure-dirs
198 46a8da3b René Nussbaumer
199 f154a7a3 Michael Hanselmann
  start-stop-daemon --start --quiet --oknodo \
200 f154a7a3 Michael Hanselmann
    --pidfile $(_daemon_pidfile $name) \
201 a34d8cc0 Michael Hanselmann
    --startas $(_daemon_executable $name) \
202 cbccd9ca René Nussbaumer
    --chuid $(_daemon_usergroup $plain_name) \
203 f154a7a3 Michael Hanselmann
    -- $args "$@"
204 f154a7a3 Michael Hanselmann
}
205 f154a7a3 Michael Hanselmann
206 f154a7a3 Michael Hanselmann
# Stops a daemon
207 f154a7a3 Michael Hanselmann
stop() {
208 f154a7a3 Michael Hanselmann
  if [[ "$#" -lt 1 ]]; then
209 f154a7a3 Michael Hanselmann
    echo 'Missing daemon name.' >&2
210 49d43244 Michael Hanselmann
    return 1
211 f154a7a3 Michael Hanselmann
  fi
212 f154a7a3 Michael Hanselmann
213 f154a7a3 Michael Hanselmann
  local name="$1"; shift
214 f154a7a3 Michael Hanselmann
215 f154a7a3 Michael Hanselmann
  start-stop-daemon --stop --quiet --oknodo --retry 30 \
216 f154a7a3 Michael Hanselmann
    --pidfile $(_daemon_pidfile $name)
217 f154a7a3 Michael Hanselmann
}
218 f154a7a3 Michael Hanselmann
219 f154a7a3 Michael Hanselmann
# Starts a daemon if it's not yet running
220 f154a7a3 Michael Hanselmann
check_and_start() {
221 f154a7a3 Michael Hanselmann
  local name="$1"
222 f154a7a3 Michael Hanselmann
223 f154a7a3 Michael Hanselmann
  if ! check $name; then
224 f154a7a3 Michael Hanselmann
    start $name
225 f154a7a3 Michael Hanselmann
  fi
226 f154a7a3 Michael Hanselmann
}
227 f154a7a3 Michael Hanselmann
228 f154a7a3 Michael Hanselmann
# Starts the master role
229 f154a7a3 Michael Hanselmann
start_master() {
230 f154a7a3 Michael Hanselmann
  start ganeti-masterd
231 f154a7a3 Michael Hanselmann
  start ganeti-rapi
232 f154a7a3 Michael Hanselmann
}
233 f154a7a3 Michael Hanselmann
234 f154a7a3 Michael Hanselmann
# Stops the master role
235 f154a7a3 Michael Hanselmann
stop_master() {
236 f154a7a3 Michael Hanselmann
  stop ganeti-rapi
237 f154a7a3 Michael Hanselmann
  stop ganeti-masterd
238 f154a7a3 Michael Hanselmann
}
239 f154a7a3 Michael Hanselmann
240 2250afb3 Michael Hanselmann
# Start all daemons
241 2250afb3 Michael Hanselmann
start_all() {
242 2250afb3 Michael Hanselmann
  for i in $(list_start_daemons); do
243 2250afb3 Michael Hanselmann
    local rc=0
244 2250afb3 Michael Hanselmann
245 2250afb3 Michael Hanselmann
    # Try to start daemon
246 2250afb3 Michael Hanselmann
    start $i || rc=$?
247 2250afb3 Michael Hanselmann
248 2250afb3 Michael Hanselmann
    if ! errmsg=$(check_exitcode $rc); then
249 2250afb3 Michael Hanselmann
      echo "$errmsg" >&2
250 2250afb3 Michael Hanselmann
      return 1
251 2250afb3 Michael Hanselmann
    fi
252 2250afb3 Michael Hanselmann
  done
253 2250afb3 Michael Hanselmann
254 2250afb3 Michael Hanselmann
  return 0
255 2250afb3 Michael Hanselmann
}
256 2250afb3 Michael Hanselmann
257 2250afb3 Michael Hanselmann
# Stop all daemons
258 2250afb3 Michael Hanselmann
stop_all() {
259 2250afb3 Michael Hanselmann
  for i in $(list_stop_daemons); do
260 2250afb3 Michael Hanselmann
    stop $i
261 2250afb3 Michael Hanselmann
  done
262 2250afb3 Michael Hanselmann
}
263 2250afb3 Michael Hanselmann
264 7e1fac25 Michael Hanselmann
# Reloads the SSH keys
265 7e1fac25 Michael Hanselmann
reload_ssh_keys() {
266 7e1fac25 Michael Hanselmann
  @RPL_SSH_INITD_SCRIPT@ restart
267 7e1fac25 Michael Hanselmann
}
268 7e1fac25 Michael Hanselmann
269 f154a7a3 Michael Hanselmann
if [[ "$#" -lt 1 ]]; then
270 f154a7a3 Michael Hanselmann
  echo "Usage: $0 <action>" >&2
271 f154a7a3 Michael Hanselmann
  exit 1
272 f154a7a3 Michael Hanselmann
fi
273 f154a7a3 Michael Hanselmann
274 f154a7a3 Michael Hanselmann
orig_action=$1; shift
275 f154a7a3 Michael Hanselmann
276 7289c16e Michael Hanselmann
if [[ "$orig_action" == *_* ]]; then
277 7289c16e Michael Hanselmann
  echo "Command must not contain underscores" >&2
278 7289c16e Michael Hanselmann
  exit 1
279 7289c16e Michael Hanselmann
fi
280 7289c16e Michael Hanselmann
281 f154a7a3 Michael Hanselmann
# Replace all dashes (-) with underlines (_)
282 f154a7a3 Michael Hanselmann
action=${orig_action//-/_}
283 f154a7a3 Michael Hanselmann
284 f154a7a3 Michael Hanselmann
# Is it a known function?
285 f154a7a3 Michael Hanselmann
if ! declare -F "$action" >/dev/null 2>&1; then
286 f154a7a3 Michael Hanselmann
  echo "Unknown command: $orig_action" >&2
287 f154a7a3 Michael Hanselmann
  exit 1
288 f154a7a3 Michael Hanselmann
fi
289 f154a7a3 Michael Hanselmann
290 f154a7a3 Michael Hanselmann
# Call handler function
291 f154a7a3 Michael Hanselmann
$action "$@"