diff options
author | Michael Janczyk | 2010-08-22 10:44:16 +0200 |
---|---|---|
committer | Michael Janczyk | 2010-08-22 10:44:16 +0200 |
commit | 6c51d303782b52c1540f74d383f41ba7a311268a (patch) | |
tree | 675ad612ef875bb576045eb70f8b8b82ca1f07c6 /os-plugins/plugins/vmchooser/files/run-virt.sh | |
parent | Merge branch 'master' of openslx.org:openslx/core (diff) | |
download | core-6c51d303782b52c1540f74d383f41ba7a311268a.tar.gz core-6c51d303782b52c1540f74d383f41ba7a311268a.tar.xz core-6c51d303782b52c1540f74d383f41ba7a311268a.zip |
vbox changes for vmchooser and var adaption
Diffstat (limited to 'os-plugins/plugins/vmchooser/files/run-virt.sh')
-rw-r--r-- | os-plugins/plugins/vmchooser/files/run-virt.sh | 413 |
1 files changed, 256 insertions, 157 deletions
diff --git a/os-plugins/plugins/vmchooser/files/run-virt.sh b/os-plugins/plugins/vmchooser/files/run-virt.sh index df2a7404..a79d0d88 100644 --- a/os-plugins/plugins/vmchooser/files/run-virt.sh +++ b/os-plugins/plugins/vmchooser/files/run-virt.sh @@ -1,7 +1,7 @@ #!/bin/bash # ----------------------------------------------------------------------------- -# Copyright (c) 2007..2009 - RZ Uni FR -# Copyright (c) 2007..2009 - OpenSLX GmbH +# Copyright (c) 2007..2010 - RZ Uni FR +# Copyright (c) 2007..2010 - OpenSLX GmbH # # This program is free software distributed under the GPL version 2. # See http://openslx.org/COPYING @@ -16,110 +16,271 @@ # The idea is to setup a set of variables used by at least two different # tools and then include the specific plugin which configures the speci- # fied virtualization tool. -# ----------------------------------------------------------------------------- +################################################################################ -# include default directories . /etc/opt/openslx/openslx.conf + +################################################################################ +### Define default dirs / get configs +################################################################################ + PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins PLUGINCONFDIR=${PLUGINCONFROOT}/vmchooser +# include general configuration from vmchooser +[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \ + . ${PLUGINCONFROOT}/vmchooser/vmchooser.conf # load general virtualization information [ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \ . ${PLUGINCONFROOT}/virtualization/virtualization.conf -# Sanity checks ################################################################################ +### Functions used throughout the script +################################################################################ + +# function to write to stdout and logfile +LOGFILE=${OPENSLX_DEFAULT_LOGDIR}/run-virt.${USER}.$$.log +writelog () { + # write to stdout + echo -e "$1" + # log into file + echo -e "$1" >> ${LOGFILE} +} + +# remove config dirs when exit +cleanexit () { + if echo "${RMDIRS}" 2>/dev/null | grep -q ${xmlvirt}; then + writelog "${xmlvirt} exited. Cleanning up... \c" + rm -rf ${RMDIRS} >/dev/null 2>&1 + writelog "done" + fi + + exit "$1" +} + +# Check for important files used +filecheck () +{ + filecheck=$(LANG=us ls -lh ${diskfile} 2>&1) + writelog "Filecheck:\n${filecheck}\n" + noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l) + rightsfile=${diskfile} + + # Check if link + if [ -L "${diskfile}" ]; then + # take link target + rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}') + rightsfile=${vmdir}/${rightsfile} + filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1) + fi + + # Does file exist + if [ "${noimage}" -ge "1" ]; then + writelog "Virtual Machine Image Problem:\c " + writelog "\tThe image you've specified doesn't exist." + writelog "Filecheck says:\c " + writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory" + writelog "Hint:\c " + writelog "\t\t\tCompare spelling of the image with your options.\n" + exit 1 + fi + + # Readable by calling user + if ! [ -r "${diskfile}" >/dev/null 2>&1 \ + -o -r "${diskfile}" >/dev/null 2>&1 ]; then + writelog "Vmware Image Problem:\c " + writelog "\tThe image you've specified has wrong rights." + writelog "Filecheck says:\t\t$(echo ${filecheck} \ + | awk '{print $1" "$3" "$4}') ${rightsfile}" + writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n" + exit 1 + fi + + # Writable (for persistent-mode)? + if ! [ -w "${diskfile}" >/dev/null 2>&1 \ + -o -w "${diskfile}" >/dev/null 2>&1 ] \ + && [ "${np}" = "independent-persistent" ]; then + writelog "Vmware Image Problem:\c " + writelog "\tThe image you have specified has wrong rights." + writelog "Filecheck says:\t\t$(echo ${filecheck} \ + | awk '{print $1" "$3" "$4}') ${rightsfile}" + writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n" + exit 1 + fi +} + +################################################################################ +### Get XML file and dir +################################################################################ + +# absolute or relative path? +xmlfile=$1 +if ls ${xmlfile} 2>/dev/null | grep '/' >/dev/null 2>&1; then + xmlpath=$(dirname ${xmlfile}) + xmlfile=$(basename ${xmlfile}) +else + xmlpath=${vmchooser_xmlpath} +fi +# full path +xmlfile="${xmlpath}/${xmlfile%.xml}.xml" + +################################################################################ +### Sanity checks +################################################################################ + +# test if the xml file is valid +if ! [ -r "${xmlfile}" ]; then + writelog "${xmlfile} not a readable XML file!" + exit 1 +fi + +# test if XML file +if ! grep '<?xml' "${xmlfile}" >/dev/null 2>&1; then + writelog \ + "Submitted configuration file ${xmlfile} seems to have wrong XML format" + exit 1 +fi # Theck for running in graphical environment otherwise no much use here [ -z "$DISPLAY" ] && echo -e "\n\tStart only within a graphical desktop!\n" \ && exit 1 -# Test if the xml path/file is valid (gotten via commandline first parameter) -xml=$1 -[ -e "${xml}" ] || { echo -e "\n\tNo XML file given!\n"; exit 1; } +################################################################################ +### Logo for console +################################################################################ -# Read needed variables from XML file +cat <<EOL + __ __ + .----.--.--.-----.___.--.--.|__|.----.| |_ + | _| | | |___| | || || _|| _| + |__| |_____|__|__| \___/ |__||__| |____| + OpenSLX virtual machine environment preparation script ... + +EOL + +################################################################################ +### Read needed variables from XML file ################################################################################ -# File name of the image -imgname=$(grep -io "<image_name param=.*\"" ${xml} | \ - awk -F "\"" '{ print $2 }') - -case ${xml} in - /tmp/*) - # we do not need folder name as it is already included by vmchooser - diskfile=$imgname - imgname=$(basename ${imgname}) - ;; - *) - # Path to the image - # (readlink produces the absolute path if called relatively) - [ -z $imgpath ] && \ - { imgpath=$(readlink -f $xml); imgpath=${imgpath%/*.xml}; } - # Diskfile is file including absolute path to it - diskfile=$imgpath/$imgname - ;; -esac -# TODO: change to new var vmpath, remove diskfile afterwards -vmpath=$diskfile - -[ -e $diskfile ] || { echo -e "\n\tImage file $diskfile not found!"; exit 1; } - -# Short description of the image (as present in the vmchooser menu line) -vm_name=$(grep -o "short_description param=.*\"" ${xml} | \ - sed -e "s/&.*;/; /g" | awk -F "\"" '{print $2}') -# If ${short_description} not defined use ${image_name} -# if ${vm_name} not defined use ${imgname} -vm_name=${vm_name:-"${imgname%.*}"} +writelog "Starting configuration..." +writelog "\tLogfile:\t\t${LOGFILE}" +writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c" +writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')" +writelog "\tVM XML dir:\t\t$(dirname ${xmlfile})" +writelog "\tXML file:\t\t${xmlfile}" +writelog "VM config:" + +# name of the virt image +imgname=$(grep -io '<image_name param=.*"' ${xmlfile} \ + | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') + +# imagename /w full path +if echo ${imgname} 2>/dev/null | grep -q '^/' >/dev/null 2>&1; then + imgpath=$(dirname ${imgname}) + imgname=$(basename ${imgname}) + vmpath=${imgpath}/${imgname} +# if old vmchooser binary stuff +# we do not need folder name as it is already included by vmchooser +elif echo ${xmlfile} 2>/dev/null | grep -q '^/tmp/' >/dev/null 2>&1; then + vmpath=$imgname + imgname=$(basename ${imgname}) +# else use same path as xml +else + imgpath=${xmlpath} + vmpath=${imgpath}/${imgname} +fi + +# check if virtual machine container file exists +if ! [ -e "${vmpath}" ]; then + writelog "Virtual machine image ${vmpath} not found!" + exit 1 +fi + +# name of the virt machine, sed because of Windows formatting +vm_name=$(grep -o 'short_description param=.*"' ${xmlfile} \ + | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}') +# if ${vm_name} not defined use ${xmlfile} +vm_name=${vm_name:-${xmlfile%.xml}} + # define vm_shortname since vm_name can be very long -vm_shortname=$(echo ${imgname%.*} | sed -e "s, ,-,g") -displayname=${vm_name} -# remove blanks -vm_name=$(echo ${vm_name} | sed -e "s, ,-,g") +vm_shortname=$(basename ${xmlfile%.xml} | sed -e "s, ,-,g") -# Type of virtual machine to run -virt_mach=$(grep -o "virtualmachine param=.*\"" ${xml} | \ - sed -e "s/&.*;/; /g" | awk -F "\"" '{print $2}') +# vm_name = displayname, define for old scripts +displayname=${vm_name} -# Make a guess from the filename extension if ${virt_mach} is empty (not set -# within the xml file) -if [ -z ${virt_mach} ] ; then - case "$(echo ${imgname##*.}|tr [A-Z] [a-z])" in - vmdk) - virt_mach="vmware" +# image is for the following virtual machine +xmlvirt=$(grep -o 'virtualmachine param=.*"' ${xmlfile} \ + | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}') + +# make a guess from the filename extension if ${xmlvirt} is empty +# (not set within the XML file) +# TODO: implement possibility to submit own configuration files +if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then + writelog "No virtual machine parameter defined in ${xmlfile}" + writelog "Trying to guess VM...\c" + case "$(cat ${additional_config} | tr [A-Z] [a-z])" in + *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*) + xmlvirt="vmware" ;; - img|qcow*) - virt_mach="qemukvm" + *innotek*|*virtualbox*) + xmlvirt="virtualbox" + ;; + *qemu*|*kvm*) + xmlvirt="qemukvm" + ;; + *) + xmlvirt="none" + ;; + esac +elif [ -z "${xmlvirt}" ]; then + case "$(echo ${imgname##*.} | tr [A-Z] [a-z])" in + vmdk) + xmlvirt="vmware" ;; vbox) - virt_mach="virtualbox" + xmlvirt="virtualbox" + ;; + img|qcow*) + xmlvirt="qemukvm" ;; *) - echo "Unknown image type, bailing out" + xmlvirt="none" ;; esac + writelog "result:\t${xmlvirt}" fi -# Definition of the client system -vmostype=$(grep -io '<os param=.*"' ${xml} | awk -F '"' '{ print $2 }') +# definition of the client system +vmostype=$(grep -io '<os param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }' \ + | tr [A-Z] [a-z]) + +# definition of the networking the client system is connected to +network_kind=$(grep -io '<network param=.*"' ${xmlfile} \ + | awk -F '"' '{ print $2 }' | tr [A-Z] [a-z]) +network_card=$(grep -io '<netcard param=.*"' ${xmlfile} \ + | awk -F '"' '{ print $2 }'| tr [A-Z] [a-z]) -# Definition of the networking the client system is connected to -network_kind=$(grep -io '<network param=.*"' ${xml} | awk -F '"' '{ print $2 }') -network_card=$(grep -io '<netcard param=.*"' ${xml} | awk -F '"' '{ print $2 }') +# set redirects to 0, see vmgrid if you want to define some +redirects=0 # Serial/parallel ports defined (e.g. "ttyS0" or "autodetect") -serial=$(grep -io '<serialport param=.*"' ${xml} | awk -F '"' '{ print $2 }') -parallel=$(grep -io '<parport param=.*"' ${xml} | awk -F '"' '{ print $2 }') +serial=$(grep -io '<serialport param=.*"' ${xmlfile} \ + | awk -F '"' '{ print $2 }') +parallel=$(grep -io '<parport param=.*"' ${xmlfile} \ + | awk -F '"' '{ print $2 }') + +writelog "\tVirtualization:\t\t$xmlvirt" +writelog "\tVM name:\t\t$vm_name" +writelog "\tVM short name:\t\t$vm_shortname" -# Declaration of default variables +############################################################################### +### Declaration of default variables ############################################################################### -# VM-ID static (0D) +# VM-ID static (00) VM_ID="00" -# cpu cores -cpu_cores="${cpu_cores}" - -# check for CPU virtualization flags +# make sure cpu_cores is not empty +cpu_cores=${cpu_cores:-"1"} # total amount of memory defined in stage 3 permem=60 @@ -134,8 +295,6 @@ mem=$(expr ${totalmem} / 100 \* ${permem} / 4 \* 4) macguestpart="00:50:56:${VM_ID}" machostpart=$(echo ${hostmacaddr} | awk -F ":" '{print $(NF-1)":"$NF}') macaddr=$(echo "${macguestpart}:${machostpart}" | tr [a-z] [A-Z]) -#TODO: remove when vmware modified -mac=${machostpart} # virtual fd/cd/dvd and drive devices, floppy b: for configuration # if $floppy_0 from run-virt.include set then fdtest="TRUE" @@ -160,96 +319,29 @@ cdrom1=${cdtest:-"FALSE"} ide="TRUE" scsi="FALSE" hddrv="ide" - -# add rw share -sharepath="${HOME}" -sharename="home" +remotedesktopport="590${VM_ID}" # Display resolution within the host system hostres=$(xvidtune -show 2>/dev/null| grep -ve "^$") xres=$(echo "${hostres}" | awk '{print $3}') yres=$(echo "${hostres}" | awk '{print $7}') -# Set hostname: using original hostname and adding string "-vm" -hostname="VM-${HOST}" +# enable 3D +enable3d=$(grep -i "<enable3d param=.*" ${xmlfile} 2>/dev/null | \ + awk -F '=' {'print $2'}) -# Functions used throughout the script -############################################################################### - -# Check for important files used -filecheck () -{ - filecheck=$(LANG=us ls -lh ${diskfile} 2>&1) - writelog "Filecheck:\n${filecheck}\n" - noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l) - rightsfile=${diskfile} - - # Check if link - if [ -L "${diskfile}" ]; then - # take link target - rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}') - rightsfile=${vmdir}/${rightsfile} - filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1) - fi - - # Does file exist - if [ "${noimage}" -ge "1" ]; then - writelog "Virtual Machine Image Problem:\c " - writelog "\tThe image you've specified doesn't exist." - writelog "Filecheck says:\c " - writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory" - writelog "Hint:\c " - writelog "\t\t\tCompare spelling of the image with your options.\n" - exit 1 - fi - - # Readable by calling user - if ! [ -r "${diskfile}" >/dev/null 2>&1 \ - -o -r "${diskfile}" >/dev/null 2>&1 ]; then - writelog "Vmware Image Problem:\c " - writelog "\tThe image you've specified has wrong rights." - writelog "Filecheck says:\t\t$(echo ${filecheck} \ - | awk '{print $1" "$3" "$4}') ${rightsfile}" - writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n" - exit 1 - fi - - # Writable (for persistent-mode)? - if ! [ -w "${diskfile}" >/dev/null 2>&1 \ - -o -w "${diskfile}" >/dev/null 2>&1 ] \ - && [ "${np}" = "independent-persistent" ]; then - writelog "Vmware Image Problem:\c " - writelog "\tThe image you have specified has wrong rights." - writelog "Filecheck says:\t\t$(echo ${filecheck} \ - | awk '{print $1" "$3" "$4}') ${rightsfile}" - writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n" - exit 1 - fi -} +# add rw share +sharepath="${HOME}" +sharename="home" -# Function to write to stdout and logfile -writelog () -{ - # Write to stdout - echo -e "$1" +# set hostname: using original hostname and adding string +hostname="virt-$(hostname)" - # Log into file - echo -e "$1" >> ${OPENSLX_DEFAULT_LOGDIR}/run-virt.${USER}.$$.log -} +writelog "\tVM Hostname:\t\t$hostname" -# Setup the rest of the environment and run the virtualization tool just confi- -# gured ################################################################################ - -# Logo for console -cat <<EOL - __ __ - .----.--.--.-----.___.--.--.|__|.----.| |_ - | _| | | |___| | || || _|| _| - |__| |_____|__|__| \___/ |__||__| |____| - OpenSLX virtual machine environment preparation script ... - -EOL +### Setup the rest of the environment and run the configured vm +################################################################################ # Adjust sound volume writelog "Unmuting sound...\c " @@ -266,15 +358,15 @@ writelog "finished\n" # fixme -> to be changed (vmchooser adapts the file content!?) #TODO: wozu echo? #echo "Please fix the config.xml generation" -cp ${xml} ${PLUGINCONFDIR}/fd-loop/config.xml +cp ${xmlfile} ${PLUGINCONFDIR}/fd-loop/config.xml # Check if virtual machine container file exists #filecheck # Get all virtual machine specific stuff from the respective include file -if [ -e ${PLUGINCONFROOT}/${virt_mach}/run-virt.include ] ; then - self=${virt_mach} - . ${PLUGINCONFROOT}/${virt_mach}/run-virt.include +if [ -e ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include ] ; then + self=${xmlvirt} + . ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include # start a windowmanager for easier handling # (expect problems /w windows opening in background /w vmware without wm) for dm in xfwm4 metacity openbox blackbox kwin fvwm2 ; do @@ -290,9 +382,16 @@ if [ -e ${PLUGINCONFROOT}/${virt_mach}/run-virt.include ] ; then done ${VIRTCMD} ${VIRTCMDOPTS} writelog "Bye." - exit 0 + cleanexit 0 else - writelog "Failed because of missing ${virt_mach} plugin." - exit 1 + writelog "Failed because of missing ${xmlvirt} plugin." + cleanexit 1 +fi + +# postrun for scripts after virtualization finishes +if [ -n "${POSTRUN}" ]; then + eval ${POSTRUN} >/dev/null 2>&1 fi +cleanexit 0 +exit 0 |