summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt/data/opt/openslx/scripts
diff options
context:
space:
mode:
authorSebastian2016-04-25 12:01:08 +0200
committerSebastian2016-04-25 12:01:08 +0200
commit5acda3eaeabae9045609539303a8c12c4ce401f1 (patch)
tree7e71975f8570b05aafe2ea6ec0e242a8912387bb /core/modules/run-virt/data/opt/openslx/scripts
parentinitial commit (diff)
downloadmltk-5acda3eaeabae9045609539303a8c12c4ce401f1.tar.gz
mltk-5acda3eaeabae9045609539303a8c12c4ce401f1.tar.xz
mltk-5acda3eaeabae9045609539303a8c12c4ce401f1.zip
merge with latest dev version
Diffstat (limited to 'core/modules/run-virt/data/opt/openslx/scripts')
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc11
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc53
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc23
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc33
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc50
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc103
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc120
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc12
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc88
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc89
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc21
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc71
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc33
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc64
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc21
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc19
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc11
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc20
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc77
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc48
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store39
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env184
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc475
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt116
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter74
25 files changed, 1855 insertions, 0 deletions
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc
new file mode 100644
index 00000000..8286bbaa
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc
new file mode 100644
index 00000000..fbb0bc70
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc
new file mode 100644
index 00000000..d331e1af
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc
new file mode 100644
index 00000000..11a21832
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc
@@ -0,0 +1,33 @@
+########################################################
+# 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 "Detecting current/legacy mode ..."
+
+# 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
+ # 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."
+ writelog "Triggering current (non-legacy) mode."
+ LEGACY= # both strings set: no legacy.
+ if [ ! -s "$TMPDIR/$IMGUUID" ]; then
+ LEGACY= # no legacy: server sent 0 byte file.
+ writelog "Server sent zero byte virtual machine description file. Retriggering legacy mode."
+ fi
+ else
+ writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}. Triggering legacy mode."
+ LEGACY=:
+ fi
+fi
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc
new file mode 100644
index 00000000..c3c6f7b3
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
new file mode 100644
index 00000000..b7ed648c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
@@ -0,0 +1,103 @@
+###########################################
+# 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 "Virtual image file name: $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"
+
+# Extracting OS type (vmostype) from xml file. We don't care here whether vmostype is empty, as then
+# it will yield the default entries later on.
+vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+# 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"
+writelog "\tVM OS:\t\t$vmostype"
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc
new file mode 100644
index 00000000..3fdc06d2
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc
new file mode 100644
index 00000000..649cf956
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc
new file mode 100644
index 00000000..400c1bf4
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc
new file mode 100644
index 00000000..0da5e2be
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc
new file mode 100644
index 00000000..5215eb2d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc
@@ -0,0 +1,21 @@
+######################################################
+# 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"
+USER="$(whoami)"
+TMPDIR="/tmp/virt/${USER}/$$"
+
+readonly VMCHOOSER_DIR VMCHOOSER_CONF_DIR LOGFILE TMPDIR USER
+
+# 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"
+# Create temp dir
+mkdir -p "$TMPDIR" # TODO error out if failed
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
new file mode 100644
index 00000000..dd408b22
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
@@ -0,0 +1,71 @@
+###########################################################
+# 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_fuse_mount_point
+unset dnbd3_tmplog
+if ! which dnbd3-fuse; then
+ writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH"
+elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then
+ writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes"
+else
+ # Mount path for images mounted with dnbd3-fuse
+ dnbd3_fuse_mount_point="$TMPDIR/dnbd3fuse.mnt"
+ mkdir -p "${dnbd3_fuse_mount_point}"
+ # start dnbd3-fuse in subshell
+ dnbd3_tmplog="$TMPDIR/dnbd3fuse.log"
+ dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM"
+ rm -f -- "$dnbd3_exitflag"
+ (
+ dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${imgrelpath}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1
+ RET=$?
+ touch "$dnbd3_exitflag"
+ if [ "$RET" != "0" ]; then
+ writelog "dnbd3-fuse stopped working (Exit code $RET)"
+ slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${imgrelpath}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}"
+ fi
+ sleep 2
+ rm -f -- "$dnbd3_tmplog" "$dnbd3_exitflag"
+ ) &
+ # give it a bit of time
+ usleep 250000
+ # check if we have the image
+ for TIMEOUT in 0.5 1 1 OUT; do
+ if [ -r "${dnbd3_fuse_mount_point}/img" ]; then
+ vm_revision="$(grep -m 1 "^Revision:" "${dnbd3_fuse_mount_point}/status" | cut -d" " -f2)"
+ vm_diskfile="${dnbd3_fuse_mount_point}/img"
+ writelog "DNBD3: $imgrelpath on $vm_diskfile with rid $vm_revision"
+ vmpath="$vm_diskfile"
+ break
+ fi
+ [ "$TIMEOUT" = "OUT" -o -e "$dnbd3_exitflag" ] && break
+ sleep "$TIMEOUT"
+ done
+
+ if [ -z "$vm_diskfile" ]; then
+ slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found, trying NFS/CIFS..." "$dnbd3_tmplog"
+ writelog "No working dnbd3 server found :-("
+ fi
+fi
+
+# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system
+if [ -z "$vm_diskfile" ]; then
+ new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -n 1)
+ [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}"
+ vm_diskfile="$vmpath"
+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 "Virtual machine disk file: $vm_diskfile"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc
new file mode 100644
index 00000000..ee0b2c70
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc
@@ -0,0 +1,33 @@
+#####################################
+# Include: Setup printer daemon LPD #
+#####################################
+
+QUEUE="STANDARD" # This has to match the queue you configured in your VM
+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="${TMPDIR}/printergui-${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/scripts/run-virt_print '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" &
+
+# PID to kill the process
+PID_LPD="$!"
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
new file mode 100644
index 00000000..201c0ff5
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
@@ -0,0 +1,64 @@
+########################
+# Include: Setup sound #
+########################
+# 8086:1e20: Sound card in bwPX4
+
+writelog "Starting sound setup ..."
+
+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
+ writelog "Detecting which sound card to use ..."
+ PROC="/proc/asound/cards"
+ if [ ! -r "$PROC" ]; then
+ writelog "'${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
+ writelog "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)"
+ writelog "Detected sound card index is: $SOUND_CARD_INDEX"
+ writelog "Sound card count: $SOUND_CARD_COUNT"
+
+ # Adjust sound volume (playback)... Random mixer names we have encountered during testing
+ writelog "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
+ writelog "Done setting up volume."
+fi >> "${LOGFILE}" 2>&1
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc
new file mode 100644
index 00000000..4b8e10aa
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc
new file mode 100644
index 00000000..b7bb8f01
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc
new file mode 100644
index 00000000..90cd237b
--- /dev/null
+++ b/core/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/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc
new file mode 100644
index 00000000..940f4ff3
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc
@@ -0,0 +1,20 @@
+####################################################
+# 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
+ writelog "Starting fvwm2."
+ fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 &
+ else
+ writelog "Starting ${dm}."
+ $dm >/dev/null 2>&1 &
+ fi
+ break
+ fi
+done
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc
new file mode 100644
index 00000000..9769c81d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc
@@ -0,0 +1,77 @@
+# Helper function that will scan /dev/bus/usb for devices matching specific classes
+# and then output the corresponding device ids. This can be used for selective
+# handover of devices to a virtual machine
+
+declare -rg PASSTHROUGH_USB_DEVICES="2 0:5 0:6 0:7 0:14 0:16 0:17"
+
+# $1: expression to fill with device information.
+# valid placeholders are:
+# %VENDOR% - device vendor id
+# %PRODUCT% - device product id
+# $2-n: device classes to include in output
+get_usb_devices_int() {
+ [ -z "$TMPDIR" ] && TMPDIR="/tmp"
+ local EXP=$1
+ shift
+ if [ -z "$EXP" ]; then
+ writelog --quiet "No ouput expression template passed to get_usb_devices"
+ cleanexit 1
+ fi
+ if [ $# -eq 0 ]; then
+ writelog --quiet "No device classes given to get_usb_devices"
+ cleanexit 1
+ fi
+ local MATCH=';'
+ while [ $# -gt 0 ]; do
+ MATCH+="$1;"
+ [[ "$1" != *:* ]] && MATCH+="0:$1;"
+ shift
+ done
+ local dev=
+ local key value trailing
+ trailing=
+ local tmp="${TMPDIR}/lsusb.$$.$RANDOM"
+ for dev in /dev/bus/usb/*/*; do
+ if ! lsusb -D "$dev" > "$tmp" 2>/dev/null; then
+ writelog --quiet "Cannot lsusb $dev"
+ continue
+ fi
+ local DC=
+ local OK=
+ local VENDOR=
+ local PRODUCT=
+ while read -r key value trailing || [ -n "$key" ]; do
+ if [[ "$key" == "idVendor" ]]; then
+ [[ "$value" == 0x* ]] && VENDOR="${value:2}"
+ elif [[ "$key" == "idProduct" ]]; then
+ [[ "$value" == 0x* ]] && PRODUCT="${value:2}"
+ elif [ -z "$DC" ]; then
+ # No bDeviceClass seen yet
+ if [[ "$key" == "bDeviceClass" ]]; then
+ DC="$value"
+ [[ "$MATCH" == *";${DC};"* ]] && OK=yo
+ fi
+ else
+ # #DeviceClass is generic, look at sub class
+ if [[ "$key" == "bInterfaceClass" ]]; then
+ [[ "$MATCH" == *";${DC}:${value};"* ]] && OK=yo
+ fi
+ fi
+ if [ -n "$OK" -a -n "$VENDOR" -a -n "$PRODUCT" ]; then
+ echo "$EXP" | sed "s/%VENDOR%/${VENDOR}/g;s/%PRODUCT%/${PRODUCT}/g"
+ break
+ fi
+ done < "$tmp"
+ done
+ rm -f -- "$tmp"
+}
+
+get_usb_devices() {
+ if which lsusb 2>/dev/null >&2 && lsusb --help 2>&1 | grep -q -- '-D' 2>/dev/null; then
+ [ $# -eq 1 ] && set -- "$1" $PASSTHROUGH_USB_DEVICES # no quotes here!
+ get_usb_devices_int "$@" | sort -u
+ else
+ writelog --quiet "Cannot scan usb bus: lsusb not found or doesn't support -D"
+ fi
+}
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc
new file mode 100644
index 00000000..1f09b3d2
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc
@@ -0,0 +1,48 @@
+#######################################################
+# Include: Set functions needed by vmchooser-run_virt #
+#######################################################
+
+# function to write to stdout and logfile
+writelog() {
+ local DATE=$(date +%Y-%m-%d-%H-%M-%S)
+ # write to stdout?
+ if [ "x$1" = "x--quiet" ]; then
+ shift
+ else
+ echo -e "$DATE: $@"
+ fi
+ # log into file
+ echo -e "$DATE: $@" >> "${LOGFILE}"
+}
+
+# Clean exit will be called at the end of vmchooser-run_virt
+cleanexit() {
+ sleep 1
+ # Ummount dnbd3-fuse
+ if [ -n "$dnbd3_fuse_mount_point" ] && [ -e "$dnbd3_fuse_mount_point/img" ]; then
+ for timeout in 1 1 1 FAIL; do
+ fusermount -u "$dnbd3_fuse_mount_point" && break
+ writelog "dnbd3 still busy...."
+ [ "$timeout" = "FAIL" ] && break
+ sleep "$timeout"
+ done
+ fi
+ # Kill LPD
+ [ -n "${PID_LPD}" ] && kill "${PID_LPD}"
+
+ # If we're not in debug mode, remove all temporary files
+ if [ -n "${TMPDIR}" -a -z "$SLX_DEBUG" ]; then
+ rm -rf -- "${TMPDIR}"
+ fi
+
+ [ $# -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/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store b/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
new file mode 100755
index 00000000..9d478918
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
@@ -0,0 +1,39 @@
+#!/bin/ash
+
+. /opt/openslx/config || exit 1
+
+[ -z "$SLX_VM_NFS" ] && exit 0
+
+# create target directory
+mkdir -p /mnt/vmstore
+
+OUTFILE=$(mktemp)
+
+# check if it is a CIFS-share or NFS-share
+# no bash, so this is a bit ugly...
+if [ "${SLX_VM_NFS#//}" = "${SLX_VM_NFS}" ]; then
+ # doesn't start with '//' -> assume NFS
+ /opt/openslx/bin/timeout -t 10 -s 9 mount -v -t nfs -o ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore
+ RET=$?
+else
+ # starts with '//' -> assume CIFS
+ export USER="$SLX_VM_NFS_USER"
+ export PASSWD="$SLX_VM_NFS_PASSWD"
+ /opt/openslx/bin/timeout -t 10 -s 9 mount -v -t cifs -o ro,file_mode=0644,dir_mode=0755,uid=0,gid=0,forceuid,forcegid,sec=ntlm,nounix "$SLX_VM_NFS" /mnt/vmstore
+ unset USER
+ unset PASSWD
+ RET=$?
+fi > "$OUTFILE" 2>&1
+
+if [ $RET -ne 0 ]; then
+ if [ -s "$OUTFILE" ]; then
+ slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot." "$OUTFILE"
+ sleep 1
+ else
+ slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot."
+ fi
+fi
+
+rm -f -- "$OUTFILE"
+exit $RET
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env b/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
new file mode 100755
index 00000000..b8236600
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
@@ -0,0 +1,184 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2013 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# systemd-vmchooser_env
+# - This is the preparation script for the configuration of the virtuali-
+# zation tools used later on.
+################################################################################
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+# source config file with vars (e.g. ipaddr, macaddr, hostname)
+. /opt/openslx/config
+
+# from plugins/vmchooser/XX_vmchooser.sh
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+
+mkdir -p "${VMCHOOSER_DIR}/data/loopimg"
+mkdir -p "${VMCHOOSER_DIR}/fd-loop" -m 1777
+
+# mount a clean tempfs (bug in UnionFS prevents loopmount to work)
+grep -qE "unionfs |aufs " /proc/mounts && \
+ mount -n -o size=1500k -t tmpfs vm-loopimg "${VMCHOOSER_DIR}/data/loopimg"
+
+# create an empty floppy image of 1.44 MByte size
+dd "if=/dev/zero" "of=${VMCHOOSER_DIR}/data/loopimg/fd.img" count=2880 bs=512 2>/dev/null
+chmod 0777 "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+
+# use dos formatter copied into stage3
+mkdosfs "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+mount -n -t msdos -o loop,umask=000 "${VMCHOOSER_DIR}/data/loopimg/fd.img" "${VMCHOOSER_DIR}/fd-loop"
+
+#pvs integration
+#if [ $vmchooser_pvs -ne 0 ]; then
+# sed -i /usr/share/xsessions/default.desktop \
+# -e "s,vmchooser$,vmchooser --pvs,"
+#fi
+
+# setup more scratch space for virtual machines, if configured
+mkdir -p /tmp/virt /var/log/samba /run/samba
+
+chmod a+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
+# independent daemons)
+
+#cat >> /mnt/etc/sudoers << EOF
+# allow to start and stop the special /tmp redo file space (RAM + NBD/NFS server RAID)
+#ALL ALL=NOPASSWD: /sbin/losetup /dev/loop*
+#ALL ALL=NOPASSWD: /sbin/mdadm -C /dev/md0 -l linear --raid-devices=2 /dev/loop* /dev/*
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/sbin/nbd-client * * /dev/nbd*
+# allow to configure and start/stop samba services
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/bin/sed -i /etc/*/smb.conf -e *
+#ALL ALL=NOPASSWD: /usr/sbin/nmbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /usr/sbin/smbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/bin/killall nmbd smbd
+#EOF
+
+################################################################################
+### Determine hardware configuration
+################################################################################
+
+# estimate free mem
+mem_free=$(grep -i "^memfree:" /proc/meminfo | awk '{print $2}')
+mem_cached=$(grep -i "^cached:" /proc/meminfo | awk '{print $2}')
+mem_swapcached=$(grep -i "^swapcached:" /proc/meminfo | awk '{print $2}')
+[ -z "$mem_free" ] && mem_free="2048000"
+[ -z "$mem_cached" ] && mem_cached="0"
+[ -z "$mem_swapcached" ] && mem_swapcached="0"
+totalmem="$(expr $(expr $mem_free + $mem_cached + $mem_swapcached) / 1024)"
+echo "totalmem=${totalmem}" > "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# determine number of cpu cores
+CPU_CORES=$(grep '^processor.*:' /proc/cpuinfo | wc -l)
+if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then
+ echo "cpu_cores=${CPU_CORES}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else
+ echo 'cpu_cores=1' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# general machine architecture (32/64bit)
+echo "host_arch=$(uname -m)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# check for VT enabled CPU
+if grep -q '^flags.*\<vmx\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_intel"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ elif grep -q '^flags.*\<svm\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_amd"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ else
+ echo "vtflag=0" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# write mac
+if [ -n "$SLX_PXE_MAC" ]; then
+ echo "hostmacaddr=${SLX_PXE_MAC}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else ## Fallback:
+ echo "hostmacaddr=$(ip a | grep ether | grep -o -E -i '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+# read in ip address
+echo "hostip=${SLX_PXE_CLIENT_IP}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+# hostname
+echo "hostname=\"$(hostname -s)\"" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# get further hw information and check for traces of available optical and floppy drives
+j=0
+for cdrom in $(dmesg|grep -i "Attached scsi CD-ROM sr" | sed "s,.*Attached scsi CD-ROM ,,"); do
+ echo "cdrom_$j=/dev/${cdrom}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+j=0
+for floppy in $(dmesg|grep -i "Floppy drive"|sed "s,.*(s): ,,;s, is .*,,"); do
+ echo "floppy_$j=/dev/${floppy}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+################################################################################
+### Setup VM networking
+################################################################################
+
+# there will be three types of network interfaces for virtual machines available
+# all will be configured for every type of virtualization tool
+# a) br0 is the direct host bridge into the local LAN (br0 already exists)
+# vmnet0 for VMware
+# vboxnet0 for VirtualBox
+# kvmnet0* for Qemu/KVM
+# b) nat1 is an internal bridge which "NATes" into the local LAN (with DHCP)
+# vmnet1 for VMware
+# vboxnet1 for VirtualBox
+# kvmnet1* for Qemu/KVM
+# c) vsw2 is an internal host bridge to connect software defined LANs to
+# vmnet2 for VMware
+# vboxnet2 for VirtualBox
+# kvmnet2* for Qemu/KVM
+
+# creating and configuring nat0
+# 192.168.101.0/24 is vm nat. If you ever change this there are a couple of other files
+# where you'd need to make changes, so think twice before doing so. ;)
+brctl addbr nat1
+ip link set dev nat1 up
+ip addr add 192.168.101.1/24 dev nat1
+echo "1" >/proc/sys/net/ipv4/conf/nat1/forwarding
+echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
+# iptables masquerade rule is now inserted by /opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
+### iptables -t nat -A POSTROUTING -o br0 -s 192.168.0.0/16 -j MASQUERADE
+
+for wait in 1 1 2 2 3 end; do
+ grep '^SLX_DNS' "/opt/openslx/config" > /dev/null && break
+ [ "$wait" == "end" ] && echo "No DNS config found, using google dns" && break
+ echo "Waiting for DNS config.."
+ sleep "$wait"
+done
+
+# read the DNS configuration and configure the udhcpd
+[ -z "${SLX_DNS}" ] && SLX_DNS="8.8.8.8"
+sed -i "s,DNSSERVER,${SLX_DNS},;s,DOMAIN,${SLX_NET_DOMAIN}," \
+ /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+mkdir -p /var/lib/udhcpd
+udhcpd -S /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+# creating and configuring vsw2
+brctl addbr vsw2
+ip link set dev vsw2 up
+echo "1" >/proc/sys/net/ipv4/conf/vsw2/forwarding
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc
new file mode 100755
index 00000000..337dee44
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc
@@ -0,0 +1,475 @@
+#!/bin/bash
+
+# region header
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+ # region dependencies:
+
+# VMware Player - Runs a virtual machine.
+# VMware Workstation - Runs, edits, creates virtual machines for business
+# usage.
+# VirtualBox ver. 4+ - Plays, creates, edits virtual machines.
+# bash ver. 4+ - A sh-compatible command line interpreter.
+# cat - Concatenate and prints file contents.
+# echo - Prints chars.
+# grep - Prints lines which matches a given regular expression
+# pattern.
+# sed - Stream-editor for filtering and transformation text.
+# mktemp - Creates temporary files and folders.
+# dirname - Extracts the last element from a given file path.
+# mv - moves and renames file objects.
+# rm - Removes files and folders.
+# cp - Copies files and folders.
+# sleep - Delays program calls.
+# readlink - Print resolved symbolic links or canonical file names.
+
+ # endregion
+
+# Abbreviation for "createLinkedClone".
+__NAME__='vmchooser-clc'
+
+# endregion
+
+# Provides the main module scope.
+function vmchooser-clc() {
+
+# region configuration
+
+ # region private properties
+
+ # region command line arguments
+
+ local _VERBOSE='no'
+ # NOTE: You should write upper case first letters to support valid
+ # camel case method names to handle given hypervisor.
+ local _SUPPORTED_HYPERVISOR=('VMware' 'VirtualBox')
+ # NOTE: This value will be determined automatically. If no hypervisor
+ # could be detected this value will be used as default.
+ # The first value from supported Machines is taken as default.
+ local _HYPERVISOR="$_SUPPORTED_HYPERVISOR"
+ local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--'
+ local _PERSISTENT_CONFIG_TARGET=''
+ local _BASIC_IMAGE_CONFIGURATION_FILE_PATH=''
+ local _TARGET_PATH=''
+ local _VIRTUAL_BOX_SNAPSHOT_NAME='persistentUserSnapshot'
+
+ # endregion
+
+ local _STANDARD_OUTPUT=/dev/null
+ local _ERROR_OUTPUT=/dev/null
+ local _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH='/tmp/clcVirtualBoxSnapshotUUID'
+
+ # endregion
+
+# endregion
+
+# region functions
+
+ # region command line interface
+
+ # Prints a description about how to use this program.
+ function clcPrintUsageMessage() {
+ cat << EOF
+ $__NAME__ Generates a linked clone from given machine description file in
+ given target location.
+EOF
+ return $?
+ }
+
+ # Prints a description about how to use this program by providing examples.
+ function clcPrintUsageExamples() {
+ cat << EOF
+ # Getting a help message.
+ >>> $0 --help
+
+ # Creating a linked clone.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/
+
+ # Creating a linked clone configuration file.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -c
+
+ # Creating a linked clone in verbose mode.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d
+EOF
+ return $?
+ }
+
+ # Prints descriptions about each available command line option.
+ function clcPrintCommandLineOptionDescriptions() {
+ # NOTE; All letters are used for short options.
+ cat << EOF
+ -h --help Shows this help message.
+
+ -v --verbose Tells you what is going on (default: "$_VERBOSE").
+
+ -d --debug Gives you any output from all tools which are used
+ (default: "$_DEBUG").
+
+ -c --create-persistent-config PERSISTENT_IMAGE_FILE_PATH If set an xml file
+ for persistent openslx boot will be created referencing to given
+ persistent image path (default: "$_PERSISTENT_CONFIG_TARGET").
+
+ -v --virtualbox-snapshot-name NAME Provide a name for newly created
+ snapshots. (default: "$_VIRTUAL_BOX_SNAPSHOT_NAME").
+
+ -u --virtualbox-snapshot-uuid-file-path PATH Provide a file path where to
+ save the newly generated snapshot uuid (default: \
+ "$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH").
+EOF
+ return $?
+ }
+
+ # Provides a help message for this module.
+ function clcPrintHelpMessage() {
+ echo -e \
+ "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \
+ clcPrintUsageMessage "$@" && \
+ echo -e '\nExamples:\n' && \
+ clcPrintUsageExamples "$@" && \
+ echo -e '\nOption descriptions:\n' && \
+ clcPrintCommandLineOptionDescriptions "$@" && \
+ echo && \
+ return $?
+ }
+
+ # Provides the command line interface and interactive questions.
+ function clcCommandLineInterface() {
+ while true; do
+ case "$1" in
+ -h|--help)
+ shift
+ clcPrintHelpMessage "$0"
+ exit 0
+ ;;
+ -v|--verbose)
+ shift
+ _VERBOSE='yes'
+ ;;
+ -d|--debug)
+ shift
+ _DEBUG='yes'
+ _STANDARD_OUTPUT=/dev/stdout
+ _ERROR_OUTPUT=/dev/stderr
+ ;;
+ -c|--create-persistent-config)
+ shift
+ _PERSISTENT_CONFIG_TARGET="$1"
+ shift
+ ;;
+ -v|--virtualbox-snapshot-name)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_NAME="$1"
+ shift
+ ;;
+ -u|--virtualbox-snapshot-uuid-file-path)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH="$1"
+ shift
+ ;;
+
+ '')
+ shift
+ break 2
+ ;;
+ *)
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then
+ _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1"
+ elif [[ ! "$_TARGET_PATH" ]]; then
+ _TARGET_PATH="$1"
+ else
+ clcLog 'critical' \
+ "Given argument: \"$1\" is not available." '\n'
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ shift
+ ;;
+ esac
+ done
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \
+ [[ ! "$_TARGET_PATH" ]]; then
+ clcLog 'critical' \
+ "You have to provide a basic image configuration file and a destination path."
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ local supportedVirtualMachine
+ for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do
+ if [[ "$(clcGetXMLValue 'virtualMachine' | \
+ grep --ignore-case "$supportedVirtualMachine")" ]]; then
+ _HYPERVISOR="$supportedVirtualMachine"
+ clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor."
+ break
+ fi
+ done
+ clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \
+ return $?
+ }
+
+ # Grabs a value from currently loaded xml file.
+ function clcGetXMLValue() {
+ grep --ignore-case --only-matching "<$1 param=.*" \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }'
+ return $?
+ }
+
+ # Handles logging messages. Returns non zero and exit on log level error to
+ # support chaining the message into toolchain.
+ function clcLog() {
+ local loggingType='info'
+ local message="$1"
+ if [ "$2" ]; then
+ loggingType="$1"
+ message="$2"
+ fi
+ if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \
+ [ "$loggingType" == 'critical' ]; then
+ if [ "$3" ]; then
+ echo -e -n "$3"
+ fi
+ echo -e "${loggingType}: $message"
+ fi
+ if [ "$loggingType" == 'error' ]; then
+ exit 1
+ fi
+ }
+
+ # endregion
+
+ # region tools
+
+ # Returns the minimal vmx vmware configuration file content to create a
+ # snapshot.
+ function clcGetTemporaryVMXContent() {
+ cat << EOF
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "7"
+ide0:0.present = "TRUE"
+ide0:0.fileName = "$1"
+displayName = ""
+EOF
+ return $?
+ }
+
+ # This functions escapes every special meaning character for a sed
+ # replacement.
+ #
+ # Examples:
+ #
+ # >>> sed "s/myInputString/$(clcValidateSEDReplacement '\hans/peter&klaus')/g"
+ function clcValidateSEDReplacement() {
+## bash
+## sed --expression 's/\\/\\\\/g' --expression 's/\//\\\//g' \
+## --expression 's/&/\\\&/g' <<< "$1"
+ sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g' <<< "$1"
+##
+ return $?
+ }
+
+ # endregion
+
+ # region main tasks
+
+ # Creates a snapshot from VMware generated virtual machine.
+ function clcCreateVMwareSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Generate a temporary virtual machine configuration file \"$temporaryConfigurationFilePath\"." && \
+ clcGetTemporaryVMXContent "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" 1>"$temporaryConfigurationFilePath" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ vmrun snapshot "$temporaryConfigurationPath"*.vmx \
+ persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ fi
+ return $result
+ }
+
+ # Creates a snapshot from virtualBox generated virtual machine.
+ function clcCreateVirtualBoxSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## (cp --recursive ~/.VirtualBox/ \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+## mkdir --parents \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+ (cp -r ~/.VirtualBox/ \
+ "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ mkdir -p "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+##
+ # VBoxManage version to create snapshots.
+ clcLog 'Create a temporary virtual machine.' && \
+ # NOTE: Virtualbox needs 5 at leas 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ VBoxManage createvm --name tmp --basefolder \
+ "$temporaryConfigurationPath" --register 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Create a temporary virtual ide controller.' && \
+ VBoxManage storagectl tmp --name tmp --add ide 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Attach given virtual disk image to temporary virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --type hdd --medium "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ clcLog "Take a snapshot with name or uuid \"$_VIRTUAL_BOX_SNAPSHOT_NAME\"." && \
+ VBoxManage snapshot tmp take "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## local virtualBoxSnapshotUUID="$(basename \
+## "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+## --regexp-extended 's/\{(.+)\}\..+/\1/g')" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local virtualBoxSnapshotUUID="$(basename \
+ "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+ -r 's/\{(.+)\}\..+/\1/g')" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ echo "$virtualBoxSnapshotUUID" \
+ 1>"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Created snapshot uuid is \"$virtualBoxSnapshotUUID\" (uuid saved to \"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH\")." && \
+ clcLog "Copy result to given target path \"$_TARGET_PATH\"." && \
+ cp "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtualbox tries to consolidate with
+ # readonly basic image.
+ #VBoxManage snapshot tmp delete "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ # 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtual box has child images registered.
+ #VBoxManage closemedium disk "$(dirname \
+ # "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ # 'image_name')" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Detach given virtual disk image from temporary created virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --medium none 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Remove virtual dummy harddisk.' && \
+ VBoxManage storagectl tmp --name tmp --remove \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Unregister temporary created virtual machine.' && \
+ VBoxManage unregistervm tmp 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Restore virtualbox home directory.' && \
+## bash
+## rm --recursive --force ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+## 2>"$_ERROR_OUTPUT" && \
+## cp --recursive "${temporaryConfigurationPath}virtualBoxBackup/" \
+## ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## rm --recursive --force "$temporaryConfigurationPath" && \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ cp -r "${temporaryConfigurationPath}virtualBoxBackup/" \
+ ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf "$temporaryConfigurationPath" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ # NOTE: Virtualbox needs at least 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ return $?
+ fi
+ return $result
+ }
+
+ # Creates a persistent version of given configuration file.
+ function clcCreatePersistentConfig() {
+ clcLog "Create a persistent configuration file version from \"$_BASIC_IMAGE_CONFIGURATION_FILE_PATH\" in \"$_TARGET_PATH\"." && \
+ cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Edit short description.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Append "original_xml_file_path" tag.' && \
+## bash
+## sed --in-place --regexp-extended \
+## "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+## "$(readlink --canonicalize \
+## "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+## "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r \
+ "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+ "$(readlink -f \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ clcLog 'Edit image file path.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *image_name[^>]*param=\")[^\"]*(\")/\\1$(clcValidateSEDReplacement \
+ "$_PERSISTENT_CONFIG_TARGET")\\2/g" "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Convert configuration file from windows style line endings to unix line endings.' && \
+## bash
+## sed --in-place --regexp-extended 's/\r//g' "$_TARGET_PATH" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r 's/\r//g' "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ return $?
+ }
+
+ # endregion
+
+# endregion
+
+# region controller
+
+ clcCommandLineInterface "$@" || return $?
+ if [[ "$_PERSISTENT_CONFIG_TARGET" ]]; then
+ clcCreatePersistentConfig || \
+ clcLog 'error' 'Creating persistent configuration file failed.'
+ else
+ "clcCreate${_HYPERVISOR}Snapshot" || \
+ clcLog 'error' 'Creating Linked Clone failed.'
+ fi
+ clcLog 'Program has successfully finished.' && \
+ return $?
+
+# endregion
+
+}
+
+# region footer
+
+if [[ "$0" == *"${__NAME__}" ]]; then
+ "$__NAME__" "$@"
+fi
+
+# endregion
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
new file mode 100755
index 00000000..1e591389
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
@@ -0,0 +1,116 @@
+#!/bin/bash
+# Full bash required
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2010 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# run-virt.sh
+# - This is the generic wrapper for the several virtualization solutions.
+# The idea is to setup a set of variables used by at least two different
+# tools and then include the specific plugin which configures the speci-
+# fied virtualization tool.
+################################################################################
+
+RUNVIRTINCLUDEDIR=/opt/openslx/scripts/includes
+xmlfile="$1"
+
+# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string())
+source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc && trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM
+# Define default dirs / get configs
+source ${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc
+# Function to detect whether we can use the new way (vmx via http) or the old way (legacy):
+source ${RUNVIRTINCLUDEDIR}/detect_legacy.inc # This yields LEGACY, IMGUUID, IMGVMX
+# For scanning for certain usb classes
+source "${RUNVIRTINCLUDEDIR}/usb_detector.inc"
+
+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
+ # check for important files used (filecheck()) - vestigial?
+ # This include does not currently work. TODO.
+ # source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc && filecheck
+
+ # Read needed variables from XML file
+ source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc
+
+ # Sound setup the rest of the environment and run the configured vm
+ source ${RUNVIRTINCLUDEDIR}/setup_sound.inc
+
+ # Declaration of hardware relatedt variables
+ source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.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
+
+ # Get all virtual machine specific stuff from the respective include file
+ source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc
+
+ # start a windowmanager for easier handling
+ source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc
+
+ # Try to use dnbd3 to access the image, nfs/cifs fallback
+ 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
+
+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
+if [ -n "${POSTRUN}" ]; then
+ eval ${POSTRUN} >/dev/null 2>&1
+fi
+
+cleanexit 0
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter
new file mode 100755
index 00000000..5fd8acc5
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter
@@ -0,0 +1,74 @@
+#!/bin/bash
+# Probably needs bash somewhere
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2009 - RZ Uni FR
+# Copyright (c) 2007..2011 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xmlfilter.sh
+# - This script is invoked by the vmchooser tool. It simply filters xml-
+# files (taking the path to these files in $1). You might modify it in any
+# way to match your needs, e.g. ask some database instead. You can re-
+# implement it in any other programming language too. You simply have to
+# return a list of proper xml files to be interpreted by the vmchooser
+# binary). Please check for vmchooser.sh too ...
+# -----------------------------------------------------------------------------
+
+# This script .
+#
+# currently:
+# - filter for slxgrp (which comes from /etc/machine-setup)
+#
+
+# include default directories
+. /opt/openslx/config
+
+if [ -f "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf" ]; then
+ . "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf"
+fi
+
+function handlePersistentVM() {
+ if grep --extended-regexp -q "<persistent param=\"(|.+:)$USER(|:.+)\"" "$1"; then
+ # If this virtual machine is useable as persistent version for current
+ # user we provide an additional persistent version.
+ # TODO: This evil black magic needs to be rewritten some day (by someone who understands it)
+ local originalImagePath=$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+ local imageName=$(basename "$originalImagePath")
+ eval export SLX_VM_PERSISTENT_PATH="${SLX_VM_PERSISTENT_PATH}" && \
+ local imagePath="${SLX_VM_PERSISTENT_PATH}${imageName}"
+ local persistentConfigVersionFilePath="$(mktemp --directory)/$(basename "$1")"
+ local vmchooserFilePath="$(dirname "$0")/vmchooser-clc"
+ if [ ! -f "$vmchooserFilePath" ]; then
+ vmchooserFilePath='/opt/openslx/scripts/vmchooser-clc'
+ fi
+ "$vmchooserFilePath" "$1" "$persistentConfigVersionFilePath" \
+ --create-persistent-config "$imagePath" && \
+ echo "$persistentConfigVersionFilePath"
+ fi
+}
+
+for FILE in $(find -L "$1" -iname "*.xml"); do
+ # filter all xmls which aren't set active
+ grep -i -q "<active param=.*true.*" "$FILE" || continue
+ # HACK: filter all virtualbox images, as vbox is not ready yet
+ grep -i -q "<virtualmachine param=.*virtualbox.*" "$FILE" && continue
+ if [ -n "${SLX_VM_POOL_FILTER}" ]; then
+ # filter all xmls with pool-param not equal to vmchooser::env
+ if [ $(grep "<pools param=\"${SLX_VM_POOL_FILTER}\"" "$FILE" | wc -l) -eq 1 ]; then
+ handlePersistentVM "$FILE"
+ echo "$FILE"
+ fi
+ else
+ handlePersistentVM "$FILE"
+ # if there is no pool set, just take all available xmls
+ echo "$FILE"
+ fi
+done
+