]> git.pld-linux.org Git - packages/xen.git/blob - xendomains.init
- updated to 4.17.3
[packages/xen.git] / xendomains.init
1 #!/bin/bash
2 #
3 # xendomains            Start / stop domains automatically when domain 0 boots / shuts down.
4 #
5 # chkconfig:            345 99 00
6 # description:          Start / stop Xen domains.
7 #
8
9 . /etc/rc.d/init.d/functions
10
11 if ! [ -e /proc/xen/privcmd ]; then
12         exit 0
13 fi
14
15 TOOLSTACK=$(/usr/libexec/xen/bin/xen-toolstack toolstack 2>/dev/null)
16 if [ $? -ne 0 ]; then
17         echo "No usable Xen toolstack selected"
18         exit 0
19 fi
20 if [ "$(basename "$TOOLSTACK")" != xl ] && [ "$(basename "$TOOLSTACK")" != xm ]; then
21         exit 0
22 fi
23
24 if ! /usr/libexec/xen/bin/xen-toolstack list >/dev/null 2>&1 ; then
25         exit 0;
26 fi
27
28 [ -r /etc/sysconfig/xendomains ] && . /etc/sysconfig/xendomains
29
30 shopt -s nullglob
31
32 check_config_name()
33 {
34         /usr/libexec/xen/bin/xen-toolstack create --quiet --dryrun --defconfig "$1" | sed -n 's/^.*(name \(.*\))$/\1/p;s/^.*"name": "\(.*\)",$/\1/p'
35 }
36
37 check_running()
38 {
39         /usr/libexec/xen/bin/xen-toolstack domid "$1" >/dev/null 2>&1
40         return $?
41 }
42
43 timeout_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
64         else
65                 fail
66         fi
67
68         [ $rc -gt 0 ] && cat <&$COPROC_OUT
69         exec <&$COPROC_OUT-
70 }
71
72 timeout_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
81 }
82
83 do_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/libexec/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
110 }
111
112 do_start_auto()
113 {
114         [ -n "$XENDOMAINS_AUTO" ] || return
115         [ -d "$XENDOMAINS_AUTO" ] || return
116
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"
124                 else
125                         show "Starting Xen domain $name (from $file)"
126                         busy
127
128                         if [ "${domains[$name]}" = failed ]; then
129                                 fail
130                         else
131                                 out=$(/usr/libexec/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
142                 fi
143         done
144 }
145
146 do_start() 
147 {
148         declare -A domains
149
150         if [ -f /var/lock/subsys/xendomains ]; then 
151                 msg_already_running "xendomains"
152                 return
153         fi
154
155         do_start_restore
156         do_start_auto
157
158         touch /var/lock/subsys/xendomains
159 }
160
161 do_stop_migrate()
162 {
163         [ -n "$XENDOMAINS_MIGRATE" ] || return
164
165         while read id name rest; do
166                 show "Migrating Xen domain $name ($id)"
167                 busy
168                 (timeout_coproc "$XENDOMAINS_STOP_MAXWAIT" /usr/libexec/xen/bin/xen-toolstack migrate $id $XENDOMAINS_MIGRATE)
169         done < <(/usr/libexec/xen/bin/xen-init-list)
170 }
171
172 do_stop_save()
173 {
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/libexec/xen/bin/xen-toolstack save $id $XENDOMAINS_SAVE/$name)
181         done < <(/usr/libexec/xen/bin/xen-init-list)
182 }
183
184 do_stop_shutdown()
185 {
186         while read id name rest; do
187                 show "Shutting down Xen domain $name ($id)"
188                 busy
189                 /usr/libexec/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/libexec/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/libexec/xen/bin/xen-init-list)
206 }
207
208 do_stop()
209 {
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
220 }
221
222 case "$1" in
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/libexec/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                 ;;
246 esac
247
248 exit 0
This page took 0.109661 seconds and 3 git commands to generate.