diff options
author | Simon Rettberg | 2016-10-21 17:27:16 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-10-21 17:27:16 +0200 |
commit | daa8b9fd8255d9033637c304241deba8d7f3bd58 (patch) | |
tree | ffec7fdfdb95c04f6b5e38c2767ba23996eb95a5 | |
parent | [nvidia_kernel] Actually build nvidia-drm.ko (diff) | |
download | tm-scripts-daa8b9fd8255d9033637c304241deba8d7f3bd58.tar.gz tm-scripts-daa8b9fd8255d9033637c304241deba8d7f3bd58.tar.xz tm-scripts-daa8b9fd8255d9033637c304241deba8d7f3bd58.zip |
[run-virt/...] More cleanup, refactoring, comments
18 files changed, 327 insertions, 547 deletions
diff --git a/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include b/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include index 29360159..81bf9218 100644 --- a/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include +++ b/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include @@ -44,16 +44,16 @@ mkdir -m 1777 -p ${QKTMPDIR} 2>/dev/null diskfile=${vmpath} # check the file type -if echo ${imgname} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then - imgtype=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]") +if echo ${IMG_BASENAME} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then + imgtype=$(echo ${IMG_BASENAME##*.} | tr "[a-z]" "[A-Z]") else - writelog "${imgname} is not a valid image type (img|qcow*|vmdk), exiting!" + writelog "${IMG_BASENAME} is not a valid image type (img|qcow*|vmdk), exiting!" exit 1 fi # set the emulator/virtualization options for various operating systems sound="es1370" -case "${vmostype}" in +case "${VM_OS_TYPE}" in beos*) VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg" sound="sb16" @@ -91,8 +91,8 @@ esac #VIRTCMDOPTS="${VIRTCMDOPTS} -alt-grab" # display name, remove blanks because of cmdline problems -displayname=$(echo ${displayname} | sed -e "s, ,-,g;s,(,[,g;s,),],g") -VIRTCMDOPTS="${VIRTCMDOPTS} -name ${displayname}" +VM_DISPLAYNAME=$(echo ${VM_DISPLAYNAME} | sed -e "s, ,-,g;s,(,[,g;s,),],g") +VIRTCMDOPTS="${VIRTCMDOPTS} -name ${VM_DISPLAYNAME}" writelog "Directories:" writelog "\tTMPDIR:\t\t\t$QKTMPDIR" diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/check_runvirt_needed_files.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/check_runvirt_needed_files.inc deleted file mode 100644 index fbb0bc70..00000000 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/check_runvirt_needed_files.inc +++ /dev/null @@ -1,53 +0,0 @@ -################################################################# -# Include: Check for important files used by vmchooser_run-virt # -################################################################# - -# WARNING: This is perhaps vestigial! - -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 -} diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/detect_legacy.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc index 8bdfd8b1..b1995d09 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/detect_legacy.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc @@ -7,8 +7,6 @@ writelog "Detecting current/legacy mode ..." -# First, let's try to extract an imguuid from xmlfile: -declare -rg IMGUUID=$(grep -i -o '<uuid param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') declare -rg TMPCONFIG="$TMPDIR/vmconfig.tmp" writelog "IMGUUID extracted: $IMGUUID" @@ -32,3 +30,5 @@ else fi fi +readonly LEGACY + diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc index b7ed648c..eb699ec0 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc @@ -1,103 +1,62 @@ -########################################### -# Include: Set hardware related variables # -########################################### +############################################ +# Include: Get needed values from XML file # +############################################ -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 "Enable 3D:\t\t${enable3d}" -writelog "VM config:" +writelog "Parsing XML..." + +declare -rg VMSTORE_PATH=/mnt/vmstore + +# Need some lean and mean xml parser some day in the far future +get_xml () { + grep -Pio "<$1"'\s+param=[^"]*".*' "${xmlfile}" \ + | awk -F '"' '{ print $2 }' \ + | sed 's/&/+/g;s/"/"/g;s/</</g;s/>/>/g' +} # # Name of the virt image -imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') -imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') -# [ -z "$imgname" ] && imgname="${imgrelpath}" -imgrelpath=${imgrelpath#/mnt/vmstore/} +SRC_IMG_ABSOLUTE=$(get_xml "image_path") +SRC_IMG_RELATIVE=$(get_xml "image_name") -writelog "Virtual image file name: $imgname" +if [ -z "${SRC_IMG_ABSOLUTE}${SRC_IMG_RELATIVE}" ]; then + writelog "Neither relative nor absolute path for image found in xml" + cleanexit 1 +fi -# Imagename w/ full path -if echo "${imgname}" | grep -q '^/'; 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}" | grep -q '^/tmp/'; then - vmpath="$imgname" - imgname="$(basename "${imgname}")" - ## Added for persistent support. -else - # Else use same path as xml - imgpath="${xmlpath}" - vmpath="${imgpath}/${imgname}" +if [ -n "$SRC_IMG_ABSOLUTE" ] && [ "${SRC_IMG_ABSOLUTE:0:1}" != "/" ]; then + writelog "Error parsing XML for absolute image path: given value doesn't start with '/': '$SRC_IMG_ABSOLUTE'" + cleanexit 1 fi -# If ${vm_name} not defined use ${xmlfile} -vm_name="${vm_name:-${xmlfile%.xml}}" +if [ -z "$SRC_IMG_ABSOLUTE" ]; then + SRC_IMG_ABSOLUTE="${VMSTORE_PATH}/${SRC_IMG_RELATIVE}" +fi -# Define vm_shortname since vm_name can be very long -vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")" +IMG_BASENAME=$(basename "$SRC_IMG_ABSOLUTE") +writelog "Virtual image file name: $IMG_BASENAME" -# vm_name = displayname, define for old scripts -displayname="${vm_name}" +VM_DISPLAYNAME=$(get_xml "short_description") +[ -z "$VM_DISPLAYNAME" ] && VM_DISPLAYNAME="${IMG_BASENAME}" + +# Define VM_NAME_CLEAN since VM_DISPLAYNAME can be long and contain weird characters +VM_NAME_CLEAN=$(echo "${VM_DISPLAYNAME:0:32}" | sed -r 's/[^0-9a-zA-Z_-\.]+/_/g') # image is for the following virtual machine -xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \ +PLUGIN_ID=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}') -# choose the proper virtualization/emulator plugin -[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe" - -# Extracting OS type (vmostype) from xml file. We don't care here whether vmostype is empty, as then +# Extracting OS type (VM_OS_TYPE) from xml file. We don't care here whether VM_OS_TYPE is empty, as then # it will yield the default entries later on. -vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') +VM_OS_TYPE=$(get_xml "os") -# 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" - ;; - *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|vdi) - xmlvirt="virtualbox" - ;; - qcow*) - xmlvirt="qemukvm" - ;; - *) - xmlvirt="emufe" - ;; - esac - writelog "result:\t${xmlvirt}" -fi +readonly SRC_IMG_ABSOLUTE SRC_IMG_RELATIVE +readonly IMG_BASENAME +readonly VM_DISPLAYNAME VM_NAME_CLEAN +readonly PLUGIN_ID +readonly VM_OS_TYPE -# Set redirects to 0, see vmgrid if you want to define some -redirects=0 +writelog "Virtualization plugin: $PLUGIN_ID" +writelog "VM name: $VM_DISPLAYNAME" +writelog "VM short name: $VM_NAME_CLEAN" +writelog "VM OS: $VM_OS_TYPE" +writelog "Done parsing XML." -writelog "\tVirtualization:\t\t$xmlvirt" -writelog "\tVM name:\t\t$vm_name" -writelog "\tVM short name:\t\t$vm_shortname" -writelog "\tVM OS:\t\t$vmostype" diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc index 9a46bc88..7ef03c1c 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc @@ -19,6 +19,7 @@ get_vm_id() { fi # fallback: take last two digits of current pid... VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2) + [ "${#VM_ID}" -eq 1 ] && VM_ID="0${VM_ID}" } get_vm_id @@ -38,18 +39,18 @@ else fi # Calculate absulute amount of RAM that should stay available to the host -reserve="$[ ( $totalmem * $reserve ) / 100 ]" +reserve="$(( ( totalmem * reserve ) / 100 ))" # Respect some upper and lower bounds for the host amount [ "$reserve" -lt "$min" ] && reserve="$min" [ "$reserve" -gt "$max" ] && reserve="$max" # Get a result which can be divided by 4 -mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]" +mem="$(( ( ( totalmem - reserve ) / 4 ) * 4 ))" if [ -n "$mainvirtmem" ]; then - forcemem="$[ "$mainvirtmem" / 4 * 4 ]" + forcemem="$(( mainvirtmem / 4 * 4 ))" mem="$forcemem" fi -hostmem="$[ $totalmem - $mem ]" +hostmem="$(( totalmem - mem ))" # Fill in VMID macaddrsuffix=$(echo "$macaddrsuffix" | sed "s/%VMID%/${VM_ID}/") @@ -75,17 +76,9 @@ cdrom0=${cdtest:-"FALSE"} cdtest=${cdrom_1:+"TRUE"} # if $cdtest not set cdrom1="FALSE", else "TRUE" cdrom1=${cdtest:-"FALSE"} -# IDE is expected default, test for the virtual disk image type should -# be done while creating the runscripts ... -# TODO enable SCSI support instead of just disabling it. -ide="TRUE" -scsi="FALSE" -hddrv="ide" -audio="true" -remotedesktopport="590${VM_ID}" -# Enable 3D -enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string) +# RDP/VNC port (59001 - 59099) +remotedesktopport="590${VM_ID}" # Add rw share for home dir homesharepath="${HOME}/PERSISTENT" diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc index 4c4ccf1d..cd9a573a 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc @@ -4,8 +4,8 @@ VMCHOOSER_DIR="/opt/openslx/vmchooser" VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config" -LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log" USER="$(whoami)" +LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log" TMPDIR="/tmp/virt/${USER}/$$" readonly VMCHOOSER_DIR VMCHOOSER_CONF_DIR LOGFILE TMPDIR USER diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc index 3c4ed330..4eb66028 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc @@ -2,32 +2,40 @@ # Include: Setup dnbd for image access, nfs/cifs fallback # ########################################################### -writelog "Now in setup_image_access.inc ..." +# This will currently make sure that the variable +# VM_DISKFILE_RO is set which will contain the +# absolute path to the disk image to use for the vm +# session. +# When using DNBD3 this will differ from SRC_IMG_ABSOLUTE, +# otherwise it will be identical. +# In the future DNBD3 (or something else) might provide +# a CoW layer so we don't need snapshots etc. anymore. +# This include should set VM_DISKFILE_RW in that case to +# indicate to the virt plugin that it doesn't need to +# handle creating a temporary CoW layer itself. + +writelog "Setting up disk access for virtualizer/emulator ..." # Try to use dnbd3 to access the image -unset vm_diskfile -unset vm_revision +unset VM_DISKFILE_RO unset dnbd3_fuse_mount_point -unset dnbd3_tmplog -if ! which dnbd3-fuse; then - writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH" -elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then - writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes" -else + +setup_dnbd3 () { # Mount path for images mounted with dnbd3-fuse dnbd3_fuse_mount_point="$TMPDIR/dnbd3fuse.mnt" mkdir -p "${dnbd3_fuse_mount_point}" # start dnbd3-fuse in subshell - dnbd3_tmplog="$TMPDIR/dnbd3fuse.log" - dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM" + local dnbd3_tmplog="$TMPDIR/dnbd3fuse.log" + local dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM" + local TIMEOUT vm_revision rm -f -- "$dnbd3_exitflag" ( - dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${imgrelpath}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1 + dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${SRC_IMG_RELATIVE}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1 RET=$? touch "$dnbd3_exitflag" if [ "$RET" != "0" ]; then writelog "dnbd3-fuse stopped working (Exit code $RET)" - slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${imgrelpath}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}" + slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${SRC_IMG_RELATIVE}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}" fi ) & # give it a bit of time @@ -36,36 +44,55 @@ else for TIMEOUT in 0.5 1 1 OUT; do if [ -r "${dnbd3_fuse_mount_point}/img" ]; then vm_revision="$(grep -m 1 "^Revision:" "${dnbd3_fuse_mount_point}/status" | cut -d" " -f2)" - vm_diskfile="${dnbd3_fuse_mount_point}/img" - writelog "DNBD3: $imgrelpath on $vm_diskfile with rid $vm_revision" - vmpath="$vm_diskfile" + VM_DISKFILE_RO="${dnbd3_fuse_mount_point}/img" + writelog "DNBD3: $SRC_IMG_RELATIVE on $VM_DISKFILE_RO with rid $vm_revision" break fi [ "$TIMEOUT" = "OUT" -o -e "$dnbd3_exitflag" ] && break sleep "$TIMEOUT" done - if [ -z "$vm_diskfile" ]; then - slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found, trying NFS/CIFS..." "$dnbd3_tmplog" + if [ -z "$VM_DISKFILE_RO" ]; then + slxlog "virt-dnbd3" "No dnbd3 server for ${SRC_IMG_RELATIVE} found, trying NFS/CIFS..." "$dnbd3_tmplog" writelog "No working dnbd3 server found :-(" fi +} + +# See if we should setup dnbd3 image access at all +if ! which dnbd3-fuse; then + writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH" +elif [ -z "$SRC_IMG_RELATIVE" ]; then + writelog "Can't use dnbd3 as SRC_IMG_RELATIVE is not set" +elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then + writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes" +else + setup_dnbd3 fi -# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system -if [ -z "$vm_diskfile" ]; then - new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -n 1) - [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}" - vm_diskfile="$vmpath" +# VM_DISKFILE_RO will be empty if dnbd3 is not used or failed to connect. +# Let's try to fall back to NFS/CIFS via file system +if [ -z "$VM_DISKFILE_RO" ]; then + # Maybe we're reading a dnbd3 directory with RIDs encoded into the filename - use latest one + rid_suffix=$(ls -1 "${SRC_IMG_ABSOLUTE}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+$' | sort -n | tail -n 1) + if [ -n "$rid_suffix" ]; then + # found + VM_DISKFILE_RO="${SRC_IMAGE_ABSOLUTE}.r${rid_suffix}" + elif [ -e "$SRC_IMAGE_ABSOLUTE" ]; then + # try name we got from xml in the first place + VM_DISKFILE_RO="$SRC_IMAGE_ABSOLUTE" + fi fi # Check if virtual machine container file exists -if ! [ -e "${vmpath}" ]; then - slxlog "virt-image-missing" "VM image $vmpath not found!" - writelog "Virtual machine image ${vmpath} not found!" +if [ -z "$VM_DISKFILE_RO" ] || ! [ -e "${VM_DISKFILE_RO}" ]; then + slxlog "virt-image-missing" "VM image $VM_DISKFILE_RO not found!" + writelog "Virtual machine image ${VM_DISKFILE_RO} not found!" error_user "Das Image für die gewählte Virtuelle Maschine konnte nicht gefunden werden. Versuchen Sie zunächst, den Computer komplett neu zu starten. Sollte das Problem bestehen bleiben, wenden Sie sich bitte an den Support." cleanexit 1 fi -writelog "Virtual machine disk file: $vm_diskfile" +readonly VM_DISKFILE_RO + +writelog "Disk file to use: $VM_DISKFILE_RO" diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc index ce15524f..7709a85d 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc @@ -3,30 +3,30 @@ ########################################################################## # Get all virtual machine specific stuff from the respective include file -if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then - slxlog "virt-plugin-missing" "Could not find run-virt.include for $xmlvirt ($VMCHOOSER_DIR/$xmlvirt/run-virt.include)" - writelog "Failed because of missing ${xmlvirt} plugin." - error_user "Konnte den Virtualisierer '$xmlvirt' nicht finden. Starten der Virtuellen Maschine fehlgeschlagen. +if [ ! -e "$VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include" ] ; then + slxlog "virt-plugin-missing" "Could not find run-virt.include for $PLUGIN_ID ($VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include)" + writelog "Failed because of missing ${PLUGIN_ID} plugin." + error_user "Konnte den Virtualisierer '$PLUGIN_ID' nicht finden. Starten der Virtuellen Maschine fehlgeschlagen. Starten Sie den Computer neu und wenden Sie sich an den Support, wenn das Problem weiterhin besteht." cleanexit 1 fi -self="${xmlvirt}" +self="${PLUGIN_ID}" -if ! bash -n "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then - slxlog "virt-plugin-syntax" "run-virt.include for $xmlvirt contains syntax errors (bash -n run-virt.include failed)" - writelog "Erroneous run-virt.include for $xmlvirt (syntax check)" - error_user "Das Start-Script für den Virtualisierer '$xmlvirt' ist fehlerhaft. +if ! bash -n "$VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include"; then + slxlog "virt-plugin-syntax" "run-virt.include for $PLUGIN_ID contains syntax errors (bash -n run-virt.include failed)" + writelog "Erroneous run-virt.include for $PLUGIN_ID (syntax check)" + error_user "Das Start-Script für den Virtualisierer '$PLUGIN_ID' ist fehlerhaft. Starten Sie den Computer neu und wenden Sie sich an den Support, wenn das Problem weiterhin besteht." cleanexit 1 fi setup_vm_commandline () { # Now including the hypervisor specific include file: - if ! source "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then - slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced properly." - writelog "Erroneous run-virt.include for ${xmlvirt}? Source returned != 0" - error_user "Das Start-Script für den Virtualisierer '$xmlvirt' hat einen fehlercode zurückgegeben. + if ! source "$VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include"; then + slxlog "virt-plugin-error" "run-virt.include for $PLUGIN_ID could not be sourced properly." + writelog "Erroneous run-virt.include for ${PLUGIN_ID}? Source returned != 0" + error_user "Das Start-Script für den Virtualisierer '$PLUGIN_ID' hat einen fehlercode zurückgegeben. Starten Sie den Computer neu, falls es beim Ausführen der VM zu Problemen kommt und wenden Sie sich an den Support, wenn das Problem weiterhin besteht." fi diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc index c0d17dbe..7519a48d 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc @@ -77,3 +77,22 @@ rv_clean_string() { tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9\-]' fi } + +# Check if the given variables are set (empty or not) +isset() { + while [ $# -gt 0 ]; do + [ -z "${!1+x}" ] && return 1 + shift + done + return 0 +} + +# Check if the given variables are not empty +notempty() { + while [ $# -gt 0 ]; do + [ -z "${!1}" ] && return 1 + shift + done + return 0 +} + diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt b/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt index 10943c51..b945cca2 100755 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt @@ -19,8 +19,8 @@ # fied virtualization tool. ################################################################################ -RUNVIRTINCLUDEDIR=/opt/openslx/vmchooser/run-virt-includes -xmlfile="$1" +declare -rg RUNVIRTINCLUDEDIR=/opt/openslx/vmchooser/run-virt-includes +declare -rg xmlfile="$1" # Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string()) if ! source "${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc"; then @@ -29,10 +29,20 @@ if ! source "${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc"; then fi trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM + # Define default dirs / get configs source "${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc" -# Function to detect whether we can use the new way (vmx via http) or the old way (legacy): -source "${RUNVIRTINCLUDEDIR}/detect_legacy.inc" # This yields LEGACY, IMGUUID, IMGVMX + +# Read needed variables from XML file +source "${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc" + +# Download meta data from server (e.g. vmx for vmware) +source "${RUNVIRTINCLUDEDIR}/download_vm_metadata.inc" + +if ! isset IMGUUID TMPCONFIG TMPDIR USER; then + slxlog "run-virt" "Internal sanity check failed: One of IMGUUID TMPCONFIG TMPDIR USER is not set." + cleanexit 1 +fi if [ "$LEGACY" ]; then @@ -54,13 +64,6 @@ fi # Proper meta data received - proceed normally -# check for important files used (filecheck()) - vestigial? -# This include does not currently work. TODO. -# source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc && filecheck - -# Read needed variables from XML file -source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc - # Helper that looks for virtualizer-specific include, show error to user if not found source "${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc" @@ -72,22 +75,22 @@ source "${RUNVIRTINCLUDEDIR}/setup_firewall.inc" || writelog "Could not source s setup_firewall || writelog "Could not run setup_firewall" # Sound setup -source ${RUNVIRTINCLUDEDIR}/setup_sound.inc +source "${RUNVIRTINCLUDEDIR}/setup_sound.inc" # Declaration of hardware relatedt variables -source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.inc +source "${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.inc" # Start printer daemon -source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc +source "${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc" # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc. -source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc +source "${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc" # Try to use dnbd3 to access the image, nfs/cifs fallback -source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc +source "${RUNVIRTINCLUDEDIR}/setup_image_access.inc" # Window manager required for handling of popups etc. -source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc +source "${RUNVIRTINCLUDEDIR}/start_windowmanager.inc" # Source run-virt.include of virtualizer setup_vm_commandline @@ -95,9 +98,9 @@ setup_vm_commandline # It should have set this variable if all went well if [ -z "${VIRTCMD}" ]; then error_user "Fehler beim Starten der VM-Sitzung" " -Das Start-Script für den Virtualisierer $xmlvirt hat kein Kommando +Das Start-Script für den Virtualisierer $PLUGIN_ID hat kein Kommando zum Starten der Sitzung definiert. Kann Sitzung nicht initialisieren." - slxlog "virt-plugin-error" "run-virt.include for $xmlvirt did not set VIRTCMD" + slxlog "virt-plugin-error" "run-virt.include for $PLUGIN_ID did not set VIRTCMD" cleanexit 1 fi diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include index 1f0b209a..344ccc48 100644 --- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include +++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include @@ -11,10 +11,14 @@ # ----------------------------------------------------------------------------- # Include file (general template) for run-virt.include of the virtualbox plugin +# TODO: Move this server side (just like vmware) +# !! A lot of variable names have changed and are NOT updated here !! +# Oh and for the love of god remove the above comment when this works again + cat << EOF > "${machconfig}" <?xml version="1.0"?> <VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.14-linux"> - <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}"> + <Machine uuid="{${machineuuid}}" name="${VM_DISPLAYNAME}" OSType="${VM_OS_TYPE}"> <MediaRegistry> <HardDisks> <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}"/> diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include index 1b116f32..59dd712d 100755 --- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include +++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include @@ -14,261 +14,165 @@ # - component for virtualbox of the vmchooser plugin vmchooser-run_virt ################################################################################ +[ -r /run/hwinfo ] && source /run/hwinfo + ################################################################################ ### declaration of default variables ################################################################################ -VMCHOOSERVBOX="/opt/openslx/vmchooser/${self}" -confdir="${TMPDIR}/vbox" # dir for configs -export VBOX_USER_HOME=${confdir} # instead of $HOME/.VirtualBox -# define dirs and files which can be removed after exit, be carefull! -# TODO: Machanism not in use anymore. A better approach would be anyways to -# Define a fixed directory which can be deleted recursively on exit. $TMPDIR -# would be a start. -#RMDIRS="${snapshotdir} ${confdir} /tmp/virt/.vbox-${USER}-ipc" -# rm -rf ${RMDIRS} 2>/dev/null -machfolder="${confdir}/Machines" -# use vm_shortname for dir and config names since vm_name can be very long -machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml" -diskfolder="${confdir}/HardDisks" -snapshotdir=${machfolder}/${vm_shortname}/Snapshots -mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null -[ -z "${diskless}" ] && diskless=0 # check if diskless var empty? -guestaudio="HDA" # default guest audio controller (SB16, AC97, HDA) -vb_network_card="82540EM" # default guest network adaptor (Am79C970A, Am79C973, 82540EM) +if ! isset VM_NAME_CLEAN IMG_BASENAME SRC_IMG_ABSOLUTE VM_OS_TYPE; then + env=$(mktemp) + env > "$env" + slxlog -d "virt-vbox-init" "A required variable is not set." "$env" + writelog "Incomplete variable set passed from main run-virt" + error_user "Wichtige variablen, die das VBox Plugin benötigt, wurden nicht +gesetzt. Kann die VM nicht starten." + cleanexit 1 +fi + +declare -rg VMCHOOSERVBOX="/opt/openslx/vmchooser/${self}" +declare -rg VBOX_ROOT="${TMPDIR}/vbox" # dir for configs +declare -rg VBOX_MACHINES_DIR="${VBOX_ROOT}/Machines" +declare -rg VBOX_SNAPSHOT_DIR="${VBOX_MACHINES_DIR}/${VM_NAME_CLEAN}/Snapshots" +declare -rg VBOX_HDD_DIR="${VBOX_ROOT}/HardDisks" +declare -rg VBOX_HDD_LINK="${VBOX_HDD_DIR}/${IMG_BASENAME}" + +export VBOX_USER_HOME="${VBOX_ROOT}" # instead of $HOME/.VirtualBox + +# use VM_NAME_CLEAN for dir and config names since VM_DISPLAYNAME can be very long +VBOX_MACHINE_CONFIG="${VBOX_MACHINES_DIR}/${VM_NAME_CLEAN}/${VM_NAME_CLEAN}.xml" +mkdir -p "${VBOX_HDD_DIR}" "${VBOX_SNAPSHOT_DIR}" 2>/dev/null enable2d="true" # default setting for accelerated 2D grapics (OS dependent) vram="128" # set default graphics ram +snapshotuuid="34f617be-192a-46b3-a8ae-bce1029e093f" # snapshot UUID is static -# configure our own rwimg, empty image which we provide -if [ "${imgmode}" = "rwimg" ]; then - imgname="${vm_shortname}.vdi" # what is our rwimg called? - vmpath=${imgpath}/${imgname} - if ! [ -e "${vmpath}" ]; then - cat /opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz | gunzip > "${vmpath}" +# link to image, determine extension (type) +imgfmt=$(echo ${SRC_IMG_ABSOLUTE##*.} | tr '[a-z]' '[A-Z]') +if [ -n "$VM_DISKFILE_RW" ]; then + ln -sf "${VM_DISKFILE_RW}" "${VBOX_HDD_LINK}" +else + ln -sf "${VM_DISKFILE_RO}" "${VBOX_HDD_LINK}" + # image is RO, we only support VDI? + if [ "$imgfmt" != "VDI" ]; then + writelog "Image is not VDI, cannot create snapshot.." + error_log "Die gewählte VM nutzt VBox, hat aber kein VDI image (sondern '$imgfmt'), kann VM nicht starten." + cleanexit 1 fi fi -# link to image -diskfile="${diskfolder}/${imgname}" -[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile} - -# check the file type -if echo ${imgname} | grep -qiE "vdi|vhd" && [ ${diskless} -eq 0 ]; then - imgfmt=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]") -elif [ ${diskless} -eq 0 ]; then - writelog "${imgname} is not a valid image format (vdi|vhd), exiting!" - cleanexit 1 -fi - -npaging="false" # nested paging: Default: not enabled -enablevt="false" # VT: Default: not enabled -[ ${vtflag} -eq 0 ] && cpu_cores=1 # check for VT, if not available only 1 cpu supported -[ ${vtflag} -eq 1 ] && enablevt="true" # Setting some default variables shfolders="TRUE" +enablevt="true" # set some base configuration depending on the guest operating system -case "${vmostype}" in - win31*) - guestaudio="SB16" - vb_network_card="Am79C973" - vmostype="Windows31" +case "${VM_OS_TYPE}" in + Windows31) mem="32" vram="16" cpu_cores=1 enablevt="false" shfolders="FALSE" - ;; - winnt*) - guestaudio="SB16" - vb_network_card="Am79C973" - vmostype="Windows31" - mem="32" + ;; + WindowsNT) + mem="4096" vram="16" - cpu_cores=1 + cpu_cores=4 enablevt="false" shfolders="FALSE" - ;; - win95*) - vmostype="Windows95" - guestaudio="SB16" - vb_network_card="Am79C973" - mem="92" + ;; + Windows95) + mem="128" vram="32" cpu_cores=1 enablevt="false" shfolders="FALSE" - ;; - win98*) - vmostype="Windows98" - guestaudio="SB16" - vb_network_card="Am79C973" + ;; + Windows98) mem="256" vram="64" cpu_cores=1 shfolders="FALSE" - ;; - winme*) - vmostype="WindowsMe" - guestaudio="AC97" - vb_network_card="Am79C973" + ;; + WindowsMe) mem="256" vram="64" cpu_cores=1 shfolders="FALSE" - ;; - winxp*|windowsxp*) - vmostype="WindowsXP" - guestaudio="AC97" - ;; - winvista*|windowsvista*) - vmostype="WindowsVista" - ;; - windows7*) - vmostype="Windows7" - ;; - windows8*) - vmostype="Windows8" - ;; - linux*|*ubuntu*|*suse*|debian*|*sci*) - if echo "${vmostype}" | grep -q "64"; then - vmostype="Linux26_64" - # check for vtflag - if [ ${vtflag} -ne 1 ]; then - writelog "You are trying to boot a 64 bit OS without a VT enabled CPU" - writelog "This is not supported, exiting!" - cleanexit 1 - fi - # check if host is only 32 bit, then use only 1 cpu (only 1 supported) - if echo "${host_arch}" | grep -qE "i.86"; then - cpu_cores=1 - fi - else - vmostype="Linux26" - fi - ;; - os2*) + ;; + WindowsXP) + ;; + WindowsVista) + ;; + Windows7) + ;; + Windows8) + ;; + OS2eCS) mem="256" - vmostype="OS2eCS" cpu_cores=1 enable2d="false" - ;; - macos*|MacOS*) - vmostype="MacOS" + ;; + MacOS) enable2d="false" - ;; + ;; + Linux*) + ;; *) - vmostype="Other" + VM_OS_TYPE="Other" enable2d="false" - ;; + ;; esac +if [ "$HW_KVM" != "ENABLED" ]; then + enablevt="false" + cpu_cores=1 # check for VT, if not available only 1 cpu supported +fi + writelog "Directories:" -writelog "\tConfig dir:\t\t$confdir" -writelog "\tMachines dir:\t\t$machfolder" -writelog "\tMachine config:\t\t$machconfig" -[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder" +writelog "\tConfig dir:\t\t$VBOX_ROOT" +writelog "\tMachines dir:\t\t$VBOX_MACHINES_DIR" +writelog "\tMachine config:\t\t$VBOX_MACHINE_CONFIG" ################################################################################ ### Hardware checks ################################################################################ # remove ':' from MAC addr for vbox and generate a VDE (virtual device ethernet) -# MAC addr from the first one (put in prefix 0DE) +# MAC addr from the first one (put in prefix 00DE) macaddr=$(echo ${macaddr} | sed 's/://g') vdemacaddr=$(echo ${macaddr} | sed 's/^..../00DE/g') machineuuid="00000000-0000-0000-0000-${macaddr}" # machine UUID, MAC addr part of it machineuuid=$(echo ${machineuuid} | tr "[A-Z]" "[a-z]") # cosmetical, since UUID in lower case -# get UUID of VBox image, if not diskless -[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \ - | grep UUID | grep -v "Parent UUID" | awk '{print $2}' \ - | grep -v use ) # nec. for VBox >= 4 -imgtype="Immutable" # make disk immutable -snapshotuuid="34f617be-192a-46b3-a8ae-bce1029e093f" # snapshot UUID is static -imageuuid=${snapshotuuid} # imageuuid in machine.include, default snapshotuuid - -# check if rw image -# remove disk and add rwimg if set -if echo "${imgmode}" | grep -q rw; then - # lock existing? - if [ -e "${vmpath}.lock" ]; then - writelog "This rw image is already in use." - writelog "Found lock: ${vmpath}.lock, exiting!" - writelog "Remove lock if you are sure that this is not the case" - cleanexit 1 - # image rw? - elif ! [ -w ${vmpath} ]; then - writelog "You defined mode rw, but image ${vmpath} is not rw! \c" - writelog "Please correct, exiting!" - cleanexit 1 - fi - touch "${vmpath}.lock" # add lock - #RMDIRS="${RMDIRS} ${vmpath}.lock" # remove lock after VM stopped TODO See note at the top +# get UUID of VBox image +diskuuid=$(VBoxManage -q showvdiinfo ${VBOX_HDD_LINK} \ + | grep UUID | grep -v "Parent UUID" | awk '{print $2}' \ + | grep -v use ) # nec. for VBox >= 4 + + +if [ -n "$VM_DISKFILE_RW" ]; then + # Image is already RW - easy imgtype="Normal" - imageuuid=${diskuuid} # replace image uuid in machine config -elif [ ${diskless} -eq 0 ]; then - # use temp disk as snapshot - cat ${VMCHOOSERVBOX}/empty-diff.vdi.gz \ - | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi" - # patch the disk file uuid into the snapshot vdi file - dd if=${diskfile} of="${snapshotdir}/{${snapshotuuid}}.vdi" seek=424 \ - skip=392 bs=1 count=16 conv=notrunc + imageuuid=${diskuuid} +else + # use temp disk as snapshot to get CoW + imgtype="Immutable" # make disk immutable + imageuuid=${snapshotuuid} + < "${VMCHOOSERVBOX}/empty-diff.vdi.gz" gunzip > "${VBOX_SNAPSHOT_DIR}/{${snapshotuuid}}.vdi" + # patch the disk file uuid into the snapshot vdi file: + # We read from offset 424 in the source HDD and write to offset 392 in out prepared + # CoW container. 16 bytes will be copied, which is the binary UUID + # TODO: This requires the image to be a vdi/vdh; Afaik, vbox supports vmdk, + # so this code would break in that case. Can we use the diskuuid we got via + # VBoxManage, convert to binary, and patch it + dd if=${VBOX_HDD_LINK} of="${VBOX_SNAPSHOT_DIR}/{${snapshotuuid}}.vdi" seek=424 \ + skip=392 bs=16 count=1 conv=notrunc fi -# TODO: MEM muss noch angepasst werden. Maschine crasht wenn mehr als 50% MEM -# memory part equal to vmware plugin -# percentage of memory to use for virtualbox in standard case -#if [ -n "${forcemem}" ]; then -# mem="${forcemem}" -#else -# permem=30 -# if [ "${totalmem}" -ge "1600" ]; then -# permem=40 -# fi -# # check if /tmp is on harddisk -# if grep -qe "/dev/.* /tmp " /proc/mounts ; then -# permem=60 -# id44="1" -# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well -# # (40% vmware | 40% confdir(vmem...) | 20% host -# # VMplayer 2+ issue -# # TODO: makes this sense for vbox? -# #if [ "${totalmem}" -ge "2500" ]; then -# #permem=40 -# #rmdir ${snapshotdir} -# #snapshotdirold=${snapshotdir} -# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID} -# #mkdir -p ${snapshotdir} -# #ln -sf ${snapshotdir} ${snapshotdirold} -# #fi -# fi -# mem=$(expr ${totalmem} / 100 \* ${permem}) -# if [ "${id44}" = "1" ]; then -# hostmem=$(expr ${totalmem} - ${mem}) -# else -# hostmem=$(expr ${totalmem} - ${mem} - ${mem}) -# fi -# #permem=40 -# #mem=$(expr ${totalmem} * ${permem}) -#fi - -# translate network cards -case "${network_card}" in - e1000) - vb_network_card="82540EM" - ;; - virtio) - vb_network_card="virtio" - ;; - *) - network_card="pcnet" - vb_network_card="Am79C973" -esac - # translate network kinds (nat, bridged, host-only) +# TODO: Server should prepare this in returned xml case "${network_kind}" in bridge*) network_kind='HostOnlyInterface name="vboxnet0"' @@ -280,57 +184,19 @@ case "${network_kind}" in network_kind='HostOnlyInterface name="vboxnet1"' esac -# configure 3d settings -case "${enable3d}" in - *true*|*yes*) - enable3d="true" - ;; - *) - enable3d="false" - ;; -esac +boot="HardDisk" -# translate boot, use if set else set to HardDisk -# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network -# support nfs and tftp as well -case ${boot} in - n*|tftp) - boot="Network" - if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then - vm_name=${vm_shortname} # use vm_shortname to avoid Problems /w TFTP in NAT - mkdir -p ${confdir}/TFTP # link TFTP dir for NAT TFTP boots - if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then - cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe - else - writelog "${virtualbox_tftpdir}/pxelinux.0 not found!" - writelog "Network boot won't work, exiting!" - cleanexit 1 - fi - for i in $(ls ${virtualbox_tftpdir}); do - ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i} - done - fi - ;; - # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM - *) - boot="HardDisk" - ;; -esac - -vrdpport=${remotedesktopport} # external GUI - -[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir" +writelog "\tSnapshots dir:\t\t$VBOX_SNAPSHOT_DIR" writelog "Diskimage:" -[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile" -[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt" -[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype" - writelog "\tVMostype:\t\t$vmostype" - writelog "\tMachine UUID:\t\t$machineuuid" -[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid" +writelog "\tDisk file:\t\t$VBOX_HDD_LINK" +writelog "\tDisk type:\t\t$imgtype" +writelog "\tVMostype:\t\t$VM_OS_TYPE" +writelog "\tMachine UUID:\t\t$machineuuid" +writelog "\tDisk UUID:\t\t$diskuuid" writelog "Virtual Hardware:" writelog "\tCPU cores:\t\t${cpu_cores}\c" -[ ${vtflag} -eq 0 ] && writelog "" -[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)" +writelog "" +[ "$HW_KVM" = "ENABLED" ] && writelog " (VT enabled CPU)" writelog "\tGuest RAM:\t\t${mem} MB" # echo nur wenn hostmem gesetzt [ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB" @@ -338,10 +204,7 @@ writelog "\tMAC address:\t\t$macaddr" writelog "\tNetwork card:\t\t${vb_network_card}" writelog "\tNetwork kind:\t\t${network_kind}" writelog "\tBooting from:\t\t${boot}\c" -[ ${diskless} -eq 0 ] && writelog "" -[ ${diskless} -eq 1 ] && writelog " 'diskless'" -# TODO: server start activate via xml, etc... -#writelog "\tGuest VRDP port:\t${vrdpport}" +writelog "" writelog "\tCD-ROM1:\t\t${cdrom0}" #writelog "\tCD-ROM2:\t\t${cdrom1}" writelog "\tFloppy_A:\t\t${floppy0}" @@ -357,60 +220,31 @@ writelog "\tShared Folders '${sharename}':\t${sharepath}" # Shares given? if [ "x$shfolders" != "xFALSE" ]; then - sharelist="<SharedFolders> + sharelist="<SharedFolders> <SharedFolder name=\"${homesharename}\" hostPath=\"${homesharepath}\" writable=\"true\"/> <SharedFolder name=\"${commonsharename}\" hostPath=\"${commonsharepath}\" writable=\"true\"/> </SharedFolders>" else - sharelist='' + sharelist='' fi -source ${VMCHOOSERVBOX}/virtualbox.include # create Virtualbox.xml +source "${VMCHOOSERVBOX}/virtualbox.include" # create Virtualbox.xml # remove snapshot disk when using rw images if [ "${imgtype}" != "Immutable" ]; then - sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml" + sed -i "/${snapshotuuid}/d" "${VBOX_ROOT}/VirtualBox.xml" fi # TODO: add rawdisk if requested #"raw.vmdk" format="VMDK" type="Writethrough"/> -source ${VMCHOOSERVBOX}/machine.include # create machine.xml +source "${VMCHOOSERVBOX}/machine.include" # create machine.xml # remove CD-ROM if not available if [ "${cdrom0}" != "TRUE" ]; then - sed -i "/HostDrive/d" ${machconfig} - sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig} - sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" ${machconfig} -fi - -# if diskless remove all disks -if [ ${diskless} -eq 1 ]; then - sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml" - sed -i "/${imageuuid}/d" ${machconfig} - sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig} - sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->/d" ${machconfig} -fi - -# define redirects -if [ ${redirects} -ge 1 ]; then - (( i=1 )) - writelog "\tGuest redirects:\t\c" - while [ ${i} -le ${redirects} ]; do - extradataitem='<ExtraDataItem name="VBoxInternal/Devices' - extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config" - extradataitem="${extradataitem}/${redirect_name[$i]}/" - extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>" - extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>" - extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>" - sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\ - ${extradataitem}${extradatahostport}\n\ - ${extradataitem}${extradataprotocol}\n\ - </ExtraData>," "${machconfig}" - writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}" - tabspace='\t\t\t\t' - (( i=$i+1 )) - done + sed -i "/HostDrive/d" "${VBOX_MACHINE_CONFIG}" + sed -i '/AttachedDevice.*type="DVD"/d' "${VBOX_MACHINE_CONFIG}" + sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" "${VBOX_MACHINE_CONFIG}" fi ################################################################################ diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include index 62143c54..70a036a8 100644 --- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include +++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include @@ -11,7 +11,7 @@ # ----------------------------------------------------------------------------- # Include file (general template) for run-virt.include of the virtualbox plugin -cat << EOF > "${confdir}/VirtualBox.xml" +cat << EOF > "${VBOX_ROOT}/VirtualBox.xml" <VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-linux"> <Global> <ExtraData> @@ -27,7 +27,7 @@ cat << EOF > "${confdir}/VirtualBox.xml" <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/> </ExtraData> <MachineRegistry> - <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/> + <MachineEntry uuid="{${machineuuid}}" src="Machines/${VM_NAME_CLEAN}/${VM_NAME_CLEAN}.xml"/> </MachineRegistry> <MediaRegistry> <HardDisks> diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc index 84d959ea..11ea2e3a 100644 --- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc @@ -9,116 +9,116 @@ sound="es1371" # define hardware configuration depending on the guest OS used # this needs to be fixed and is the base for the creation of new VMs -case "$vmostype" in +case "$VM_OS_TYPE" in win31*|windows31*) - vmostype="win31" + VM_OS_TYPE="win31" shfolders="FALSE" sound="sb16" MAXMEM="32" MAXCORES="1" ;; winnt*|windowsnt*) - vmostype="winnt" + VM_OS_TYPE="winnt" shfolders="FALSE" sound="sb16" MAXMEM="1000" MAXCORES="2" ;; win95*|windows95*) - vmostype="win95" + VM_OS_TYPE="win95" shfolders="FALSE" MAXMEM="96" MAXCORES="1" ;; win98*|windows98*) - vmostype="win98" + VM_OS_TYPE="win98" MAXMEM="256" MAXCORES="1" ;; winme*|windowsme*) - vmostype="winme" + VM_OS_TYPE="winme" MAXMEM="384" MAXCORES="1" ;; win2000|windows2000|win2000pro*) - vmostype="win2000pro" + VM_OS_TYPE="win2000pro" MAXMEM="4000" MAXCORES="2" ;; win2000srv*|windows2000srv*|win2000serv*|windows2000serv*) - vmostype="win2000serv" + VM_OS_TYPE="win2000serv" shfolders="FALSE" MAXMEM="4000" MAXCORES="4" ;; win2000adv*|windows2000adv*|win2000dat*|windows2000dat*) - vmostype="win2000advserv" + VM_OS_TYPE="win2000advserv" shfolders="FALSE" MAXMEM="8000" MAXCORES="8" ;; winnet*64|win*2003*64|windowsnet*64) - vmostype="winnetstandard-64" + VM_OS_TYPE="winnetstandard-64" MAXMEM="8000" MAXCORES="8" ;; winnet*|win*2003*|windowsnet*) - vmostype="winnetstandard" + VM_OS_TYPE="winnetstandard" MAXMEM="4000" MAXCORES="8" ;; winxphome*|windowsxphome*) - vmostype="winxphome" + VM_OS_TYPE="winxphome" MAXMEM="4000" MAXCORES="2" ;; winxp*64|windowsxp*64) - vmostype="winxppro-64" + VM_OS_TYPE="winxppro-64" MAXMEM="8000" MAXCORES="8" ;; winxp*|windowsxp*) - vmostype="winxppro" + VM_OS_TYPE="winxppro" MAXMEM="4000" MAXCORES="4" ;; winvista-64) - vmostype="winvista-64" + VM_OS_TYPE="winvista-64" MAXMEM="16000" MAXCORES="4" ;; windows7-64) - vmostype="windows7-64" + VM_OS_TYPE="windows7-64" MAXMEM="32000" MAXCORES="8" ;; windows8-64) - vmostype="windows8-64" + VM_OS_TYPE="windows8-64" MAXMEM="32000" MAXCORES="8" ;; windows9-64) - vmostype="windows9-64" + VM_OS_TYPE="windows9-64" MAXMEM="64000" MAXCORES="8" ;; winvista) - vmostype="winvista" + VM_OS_TYPE="winvista" MAXMEM="8000" MAXCORES="2" ;; windows7) - vmostype="windows7" + VM_OS_TYPE="windows7" MAXMEM="8000" MAXCORES="4" ;; windows8) - vmostype="windows8" + VM_OS_TYPE="windows8" MAXMEM="8000" MAXCORES="4" ;; windows9) - vmostype="windows9" + VM_OS_TYPE="windows9" MAXMEM="8000" MAXCORES="4" ;; @@ -131,36 +131,36 @@ case "$vmostype" in MAXCORES="1" ;; dos|msdos*|ms-dos*) - vmostype="dos" + VM_OS_TYPE="dos" shfolders="FALSE" MAXMEM="128" MAXCORES="1" ;; macos*64) - vmostype="freebsd-64" + VM_OS_TYPE="freebsd-64" MAXMEM="4000" MAXCORES="2" ;; macos*) - vmostype="freebsd" + VM_OS_TYPE="freebsd" MAXMEM="4000" MAXCORES="1" ;; beos*) - vmostype="other" + VM_OS_TYPE="other" shfolders="FALSE" ;; # Unknown guestOS setting in .xml - this encompasses linux too, # as there is a multitude of different distributions. Perhaps further # action will be needed if this leads to problems with exotic OSs. *64) - vmostype="other-64" + VM_OS_TYPE="other-64" # shfolders="FALSE" MAXMEM="123456" MAXCORES="4" ;; *) - vmostype="other" + VM_OS_TYPE="other" # shfolders="FALSE" MAXMEM="8000" MAXCORES="1" diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc index f7f09c65..e6776882 100644 --- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc @@ -46,14 +46,13 @@ fi # image writelog "Diskimage:" -writelog "\tDiskfile:\t${diskfile}" -writelog "\tDisktype:\t${hddrv}" -writelog "\tHWVersion:\t${hwver}" -writelog "\tVMostype:\t${vmostype}" +writelog "\tDiskfile:\t${VM_DISKFILE_RO}" +writelog "\tHWVersion:\t${HWVER}" +writelog "\tVMostype:\t${VM_OS_TYPE}" # misc writelog "Misc:" -writelog "\tDisplayname:\t${displayname}" +writelog "\tDisplayname:\t${VM_DISPLAYNAME}" if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then writelog "\t3D Graphics:\tenabled" fi diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc index 0c45ee59..da820bc6 100644 --- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc @@ -3,8 +3,6 @@ ##################################################################### set_vmware_include_variables() { - [ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800 - # temporary disk space for logs, etc... redodir="/tmp/virt/vmware/${USER}.$$" @@ -14,9 +12,6 @@ set_vmware_include_variables() { # configfile conffile="${confdir}/run-vmware.conf" - # diskfile - diskfile="${vmpath}" - # users vmware config folder [ -z "${HOME}" ] && HOME=$(getent passwd "$(whoami)" | awk -F ':' '{print $6}') vmhome="${HOME}/.vmware" diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc index 41548154..e664f02f 100644 --- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc @@ -1,7 +1,7 @@ # check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE # and VM_DISK_REDOLOGDIR. -sed -i 's#%VM_DISK_PATH%#'"$vm_diskfile"'#g' "${TMPCONFIG}" +sed -i 's#%VM_DISK_PATH%#'"$VM_DISKFILE_RO"'#g' "${TMPCONFIG}" sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "${TMPCONFIG}" sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "${TMPCONFIG}" diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include index 84679ebf..f66bc9b8 100644 --- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include @@ -20,7 +20,7 @@ ################################################################################ VMWAREINCLUDEDIR=/opt/openslx/vmchooser/vmware/includes -vmostype=$(rv_clean_string "$vmostype") +VM_OS_TYPE=$(rv_clean_string "$VM_OS_TYPE") # declaration of default variables for vmware source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables |