diff options
| author | Christian Rößler | 2015-09-12 15:39:09 +0200 |
|---|---|---|
| committer | Christian Rößler | 2015-09-12 15:39:09 +0200 |
| commit | 42046ded40ab893714c67d81881e162aa13bcc5e (patch) | |
| tree | f239321948a4ae1273dc7bbd7e3f1384d76b8592 /remote/modules/run-virt/data/opt/openslx/scripts/includes | |
| parent | [runvirt] Some cosmetics, better error handling in detect_legacy.inc (diff) | |
| download | tm-scripts-42046ded40ab893714c67d81881e162aa13bcc5e.tar.gz tm-scripts-42046ded40ab893714c67d81881e162aa13bcc5e.tar.xz tm-scripts-42046ded40ab893714c67d81881e162aa13bcc5e.zip | |
[runvirt], [vmware] Some more cosmetics: now include directories
Diffstat (limited to 'remote/modules/run-virt/data/opt/openslx/scripts/includes')
19 files changed, 863 insertions, 0 deletions
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc new file mode 100644 index 00000000..8286bbaa --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/check_runvirt_needed_files.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc new file mode 100644 index 00000000..fbb0bc70 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/check_runvirt_xml_sanity_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc new file mode 100644 index 00000000..d331e1af --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/detect_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc new file mode 100644 index 00000000..13670bb1 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc @@ -0,0 +1,40 @@ +######################################################## +# 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. + +writelog "Now in detect_legacy.inc" + +TMPDIR=$(mktemp -d -p /tmp/virt) +ERR=$? +if "$ERR"; then + writelog "Could not mkdir tempdir, using /tmp." + TMPDIR=/tmp +fi + +# First, let's try to extract an imguuid from xmlfile: +IMGUUID=$(grep -io '<uuid param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') + +writelog "IMGUUID extracted: $IMGUUID" + +if [ ! -n "$IMGUUID" ]; then # Keine uuid: Abbruch, Legacy + writelog "Could not extract an uuid param from ${xmlfile}. Triggering legacy mode." + LEGACY=: # No uuid; legacy. +else + writelog "else-Zweig" + # Now getting template file: + if wget -O "$TMPDIR/$IMGUUID" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}" 1>&2 2>/dev/null; then + writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID} successful." + LEGACY= # both strings set: no legacy. + else + writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}: Error code $ERR. Triggering legacy mode." + LEGACY=: + fi +fi + +if [ ! -s "$TMPDIR/$IMGUUID" ]; then + LEGACY= # no legacy: server sent 0 byte file. + writelog "Server sent zero byte vmx template uuid file. Triggering legacy mode." +fi diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc new file mode 100644 index 00000000..c3c6f7b3 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/get_xml_file_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc new file mode 100644 index 00000000..90d59beb --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/get_xml_file_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc new file mode 100644 index 00000000..3fdc06d2 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/print_runvirt_console_logo.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc new file mode 100644 index 00000000..649cf956 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/set_runvirt_hardware_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc new file mode 100644 index 00000000..400c1bf4 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/set_runvirt_hardware_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc new file mode 100644 index 00000000..0da5e2be --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/set_runvirt_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc new file mode 100644 index 00000000..9525a290 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/setup_image_access.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc new file mode 100644 index 00000000..9e0caa5e --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/setup_printer_lpd.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc new file mode 100644 index 00000000..425ae9d9 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/setup_sound.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc new file mode 100644 index 00000000..7b505474 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/setup_virtual_floppy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc new file mode 100644 index 00000000..4b8e10aa --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/setup_vm_hypervisor.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc new file mode 100644 index 00000000..b7bb8f01 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/start_pvs.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc new file mode 100644 index 00000000..90cd237b --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/start_windowmanager.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc new file mode 100644 index 00000000..a3149c24 --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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/includes/vmchooser_runvirt_functions.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc new file mode 100644 index 00000000..7b64653c --- /dev/null +++ b/remote/modules/run-virt/data/opt/openslx/scripts/includes/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 +} |
