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