diff options
| author | Christian Rößler | 2015-09-11 17:29:54 +0200 |
|---|---|---|
| committer | Christian Rößler | 2015-09-11 17:29:54 +0200 |
| commit | 0490caf38b0625b612e050bff57d4ce92c87c2af (patch) | |
| tree | 4811d2eaeeacc3d03a61565123fb055203ffb029 /remote | |
| parent | [chroot] Little bug fix: removed forgotten dev.-mount (diff) | |
| download | tm-scripts-0490caf38b0625b612e050bff57d4ce92c87c2af.tar.gz tm-scripts-0490caf38b0625b612e050bff57d4ce92c87c2af.tar.xz tm-scripts-0490caf38b0625b612e050bff57d4ce92c87c2af.zip | |
[runvirt] [vmware] WARNING: Further testing needed! Two branches: Non-Legacy, Legacy.
Big scripts vmchooser-run_virt and vmware runvirt include broken into includes, tidied.
More cosmetics needed, but it works so far.
Diffstat (limited to 'remote')
32 files changed, 1969 insertions, 1240 deletions
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/check_lpd.inc b/remote/modules/run-virt/data/opt/openslx/scripts/check_lpd.inc new file mode 100644 index 00000000..8286bbaa --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/check_lpd.inc @@ -0,0 +1,11 @@ +############################################ +# Include: Checking whether lpd is running # +############################################ + +# Check if tcpsvd is running. Do this down here so we do not check +# immediately after trying to spawn it, as this could result in +# success even if it's not really working. + +if ! kill -0 "$PID_LPD"; then + slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session" +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/check_runvirt_needed_files.inc b/remote/modules/run-virt/data/opt/openslx/scripts/check_runvirt_needed_files.inc new file mode 100644 index 00000000..fbb0bc70 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/check_runvirt_needed_files.inc @@ -0,0 +1,53 @@ +################################################################# +# 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/scripts/check_runvirt_xml_sanity_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/check_runvirt_xml_sanity_legacy.inc new file mode 100644 index 00000000..d331e1af --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/check_runvirt_xml_sanity_legacy.inc @@ -0,0 +1,23 @@ +####################################################### +# Include: check xml file for sanity (legacy, old way # +####################################################### + +# test if the xml file is valid +if ! [ -r "${xmlfile}" ]; then + writelog "${xmlfile} not a readable XML file!" + slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile" + exit 1 +fi + +# test if XML file +if ! grep -q '<?xml' "${xmlfile}"; then + writelog "Submitted configuration file ${xmlfile} seems to have wrong XML format" + slxlog "virt-invalid-xml" "Malformed XML file: $xmlfile" "$xmlfile" + exit 1 +fi + +# check for running in graphical environment otherwise no much use here +if [ -z "$DISPLAY" ]; then + echo -e "\n\tStart only within a graphical desktop!\n" + exit 1 +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/detect_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/detect_legacy.inc new file mode 100644 index 00000000..4c3a2f2b --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/detect_legacy.inc @@ -0,0 +1,25 @@ +######################################################## +# Include: Detect, whether runvirt runs in legacy mode # +######################################################## + +# Legacy mode: As runvirt has been before. +# New mode: uuid in xml _and_ vmx given via http. + +# First, let's try to extract an imguuid from xmlfile: +IMGUUID=$(grep -io '<uuid param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') + +# Temporary directory for run-virt related stuff +TMPDIR=$(mktemp -d -p /tmp/virt) + +# Then get a template (vmx) file via http/wget: +wget --output-document="$TMPDIR/$IMGUUID" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}" + +writelog "IMGUUID: -$IMGUUID- --- TMPDIR: ${TMPDIR}" + +if [ -n "$IMGUUID" ] && [ -n "$TMPDIR/$IMGUUID" ]; then + LEGACY= # no legacy; both strings set + writelog "Current (non-legacy) mode detected." +else + LEGACY=: # legacy: One or both strings not set + writelog "Legacy mode detected." +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_dir_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_dir_legacy.inc new file mode 100644 index 00000000..c3c6f7b3 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_dir_legacy.inc @@ -0,0 +1,50 @@ +######################################################### +# Include: Get xml file and directory (legacy, old way) # +######################################################### + +## Added for persistent support. +diskmode='nonpersistent' +if [[ "$(grep --extended-regexp \ + '< *short_description *param=".+ --persistent--"' "$1")" ]]; then + diskmode='persistent' + imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \ + | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + originalImageFileName="$(grep -io '<image_name param=.*"' \ + "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \ + '{ print $2 }')" + originalVMDKFilePath="$(dirname \ + "$originalXMLFilePath")/${originalImageFileName}" + # Added to workaround path prefix coming from temporary generated xml file + # by vmchooser. + if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \ + "$imageFilePath")" ]]; then + imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \ + <<< "$imageFilePath") + sed -ir \ + "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \ + 's/\\/\\\\/g' -e 's/\//\\\//g' -e \ + 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1" + fi + # Create linked clone if not exists. + if [ ! -f "$imageFilePath" ]; then + mkdir -p "$(dirname "$imageFilePath")" && \ + bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \ + "$imageFilePath" --debug --verbose &>"${LOGFILE}" + fi +fi + +# 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" + +DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")" + diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables.inc new file mode 100644 index 00000000..90d59beb --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables.inc @@ -0,0 +1,99 @@ +########################################### +# Include: Set hardware related variables # +########################################### + +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:" + +# # 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/} + +writelog "imgname: $imgname--" + +# 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}" +fi + +# 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="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")" + +# vm_name = displayname, define for old scripts +displayname="${vm_name}" + +# image is for the following virtual machine +xmlvirt=$(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" + +# 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 + +# Set redirects to 0, see vmgrid if you want to define some +redirects=0 + +writelog "\tVirtualization:\t\t$xmlvirt" +writelog "\tVM name:\t\t$vm_name" +writelog "\tVM short name:\t\t$vm_shortname" + diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables_legacy.inc new file mode 100644 index 00000000..3fdc06d2 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/get_xml_file_variables_legacy.inc @@ -0,0 +1,120 @@ +########################################### +# Include: Set hardware related variables # +########################################### + +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:" + +# 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/} + +## Added for persistent support. +if [[ "$userBranchFilePath" ]]; then + imgname="$userBranchFilePath" +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. +elif [[ "$userBranchFilePath" ]]; then + vmpath="$userBranchFilePath" +else + # Else use same path as xml + imgpath="${xmlpath}" + vmpath="${imgpath}/${imgname}" +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="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")" + +# vm_name = displayname, define for old scripts +displayname="${vm_name}" + +# image is for the following virtual machine +xmlvirt=$(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" + +# 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 + +# 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]") +override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]") + +# 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=.*"' "${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" + diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/print_runvirt_console_logo.inc b/remote/modules/run-virt/data/opt/openslx/scripts/print_runvirt_console_logo.inc new file mode 100644 index 00000000..649cf956 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/print_runvirt_console_logo.inc @@ -0,0 +1,12 @@ +####################################### +# Include: Print Logo for console use # +####################################### + +cat <<EOL + __ __ + .----.--.--.-----.___.--.--.|__|.----.| |_ + | _| | | |___| | || || _|| _| + |__| |_____|__|__| \___/ |__||__| |____| + OpenSLX virtual machine environment preparation script ... + +EOL diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables.inc new file mode 100644 index 00000000..400c1bf4 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables.inc @@ -0,0 +1,88 @@ +########################################### +# Include: Set hardware related variables # +########################################### + +# take last two digits of current pid... +VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2) + +# Make sure cpu_cores is not empty +cpu_cores=${cpu_cores:-"1"} + +# Amount of memory for the VM. Be generous if diff is written to HDD +if mount | grep -q '^/dev/sd.*on.*/tmp'; then + reserve=20 + min=768 + max=1536 +else + reserve=65 + min=768 + max=8192 +fi + +# Calculate absulute amount of RAM that should stay available to the host +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 ]" +if [ -n "$mainvirtmem" ]; then + forcemem="$[ "$mainvirtmem" / 4 * 4 ]" + mem="$forcemem" +fi +hostmem="$[ $totalmem - $mem ]" + +# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are +# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on +# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes +# and append $macaddrssuffix +macguestpart="00:50:56:${VM_ID}" +machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}') +macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]") +macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]") + +if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then + slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)" +fi + +# Virtual fd/cd/dvd and drive devices, floppy b: for configuration +# if $floppy_0 from virtualization.conf set then fdtest="TRUE" +fdtest=${floppy_0:+"TRUE"} +# if $fdtest not set floppy0="FALSE", else "TRUE" +floppy0=${fdtest:-"FALSE"} +floppy1="TRUE" +floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img" +# if $cdrom_0 from virtualization.conf set then cdtest="TRUE" +cdtest=${cdrom_0:+"TRUE"} +# if $cdtest not set cdrom0="FALSE", else "TRUE" +cdrom0=${cdtest:-"FALSE"} +# if $cdrom_1 from virtualization.conf set then cdtest="TRUE" +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) + +# Add rw share for home dir +homesharepath="${HOME}/PERSISTENT" +homesharename="home" + +# Add common share +commonsharepath="${HOME}/SHARE" +commonsharename="share" + +# Set hostname: using original hostname and adding string +hostname="virt-$(hostname)" + +writelog "\tVM Hostname:\t\t$hostname" + diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables_legacy.inc new file mode 100644 index 00000000..0da5e2be --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_hardware_variables_legacy.inc @@ -0,0 +1,89 @@ +########################################### +# Include: Set hardware related variables # +########################################### + +# take last two digits of current pid... +VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2) + +# Make sure cpu_cores is not empty +cpu_cores=${cpu_cores:-"1"} + +# Amount of memory for the VM. Be generous if diff is written to HDD +if mount | grep -q '^/dev/sd.*on.*/tmp'; then + reserve=20 + min=768 + max=1536 +else + reserve=65 + min=768 + max=8192 +fi + +# Calculate absulute amount of RAM that should stay available to the host +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 ]" +if [ -n "$mainvirtmem" ]; then + forcemem="$[ "$mainvirtmem" / 4 * 4 ]" + mem="$forcemem" +fi +hostmem="$[ $totalmem - $mem ]" + +# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are +# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on +# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes +# and append $macaddrssuffix +macguestpart="00:50:56:${VM_ID}" +machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}') +macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]") +macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]") + +if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then + slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)" +fi + +# Virtual fd/cd/dvd and drive devices, floppy b: for configuration +# if $floppy_0 from virtualization.conf set then fdtest="TRUE" +fdtest=${floppy_0:+"TRUE"} +# if $fdtest not set floppy0="FALSE", else "TRUE" +floppy0=${fdtest:-"FALSE"} +floppy1="TRUE" +floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img" +# if $cdrom_0 from virtualization.conf set then cdtest="TRUE" +cdtest=${cdrom_0:+"TRUE"} +# if $cdtest not set cdrom0="FALSE", else "TRUE" +cdrom0=${cdtest:-"FALSE"} +# if $cdrom_1 from virtualization.conf set then cdtest="TRUE" +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) + +# Add rw share for home dir +homesharepath="${HOME}/PERSISTENT" +homesharename="home" + +# Add common share +commonsharepath="${HOME}/SHARE" +commonsharename="share" + +# Set hostname: using original hostname and adding string +hostname="virt-$(hostname)" + +writelog "\tVM Hostname:\t\t$hostname" + diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_variables.inc new file mode 100644 index 00000000..9525a290 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/set_runvirt_variables.inc @@ -0,0 +1,14 @@ +###################################################### +# Include: Declaration of run-virt default variables # +###################################################### + +VMCHOOSER_DIR="/opt/openslx/vmchooser" +VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config" +LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log" + +# include general configuration from vmchooser +[ -f "$VMCHOOSER_CONF_DIR/vmchooser.conf" ] && . "$VMCHOOSER_CONF_DIR/vmchooser.conf" +# load general virtualization information +[ -f "$VMCHOOSER_CONF_DIR/virtualization.conf" ] && . "$VMCHOOSER_CONF_DIR/virtualization.conf" +# Load general openslx config +[ -f "/opt/openslx/config" ] && . "/opt/openslx/config" diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/setup_image_access.inc b/remote/modules/run-virt/data/opt/openslx/scripts/setup_image_access.inc new file mode 100644 index 00000000..9e0caa5e --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/setup_image_access.inc @@ -0,0 +1,54 @@ +########################################################### +# Include: Setup dnbd for image access, nfs/cifs fallback # +########################################################### + +writelog "Now in setup_image_access.inc ..." + +# Try to use dnbd3 to access the image +unset vm_diskfile +unset vm_revision +unset dnbd3 +unset dnbd3error +if [ -n "$SLX_DNBD3_SERVERS" -o -n "$SLX_DNBD3_PRIO_SERVERS" ] && [ "x$SLX_VM_DNBD3" = "xyes" ]; then + if [ -e "/dev/dnbd0" -a -e "/var/run/dnbd3.socket" ]; then + # Shuffle server list + [ -n "$SLX_DNBD3_SERVERS" ] && TMP_SERVERS=$(for SRV in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SRV"; done | sort -u | sed -r 's/^[0-9]+ //') + for SRV in $SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS; do + dnbd3=$(dnbd3-client -h "$SRV" -i "${imgrelpath}" -r 0) + RET=$? + if [ "$RET" = "0" ]; then + vm_revision=$(cat "/sys/block/${dnbd3#/dev/}/net/rid") + writelog "DNBD3: $vm_diskfile on $dnbd3 with rid $vm_revision" + vm_diskfile="$dnbd3" + vmpath="$vm_diskfile" + break + fi + dnbd3error="$dnbd3error ($RET/$dnbd3)" + usleep 200000 + done + if [ -z "$vm_diskfile" ]; then + slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found ($SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS $dnbd3error), trying NFS/CIFS..." + writelog "No working dnbd3 server found :-(" + fi + else + writelog "Can't use dnbd3 as it's not loaded, or the daemon is not running..." + fi +else + writelog "Can't use dnbd3 as no servers are given in config" +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 -1) + [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}" + vm_diskfile="$vmpath" +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!" + cleanexit 1 +fi + +writelog "Used diskfile: $vm_diskfile" diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/setup_printer_lpd.inc b/remote/modules/run-virt/data/opt/openslx/scripts/setup_printer_lpd.inc new file mode 100644 index 00000000..425ae9d9 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/setup_printer_lpd.inc @@ -0,0 +1,34 @@ +##################################### +# Include: Setup printer daemon LPD # +##################################### + +QUEUE="STANDARD" # This has to match the queue you configured in your VM +USER="$(/usr/bin/whoami)" +SPOOLDIR= + +### Disabled: 100megs is not enough, some jobs are HUGE, try to use temp which should be on disk +## Try using user's tmpfs home first, as it gets wiped on logout +#if [ -n "${HOME}" ] && [ -w "${HOME}" ]; then +# SPOOLDIR="${HOME}/.spool" +# mkdir -p "${SPOOLDIR}/${QUEUE}" +#fi +# If failed, try to fall back to /tmp + +if [ -z "${SPOOLDIR}" ] || [ ! -w "${SPOOLDIR}/${QUEUE}" ]; then + SPOOLDIR="/tmp/printergui-${USER}-$$-${RANDOM}" + rm -rf -- "${SPOOLDIR}" + if ! mkdir -p "${SPOOLDIR}/${QUEUE}"; then + slxlog "virt-spooldir" "Could not create spool directory ($SPOOLDIR) for $USER - printing will not work!" + # TODO: Warn user + fi + chmod 0700 "${SPOOLDIR}/${QUEUE}" +fi + +# Start the lpdaemon listening on the given port +# TODO: externalize with something like runvirt.d (other parts might benefit from that too) +tcpsvd -E 192.168.101.1 5515 \ + lpd "$SPOOLDIR" \ + ash -c "/opt/openslx/cups/printergui '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" & + +# PID to kill the process +PID_LPD="$!" diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/setup_sound.inc b/remote/modules/run-virt/data/opt/openslx/scripts/setup_sound.inc new file mode 100644 index 00000000..7b505474 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/setup_sound.inc @@ -0,0 +1,62 @@ +######################## +# Include: Setup sound # +######################## +# 8086:1e20: Sound card in bwPX4 + +if lspci -n | grep -E -i '8086:1e20( |$)'; then + VOL="100%" # bwPC 4: Speaker too quiet :-( +else + VOL="85%" +fi + +if true; then + # detecting which card is to be used + echo "Detecting which sound card to use ..." + PROC="/proc/asound/cards" + if [ ! -r "$PROC" ]; then + echo "'${PROC}' not found or not readable." + SOUND_CARD_INDEX=0 + SOUND_CARD_COUNT=1 + else + # Try to filter HDMI cards first + SOUND_CARD_INDEX=$(grep -v -i 'HDMI' "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1) + # If empty, try again with all + [ -z "${SOUND_CARD_INDEX}" ] && SOUND_CARD_INDEX=$(cat "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1) + if [ -z "${SOUND_CARD_INDEX}" ]; then + echo "No sound card found." + SOUND_CARD_INDEX=0 + fi + SOUND_CARD_COUNT=$(grep -E '^[[:space:]]{0,2}[0-9]+[[:space:]]+' "${PROC}" | wc -l) + fi + + SOUND_CARD_INDEX="$(grep -E -o '[0-9]+' <<<$SOUND_CARD_INDEX)" + echo "Detected sound card index is: $SOUND_CARD_INDEX" + echo "Sound card count: $SOUND_CARD_COUNT" + + # Adjust sound volume (playback)... Random mixer names we have encountered during testing + echo "Setting up volume..." + amixer -q -c "$SOUND_CARD_INDEX" sset 'Master' "$VOL" unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'PCM' "$VOL" unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'CD' "$VOL" unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Headphone' "$VOL" unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Front' "$VOL" unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Speaker' "$VOL" unmute + # Recording. It seems that (most) devices need the volume set to 0, so you + # don't hear your own mic input, but should be unmuted. Also on some cards, + # you need to set the cap option on the mic you want to use, while other cards + # will just ignore that option. + # Plus, most cards have a Capture mixer, which needs to be set to cap too, and + # have its volume turned up. (There'll probably be some cards that need yet + # another setup, but this works for now on 4 tested cards) + amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic Boost' "50%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic' "0%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic Boost' "50%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic' "0%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic Boost' "50%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic' "0%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Capture' "100%" cap unmute + amixer -q -c "$SOUND_CARD_INDEX" sset 'Input Source' 'Front Mic' # Let's hope nobody uses rear mic... + # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded + amixer -q -c pcsp sset Master "0%" mute + echo "Done setting up volume." +fi >> "${LOGFILE}" 2>&1 diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/setup_virtual_floppy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/setup_virtual_floppy.inc new file mode 100644 index 00000000..4b8e10aa --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/setup_virtual_floppy.inc @@ -0,0 +1,21 @@ +############################################## +# Include: Setup virtual floppy for drive b: # +############################################## + +# Copy guest configuration (with added information) config.xml to be accessed +# via virtual floppy +cp "$xmlfile" "$VMCHOOSER_DIR/fd-loop/config.xml" + +# Add another file with resolution information +xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' | grep -o -E '[0-9]+x[0-9]+' | head -n 1 > "$VMCHOOSER_DIR/fd-loop/hostres.txt" + +# Add our magic openslx binary that sets the correct guest resolution +cp "$VMCHOOSER_DIR/data/openslx.exe" "$VMCHOOSER_DIR/fd-loop/" +cp "$VMCHOOSER_DIR/data/SHARELWS.BAT" "$VMCHOOSER_DIR/fd-loop/" +rm "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" + +for SHARE in $(grep -o -E '^SLX_SHARE_.*_PATH' /opt/openslx/config); do + eval "echo -n \$${SHARE} | /opt/openslx/bin/tr '/' '\' " >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" + #eval echo -n " \$${SHARE%PATH}AUTH_PASS /user:\$${SHARE%PATH}AUTH_USER" >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" + echo -e '\r\n' >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" +done diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/setup_vm_hypervisor.inc b/remote/modules/run-virt/data/opt/openslx/scripts/setup_vm_hypervisor.inc new file mode 100644 index 00000000..b7bb8f01 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/setup_vm_hypervisor.inc @@ -0,0 +1,19 @@ +########################################################################## +# Include: Setup virtual machine hypervisor via vm-specific include file # +########################################################################## + +# Get all virtual machine specific stuff from the respective include file +if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then + # TODO: Tell user + 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." + cleanexit 1 +fi + + self="${xmlvirt}" + +# 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 (contains syntax errors?)" "$xmlvirt" + writelog "Erroneous run-virt.include for $xmlvirt" +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/start_pvs.inc b/remote/modules/run-virt/data/opt/openslx/scripts/start_pvs.inc new file mode 100644 index 00000000..90cd237b --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/start_pvs.inc @@ -0,0 +1,11 @@ +####################################################### +# Include: Starting PVS (Pool Video switch) if wanted # +####################################################### + +# if [ -e /etc/xdg/autostart/pvsgui.desktop ]; then +# /usr/local/bin/pvsgui -p 2 -b >/dev/null 2>&1 & +# fi + +if [[ "$DO_PROFILE" -ge "1" ]]; then + wget "http://132.230.8.113/profile/do.php?action=start" & +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/start_windowmanager.inc b/remote/modules/run-virt/data/opt/openslx/scripts/start_windowmanager.inc new file mode 100644 index 00000000..a3149c24 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/start_windowmanager.inc @@ -0,0 +1,18 @@ +#################################################### +# Include: Start windowmanager for easier handling # +#################################################### + +# Some problems may arise with windows opening in background when +# using eg. vmware without a window manager. + +for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do + if which $dm >/dev/null 2>&1 ; then + if [ "$dm" = "fvwm2" ] ; then + echo "EdgeScroll 0 0" > ${redodir}/fvwm + fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 & + else + $dm >/dev/null 2>&1 & + fi + break + fi +done diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env index c39803cd..2d1ceb0f 100755 --- a/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env +++ b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env @@ -53,6 +53,8 @@ mount -n -t msdos -o loop,umask=000 "${VMCHOOSER_DIR}/data/loopimg/fd.img" "${VM # setup more scratch space for virtual machines, if configured mkdir -p /tmp/virt /var/log/samba /run/samba +chmod +rwxt /tmp/virt + # enable normal users to setup the extended virtual machine redo file space # and image source via network block device (NBD only at the moment) # allow to start/stop samba on virtual devices (latter one ignores multiple diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt index 21c01df6..9845ead6 100755 --- a/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt +++ b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt @@ -19,630 +19,91 @@ # fied virtualization tool. ################################################################################ -################################################################################ -### Define default dirs / get configs -################################################################################ - -VMCHOOSER_DIR="/opt/openslx/vmchooser" -VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config" - -# include general configuration from vmchooser -[ -f "$VMCHOOSER_CONF_DIR/vmchooser.conf" ] && . "$VMCHOOSER_CONF_DIR/vmchooser.conf" -# load general virtualization information -[ -f "$VMCHOOSER_CONF_DIR/virtualization.conf" ] && . "$VMCHOOSER_CONF_DIR/virtualization.conf" -# Load general openslx config -[ -f "/opt/openslx/config" ] && . "/opt/openslx/config" - -################################################################################ -### Functions used throughout the script -################################################################################ - -# function to write to stdout and logfile -LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log" -writelog () { - # write to stdout - echo -e "$1" - # log into file - echo -e "$1" >> "${LOGFILE}" -} - -# Clean exit will be called at the end of this script -cleanexit () { - sleep 1 - # remove config dirs when exit - if echo "${RMDIRS}" 2>/dev/null | grep -q "${xmlvirt}"; then - writelog "${xmlvirt} exited. Cleaning up... \c" - rm -rf -- ${RMDIRS} >/dev/null 2>&1 - writelog "done" - fi - # Disconnect dnbd3 device - if [ -n "$dnbd3" ]; then - for timeout in 1 1 2; do - dnbd3-client -d "$dnbd3" -c -d "$dnbd3" -c && break - writelog "dnbd3 still busy...." - sleep "$timeout" - done - fi - # Kill LPD - kill "$PID_LPD" - # Remove spool directory for printjobs from VM - [ -n "${SPOOLDIR}" ] && rm -rf -- "${SPOOLDIR}" - - [ $# -gt 0 ] && exit "$1" - exit 129 # No exit code was given :/ -} - -function rv_clean_string () -{ - if [ "$#" -ge 1 ]; then - echo "$@" | tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' - else - tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' - fi -} - -trap cleanexit SIGINT SIGTERM - -# 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 -################################################################################ - -## Added for persistent support. -diskmode='nonpersistent' -if [[ "$(grep --extended-regexp \ - '< *short_description *param=".+ --persistent--"' "$1")" ]]; then - diskmode='persistent' - imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" - [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" - originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \ - | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" - originalImageFileName="$(grep -io '<image_name param=.*"' \ - "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \ - '{ print $2 }')" - originalVMDKFilePath="$(dirname \ - "$originalXMLFilePath")/${originalImageFileName}" - # Added to workaround path prefix coming from temporary generated xml file - # by vmchooser. - if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \ - "$imageFilePath")" ]]; then - imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \ - <<< "$imageFilePath") - sed -ir \ - "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \ - 's/\\/\\\\/g' -e 's/\//\\\//g' -e \ - 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1" - fi - # Create linked clone if not exists. - if [ ! -f "$imageFilePath" ]; then - mkdir -p "$(dirname "$imageFilePath")" && \ - bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \ - "$imageFilePath" --debug --verbose &>"${LOGFILE}" - fi -fi -## - -# 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" - -DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")" - -################################################################################ -### Sanity checks -################################################################################ - -# test if the xml file is valid -if ! [ -r "${xmlfile}" ]; then - writelog "${xmlfile} not a readable XML file!" - slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile" - exit 1 -fi - -# test if XML file -if ! grep -q '<?xml' "${xmlfile}"; then - writelog "Submitted configuration file ${xmlfile} seems to have wrong XML format" - slxlog "virt-invalid-xml" "Malformed XML file: $xmlfile" "$xmlfile" - exit 1 -fi - -# check for running in graphical environment otherwise no much use here -if [ -z "$DISPLAY" ]; then - echo -e "\n\tStart only within a graphical desktop!\n" - exit 1 -fi - -################################################################################ -### Logo for console -################################################################################ - -cat <<EOL - __ __ - .----.--.--.-----.___.--.--.|__|.----.| |_ - | _| | | |___| | || || _|| _| - |__| |_____|__|__| \___/ |__||__| |____| - OpenSLX virtual machine environment preparation script ... - -EOL - -################################################################################ -### Read needed variables 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:" - -# 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/} - -## Added for persistent support. -if [[ "$userBranchFilePath" ]]; then - imgname="$userBranchFilePath" -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. -elif [[ "$userBranchFilePath" ]]; then - vmpath="$userBranchFilePath" -## - # Else use same path as xml -else - imgpath="${xmlpath}" - vmpath="${imgpath}/${imgname}" -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="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")" - -# vm_name = displayname, define for old scripts -displayname="${vm_name}" - -# image is for the following virtual machine -xmlvirt=$(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" - -# 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 - -# 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]") -override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]") - -# 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=.*"' "${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 -############################################################################### - -# take last two digits of current pid... -VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2) - -# Make sure cpu_cores is not empty -cpu_cores=${cpu_cores:-"1"} - -# Amount of memory for the VM. Be generous if diff is written to HDD -if mount | grep -q '^/dev/sd.*on.*/tmp'; then - reserve=20 - min=768 - max=1536 +RUNVIRTINCLUDEDIR=/opt/openslx/scripts/ +xmlfile="$1" + +# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string()) +source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc && trap 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 IMGUUID, IMGVMX + +if [ "$LEGACY" ]; then + # check for important files used (filecheck()) - vestigial? + source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc + # Get XML file and dir, legacy (old way) + source ${RUNVIRTINCLUDEDIR}/get_xml_file_dir_legacy.inc # xmlfile=$1 + # xml file sanity checks, legacy + source ${RUNVIRTINCLUDEDIR}/check_runvirt_xml_sanity_legacy.inc + # print console logo + source ${RUNVIRTINCLUDEDIR}/print_runvirt_console_logo.inc + # Read needed variables from XML file + source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables_legacy.inc + # Declaration of hardware relatedt variables + source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables_legacy.inc + # Sound setup the rest of the environment and run the configured vm + source ${RUNVIRTINCLUDEDIR}/setup_sound.inc + # Start printer daemon + 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 + # Try to use dnbd3 to access the image, nfs/cifs fallback + source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc + # Get all virtual machine specific stuff from the respective include file + source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc + # start a windowmanager for easier handling + source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc + # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!) + source ${RUNVIRTINCLUDEDIR}/start_pvs.inc + # Check if tcpsvd is running. Do not check immediately after spawning, + # as this could result in success even if it's not really working. + source ${RUNVIRTINCLUDEDIR}/check_lpd.inc else - reserve=65 - min=768 - max=8192 -fi - -# Calculate absulute amount of RAM that should stay available to the host -reserve="$[ ( $totalmem * $reserve ) / 100 ]" -# Respect some upper and lower bounds for the host amount -[ "$reserve" -lt "$min" ] && reserve="$min" -[ "$reserve" -gt "$max" ] && reserve="$max" + # check for important files used (filecheck()) - vestigial? + # This include does not currently work. TODO. + # source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc && filecheck -# Get a result which can be divided by 4 -mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]" -if [ -n "$mainvirtmem" ]; then - forcemem="$[ "$mainvirtmem" / 4 * 4 ]" - mem="$forcemem" -fi -hostmem="$[ $totalmem - $mem ]" + # Read needed variables from XML file + source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc -# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are -# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on -# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes -# and append $macaddrssuffix -macguestpart="00:50:56:${VM_ID}" -machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}') -macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]") -macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]") + # Sound setup the rest of the environment and run the configured vm + source ${RUNVIRTINCLUDEDIR}/setup_sound.inc -if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then - slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)" -fi + # Declaration of hardware relatedt variables + source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.inc -# Virtual fd/cd/dvd and drive devices, floppy b: for configuration -# if $floppy_0 from virtualization.conf set then fdtest="TRUE" -fdtest=${floppy_0:+"TRUE"} -# if $fdtest not set floppy0="FALSE", else "TRUE" -floppy0=${fdtest:-"FALSE"} -floppy1="TRUE" -floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img" -# if $cdrom_0 from virtualization.conf set then cdtest="TRUE" -cdtest=${cdrom_0:+"TRUE"} -# if $cdtest not set cdrom0="FALSE", else "TRUE" -cdrom0=${cdtest:-"FALSE"} -# if $cdrom_1 from virtualization.conf set then cdtest="TRUE" -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}" + # Start printer daemon + 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 -# Enable 3D -enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string) + # Get all virtual machine specific stuff from the respective include file + source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc -# Add rw share for home dir -homesharepath="${HOME}/PERSISTENT" -homesharename="home" + # start a windowmanager for easier handling + source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc -# Add common share -commonsharepath="${HOME}/SHARE" -commonsharename="share" + # Try to use dnbd3 to access the image, nfs/cifs fallback + source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc -# Set hostname: using original hostname and adding string -hostname="virt-$(hostname)" + # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!) + source ${RUNVIRTINCLUDEDIR}/start_pvs.inc -writelog "\tVM Hostname:\t\t$hostname" + # Check if tcpsvd is running. Do not check immediately after spawning, + # as this could result in success even if it's not really working. + source ${RUNVIRTINCLUDEDIR}/check_lpd.inc -################################################################################ -### Setup the rest of the environment and run the configured vm -################################################################################ -# 8086:1e20 -if lspci -n | grep -E -i '8086:1e20( |$)'; then - VOL="100%" # bwPC 4: Speaker too quiet :-( -else - VOL="85%" fi -if true; then - # detecting which card is to be used - echo "Detecting which sound card to use ..." - PROC="/proc/asound/cards" - if [ ! -r "$PROC" ]; then - echo "'${PROC}' not found or not readable." - SOUND_CARD_INDEX=0 - SOUND_CARD_COUNT=1 - else - # Try to filter HDMI cards first - SOUND_CARD_INDEX=$(grep -v -i 'HDMI' "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1) - # If empty, try again with all - [ -z "${SOUND_CARD_INDEX}" ] && SOUND_CARD_INDEX=$(cat "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1) - if [ -z "${SOUND_CARD_INDEX}" ]; then - echo "No sound card found." - SOUND_CARD_INDEX=0 - fi - SOUND_CARD_COUNT=$(grep -E '^[[:space:]]{0,2}[0-9]+[[:space:]]+' "${PROC}" | wc -l) - fi - - SOUND_CARD_INDEX="$(grep -E -o '[0-9]+' <<<$SOUND_CARD_INDEX)" - echo "Detected sound card index is: $SOUND_CARD_INDEX" - echo "Sound card count: $SOUND_CARD_COUNT" - - # Adjust sound volume (playback)... Random mixer names we have encountered during testing - echo "Setting up volume..." - amixer -q -c "$SOUND_CARD_INDEX" sset 'Master' "$VOL" unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'PCM' "$VOL" unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'CD' "$VOL" unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Headphone' "$VOL" unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Front' "$VOL" unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Speaker' "$VOL" unmute - # Recording. It seems that (most) devices need the volume set to 0, so you - # don't hear your own mic input, but should be unmuted. Also on some cards, - # you need to set the cap option on the mic you want to use, while other cards - # will just ignore that option. - # Plus, most cards have a Capture mixer, which needs to be set to cap too, and - # have its volume turned up. (There'll probably be some cards that need yet - # another setup, but this works for now on 4 tested cards) - amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic Boost' "50%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic' "0%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic Boost' "50%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic' "0%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic Boost' "50%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic' "0%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Capture' "100%" cap unmute - amixer -q -c "$SOUND_CARD_INDEX" sset 'Input Source' 'Front Mic' # Let's hope nobody uses rear mic... - # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded - amixer -q -c pcsp sset Master "0%" mute - echo "Done setting up volume." -fi >> "${LOGFILE}" 2>&1 - -# Start printer daemon -QUEUE="STANDARD" # This has to match the queue you configured in your VM -USER="$(/usr/bin/whoami)" -SPOOLDIR= -### Disabled: 100megs is not enough, some jobs are HUGE, try to use temp which should be on disk -## Try using user's tmpfs home first, as it gets wiped on logout -#if [ -n "${HOME}" ] && [ -w "${HOME}" ]; then -# SPOOLDIR="${HOME}/.spool" -# mkdir -p "${SPOOLDIR}/${QUEUE}" -#fi -# If failed, try to fall back to /tmp -if [ -z "${SPOOLDIR}" ] || [ ! -w "${SPOOLDIR}/${QUEUE}" ]; then - SPOOLDIR="/tmp/printergui-${USER}-$$-${RANDOM}" - rm -rf -- "${SPOOLDIR}" - if ! mkdir -p "${SPOOLDIR}/${QUEUE}"; then - slxlog "virt-spooldir" "Could not create spool directory ($SPOOLDIR) for $USER - printing will not work!" - # TODO: Warn user - fi - chmod 0700 "${SPOOLDIR}/${QUEUE}" -fi - -# Start the lpdaemon listening on the given port -# TODO: externalize with something like runtvirt.d (other parts might benefit from that too) -tcpsvd -E 192.168.101.1 5515 \ - lpd "$SPOOLDIR" \ - ash -c "/opt/openslx/cups/printergui '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" & - -# PID to kill the process -PID_LPD="$!" - -# Copy guest configuration (with added information) config.xml to be accessed -# via virtual floppy -cp "$xmlfile" "$VMCHOOSER_DIR/fd-loop/config.xml" -# Add another file with resolution information -xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' | grep -o -E '[0-9]+x[0-9]+' | head -n 1 > "$VMCHOOSER_DIR/fd-loop/hostres.txt" -# Add our magic openslx binary that sets the correct guest resolution -cp "$VMCHOOSER_DIR/data/openslx.exe" "$VMCHOOSER_DIR/fd-loop/" -cp "$VMCHOOSER_DIR/data/SHARELWS.BAT" "$VMCHOOSER_DIR/fd-loop/" -rm "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" -for SHARE in $(grep -o -E '^SLX_SHARE_.*_PATH' /opt/openslx/config); do - eval "echo -n \$${SHARE} | /opt/openslx/bin/tr '/' '\' " >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" - #eval echo -n " \$${SHARE%PATH}AUTH_PASS /user:\$${SHARE%PATH}AUTH_USER" >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" - echo -e '\r\n' >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG" -done - - -# Try to use dnbd3 to access the image -unset vm_diskfile -unset vm_revision -unset dnbd3 -unset dnbd3error -if [ -n "$SLX_DNBD3_SERVERS" -o -n "$SLX_DNBD3_PRIO_SERVERS" ] && [ "x$SLX_VM_DNBD3" = "xyes" ]; then - if [ -e "/dev/dnbd0" -a -e "/var/run/dnbd3.socket" ]; then - # Shuffle server list - [ -n "$SLX_DNBD3_SERVERS" ] && TMP_SERVERS=$(for SRV in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SRV"; done | sort -u | sed -r 's/^[0-9]+ //') - for SRV in $SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS; do - dnbd3=$(dnbd3-client -h "$SRV" -i "${imgrelpath}" -r 0) - RET=$? - if [ "$RET" = "0" ]; then - vm_revision=$(cat "/sys/block/${dnbd3#/dev/}/net/rid") - writelog "DNBD3: $vm_diskfile on $dnbd3 with rid $vm_revision" - vm_diskfile="$dnbd3" - vmpath="$vm_diskfile" - break - fi - dnbd3error="$dnbd3error ($RET/$dnbd3)" - usleep 200000 - done - if [ -z "$vm_diskfile" ]; then - slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found ($SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS $dnbd3error), trying NFS/CIFS..." - writelog "No working dnbd3 server found :-(" - fi - else - writelog "Won't use dnbd3 as it's not loaded, or the daemon is not running..." - fi -else - writelog "Won't use dnbd3 as no servers are given in config" -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 -1) - [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}" - vm_diskfile="$vmpath" -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!" - cleanexit 1 -fi - -writelog "Used diskfile: $vm_diskfile" - -# Get all virtual machine specific stuff from the respective include file -if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then - # TODO: Tell user - 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." - cleanexit 1 -fi - -self="${xmlvirt}" -if ! . "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then - slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced (contains syntax errors?)" "$xmlvirt" - writelog "Erroneous run-virt.include for $xmlvirt" -fi - -# start a windowmanager for easier handling -# (expect problems w/ windows opening in background w/ vmware without wm) -for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do - if which $dm >/dev/null 2>&1 ; then - if [ "$dm" = "fvwm2" ] ; then - echo "EdgeScroll 0 0" > ${redodir}/fvwm - fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 & - else - $dm >/dev/null 2>&1 & - fi - break - fi -done - -# Start poolvideoswitch if we find the autostarter file -#if [ -e /etc/xdg/autostart/pvsgui.desktop ]; then -# /usr/local/bin/pvsgui -p 2 -b >/dev/null 2>&1 & -#fi - -if [[ "$DO_PROFILE" -ge "1" ]]; then - wget "http://132.230.8.113/profile/do.php?action=start" & -fi - -# Check if tcpsvd is running. Do this down here so we do not check immediately after trying to spawn it, -# as this could result in success even if it's not really working -if ! kill -0 "$PID_LPD"; then - slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session" -fi - -# Configure and start samba service to provide user's home directory -#if [ -f /usr/sbin/smbd ] ; then -# sudo /opt/openslx/bin/sed -i /opt/openslx/vmchooser/smb.conf -e "s,USER,$USER," -# sudo /usr/sbin/nmbd -s /opt/openslx/vmchooser/config/smb.conf -# sudo /usr/sbin/smbd -s /opt/openslx/vmchooser/config/smb.conf -#fi # This will start the VM writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}" + +# Transported from vmware-runvirt include +sync + eval ${VIRTCMD} ${VIRTCMDOPTS} -# writelog "Bye." # Postrun for commands after virtualization finishes @@ -650,7 +111,4 @@ if [ -n "${POSTRUN}" ]; then eval ${POSTRUN} >/dev/null 2>&1 fi - cleanexit 0 - - diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser_runvirt_functions.inc b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser_runvirt_functions.inc new file mode 100644 index 00000000..7b64653c --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser_runvirt_functions.inc @@ -0,0 +1,45 @@ +####################################################### +# Include: Set functions needed by vmchooser-run_virt # +####################################################### + +# function to write to stdout and logfile +writelog() { + # write to stdout + echo -e "$1" + # log into file + echo -e "$1" >> "${LOGFILE}" +} + +# Clean exit will be called at the end of vmchooser-run_virt +cleanexit() { + sleep 1 + # remove config dirs when exit + if echo "${RMDIRS}" 2>/dev/null | grep -q "${xmlvirt}"; then + writelog "${xmlvirt} exited. Cleaning up... \c" +# rm -rf -- ${RMDIRS} >/dev/null 2>&1 + writelog "done" + fi + # Disconnect dnbd3 device + if [ -n "$dnbd3" ]; then + for timeout in 1 1 2; do + dnbd3-client -d "$dnbd3" -c -d "$dnbd3" -c && break + writelog "dnbd3 still busy...." + sleep "$timeout" + done + fi + # Kill LPD + [ -n "$PID_LPD" ] && kill "$PID_LPD" + # Remove spool directory for printjobs from VM + [ -n "${SPOOLDIR}" ] && rm -rf -- "${SPOOLDIR}" + + [ $# -gt 0 ] && exit "$1" + exit 129 # No exit code was given :/ +} + +rv_clean_string() { + if [ "$#" -ge 1 ]; then + echo "$@" | tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' + else + tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' + fi +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmhome_preferences_file.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmhome_preferences_file.inc new file mode 100644 index 00000000..a5f2cbee --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmhome_preferences_file.inc @@ -0,0 +1,53 @@ +create_vmhome_preferences_file() { + cat > "$vmhome/preferences" <<-HEREEND + .encoding = "UTF-8" + # This configuration file was generated by $0 + + # updates/tips + webUpdate.enabled = "FALSE" + webUpdate.lastCheck.status = "done_updates" + webUpdate.checkPeriod = "manual" + pref.downloadPermission = "deny" + pref.vmplayer.downloadPermission = "deny" + pref.vmplayer.webUpdateOnStartup = "FALSE" + pref.tip.startup = "FALSE" + hints.hideAll = "TRUE" + hint.vmui.showAllUSBDevs = "FALSE" + + # configs + prefvmx.defaultVMPath = "$vmhome" + prefvmx.mru.config = "$conffile:" + + # hot keys + pref.hotkey.control = "true" + pref.hotkey.alt = "true" + pref.hotkey.shift = "true" + pref.hotkey.gui = "true" + gui.restricted = "true" + + # fullscreen/mouse/keyboard + pref.fullscreen.toolbarPixels = "0" + pref.vmplayer.fullscreen.autohide = "TRUE" + pref.vmplayer.fullscreen.nobar = 1 + pref.grabOnMouseClick = "TRUE" + pref.grabOnKeyPress = "TRUE" + pref.motionGrab = "TRUE" + pref.motionUngrab = "TRUE" + pref.hideCursorOnUngrab = "TRUE" + pref.autoFit = "TRUE" + pref.autoFitFullScreen = "fitGuestToHost" + pref.autoFitGuestToWindow = "TRUE" + pref.vmplayer.exit.vmAction = "poweroff" + pref.vmplayer.confirmOnExit = "TRUE" + + # shared folders + pref.enableAllSharedFolders = "TRUE" + + # eula + pref.eula.count = "2" + pref.eula0.product = "VMware Player" + pref.eula0.build = "$vmbuild" + pref.eula1.product = "VMware Workstation" + pref.eula1.build = "$vmbuild" + HEREEND +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file.inc new file mode 100644 index 00000000..bac61be6 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file.inc @@ -0,0 +1,175 @@ +######################################## +# Include: Create vmware startup files # +######################################## + +writelog "create_vmware_config_file.inc: conffile: -$conffile-" + +MAXMEM="9999999" +MAXCORES="4" +shfolders="TRUE" +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 + win31*|windows31*) + vmostype="win31" + shfolders="FALSE" + sound="sb16" + MAXMEM="32" + MAXCORES="1" + ;; + winnt*|windowsnt*) + vmostype="winnt" + shfolders="FALSE" + sound="sb16" + MAXMEM="1000" + MAXCORES="2" + ;; + win95*|windows95*) + vmostype="win95" + shfolders="FALSE" + MAXMEM="96" + MAXCORES="1" + ;; + win98*|windows98*) + vmostype="win98" + MAXMEM="256" + MAXCORES="1" + ;; + winme*|windowsme*) + vmostype="winme" + MAXMEM="384" + MAXCORES="1" + ;; + win2000|windows2000|win2000pro*) + vmostype="win2000pro" + MAXMEM="4000" + MAXCORES="2" + ;; + win2000srv*|windows2000srv*|win2000serv*|windows2000serv*) + vmostype="win2000serv" + shfolders="FALSE" + MAXMEM="4000" + MAXCORES="4" + ;; + win2000adv*|windows2000adv*|win2000dat*|windows2000dat*) + vmostype="win2000advserv" + shfolders="FALSE" + MAXMEM="8000" + MAXCORES="8" + ;; + winnet*64|win*2003*64|windowsnet*64) + vmostype="winnetstandard-64" + MAXMEM="8000" + ;; + winnet*|win*2003*|windowsnet*) + vmostype="winnetstandard" + MAXMEM="4000" + ;; + winxphome*|windowsxphome*) + vmostype="winxphome" + MAXMEM="4000" + MAXCORES="1" + ;; + winxp*64|windowsxp*64) + vmostype="winxppro-64" + MAXMEM="8000" + MAXCORES="2" + ;; + winxp*|windowsxp*) + vmostype="winxppro" + MAXMEM="4000" + MAXCORES="1" + ;; + winvista*64|windowsvista*64) + vmostype="winvista-64" + MAXMEM="16000" + MAXCORES="2" + ;; + winvista*|windowsvista*) + vmostype="winvista" + MAXMEM="8000" + MAXCORES="2" + ;; + win7*64|windows7*64) + vmostype="windows7-64" + MAXMEM="32000" + MAXCORES="4" + ;; + win7*|windows7*) + vmostype="windows7" + MAXMEM="8000" + MAXCORES="4" + ;; + win8*64|windows8*64) + vmostype="windows8-64" + MAXMEM="32000" + MAXCORES="4" + ;; + win8*|windows8*) + vmostype="windows8" + MAXMEM="8000" + MAXCORES="4" + ;; + win*64) + MAXMEM="16000" + MAXCORES="4" + ;; + win*) + MAXMEM="8000" + ;; + dos|msdos*|ms-dos*) + vmostype="dos" + shfolders="FALSE" + MAXMEM="128" + ;; + macos*64) + vmostype="freebsd-64" + MAXMEM="4000" + MAXCORES="2" + ;; + macos*) + vmostype="freebsd" + MAXMEM="4000" + MAXCORES="1" + ;; + beos*) + vmostype="other" + shfolders="FALSE" + ;; + # Unknown guestOS setting in .xml - use conservative defaults + *64) + vmostype="other-64" + shfolders="FALSE" + MAXMEM="123456" + MAXCORES="4" + ;; + *) + vmostype="other" + shfolders="FALSE" + MAXMEM="8000" + MAXCORES="1" + ;; +esac + +real_core_count="$cpu_cores" + +[ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES" + +# It currently makes no sense to set the virtual number of cores +# to a different value than the virtual number of cores per virtual CPU. +cores_per_socket="$cpu_cores" + +if [ "x$shfolders" != "xFALSE" ]; then + ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"' +else + ENABLE_SHARE='' +fi + +[ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM" +[ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500" + +# set the appropriate permissions for the vmware config file +chmod u+rwx "${conffile}" >/dev/null 2>&1 + diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file_legacy.inc new file mode 100644 index 00000000..1d6b2185 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/create_vmware_config_file_legacy.inc @@ -0,0 +1,312 @@ +######################################## +# Include: Create vmware startup files # +######################################## + +create_vmware_config_file_legacy() { + echo "# This configuration file was generated by $0" > "$conffile" + + MAXMEM="9999999" + MAXCORES="4" + shfolders="TRUE" + 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 + win31*|windows31*) + vmostype="win31" + shfolders="FALSE" + sound="sb16" + MAXMEM="32" + MAXCORES="1" + ;; + winnt*|windowsnt*) + vmostype="winnt" + shfolders="FALSE" + sound="sb16" + MAXMEM="1000" + MAXCORES="2" + ;; + win95*|windows95*) + vmostype="win95" + shfolders="FALSE" + MAXMEM="96" + MAXCORES="1" + ;; + win98*|windows98*) + vmostype="win98" + MAXMEM="256" + MAXCORES="1" + ;; + winme*|windowsme*) + vmostype="winme" + MAXMEM="384" + MAXCORES="1" + ;; + win2000|windows2000|win2000pro*) + vmostype="win2000pro" + MAXMEM="4000" + MAXCORES="2" + ;; + win2000srv*|windows2000srv*|win2000serv*|windows2000serv*) + vmostype="win2000serv" + shfolders="FALSE" + MAXMEM="4000" + MAXCORES="4" + ;; + win2000adv*|windows2000adv*|win2000dat*|windows2000dat*) + vmostype="win2000advserv" + shfolders="FALSE" + MAXMEM="8000" + MAXCORES="8" + ;; + winnet*64|win*2003*64|windowsnet*64) + vmostype="winnetstandard-64" + MAXMEM="8000" + ;; + winnet*|win*2003*|windowsnet*) + vmostype="winnetstandard" + MAXMEM="4000" + ;; + winxphome*|windowsxphome*) + vmostype="winxphome" + MAXMEM="4000" + MAXCORES="1" + ;; + winxp*64|windowsxp*64) + vmostype="winxppro-64" + MAXMEM="8000" + MAXCORES="2" + ;; + winxp*|windowsxp*) + vmostype="winxppro" + MAXMEM="4000" + MAXCORES="1" + ;; + winvista*64|windowsvista*64) + vmostype="winvista-64" + MAXMEM="16000" + MAXCORES="2" + ;; + winvista*|windowsvista*) + vmostype="winvista" + MAXMEM="8000" + MAXCORES="2" + ;; + win7*64|windows7*64) + vmostype="windows7-64" + MAXMEM="32000" + MAXCORES="4" + ;; + win7*|windows7*) + vmostype="windows7" + MAXMEM="8000" + MAXCORES="4" + ;; + win8*64|windows8*64) + vmostype="windows8-64" + MAXMEM="32000" + MAXCORES="4" + ;; + win8*|windows8*) + vmostype="windows8" + MAXMEM="8000" + MAXCORES="4" + ;; + win*64) + MAXMEM="16000" + MAXCORES="4" + ;; + win*) + MAXMEM="8000" + ;; + dos|msdos*|ms-dos*) + vmostype="dos" + shfolders="FALSE" + MAXMEM="128" + ;; + macos*64) + vmostype="freebsd-64" + MAXMEM="4000" + MAXCORES="2" + ;; + macos*) + vmostype="freebsd" + MAXMEM="4000" + MAXCORES="1" + ;; + beos*) + vmostype="other" + shfolders="FALSE" + ;; + # Unknown guestOS setting in .xml - use conservative defaults + *64) + vmostype="other-64" + shfolders="FALSE" + MAXMEM="123456" + MAXCORES="4" + ;; + *) + vmostype="other" + shfolders="FALSE" + MAXMEM="8000" + MAXCORES="1" + ;; + esac + real_core_count="$cpu_cores" + [ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES" + # It currently makes no sense to set the virtual number of cores + # to a different value than the virtual number of cores per virtual CPU. + cores_per_socket="$cpu_cores" + + if [ "x$shfolders" != "xFALSE" ]; then + ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"' + else + ENABLE_SHARE='' + fi + + [ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM" + [ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500" + + cap3d="WHAT IS THIS VAR USED FOR?" # helper var for loging output + + + cat >> "$conffile" <<-HEREEND + .encoding = "UTF-8" + config.version = "8" + + # general hardware (ehci, 3d accel) + ehci.present = "TRUE" + $FORCE3D + mks.enable3d = "$enable3d" + + monitor.virtual_mmu = "automatic" + monitor.virtual_exec = "automatic" + floppy1.clientDevice = "FALSE" + floppy1.readonly = "TRUE" + + # id + virtualHW.version = "$hwver" + displayName = "$displayname" + guestOS = "$vmostype" + + # CPU/MEM + numvcpus = "$cpu_cores" + cpuid.coresPerSocket = "$cores_per_socket" + maxvcpus = "$real_core_count" + memsize = "$mem" + MemAllowAutoScaleDown = "FALSE" + MemTrimRate = "-1" + + # ide-disks + ide0:0.present = "$ide" + ide0:0.fileName = "$vm_diskfile" + ## Edited for persistent mode. + ide0:0.mode = "independent-${diskmode}" + ## + ide1:0.present = "$cdrom0" + ide1:0.autodetect = "TRUE" + ide1:0.fileName = "auto detect" + ide1:0.deviceType = "cdrom-raw" + ide1:1.present = "$cdrom1" + ide1:1.autodetect = "TRUE" + ide1:1.fileName = "auto detect" + ide1:1.deviceType = "cdrom-raw" + + # scsi-disks + scsi0.present = "$scsi" + scsi0:0.present = "$scsi" + scsi0:0.fileName = "$vm_diskfile" + scsi0.virtualDev = "$hddrv" + ## Edited for persistent mode. + scsi0:0.mode = "independent-${diskmode}"$stateFileConfiguration + ## + + # floppies + floppy0.present = "$floppy0" + floppy0.startConnected = "FALSE" + floppy0.autodetect = "TRUE" + floppy0.fileName = "auto detect" + + # we need floppy b: for the client configuration + floppy1.present = "$floppy1" + floppy1.startConnected = "TRUE" + floppy1.fileType = "file" + floppy1.fileName = "$floppy1name" + + # nics + ethernet0.present = "TRUE" + ethernet0.addressType = "static" + $network_virtualDev + #ethernet0.connectionType = "hostonly" + ethernet0.connectionType = "custom" + ethernet0.vnet = "$hostdev" + ethernet0.address = "00:50:56:$macaddrsuffix" + ethernet0.wakeOnPcktRcv = "FALSE" + + # sound + sound.present = "TRUE" + $sound_fileName + sound.virtualdev = "$sound" + pciSound.enableVolumeControl = "FALSE" + sound.enableVolumeControl = "FALSE" + + # svga + svga.autodetect = "TRUE" + + # usb + usb.present = "TRUE" + usb.generic.autoconnect = "TRUE" + + # pci configuration + usb.pciSlotNumber = "16" + ethernet0.pciSlotNumber = "17" + sound.pciSlotNumber = "18" + ehci.pciSlotNumber = "19" + scsi0.pciSlotNumber = "20" + + $PCIE + + # shared folders + $ENABLE_SHARE + sharedFolder0.present = "$shfolders" + sharedFolder0.enabled = "$shfolders" + sharedFolder0.expiration = "never" + sharedFolder0.guestName = "$homesharename" + sharedFolder0.hostPath = "$homesharepath" + sharedFolder0.readAccess = "TRUE" + sharedFolder0.writeAccess = "TRUE" + sharedFolder1.present = "$shfolders" + sharedFolder1.enabled = "$shfolders" + sharedFolder1.expiration = "never" + sharedFolder1.guestName = "$commonsharename" + sharedFolder1.hostPath = "$commonsharepath" + sharedFolder1.readAccess = "TRUE" + sharedFolder1.writeAccess = "TRUE" + sharedFolder.maxNum = "2" + + # dirs/configs + tmpDirectory = "$redodir" + redoLogDir = "$redodir" + mainMem.useNamedFile = "TRUE" + snapshot.disabled = "TRUE" + tools.syncTime = "TRUE" + isolation.tools.hgfs.disable = "FALSE" + hgfs.mapRootShare = "TRUE" + isolation.tools.dnd.disable = "FALSE" + isolation.tools.copy.enable = "TRUE" + isolation.tools.paste.enabled = "TRUE" + + # serial port + serial0.present = "$serial" + $serialdev + + # parallel port + parallel0.present = "$parallel" + parallel0.bidirectional = "$paralbidi" + $paraldev + HEREEND + + # set the appropriate permissions for the vmware config file + chmod u+rwx "${conffile}" >/dev/null 2>&1 +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/logging.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/logging.inc new file mode 100644 index 00000000..62b1c691 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/logging.inc @@ -0,0 +1,57 @@ +############################### +# Include: Logging and stdout # +############################### + +logging() { + # log script information + writelog "# File created by $0 (VMversion ${vmversion})\n# on $(date)\n" + ## Edited for persistent mode. + writelog "Starting with ${diskmode} mode ...\n" + ## + + # write all results to logfile + # log disksetup + writelog "Directories:" + writelog "\tConfdir:\t${confdir}" + writelog "\tConffile:\t${conffile}" + writelog "\tRedodir:\t${redodir}" + writelog "\tVMhome:\t\t${vmhome}" + writelog "\t/tmp info: $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')" + # hw setup + writelog "Hardware:" + writelog "\tMAC:\t\t00:50:56:$macaddrsuffix" # TODO: Make var at top for this, it's hard coded twice + if [ -n "${network_card}" ]; then + writelog "\tNet Adaptor:\t${network_card}" + fi + writelog "\tMem:\t\t${mem} MB" + + # echo nur wenn hostmem gesetzt + [ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB" + writelog "\tMax. res.:\t${xres}x${yres}" + writelog "\tCD-ROM1:\t${cdrom0}" + writelog "\tCD-ROM2:\t${cdrom1}" + writelog "\tFloppy_A:\t${floppy0}" + if [ "${serial}" = "TRUE" ]; then + writelog "\tSerial Port:\t${serialdev}" + fi + if [ "${parallel}" = "TRUE" ]; then + writelog "\tParallel Port:\t${paraldev}" + fi + + # image + writelog "Diskimage:" + writelog "\tDiskfile:\t${diskfile}" + writelog "\tDisktype:\t${hddrv}" + writelog "\tHWVersion:\t${hwver}" + writelog "\tVMostype:\t${vmostype}" + + # misc + writelog "Misc:" + writelog "\tDisplayname:\t${displayname}" + if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then + writelog "\t3D Graphics:\tenabled" + fi + # empty line at end + writelog "" + +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/parse_vmx.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/parse_vmx.inc new file mode 100644 index 00000000..7b9f46c3 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/parse_vmx.inc @@ -0,0 +1,78 @@ +###################################################################### +# Include: Parsing the non-legacy delivered vmxfile $TMPDIR/$IMGUUID # +###################################################################### + +writelog "Now in parse_vmx.inc." + +# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE +# and VM_DISK_REDOLOGDIR. +# IMAGE=$(grep -io '<image_path.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') +sed -i 's#%VM_DISK_PATH%#'"$vm_diskfile"'#g' "$TMPDIR/$IMGUUID" +sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "$TMPDIR/$IMGUUID" +sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "$TMPDIR/$IMGUUID" + +# Ethernet: All we do is entering a generated MAC, as we do not want to interfere +# in the possible case no networking is wanted. +writelog "Guest MAC: $macaddr" +echo 'ethernet0.address = "'"${macaddr}"'"' >> "$TMPDIR/$IMGUUID" + +# Massenspeicher: DVD, CDROM +cat >> "$TMPDIR/$IMGUUID" <<-HEREEND +ide1:0.present = "$cdrom0" +ide1:0.autodetect = "TRUE" +ide1:0.fileName = "auto detect" +ide1:0.deviceType = "cdrom-raw" +ide1:1.present = "$cdrom1" +ide1:1.autodetect = "TRUE" +ide1:1.fileName = "auto detect" +ide1:1.deviceType = "cdrom-raw" +HEREEND + +# Floppies: +cat >> "$TMPDIR/$IMGUUID" <<-HEREEND +floppy0.present = "$floppy0" +floppy0.startConnected = "FALSE" +floppy0.autodetect = "TRUE" +floppy0.fileName = "auto detect" +floppy1.present = "$floppy1" +floppy1.startConnected = "TRUE" +floppy1.fileType = "file" +floppy1.fileName = "$floppy1name" +HEREEND + +# RAM, CPUs +cat >> "$TMPDIR/$IMGUUID" <<-HEREEND +numvcpus = "$cpu_cores" +cpuid.coresPerSocket = "$cores_per_socket" +maxvcpus = "$real_core_count" +memsize = "$mem" +MemAllowAutoScaleDown = "FALSE" +MemTrimRate = "-1" +HEREEND + +# USB +cat >> "$TMPDIR/$IMGUUID" <<-HEREEND +usb.present = "TRUE" +usb.generic.autoconnect = "TRUE" +HEREEND + +# Seriell, Parallel: Empty, nothing is being currently set. TODO later. + +# rausziehen: Hardwareversion +# hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}') +# writelog "hwver: $hwver" +# sed -i "s/virtualHW.version.*/virtualHW.version = $hwver/g" "$TMPDIR/$IMGUUID" +# cleanexit 1 + +# rausziehen: GuestOS + +# Killing duplicate lines (output much nicer as sort -u): +awk '!a[$0]++' "${TMPDIR}/${IMGUUID}" > "${TMPDIR}/${IMGUUID}.tmp" && mv "${TMPDIR}/${IMGUUID}.tmp" "${TMPDIR}/${IMGUUID}" + +# At last_ Let's copy it to $confdir/run-vmware.conf +cp -p "$TMPDIR/$IMGUUID" "$conffile" && writelog "Copied TMPDIR/IMGUUID -$TMPDIR/$IMGUUID- to conffile -$conffile-" || \ + ( writelog "Could not copy TMPDIR/IMGUUID -$TMPDIR/$IMGUUID- to conffile -$conffile-!"; cleanexit 1 ) + +# TODO: Move this to cleanexit. +rm -f "$TMPDIR/$IMGUUID" || writelog "Could not delete $TMPDIR/$IMGUUID." +rmdir "$TMPDIR" || writelog "Could not rmdir $TMPDIR" 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 ae978036..806d9921 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 @@ -19,644 +19,41 @@ ### This needs bash, not dash or ash! (indented HEREDOC) ################################################################################ +VMWAREINCLUDEDIR=/opt/openslx/vmchooser/vmware vmostype=$(rv_clean_string "$vmostype") -runvmwareconfheader () -{ - echo "# This configuration file was generated by $0" > "$conffile" - - MAXMEM="9999999" - MAXCORES="4" - shfolders="TRUE" - 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 - win31*|windows31*) - vmostype="win31" - shfolders="FALSE" - sound="sb16" - MAXMEM="32" - MAXCORES="1" - ;; - winnt*|windowsnt*) - vmostype="winnt" - shfolders="FALSE" - sound="sb16" - MAXMEM="1000" - MAXCORES="2" - ;; - win95*|windows95*) - vmostype="win95" - shfolders="FALSE" - MAXMEM="96" - MAXCORES="1" - ;; - win98*|windows98*) - vmostype="win98" - MAXMEM="256" - MAXCORES="1" - ;; - winme*|windowsme*) - vmostype="winme" - MAXMEM="384" - MAXCORES="1" - ;; - win2000|windows2000|win2000pro*) - vmostype="win2000pro" - MAXMEM="4000" - MAXCORES="2" - ;; - win2000srv*|windows2000srv*|win2000serv*|windows2000serv*) - vmostype="win2000serv" - shfolders="FALSE" - MAXMEM="4000" - MAXCORES="4" - ;; - win2000adv*|windows2000adv*|win2000dat*|windows2000dat*) - vmostype="win2000advserv" - shfolders="FALSE" - MAXMEM="8000" - MAXCORES="8" - ;; - winnet*64|win*2003*64|windowsnet*64) - vmostype="winnetstandard-64" - MAXMEM="8000" - ;; - winnet*|win*2003*|windowsnet*) - vmostype="winnetstandard" - MAXMEM="4000" - ;; - winxphome*|windowsxphome*) - vmostype="winxphome" - MAXMEM="4000" - MAXCORES="1" - ;; - winxp*64|windowsxp*64) - vmostype="winxppro-64" - MAXMEM="8000" - MAXCORES="2" - ;; - winxp*|windowsxp*) - vmostype="winxppro" - MAXMEM="4000" - MAXCORES="1" - ;; - winvista*64|windowsvista*64) - vmostype="winvista-64" - MAXMEM="16000" - MAXCORES="2" - ;; - winvista*|windowsvista*) - vmostype="winvista" - MAXMEM="8000" - MAXCORES="2" - ;; - win7*64|windows7*64) - vmostype="windows7-64" - MAXMEM="32000" - MAXCORES="4" - ;; - win7*|windows7*) - vmostype="windows7" - MAXMEM="8000" - MAXCORES="4" - ;; - win8*64|windows8*64) - vmostype="windows8-64" - MAXMEM="32000" - MAXCORES="4" - ;; - win8*|windows8*) - vmostype="windows8" - MAXMEM="8000" - MAXCORES="4" - ;; - win*64) - MAXMEM="16000" - MAXCORES="4" - ;; - win*) - MAXMEM="8000" - ;; - dos|msdos*|ms-dos*) - vmostype="dos" - shfolders="FALSE" - MAXMEM="128" - ;; - macos*64) - vmostype="freebsd-64" - MAXMEM="4000" - MAXCORES="2" - ;; - macos*) - vmostype="freebsd" - MAXMEM="4000" - MAXCORES="1" - ;; - beos*) - vmostype="other" - shfolders="FALSE" - ;; - # Unknown guestOS setting in .xml - use conservative defaults - *64) - vmostype="other-64" - shfolders="FALSE" - MAXMEM="123456" - MAXCORES="4" - ;; - *) - vmostype="other" - shfolders="FALSE" - MAXMEM="8000" - MAXCORES="1" - ;; - esac - - real_core_count="$cpu_cores" - [ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES" - # It currently makes no sense to set the virtual number of cores - # to a different value than the virtual number of cores per virtual CPU. - cores_per_socket="$cpu_cores" - - if [ "x$shfolders" != "xFALSE" ]; then - ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"' - else - ENABLE_SHARE='' - fi - - [ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM" - [ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500" - - cap3d="WHAT IS THIS VAR USED FOR?" # helper var for loging output - - cat >> "$conffile" <<-HEREEND - .encoding = "UTF-8" - config.version = "8" - - # general hardware (ehci, 3d accel) - ehci.present = "TRUE" - $FORCE3D - mks.enable3d = "$enable3d" - - monitor.virtual_mmu = "automatic" - monitor.virtual_exec = "automatic" - floppy1.clientDevice = "FALSE" - floppy1.readonly = "TRUE" - - # id - virtualHW.version = "$hwver" - displayName = "$displayname" - guestOS = "$vmostype" - - # CPU/MEM - numvcpus = "$cpu_cores" - cpuid.coresPerSocket = "$cores_per_socket" - maxvcpus = "$real_core_count" - memsize = "$mem" - MemAllowAutoScaleDown = "FALSE" - MemTrimRate = "-1" - - # ide-disks - ide0:0.present = "$ide" - ide0:0.fileName = "$vm_diskfile" - ## Edited for persistent mode. - ide0:0.mode = "independent-${diskmode}" - ## - ide1:0.present = "$cdrom0" - ide1:0.autodetect = "TRUE" - ide1:0.fileName = "auto detect" - ide1:0.deviceType = "cdrom-raw" - ide1:1.present = "$cdrom1" - ide1:1.autodetect = "TRUE" - ide1:1.fileName = "auto detect" - ide1:1.deviceType = "cdrom-raw" - - # scsi-disks - scsi0.present = "$scsi" - scsi0:0.present = "$scsi" - scsi0:0.fileName = "$vm_diskfile" - scsi0.virtualDev = "$hddrv" - ## Edited for persistent mode. - scsi0:0.mode = "independent-${diskmode}"$stateFileConfiguration - ## - - # floppies - floppy0.present = "$floppy0" - floppy0.startConnected = "FALSE" - floppy0.autodetect = "TRUE" - floppy0.fileName = "auto detect" - - # we need floppy b: for the client configuration - floppy1.present = "$floppy1" - floppy1.startConnected = "TRUE" - floppy1.fileType = "file" - floppy1.fileName = "$floppy1name" - - # nics - ethernet0.present = "TRUE" - ethernet0.addressType = "static" - $network_virtualDev - #ethernet0.connectionType = "hostonly" - ethernet0.connectionType = "custom" - ethernet0.vnet = "$hostdev" - ethernet0.address = "00:50:56:$macaddrsuffix" - ethernet0.wakeOnPcktRcv = "FALSE" - - # sound - sound.present = "TRUE" - $sound_fileName - sound.virtualdev = "$sound" - pciSound.enableVolumeControl = "FALSE" - sound.enableVolumeControl = "FALSE" - - # svga - svga.autodetect = "TRUE" - - # usb - usb.present = "TRUE" - usb.generic.autoconnect = "TRUE" - - # pci configuration - usb.pciSlotNumber = "16" - ethernet0.pciSlotNumber = "17" - sound.pciSlotNumber = "18" - ehci.pciSlotNumber = "19" - scsi0.pciSlotNumber = "20" - - $PCIE - - # shared folders - $ENABLE_SHARE - sharedFolder0.present = "$shfolders" - sharedFolder0.enabled = "$shfolders" - sharedFolder0.expiration = "never" - sharedFolder0.guestName = "$homesharename" - sharedFolder0.hostPath = "$homesharepath" - sharedFolder0.readAccess = "TRUE" - sharedFolder0.writeAccess = "TRUE" - sharedFolder1.present = "$shfolders" - sharedFolder1.enabled = "$shfolders" - sharedFolder1.expiration = "never" - sharedFolder1.guestName = "$commonsharename" - sharedFolder1.hostPath = "$commonsharepath" - sharedFolder1.readAccess = "TRUE" - sharedFolder1.writeAccess = "TRUE" - sharedFolder.maxNum = "2" - - # dirs/configs - tmpDirectory = "$redodir" - redoLogDir = "$redodir" - mainMem.useNamedFile = "TRUE" - snapshot.disabled = "TRUE" - tools.syncTime = "TRUE" - isolation.tools.hgfs.disable = "FALSE" - hgfs.mapRootShare = "TRUE" - isolation.tools.dnd.disable = "FALSE" - isolation.tools.copy.enable = "TRUE" - isolation.tools.paste.enabled = "TRUE" - - # serial port - serial0.present = "$serial" - $serialdev - - # parallel port - parallel0.present = "$parallel" - parallel0.bidirectional = "$paralbidi" - $paraldev - HEREEND - - # set the appropriate permissions for the vmware config file - chmod u+rwx "${conffile}" >/dev/null 2>&1 -} - -preferencesheader () -{ - cat > "$vmhome/preferences" <<HEREEND -.encoding = "UTF-8" -# This configuration file was generated by $0 - -# updates/tips -webUpdate.enabled = "FALSE" -webUpdate.lastCheck.status = "done_updates" -webUpdate.checkPeriod = "manual" -pref.downloadPermission = "deny" -pref.vmplayer.downloadPermission = "deny" -pref.vmplayer.webUpdateOnStartup = "FALSE" -pref.tip.startup = "FALSE" -hints.hideAll = "TRUE" -hint.vmui.showAllUSBDevs = "FALSE" - -# configs -prefvmx.defaultVMPath = "$vmhome" -prefvmx.mru.config = "$conffile:" - -# hot keys -pref.hotkey.control = "true" -pref.hotkey.alt = "true" -pref.hotkey.shift = "true" -pref.hotkey.gui = "true" -gui.restricted = "true" - -# fullscreen/mouse/keyboard -pref.fullscreen.toolbarPixels = "0" -pref.vmplayer.fullscreen.autohide = "TRUE" -pref.vmplayer.fullscreen.nobar = 1 -pref.grabOnMouseClick = "TRUE" -pref.grabOnKeyPress = "TRUE" -pref.motionGrab = "TRUE" -pref.motionUngrab = "TRUE" -pref.hideCursorOnUngrab = "TRUE" -pref.autoFit = "TRUE" -pref.autoFitFullScreen = "fitGuestToHost" -pref.autoFitGuestToWindow = "TRUE" -pref.vmplayer.exit.vmAction = "poweroff" -pref.vmplayer.confirmOnExit = "TRUE" - -# shared folders -pref.enableAllSharedFolders = "TRUE" - -# eula -pref.eula.count = "2" -pref.eula0.product = "VMware Player" -pref.eula0.build = "$vmbuild" -pref.eula1.product = "VMware Workstation" -pref.eula1.build = "$vmbuild" -HEREEND -} - - -# declaration of default variables -################################################################################ - -[ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800 - -# VM-ID static (0D), remove if changed to 00 -VM_ID="0D" -# should be dynamic -if [ "x$(which bc)" != "x" ]; then - VM_ID=$(echo "obase=16; $$" | bc) - VM_ID=$(expr substr $VM_ID $(expr ${#VM_ID} - 1) 2) -else - VM_ID=$[ $$ % 100 ] -fi -# temporary disk space for logs, etc... -redodir=/tmp/virt/vmware/${USER}.$$ -# dir for configs and vmem file -confdir=/tmp/virt/vmware/${USER}.$$ -# configfile -conffile="${confdir}/run-vmware.conf" -# diskfile -diskfile="${vmpath}" -# users vmware config folder -[ -z "${HOME}" ] && HOME=$(getent passwd "$(/usr/bin/whoami)" | awk -F ':' '{print $6}') -vmhome="${HOME}/.vmware" - -# get several version infos for vmware/player -. /opt/openslx/vmchooser/vmware/vmware.conf -vmbuild=$buildversion -vmversion=$version - -# VMware start options -# "-X": start in fullscreen -vmopt="-X" - - -# hardware checks -################################################################################ - -# use different network card (default e1000, vlance, vmxnet) -if [ -n "${network_card}" ]; then - network_virtualDev="ethernet0.virtualDev = \"${network_card}\"" -else - network_virtualDev='# using default virtualDev for ethernet0' -fi - -# use different network card (default e1000, vlance, vmxnet) -hostdev="/dev/vmnet1" -case "${network_kind}" in - bridge|bridged) - hostdev="/dev/vmnet0" - ;; - nat) - hostdev="/dev/vmnet1" - ;; - hostonly|host-only) - hostdev="/dev/vmnet2" - ;; -esac - -# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio) -sound="es1371" - -# set sound card explicitly if there is more than one card in the host system -if [ -n "$SOUND_CARD_INDEX" ] && [ "$SOUND_CARD_INDEX" -ne 0 ]; then - sound_fileName="sound.fileName = \"sysdefault:CARD=${SOUND_CARD_INDEX}\" -sound.autodetect = \"FALSE\"" -else - sound_fileName='sound.fileName = "-1" -sound.autodetect = "TRUE"' -fi - -# check for 3D configuration setting -case "$enable3d" in - true|yes) - enable3d="TRUE" - ;; - *) - enable3d="FALSE" - ;; -esac - -# check for whitelisted HW-3D -. /opt/openslx/config -FORCE3D="" -if [ -n "$SLX_VMWARE_3D" ]; then - FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"' -fi - -# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect") -case "$serial" in - tty*) - if [ -e "/dev/$serial" ]; then - serialdev="serial0.filename = \"/dev/${serial}\"" - serial="TRUE" - else - serialdev="# no serial port configured" - serial="FALSE" - fi - ;; - auto*) - serialdev="serial0.autodetect = \"TRUE\"" - serial="TRUE" - ;; - *) - serialdev="# no serial port configured" - serial="FALSE" - ;; -esac - -case "$parallel" in - lp*|parport*) - if [ -e "/dev/$parallel" ]; then - paraldev="parallel0.filename = \"/dev/${parallel}\"" - paralbidi="TRUE" - parallel="TRUE" - else - paraldev="# no parallel port configured" - paralbidi="FALSE" - parallel="FALSE" - fi - ;; - auto*) - paraldev="parallel0.autodetect = \"TRUE\"" - paralbidi="TRUE" - parallel="TRUE" - ;; - *) - paraldev="# no parallel port configured" - paralbidi="FALSE" - parallel="FALSE" - ;; -esac - -# check if ide/scsi and hwver of image -# read only the first 30 lines to be sure -imghead=$(head -n 30 "${diskfile}") -## Added to handle persistent snapshots. -if [[ "$originalVMDKFilePath" ]]; then - echo "Select \"${originalVMDKFilePath}\" as information base for \"${diskfile}\"." - imghead=$(head -n 30 "$originalVMDKFilePath") && \ - # Support suspend mode. - stateFilePath="$(readlink -f "$(dirname "$diskfile")/"*.vmss)" && \ - if [ -f "$stateFilePath" ]; then - echo "Found state file \"$stateFilePath\"." && \ - stateFileConfiguration=" -checkpoint.vmState = \"$stateFilePath\"" - fi - POSTRUN="stateFilePath=\"\$(readlink -f \"${confdir}/\"*.vmss)\" && memoryFilePath=\"\$(readlink -f \"${confdir}/\"*.vmem)\" && [ -f \"\$stateFilePath\" ] && echo \"Saving state and memory file \\\"\$stateFilePath\\\" and \\\"\$memoryFilePath\\\".\" && mv -f \"\$stateFilePath\" \"$(dirname "$diskfile")/\" && mv -f \"\$memoryFilePath\" \"$(dirname "$diskfile")/\"" -fi -## -hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}') - - -if [ -z "$override_hddtype" ]; then - hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}') +if [ "$LEGACY" ]; then + # declaration of default variables for vmware + source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables + # hardware checks + # sources /opt/openslx/config to check for whitelisted HW-3D + source "${VMWAREINCLUDEDIR}/set_hardware_legacy.inc" && set_hardware_legacy + # write configuration files + # write_config_files calls: + # set_vmhome_preferences_header + # set_vmware_startup_file + source "${VMWAREINCLUDEDIR}/write_config_files_legacy.inc" && write_config_files_legacy + # logging and stdout + # needs writelog() from vmchooser-run_virt + source "${VMWAREINCLUDEDIR}/logging.inc" && logging else - hddrv=$override_hddtype -fi + # declaration of default variables for vmware + source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables -PCIE= -case "${hddrv}" in - ide) - ide="TRUE" - scsi="FALSE" - ;; - lsisas*) - ide="FALSE" - scsi="TRUE" - PCIE='pciBridge4.present = "TRUE" - pciBridge4.virtualDev = "pcieRootPort" - pciBridge4.functions = "8"' - ;; - lsilogic|buslogic) - ide="FALSE" - scsi="TRUE" - ;; - scsi) - ide="FALSE" - scsi="TRUE" - hddrv="lsilogic" - ;; - *) - slxlog "virt-vmware-hdd" "vmware: Unknown HDD adapter type $hddrv" - ;; -esac + # hardware checks: sources /opt/openslx/config to check for whitelisted HW-3D + source "${VMWAREINCLUDEDIR}/set_hardware.inc" -# write configuration files -################################################################################ - -# create vmware directories -mkdir -p "$redodir" >/dev/null 2>&1 -mkdir -p "$confdir" >/dev/null 2>&1 -mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1 -touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1 - -# create preferences -preferencesheader - -# create VMware startup file -runvmwareconfheader + # write configuration files + source "${VMWAREINCLUDEDIR}/write_config_files.inc" -# link to conffile if confdir != redodir -ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1 + # parse the given vmx file + source "${VMWAREINCLUDEDIR}/parse_vmx.inc" -# sync is needed to ensure that data is really written to virtual disk -# TODO: Move to general run-virt, right before exec of vm -sync + # logging and stdout + # needs writelog() from vmchooser-run_virt + source "${VMWAREINCLUDEDIR}/logging.inc" && logging -# own nvram. We need it for floppy drive b, default nvram has just drive a -if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then - slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'" -fi - - -# logging and stdout -################################################################################ - -# log script information -writelog "# File created by $0 (VMversion ${vmversion})\n# on $(date)\n" -## Edited for persistent mode. -writelog "Starting with ${diskmode} mode ...\n" -## - -# write all results to logfile -# log disksetup -writelog "Directories:" -writelog "\tConfdir:\t${confdir}" -writelog "\tConffile:\t${conffile}" -writelog "\tRedodir:\t${redodir}" -writelog "\tVMhome:\t\t${vmhome}" -writelog "\t/tmp info: $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')" -# hw setup -writelog "Hardware:" -writelog "\tMAC:\t\t00:50:56:$macaddrsuffix" # TODO: Make var at top for this, it's hard coded twice -if [ -n "${network_card}" ]; then - writelog "\tNet Adaptor:\t${network_card}" -fi -writelog "\tMem:\t\t${mem} MB" -# echo nur wenn hostmem gesetzt -[ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB" -writelog "\tMax. res.:\t${xres}x${yres}" -writelog "\tCD-ROM1:\t${cdrom0}" -writelog "\tCD-ROM2:\t${cdrom1}" -writelog "\tFloppy_A:\t${floppy0}" -if [ "${serial}" = "TRUE" ]; then - writelog "\tSerial Port:\t${serialdev}" -fi -if [ "${parallel}" = "TRUE" ]; then - writelog "\tParallel Port:\t${paraldev}" -fi -# image -writelog "Diskimage:" -writelog "\tDiskfile:\t${diskfile}" -writelog "\tDisktype:\t${hddrv}" -writelog "\tHWVersion:\t${hwver}" -writelog "\tVMostype:\t${vmostype}" -# misc -writelog "Misc:" -writelog "\tDisplayname:\t${displayname}" -if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then - writelog "\t3D Graphics:\tenabled" -fi -# empty line at end -writelog "" - - -################################################################################ -### Set env for vmchooser-run_virt -################################################################################ +fi # For debugging cp "$conffile" "/tmp/vmware-last-config" diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware.inc new file mode 100644 index 00000000..174bf314 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware.inc @@ -0,0 +1,71 @@ +######################################### +# Include: Hardware checks and settings # +######################################### + +# check for 3D configuration setting +case "$enable3d" in + true|yes) + enable3d="TRUE" + ;; + *) + enable3d="FALSE" + ;; +esac + +# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio) +sound="es1371" + +# set sound card explicitly if there is more than one card in the host system +if [ -n "$SOUND_CARD_INDEX" ] && [ "$SOUND_CARD_INDEX" -ne 0 ]; then + sound_fileName="sound.fileName = \"sysdefault:CARD=${SOUND_CARD_INDEX}\" + sound.autodetect = \"FALSE\"" +else + sound_fileName='sound.fileName = "-1" + sound.autodetect = "TRUE"' +fi + +# check for whitelisted HW-3D +source /opt/openslx/config +FORCE3D="" +if [ -n "$SLX_VMWARE_3D" ]; then + FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"' +fi + +# read only the first 30 lines to be sure +imghead=$(head -n 30 "${diskfile}") +hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}') + + +if [ -z "$override_hddtype" ]; then + hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}') +else + hddrv=$override_hddtype +fi + +PCIE= +case "${hddrv}" in + ide) + ide="TRUE" + scsi="FALSE" + ;; + lsisas*) + ide="FALSE" + scsi="TRUE" + PCIE='pciBridge4.present = "TRUE" + pciBridge4.virtualDev = "pcieRootPort" + pciBridge4.functions = "8"' + ;; + lsilogic|buslogic) + ide="FALSE" + scsi="TRUE" + ;; + scsi) + ide="FALSE" + scsi="TRUE" + hddrv="lsilogic" + ;; + *) + slxlog "virt-vmware-hdd" "vmware: Unknown HDD adapter type $hddrv" + ;; +esac + diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware_legacy.inc new file mode 100644 index 00000000..f87d43cf --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_hardware_legacy.inc @@ -0,0 +1,180 @@ +######################################### +# Include: Hardware checks and settings # +######################################### + +set_hardware_legacy() { + +# use different network card (default e1000, vlance, vmxnet) +if [ -n "${network_card}" ]; then + network_virtualDev="ethernet0.virtualDev = \"${network_card}\"" +else + network_virtualDev='# using default virtualDev for ethernet0' +fi + +# use different network card (default e1000, vlance, vmxnet) +hostdev="/dev/vmnet1" +case "${network_kind}" in + bridge|bridged) + hostdev="/dev/vmnet0" + ;; + nat) + hostdev="/dev/vmnet1" + ;; + hostonly|host-only) + hostdev="/dev/vmnet2" + ;; +esac + +# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio) +sound="es1371" + +# set sound card explicitly if there is more than one card in the host system +if [ -n "$SOUND_CARD_INDEX" ] && [ "$SOUND_CARD_INDEX" -ne 0 ]; then + sound_fileName="sound.fileName = \"sysdefault:CARD=${SOUND_CARD_INDEX}\" +sound.autodetect = \"FALSE\"" +else + sound_fileName='sound.fileName = "-1" +sound.autodetect = "TRUE"' +fi + +# check for 3D configuration setting +case "$enable3d" in + true|yes) + enable3d="TRUE" + ;; + *) + enable3d="FALSE" + ;; +esac + +# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio) +sound="es1371" + +# set sound card explicitly if there is more than one card in the host system +if [ -n "$SOUND_CARD_INDEX" ] && [ "$SOUND_CARD_INDEX" -ne 0 ]; then + sound_fileName="sound.fileName = \"sysdefault:CARD=${SOUND_CARD_INDEX}\" +sound.autodetect = \"FALSE\"" +else + sound_fileName='sound.fileName = "-1" +sound.autodetect = "TRUE"' +fi + +# check for 3D configuration setting +case "$enable3d" in + true|yes) + enable3d="TRUE" + ;; + *) + enable3d="FALSE" + ;; +esac + +# check for whitelisted HW-3D +source /opt/openslx/config +FORCE3D="" +if [ -n "$SLX_VMWARE_3D" ]; then + FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"' +fi + +# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect") +case "$serial" in + tty*) + if [ -e "/dev/$serial" ]; then + serialdev="serial0.filename = \"/dev/${serial}\"" + serial="TRUE" + else + serialdev="# no serial port configured" + serial="FALSE" + fi + ;; + auto*) + serialdev="serial0.autodetect = \"TRUE\"" + serial="TRUE" + ;; + *) + serialdev="# no serial port configured" + serial="FALSE" + ;; +esac + +case "$parallel" in + lp*|parport*) + if [ -e "/dev/$parallel" ]; then + paraldev="parallel0.filename = \"/dev/${parallel}\"" + paralbidi="TRUE" + parallel="TRUE" + else + paraldev="# no parallel port configured" + paralbidi="FALSE" + parallel="FALSE" + fi + ;; + auto*) + paraldev="parallel0.autodetect = \"TRUE\"" + paralbidi="TRUE" + parallel="TRUE" + ;; + *) + paraldev="# no parallel port configured" + paralbidi="FALSE" + parallel="FALSE" + ;; +esac + +# check if ide/scsi and hwver of image +# read only the first 30 lines to be sure +imghead=$(head -n 30 "${diskfile}") + +## Added to handle persistent snapshots. +if [[ "$originalVMDKFilePath" ]]; then + echo "Select \"${originalVMDKFilePath}\" as information base for \"${diskfile}\"." + imghead=$(head -n 30 "$originalVMDKFilePath") && \ + + # Support suspend mode. + stateFilePath="$(readlink -f "$(dirname "$diskfile")/"*.vmss)" && \ + if [ -f "$stateFilePath" ]; then + echo "Found state file \"$stateFilePath\"." && \ + stateFileConfiguration=" + checkpoint.vmState = \"$stateFilePath\"" + fi + POSTRUN="stateFilePath=\"\$(readlink -f \"${confdir}/\"*.vmss)\" && memoryFilePath=\"\$(readlink -f \"${confdir}/\"*.vmem)\" && [ -f \"\$stateFilePath\" ] && echo \"Saving state and memory file \\\"\$stateFilePath\\\" and \\\"\$memoryFilePath\\\".\" && mv -f \"\$stateFilePath\" \"$(dirname "$diskfile")/\" && mv -f \"\$memoryFilePath\" \"$(dirname "$diskfile")/\"" +fi + +## +hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}') + + +if [ -z "$override_hddtype" ]; then + hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}') +else + hddrv=$override_hddtype +fi + +PCIE= +case "${hddrv}" in + ide) + ide="TRUE" + scsi="FALSE" + ;; + lsisas*) + ide="FALSE" + scsi="TRUE" + PCIE='pciBridge4.present = "TRUE" + pciBridge4.virtualDev = "pcieRootPort" + pciBridge4.functions = "8"' + ;; + lsilogic|buslogic) + ide="FALSE" + scsi="TRUE" + ;; + scsi) + ide="FALSE" + scsi="TRUE" + hddrv="lsilogic" + ;; + *) + slxlog "virt-vmware-hdd" "vmware: Unknown HDD adapter type $hddrv" + ;; +esac + +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_vmware_include_variables.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_vmware_include_variables.inc new file mode 100644 index 00000000..78f8c634 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/set_vmware_include_variables.inc @@ -0,0 +1,43 @@ +##################################################################### +# Include: Declaration of vmware run-virt-include default variables # +##################################################################### + +set_vmware_include_variables() { + [ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800 + + # VM-ID static (0D), remove if changed to 00 + VM_ID="0D" + + # should be dynamic + if [ "x$(which bc)" != "x" ]; then + VM_ID=$(echo "obase=16; $$" | bc) + VM_ID=$(expr substr $VM_ID $(expr ${#VM_ID} - 1) 2) + else + VM_ID=$[ $$ % 100 ] + fi + + # temporary disk space for logs, etc... + redodir=/tmp/virt/vmware/${USER}.$$ + + # dir for configs and vmem file + confdir=/tmp/virt/vmware/${USER}.$$ + + # configfile + conffile="${confdir}/run-vmware.conf" + + # diskfile + diskfile="${vmpath}" + + # users vmware config folder + [ -z "${HOME}" ] && HOME=$(getent passwd "$(/usr/bin/whoami)" | awk -F ':' '{print $6}') + vmhome="${HOME}/.vmware" + + # get several version infos for vmware/player + source /opt/openslx/vmchooser/vmware/vmware.conf + vmbuild=$buildversion + vmversion=$version + + # VMware start options + # "-X": start in fullscreen + vmopt="-X" +} diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files.inc new file mode 100644 index 00000000..05ee1dd5 --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files.inc @@ -0,0 +1,26 @@ +############################### +# Include: Write config files # +############################### + +writelog "redodir: -$redodir- confdir: -$confdir- vmhome/dndlogs: -$vmhome/dndlogs- conffile: -$conffile-" + +# create vmware directories +mkdir -p "$redodir" >/dev/null 2>&1 +mkdir -p "$confdir" >/dev/null 2>&1 +mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1 +touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1 + +# create preferences file ${vmhome}/preferences +source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file + +# create VMware config file (conffile) +source "${VMWAREINCLUDEDIR}/create_vmware_config_file.inc" + +# link to conffile if confdir != redodir +[ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1 + +# own nvram. We need it for floppy drive b, default nvram has just drive a +if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then + slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'" +fi + diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files_legacy.inc new file mode 100644 index 00000000..52a341ba --- /dev/null +++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/write_config_files_legacy.inc @@ -0,0 +1,29 @@ +############################### +# Include: Write config files # +############################### + +write_config_files_legacy() { + # create vmware directories + mkdir -p "$redodir" >/dev/null 2>&1 + mkdir -p "$confdir" >/dev/null 2>&1 + mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1 + touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1 + + # create preferences file ${vmhome}/preferences + source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file + + # create VMware config file (conffile) + source "${VMWAREINCLUDEDIR}/create_vmware_config_file_legacy.inc" && create_vmware_config_file_legacy + + # link to conffile if confdir != redodir + [ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1 + + # sync is needed to ensure that data is really written to virtual disk + # TODO: Move to general run-virt, right before exec of vm + sync + + # own nvram. We need it for floppy drive b, default nvram has just drive a + if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then + slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'" + fi +} |
