mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
stubdom-dm uses "grep" on "xm list" output to determine whether it is already running. The existing behavior is to use "grep $domname-dm" but this will result in a false-positive in the case of another domU running whose name ends with the full new name; for instance, if "abctest-dm" is running, a new "test-dm" will spin forever, waiting for it the end. Any easy fix is to have it use "grep -w" instead of "grep", searching for the whole word only. It also might be worth considering a switch to "xl list" from "xm list", here and in other places. Signed-off-by: John Weekes <lists.xen@nuclearfallout.net> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
183 lines
4.3 KiB
Bash
183 lines
4.3 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright 2007-2008 Samuel Thibault <samuel.thibault@eu.citrix.net>
|
|
#
|
|
# dm script around stubdomains.
|
|
#
|
|
|
|
DIR=`dirname $0`
|
|
. "${DIR}/stubdompath.sh"
|
|
stubdom_configdir="${XEN_CONFIG_DIR}/stubdoms"
|
|
|
|
# To fit xterms nicely
|
|
height=339
|
|
|
|
# Parse arguments
|
|
|
|
domid=
|
|
domname=
|
|
vncviewer=0
|
|
vncpid=
|
|
extra=
|
|
sdl=0
|
|
opengl=1
|
|
vnc=0
|
|
vncunused=0
|
|
while [ "$#" -gt 0 ];
|
|
do
|
|
if [ "$#" -ge 2 ];
|
|
then
|
|
case "$1" in
|
|
-d)
|
|
domid=$2;
|
|
extra="$extra -d $domid";
|
|
shift
|
|
;;
|
|
-domain-name)
|
|
domname=$2;
|
|
shift
|
|
;;
|
|
-vnc)
|
|
vnc=1
|
|
op=${2%,*}
|
|
ip=${op%:*};
|
|
vnc_port=${op#*:};
|
|
shift
|
|
;;
|
|
-vncunused)
|
|
vncunused=1
|
|
shift
|
|
;;
|
|
-loadvm)
|
|
extra="$extra -loadvm $2";
|
|
shift
|
|
;;
|
|
-k)
|
|
keymap=$2
|
|
shift
|
|
;;
|
|
-serial)
|
|
serial="$2"
|
|
shift
|
|
;;
|
|
-monitor)
|
|
monitor="$2"
|
|
shift
|
|
;;
|
|
esac
|
|
fi
|
|
case "$1" in
|
|
-vncviewer) vncviewer=1 ;;
|
|
-sdl) sdl=1 ;;
|
|
-disable-opengl) opengl=0 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
[ -z "$domid" ] && { echo "couldn't find domain ID" ; exit 1; }
|
|
[ -z "$domname" ] && { echo "couldn't find domain name" ; exit 1; }
|
|
|
|
# Termination handler
|
|
|
|
term() {
|
|
[ -n "$vncpid" ] && kill -9 $vncpid
|
|
rm -f /tmp/domname-dm
|
|
rm ${stubdom_configdir}/$domname-dm
|
|
exit 0
|
|
}
|
|
|
|
trap term SIGHUP
|
|
|
|
############
|
|
# stubdomain
|
|
# Wait for any previous stubdom to terminate
|
|
while xm list | grep -w $domname-dm
|
|
do
|
|
sleep 1
|
|
done
|
|
|
|
# Generate stubdom config file
|
|
mkdir -p ${stubdom_configdir} &>/dev/null
|
|
echo "#This file is autogenerated, edit $domname instead!" > ${stubdom_configdir}/$domname-dm
|
|
echo "kernel = '${XENFIRMWAREDIR}/ioemu-stubdom.gz'" >> ${stubdom_configdir}/$domname-dm
|
|
|
|
vfb="sdl=$sdl, opengl=$opengl"
|
|
test "$DISPLAY" && vfb="$vfb, display=$DISPLAY"
|
|
test "$XAUTHORITY" && vfb="$vfb, xauthority=$XAUTHORITY"
|
|
test $vnc != 0 && vfb="$vfb, vnc=$vnc, vncdisplay=$vnc_port, vnclisten=$ip, vncunused=$vncunused"
|
|
vncpasswd=`xenstore-read /local/domain/0/backend/vfb/$domid/0/vncpasswd 2>/dev/null`
|
|
test "$vncpasswd" && vfb="$vfb, vncpasswd=$vncpasswd"
|
|
test "$keymap" && vfb="$vfb, keymap=$keymap"
|
|
test "$monitor" && vfb="$vfb, monitor=$monitor"
|
|
test "$serial" && vfb="$vfb, serial=$serial"
|
|
echo "vfb = ['$vfb']" >> ${stubdom_configdir}/$domname-dm
|
|
|
|
echo -n "disk = [ " >> ${stubdom_configdir}/$domname-dm
|
|
j=0
|
|
for i in `xenstore-ls /local/domain/$domid/device/vbd | grep 'backend =' | awk '{print $3}'`
|
|
do
|
|
i=${i%\"}
|
|
i=${i#\"}
|
|
vbd_mode=`xenstore-read $i/mode`
|
|
vbd_disk=`xenstore-read $i/params`
|
|
vbd_type=`xenstore-read $i/type`
|
|
vbd_dev=`xenstore-read $i/dev`
|
|
vbd_front=`xenstore-read $i/frontend`
|
|
vbd_devtype=`xenstore-read $vbd_front/device-type`
|
|
if [ $j -ne 0 ]
|
|
then
|
|
echo -n "," >> ${stubdom_configdir}/$domname-dm
|
|
fi
|
|
echo -n "'$vbd_type:$vbd_disk,$vbd_dev:$vbd_devtype,$vbd_mode'" >> ${stubdom_configdir}/$domname-dm
|
|
j=$(( $j + 1 ))
|
|
done
|
|
echo " ] " >> ${stubdom_configdir}/$domname-dm
|
|
echo -n "vif = [ " >> ${stubdom_configdir}/$domname-dm
|
|
j=0
|
|
for i in `xenstore-ls /local/domain/$domid/device/vif | grep 'backend =' | awk '{print $3}'`
|
|
do
|
|
i=${i%\"}
|
|
i=${i#\"}
|
|
vif_mac=`xenstore-read $i/mac`
|
|
vif_bridge=`xenstore-read $i/bridge`
|
|
if [ $j -ne 0 ]
|
|
then
|
|
echo -n "," >> ${stubdom_configdir}/$domname-dm
|
|
fi
|
|
echo -n "'mac=$vif_mac" >> ${stubdom_configdir}/$domname-dm
|
|
if [ "$vif_bridge" ]
|
|
then
|
|
echo -n ",bridge=$vif_bridge'" >> ${stubdom_configdir}/$domname-dm
|
|
else
|
|
echo -n "'" >> ${stubdom_configdir}/$domname-dm
|
|
fi
|
|
j=$(( $j + 1 ))
|
|
done
|
|
echo " ] " >> ${stubdom_configdir}/$domname-dm
|
|
|
|
mkfifo /tmp/$domname-dm
|
|
xm create -c ${stubdom_configdir}/$domname-dm target=$domid memory=32 extra="$extra" < /tmp/$domname-dm &
|
|
exec 4>/tmp/$domname-dm
|
|
|
|
|
|
###########
|
|
# vncviewer
|
|
if [ "$vncviewer" = 1 ]
|
|
then
|
|
# Wait for vnc server to appear
|
|
while ! vnc_port=`xenstore-read /local/domain/$domid/console/vnc-port`
|
|
do
|
|
# Check that the stubdom job is still alive
|
|
kill -0 $consolepid || term
|
|
sleep 1
|
|
done
|
|
|
|
vncviewer $ip:$vnc_port &
|
|
vncpid=$!
|
|
fi
|
|
|
|
# wait for SIGHUP or stubdom termination
|
|
wait
|
|
|
|
term
|