Files
xen/stubdom/stubdom-dm
John Weekes 1676d94292 stubdom: Fix stubdom-dm using "grep" improperly
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>
2011-01-11 16:42:41 +00:00

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