]> git.pld-linux.org Git - packages/xen.git/blame - xendomains.init
- rel 2
[packages/xen.git] / xendomains.init
CommitLineData
e9dbc551 1#!/bin/bash
2e8b91a6 2#
e9dbc551 3# xendomains Start / stop domains automatically when domain 0 boots / shuts down.
2e8b91a6 4#
e9dbc551
JR
5# chkconfig: 345 99 00
6# description: Start / stop Xen domains.
2e8b91a6 7#
2e8b91a6
JR
8
9. /etc/rc.d/init.d/functions
10
e9dbc551
JR
11if ! [ -e /proc/xen/privcmd ]; then
12 exit 0
13fi
2e8b91a6 14
e9dbc551
JR
15TOOLSTACK=$(/usr/lib/xen/bin/xen-toolstack toolstack 2>/dev/null)
16if [ $? -ne 0 ]; then
17 echo "No usable Xen toolstack selected"
18 exit 0
19fi
20if [ "$(basename "$TOOLSTACK")" != xl ] && [ "$(basename "$TOOLSTACK")" != xm ]; then
21 exit 0
22fi
2e8b91a6 23
e9dbc551
JR
24if ! /usr/lib/xen/bin/xen-toolstack list >/dev/null 2>&1 ; then
25 exit 0;
2e8b91a6
JR
26fi
27
e9dbc551
JR
28[ -r /etc/sysconfig/xendomains ] && . /etc/sysconfig/xendomains
29
30shopt -s nullglob
31
32check_config_name()
33{
34 /usr/lib/xen/bin/xen-toolstack create --quiet --dryrun --defconfig "$1" | sed -n 's/^.*\("name":"\([^"]*\)",.*\)\|(name \(.*\))$/\2\3/p'
2e8b91a6
JR
35}
36
e9dbc551
JR
37check_running()
38{
39 /usr/lib/xen/bin/xen-toolstack domid "$1" >/dev/null 2>&1
40 return $?
2e8b91a6
JR
41}
42
e9dbc551
JR
43timeout_coproc()
44{
45 local TIMEOUT=$1
46 shift
47
48 coproc "$@" >/dev/null 2>&1
49
50 local COPROC_OUT
51 exec {COPROC_OUT}<&"${COPROC[0]}"
52 local PID="$COPROC_PID"
53
54 for no in $(seq 0 $TIMEOUT); do
55 if [ -z "$COPROC_PID" ]; then break; fi
56 sleep 1
57 done
58
59 kill -INT "$COPROC_PID" >/dev/null 2>&1
60 wait $PID
61 local rc=$?
62 if [ $rc -eq 0 ]; then
63 ok
2e8b91a6 64 else
e9dbc551 65 fail
2e8b91a6 66 fi
e9dbc551
JR
67
68 [ $rc -gt 0 ] && cat <&$COPROC_OUT
69 exec <&$COPROC_OUT-
2e8b91a6
JR
70}
71
e9dbc551
JR
72timeout_domain()
73{
74 name="$1"
75 TIMEOUT="$2"
76 for no in $(seq 0 $TIMEOUT); do
77 if ! check_running "$name"; then return 0; fi
78 sleep 1
79 done
80 return 1
2e8b91a6
JR
81}
82
e9dbc551
JR
83do_start_restore()
84{
85 [ -n "$XENDOMAINS_SAVE" ] || return
86 [ -d "$XENDOMAINS_SAVE" ] || return
87 [ -n "$XENDOMAINS_RESTORE" ] || return
88
89 for file in $XENDOMAINS_SAVE/*; do
90 if [ -f $file ] ; then
91 name="${file##*/}"
92 show "Restoring Xen domain $name (from $file)"
93 busy
94
95 out=$(/usr/lib/xen/bin/xen-toolstack restore "$file" >/dev/null 2>&1)
96 case "$?" in
97 0)
98 rm "$file"
99 domains[$name]='started'
100 ok
101 ;;
102 *)
103 domains[$name]='failed'
104 fail
105 echo "$out"
106 ;;
107 esac
108 fi
109 done
2e8b91a6
JR
110}
111
e9dbc551
JR
112do_start_auto()
113{
114 [ -n "$XENDOMAINS_AUTO" ] || return
115 [ -d "$XENDOMAINS_AUTO" ] || return
2e8b91a6 116
e9dbc551
JR
117 for file in $XENDOMAINS_AUTO/*; do
118 name="$(check_config_name $file)"
119
120 if [ "${domains[$name]}" = started ]; then
121 :
122 elif check_running "$name"; then
123 echo "Xen domain $name already running"
2e8b91a6 124 else
e9dbc551
JR
125 show "Starting Xen domain $name (from $file)"
126 busy
127
128 if [ "${domains[$name]}" = failed ]; then
129 fail
130 else
131 out=$(/usr/lib/xen/bin/xen-toolstack create --quiet --defconfig "$file" >/dev/null 2>&1)
132 case "$?" in
133 0)
134 ok
135 ;;
136 *)
137 fail
138 echo "$out"
139 ;;
140 esac
141 fi
2e8b91a6 142 fi
2e8b91a6 143 done
2e8b91a6
JR
144}
145
e9dbc551
JR
146do_start()
147{
148 declare -A domains
149
150 if [ -f /var/lock/subsys/xendomains ]; then
151 msg_already_running "xendomains"
152 return
2e8b91a6 153 fi
2e8b91a6 154
e9dbc551
JR
155 do_start_restore
156 do_start_auto
157
158 touch /var/lock/subsys/xendomains
2e8b91a6
JR
159}
160
e9dbc551
JR
161do_stop_migrate()
162{
163 [ -n "$XENDOMAINS_MIGRATE" ] || return
2e8b91a6 164
e9dbc551
JR
165 while read id name rest; do
166 show "Migrating Xen domain $name ($id)"
167 busy
168 (timeout_coproc "$XENDOMAINS_STOP_MAXWAIT" /usr/lib/xen/bin/xen-toolstack migrate $id $XENDOMAINS_MIGRATE)
169 done < <(/usr/lib/xen/bin/xen-init-list)
2e8b91a6
JR
170}
171
e9dbc551 172do_stop_save()
2e8b91a6 173{
e9dbc551
JR
174 [ -n "$XENDOMAINS_SAVE" ] || return
175 [ -d "$XENDOMAINS_SAVE" ] || mkdir -m 0700 -p "$XENDOMAINS_SAVE"
176
177 while read id name rest; do
178 show "Saving Xen domain $name ($id)"
179 busy
180 (timeout_coproc "$XENDOMAINS_STOP_MAXWAIT" /usr/lib/xen/bin/xen-toolstack save $id $XENDOMAINS_SAVE/$name)
181 done < <(/usr/lib/xen/bin/xen-init-list)
2e8b91a6
JR
182}
183
e9dbc551 184do_stop_shutdown()
2e8b91a6 185{
e9dbc551
JR
186 while read id name rest; do
187 show "Shutting down Xen domain $name ($id)"
188 busy
189 /usr/lib/xen/bin/xen-toolstack shutdown $id >/dev/null 2>&1
190 if [ $? -eq 0 ]; then
191 ok
192 else
193 fail
194 fi
195 done < <(/usr/lib/xen/bin/xen-init-list)
196 while read id name rest; do
197 show "Waiting for Xen domain $name ($id) to shut down"
198 busy
199 timeout_domain "$name" "$XENDOMAINS_STOP_MAXWAIT"
200 if [ $? -eq 0 ]; then
201 ok
202 else
203 fail
204 fi
205 done < <(/usr/lib/xen/bin/xen-init-list)
2e8b91a6
JR
206}
207
e9dbc551 208do_stop()
2e8b91a6 209{
e9dbc551
JR
210 if [ ! -f /var/lock/subsys/xendomains ]; then
211 msg_not_running "xendomains"
212 return
213 fi
214
215 do_stop_migrate
216 do_stop_save
217 do_stop_shutdown
218
219 rm -f /var/lock/subsys/xendomains
2e8b91a6
JR
220}
221
2e8b91a6 222case "$1" in
e9dbc551
JR
223 start)
224 do_start
225 ;;
226 stop)
227 do_stop
228 ;;
229 restart)
230 do_stop
231 do_start
232 ;;
233 reload|force-reload)
234 do_stop
235 do_start
236 ;;
237 status)
238 if [ -f /var/lock/subsys/xendomains ]; then
239 /usr/lib/xen/bin/xen-toolstack list -v
240 fi
241 ;;
242 *)
243 echo "Usage: $0 {start|stop|status|restart|reload|force-reload}"
244 exit 3
245 ;;
2e8b91a6
JR
246esac
247
e9dbc551 248exit 0
This page took 0.828271 seconds and 4 git commands to generate.