Statistics
| Branch: | Tag: | Revision:

root / daemons / daemon-util.in @ 2250afb3

History | View | Annotate | Download (4.5 kB)

1
#!/bin/bash
2
#
3

    
4
# Copyright (C) 2009 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21
set -e
22

    
23
defaults_file=@SYSCONFDIR@/default/ganeti
24

    
25
# This is a list of all daemons and the order in which they're started. The
26
# order is important as there are dependencies between them. On shutdown,
27
# they're stopped in reverse order.
28
DAEMONS=(
29
  ganeti-noded
30
  ganeti-masterd
31
  ganeti-rapi
32
  ganeti-confd
33
  )
34

    
35
NODED_ARGS=
36
MASTERD_ARGS=
37
CONFD_ARGS=
38
RAPI_ARGS=
39

    
40
# Read defaults file if it exists
41
if [[ -s $defaults_file ]]; then
42
  . $defaults_file
43
fi
44

    
45
_daemon_pidfile() {
46
  echo "@LOCALSTATEDIR@/run/ganeti/$1.pid"
47
}
48

    
49
# Checks whether the local machine is part of a cluster
50
check_config() {
51
  local server_pem=@LOCALSTATEDIR@/lib/ganeti/server.pem
52
  local fname
53

    
54
  for fname in $server_pem; do
55
    if [[ ! -f $fname ]]; then
56
      echo "Missing configuration file $fname" >&2
57
      return 1
58
    fi
59
  done
60

    
61
  return 0
62
}
63

    
64
# Checks the exit code of a daemon
65
check_exitcode() {
66
  if [[ "$#" -lt 1 ]]; then
67
    echo 'Missing exit code.' >&2
68
    return 1
69
  fi
70

    
71
  local rc="$1"; shift
72

    
73
  case "$rc" in
74
    0) ;;
75
    11)
76
      echo "not master"
77
    ;;
78
    *)
79
      echo "exit code $rc"
80
      return 1
81
    ;;
82
  esac
83

    
84
  return 0
85
}
86

    
87
# Prints a list of all daemons in the order in which they should be started
88
list_start_daemons() {
89
  local name
90

    
91
  for name in "${DAEMONS[@]}"; do
92
    echo "$name"
93
  done
94
}
95

    
96
# Prints a list of all daemons in the order in which they should be stopped
97
list_stop_daemons() {
98
  list_start_daemons | tac
99
}
100

    
101
# Checks whether a daemon name is known
102
is_daemon_name() {
103
  if [[ "$#" -lt 1 ]]; then
104
    echo 'Missing daemon name.' >&2
105
    return 1
106
  fi
107

    
108
  local name="$1"; shift
109

    
110
  for i in "${DAEMONS[@]}"; do
111
    if [[ "$i" == "$name" ]]; then
112
      return 0
113
    fi
114
  done
115

    
116
  echo "Unknown daemon name '$name'" >&2
117
  return 1
118
}
119

    
120
# Checks whether daemon is running
121
check() {
122
  if [[ "$#" -lt 1 ]]; then
123
    echo 'Missing daemon name.' >&2
124
    exit 1
125
  fi
126

    
127
  local name="$1"; shift
128

    
129
  start-stop-daemon --stop --signal 0 --quiet \
130
    --pidfile $(_daemon_pidfile $name)
131
}
132

    
133
# Starts a daemon
134
start() {
135
  if [[ "$#" -lt 1 ]]; then
136
    echo 'Missing daemon name.' >&2
137
    exit 1
138
  fi
139

    
140
  local name="$1"; shift
141

    
142
  # Convert daemon name to uppercase after removing "ganeti-" prefix
143
  local ucname=$(echo ${name#ganeti-} | tr a-z A-Z)
144

    
145
  # Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
146
  eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
147

    
148
  start-stop-daemon --start --quiet --oknodo \
149
    --pidfile $(_daemon_pidfile $name) \
150
    --startas "@PREFIX@/sbin/$name" \
151
    -- $args "$@"
152
}
153

    
154
# Stops a daemon
155
stop() {
156
  if [[ "$#" -lt 1 ]]; then
157
    echo 'Missing daemon name.' >&2
158
    exit 1
159
  fi
160

    
161
  local name="$1"; shift
162

    
163
  start-stop-daemon --stop --quiet --oknodo --retry 30 \
164
    --pidfile $(_daemon_pidfile $name)
165
}
166

    
167
# Starts a daemon if it's not yet running
168
check_and_start() {
169
  local name="$1"
170

    
171
  if ! check $name; then
172
    start $name
173
  fi
174
}
175

    
176
# Starts the master role
177
start_master() {
178
  start ganeti-masterd
179
  start ganeti-rapi
180
}
181

    
182
# Stops the master role
183
stop_master() {
184
  stop ganeti-rapi
185
  stop ganeti-masterd
186
}
187

    
188
# Start all daemons
189
start_all() {
190
  for i in $(list_start_daemons); do
191
    local rc=0
192

    
193
    # Try to start daemon
194
    start $i || rc=$?
195

    
196
    if ! errmsg=$(check_exitcode $rc); then
197
      echo "$errmsg" >&2
198
      return 1
199
    fi
200
  done
201

    
202
  return 0
203
}
204

    
205
# Stop all daemons
206
stop_all() {
207
  for i in $(list_stop_daemons); do
208
    stop $i
209
  done
210
}
211

    
212
# Reloads the SSH keys
213
reload_ssh_keys() {
214
  @RPL_SSH_INITD_SCRIPT@ restart
215
}
216

    
217
if [[ "$#" -lt 1 ]]; then
218
  echo "Usage: $0 <action>" >&2
219
  exit 1
220
fi
221

    
222
orig_action=$1; shift
223

    
224
if [[ "$orig_action" == *_* ]]; then
225
  echo "Command must not contain underscores" >&2
226
  exit 1
227
fi
228

    
229
# Replace all dashes (-) with underlines (_)
230
action=${orig_action//-/_}
231

    
232
# Is it a known function?
233
if ! declare -F "$action" >/dev/null 2>&1; then
234
  echo "Unknown command: $orig_action" >&2
235
  exit 1
236
fi
237

    
238
# Call handler function
239
$action "$@"