summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt/data/opt
diff options
context:
space:
mode:
authorJonathan Bauer2016-12-23 13:12:09 +0100
committerJonathan Bauer2016-12-23 13:12:09 +0100
commit6806ae4a850fc7785a8c05304237cf53b5b8f951 (patch)
treeb1dd8413d6c7b9a250251da7f0d49bb52b4ddc57 /core/modules/run-virt/data/opt
parentwrong kernel version variable used (diff)
downloadmltk-6806ae4a850fc7785a8c05304237cf53b5b8f951.tar.gz
mltk-6806ae4a850fc7785a8c05304237cf53b5b8f951.tar.xz
mltk-6806ae4a850fc7785a8c05304237cf53b5b8f951.zip
merge with latest dev version (tm-scripts commit f5a59daf8d70a9027118292cd40b18c221897408)
Diffstat (limited to 'core/modules/run-virt/data/opt')
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/pam_script_auth.d/99-run_virt_credentials41
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear17
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store13
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env63
l---------[-rwxr-xr-x]core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt117
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf5
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH24
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README21
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc29
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc51
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc20
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc14
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc27
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc22
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc66
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc8
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc21
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc12
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares62
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution102
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone138
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares40
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer87
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime97
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exebin15360 -> 53248 bytes
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc32
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc63
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc113
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc26
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc12
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc98
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc46
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc79
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc101
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc34
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc27
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc77
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc107
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall130
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt119
40 files changed, 2008 insertions, 153 deletions
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/pam_script_auth.d/99-run_virt_credentials b/core/modules/run-virt/data/opt/openslx/scripts/pam_script_auth.d/99-run_virt_credentials
new file mode 100644
index 00000000..a03d8886
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/pam_script_auth.d/99-run_virt_credentials
@@ -0,0 +1,41 @@
+#!/bin/ash
+# This is being sourced and running in ash
+
+if [ -n "$TEMP_HOME_DIR" ]; then
+ if [ -z "$PAM_TTY" ] || [ "x$PAM_TTY" = "x:0" ]; then
+ # Pass on network path to home directory
+ if [ -z "$PERSISTENT_NETPATH" ]; then
+ PERSISTENT_NETPATH=$(grep -m1 -F " ${PERSISTENT_HOME_DIR} " "/proc/mounts" | awk '{print $1}')
+ fi
+ if [ -n "$PERSISTENT_NETPATH" ]; then
+ [ "x${PERSISTENT_NETPATH:0:2}" = "x//" ] && PERSISTENT_NETPATH=$(echo "$PERSISTENT_NETPATH" | tr '/' '\')
+ echo "${PERSISTENT_NETPATH}" > "${TEMP_HOME_DIR}/.home"
+ chmod 0644 "${TEMP_HOME_DIR}/.home"
+ fi
+ # pwdaemon
+ # Figure out username
+ XUSER="${REAL_ACCOUNT}"
+ [ -z "$XUSER" ] && XUSER="${PAM_USER}"
+ # Guess domain
+ XDOMAIN=
+ if [ -n "$PERSISTENT_HOME_DIR" ]; then
+ XDOMAIN=$(grep -F " ${PERSISTENT_HOME_DIR} " "/proc/mounts" | grep -m1 -F 'domain=' | sed -r 's/^.*[ ,]domain=([^ ,]+)[ ,].*$/\1/g')
+ fi
+ if [ -z "$XDOMAIN" ]; then
+ XDOMAIN=$(grep -m1 -i '^BASE\s*DC=' "/etc/ldap.conf" | sed -r 's/^BASE\s*DC=([^,;]+).*$/\1/I')
+ fi
+ if [ -z "$XDOMAIN" ]; then
+ XDOMAIN=$(grep -m1 -i '^ldap_search_base\s*=\s*DC=' "/etc/sssd/sssd.conf" | sed -r 's/^ldap_search_base\s*=\s*DC=([^,;]+).*$/\1/I')
+ fi
+ if [ -n "$XDOMAIN" ]; then
+ XDOMAIN=$(echo "$XDOMAIN" | tr '[a-z]' '[A-Z]')
+ else
+ XDOMAIN="WORKGROUP"
+ fi
+ USERNAME="$XDOMAIN\\$XUSER" PASSWORD="$PAM_AUTHTOK" PWSOCKET="${TEMP_HOME_DIR}/.pwsocket" su -c 'pwdaemon --daemon &' "${PAM_USER}" &
+ unset XUSER XDOMAIN
+ fi
+fi
+
+true
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear b/core/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear
new file mode 100644
index 00000000..dab08190
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear
@@ -0,0 +1,17 @@
+#!/bin/ash
+
+# Sourced by pam_script_ses_close
+
+runvirt_fw_clear () {
+ iptables -w -F runvirt-INPUT
+ ip6tables -w -F runvirt-INPUT
+ iptables -w -F runvirt-OUTPUT
+ ip6tables -w -F runvirt-OUTPUT
+}
+
+if [ "x$PAM_TTY" = "x:0" ]; then
+ runvirt_fw_clear > /dev/null 2>&1
+fi
+
+true
+
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
index 9d478918..235cf4be 100755
--- 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
@@ -13,8 +13,12 @@ OUTFILE=$(mktemp)
# 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
+ /opt/openslx/bin/timeout -t 6 -s 9 mount -v -t nfs -o ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore
RET=$?
+ if [ "$RET" != "0" ]; then
+ /opt/openslx/bin/timeout -t 6 -s 9 mount -v -t nfs -o vers=3,ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore
+ RET=$?
+ fi
else
# starts with '//' -> assume CIFS
export USER="$SLX_VM_NFS_USER"
@@ -25,15 +29,14 @@ else
RET=$?
fi > "$OUTFILE" 2>&1
-if [ $RET -ne 0 ]; then
+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
+ slxlog --delete "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot." "$OUTFILE"
else
slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot."
+ rm -f -- "$OUTFILE"
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
index b8236600..a86b2d0b 100755
--- 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
@@ -28,27 +28,7 @@ export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
# 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
+DHCP_NAT_CONF="/opt/openslx/vmchooser/config/udhcpd-nat1.conf"
# setup more scratch space for virtual machines, if configured
mkdir -p /tmp/virt /var/log/samba /run/samba
@@ -110,10 +90,20 @@ fi
# write mac
if [ -n "$SLX_PXE_MAC" ]; then
- echo "hostmacaddr=${SLX_PXE_MAC}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ hostmacaddr="${SLX_PXE_MAC}"
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"
+ hostmacaddr="$(ip a | grep ether | grep -o -E -i '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1)"
fi
+echo "hostmacaddr='$hostmacaddr'" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+# 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
+macaddrprefix='00:50:56'
+macaddrsuffix="$(echo "$hostmacaddr" | awk -F ":" '{print "%VMID%:" $(NF-1) ":" $NF}' | tr '[a-z]' '[A-Z]')"
+echo "macaddrprefix='$macaddrprefix'" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+echo "macaddrsuffix='$macaddrsuffix'" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
# read in ip address
echo "hostip=${SLX_PXE_CLIENT_IP}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
# hostname
@@ -132,6 +122,11 @@ for floppy in $(dmesg|grep -i "Floppy drive"|sed "s,.*(s): ,,;s, is .*,,"); do
j=$(expr $j + 1)
done
+# Serial ports
+echo "serial_ports='$(dmesg | grep -Eo 'ttyS[0-9]+' | sed 's,^,/dev/,' | tr '\n' ' ')'" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+# Parallel ports
+modprobe parport_pc
+
################################################################################
### Setup VM networking
################################################################################
@@ -163,19 +158,27 @@ echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
### 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.."
+ [ -n "$SLX_DNS" ] && [ -n "$SLX_NET_SEARCH" ] && break
+ if [ "$wait" == "end" ]; then
+ echo "No DNS config found, using google dns"
+ break
+ fi
+ echo "Waiting for DNS & search-domain config.."
sleep "$wait"
+ . /opt/openslx/config
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
+[ -z "${SLX_DNS}" ] && SLX_DNS="8.8.8.8 8.8.4.4"
+[ -z "${SLX_NET_DOMAIN}" ] && SLX_NET_DOMAIN="virtual.site"
+[ -z "${SLX_NET_SEARCH}" ] && SLX_NET_SEARCH="virtual.site"
+sed -i "s#%DNSSERVER%#${SLX_DNS}#;s#%DOMAIN%#${SLX_NET_DOMAIN}#;s#%SEARCH%#${SLX_NET_SEARCH}#" "${DHCP_NAT_CONF}"
+
+# Make sure the primary vm running (we most likely never run more than one at a time anyways) always gets the same ip
+echo "static_lease $(echo "$macaddrprefix:$macaddrsuffix" | sed 's/%VMID%/01/') 192.168.101.20" >> "${DHCP_NAT_CONF}"
mkdir -p /var/lib/udhcpd
-udhcpd -S /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+udhcpd -S "${DHCP_NAT_CONF}"
# creating and configuring vsw2
brctl addbr vsw2
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
index 1e591389..447f98bc 100755..120000
--- a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
@@ -1,116 +1 @@
-#!/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
+/opt/openslx/vmchooser/vmchooser-run_virt \ No newline at end of file
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf b/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
index bca1397c..95d8ebc0 100644
--- a/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
@@ -31,11 +31,12 @@ lease_file /var/lib/udhcpd/udhcpd-nat1.leases
# location of the pid file
pidfile /var/run/udhcpd-nat1.pid
-option dns DNSSERVER
+option dns %DNSSERVER%
option subnet 255.255.255.0
option router 192.168.101.1
option wins 192.168.101.10
-option domain DOMAIN virtual.site
+option domain %DOMAIN%
+option search %SEARCH%
option lprsrv 192.168.101.1
#option ntpsrv NTPSERVER
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH
new file mode 100644
index 00000000..326af2a4
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH
@@ -0,0 +1,24 @@
+Dieses Paket besteht aus folgenden Skripten:
+
+vm_installer: Dieses Skript einmalig in einer lokalen, permanenten (also
+ nicht innerhalb des Poolsystems) Virtuellen Maschine ausführen.
+ Es schreibt eine systemd-Servicedatei und verlinkt diese, um
+ beim Systemstart per vm_runtime die Skripte zu Auflösungsan-
+ passung und Einhängung eventuell übergebener Netzlaufwerke
+ nach Hochladung der VM in das Poolsystem automatisch zu starten.
+ Das Skript kann von der gemounteten (Pseudo-)Diskette /dev/fd1
+ aus oder einzelstehend gestartet werden.
+ Unterstützung für init-basierte Systeme folgt noch.
+vm_runtime: Dieses Skript wird beim booten der VM aufgerufen und patcht
+ Xsetup, um beim grafischen Start der VM die Skripte shares
+ und resolution aufzurufen.
+mnt_shares: Liest die auf Pseudodiskette gegebene shares.dat aus und hängt
+ ggf. darin angegebene Netzlaufwerke ein.
+resolution: Stellt die Auflösung der VM anhand der übergebenen Auflösung
+ des Grundsystems ein.
+
+resolution_standalone: Einzelstehende Version des resolution-Skriptes, die
+ keine Vorarbeiten seitens systemd bzw. vm_runtime benötigt.
+ Für geeignete Einbindung innerhalb der VM muss daher selbst
+ gesorgt werden.
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README
new file mode 100644
index 00000000..12777c67
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README
@@ -0,0 +1,21 @@
+This package consists of the following scripts:
+
+vm_installer: This script is to be started once in a local, permanent (so
+ not within the pool system environment) virtual machine. It
+ writes a systemd service file and links it, so the scripts
+ for resolution setting and mounting network shares will be
+ started at boot time at boot time via vm_runtime.
+ It may be run from the mounted (pseudo) disk drive /dev/fd1
+ or from elsewhere.
+ init will be supported at later time.
+vm_runtime: Will be started at boot time and patches Xsetup, so the
+ scripts mnt_shares and resolution will be started at graphical
+ login.
+mnt_shares: Reads the config file shares.dat from (pseudo) disk drive and
+ mounts therein given network shares.
+resolution: Sets resolution within the virtual machine according to base
+ system resolution given via config file openslx.ini.
+
+resolution_standalone: Standalone version of resolution sctipt. Needs no
+ preliminary work done by systemd or vm_runtime.
+ One has to embed/start it via adequate means by hand.
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc
new file mode 100644
index 00000000..bb7ae3a1
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc
@@ -0,0 +1,29 @@
+### Variablen #####################################
+LOCALUSER=student
+USERHOME=/home/"$LOCALUSER"
+USERHOMEDIR=/home/"$LOCALUSER"/PERSISTENT
+DISKMOUNTDIR=/mnt/diskmount
+SLXCONFIGFILE="$DISKMOUNTDIR"/openslx.ini
+CONFIGFILE="$DISKMOUNTDIR"/shares.dat
+KEYTEMP=$(mktemp -t XXXXXXXXXX.dat)
+RAWKEYTEMP=$(mktemp -t XXXXXXXXXX.dat)
+BYTES=256
+declare -a ROHSHARES
+
+if [ ! $(mount 2>/dev/null | grep -q "$DISKMOUNTDIR") ]; then
+ [ ! -d "$DISKMOUNTDIR" ] && mkdir -p "$DISKMOUNTDIR"
+ mount /dev/fd1 "$DISKMOUNTDIR" 2>/dev/null 1>&2 # Zu erl.: Fehlerfangen
+fi
+
+NATADDR=$(head -n 1 "$CONFIGFILE" | cut -f 1 -d$'\t')
+PORT=$(head -n 1 "$CONFIGFILE" | cut -f 2 -d$'\t')
+SCHLUESSEL=$(head -n 1 "$CONFIGFILE" | cut -f 4 -d$'\t')
+GLOBALDOMAINUSER=$(head -n 1 "$CONFIGFILE" | cut -f 5 -d$'\t')
+GLOBALUSER=$(echo "$GLOBALDOMAINUSER" | cut -d '\' -f 2)
+
+REMAPMODE=$(grep 'remapMode=' "$SLXCONFIGFILE" | cut -d '=' -f 2)
+CREATEMISSING=$(grep 'createMissingRemap=' "$SLXCONFIGFILE" | cut -d '=' -f 2)
+
+MOUNTOPTSCIFS="-v -t cifs -o uid=$(id --user "$LOCALUSER"),gid=$(id --group "$LOCALUSER"),forceuid,forcegid,file_mode=0700,dir_mode=0700,nobrl,noacl"
+MOUNTOPTSNFS="-v -t nfs4 -o rw,nosuid,nodev,nolock,intr,hard,sloppy"
+### Variablen Ende ################################
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc
new file mode 100644
index 00000000..97767c51
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc
@@ -0,0 +1,51 @@
+### Funktionen ####################################
+
+function xor()
+{ local RES=($(echo "$1" | sed "s/../0x& /g"))
+ shift 1
+ while [[ "$1" ]]; do
+ local ONE=($(echo "$1" | sed "s/../0x& /g"))
+ local COUNT1=${#RES[@]}
+ if [ $COUNT1 -lt ${#ONE[@]} ]; then
+ COUNT1=${#ONE[@]}
+ fi
+ for (( i = 0; i < $COUNT1; i++ )); do
+ RES[$i]=$((${ONE[$i]:-0} ^ ${RES[$i]:-0}))
+ done
+ shift 1
+ done
+ printf "%02x" "${RES[@]}"
+}
+
+function already_mounted()
+{
+ # Ausgabe: gemountet = true = 0, nicht gemountet = false = 1
+ local AUSGANG
+ mount | grep -q " ${1} " && AUSGANG=0 || AUSGANG=1
+ return $AUSGANG
+}
+
+function mounter()
+{
+ # Ausgabe: konnte mounten: 0, konnte nicht mounten: 1, schon gemountet 2
+ already_mounted "$3"
+ ERR=$?
+ if [ "$ERR" -eq 0 ]; then
+ logger "openslx sharemapper: $3 already mounted."
+ AUSGANG=2
+ else
+ mount $1 $2 $3 2>/dev/null 1>&2
+ ERR=$?
+ if [ "$ERR" -gt 0 ]; then
+ logger "openslx sharemapper: could not mount ${2} to ${3}."
+ AUSGANG=1
+ else
+ logger "openslx sharemapper: ${2} mounted to ${3}."
+ AUSGANG=0
+ fi
+ fi
+ return $AUSGANG
+}
+
+### Funktionen Ende ###############################
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc
new file mode 100644
index 00000000..bcbd6ec1
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc
@@ -0,0 +1,20 @@
+preliminaries_native()
+{
+ # USERHOMEDIR=~/PERSISTENT, not ~! ################
+ [ -h "$USERHOMEDIR" ] && unlink "$USERHOMEDIR"
+ [ ! -d "$USERHOMEDIR" ] && mkdir -p "$USERHOMEDIR"
+}
+
+preliminaries_vmware()
+{
+ # USERHOMEDIR=~/PERSISTENT, not ~! ################
+ if [ -d "$USERHOMEDIR" ]; then
+ logger "openslx sharemapper: vmware mode: USERHOMEDIR ${USERHOMEDIR} is a directory, moving to ${USERHOMEDIR}_mov."
+ mv "$USERHOMEDIR" "${USERHOMEDIR}"_mov
+ fi
+
+ [ -h "$USERHOMEDIR" ] && unlink "$USERHOMEDIR"
+ logger "openslx sharemapper: vmware mode: linking $USERHOMEDIR to /mnt/hgfs/home."
+ ln -s /mnt/hgfs/home "$USERHOMEDIR" || \
+ logger "openslx sharemapper: vmware mode: Could not link to vmware hgfs mount dir."
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc
new file mode 100644
index 00000000..c49b99ff
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc
@@ -0,0 +1,14 @@
+function ausgang()
+{ rm -f "$KEYTEMP"
+ rm -f "$RAWKEYTEMP"
+ # umount "$DISKMOUNTDIR" # as mounted by systemd now.
+}
+
+function set_trapping()
+{
+ ### Trap ##########################################
+ trap ausgang EXIT SIGHUP SIGINT SIGTERM
+ ###################################################
+}
+
+set_trapping
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc
new file mode 100644
index 00000000..c6f6ffcb
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc
@@ -0,0 +1,27 @@
+function get_creds()
+{
+ # udp-Socket erzeugen Kanal erzeugen::
+ exec 13<>/dev/udp/"$NATADDR"/"$PORT"
+
+ # temp. Datei - wer hat Angst vor Nullbytes? Ich! Ich! Ich!
+ head -n 1 "$CONFIGFILE" |cut -f3 -d$'\t' | while read -n 2 CODE; do [ -n "$CODE" ] && printf "\x$CODE"; done >"$KEYTEMP"
+ # Auf Socket fuer Grundsystem schreiben:
+ cat "$KEYTEMP" >&13
+
+ # Serverantwort pwdaemon in temp. Datei schreiben:
+ timeout 2s dd bs=$BYTES count=1 of="$RAWKEYTEMP" <&13 2>/dev/null
+
+ # Kanal zu Socket schließen:
+ exec 13<&-
+ exec 13>&-
+
+ # Wieviele Zeichen (Bytes 1 und 2 der Paketnutzlast)?
+ ANZAHL=$((16#$(dd if=$RAWKEYTEMP bs=1 count=2 2>/dev/null|hexdump -e '1/1 "%02x"')))
+
+ # Und raus-xor-en:
+ PW=$( xor $(dd if="$RAWKEYTEMP" bs=1 skip=2 2>/dev/null|hexdump -e '1/1 "%02x"') \
+ $(head -n 1 "$CONFIGFILE" | cut -f 4 -d$'\t') | sed 's/../\\x&/g')
+
+ PW=$(echo -e "$PW") # \x...-Ausdrücke zu ASCII
+ PW="${PW:0:${ANZAHL}}" # ...und Rest nach ANZAHL abhacken.
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc
new file mode 100644
index 00000000..70b17236
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc
@@ -0,0 +1,22 @@
+function get_shares()
+{
+ i=0
+ while read -r LINIE; do
+ ROHSHARES[i]="$LINIE"
+ ((i++))
+ done < "$CONFIGFILE"
+
+# echo "${#ROHSHARES[@]} eingelesen:"
+# for (( i = 0; i < ${#ROHSHARES[@]}; i++ )); do
+# echo -n "$i "
+# echo "${ROHSHARES[i]}"
+# done
+
+ let SHAREZAHL=${#ROHSHARES[@]}-1
+ if [ "$SHAREZAHL" -lt 1 ]; then
+ logger "openslx sharemapper: No shares to map/mount found in config file $CONFIGFILE."
+ exit 0
+ else
+ logger "openslx sharemapper: $SHAREZAHL share(s) found."
+ fi
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc
new file mode 100644
index 00000000..b1320d01
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc
@@ -0,0 +1,66 @@
+function mount_shares()
+{
+ for (( CONFIGROW = 1; CONFIGROW < ${#ROHSHARES[@]}; CONFIGROW++ )); do
+ SHAREPATH=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 1 -d$'\t') # cifs- oder nfs-Share
+ SHARELETTER=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 2 -d$'\t' | \
+ sed 's/://g') # Laufwerksbuchstabe ohne :
+ SHARENAME=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 3 -d$'\t' | sed 's/ /_/g') # Leerzeichen raus.
+ SHAREUSER=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 4 -d$'\t') # Username, bei Userhome nicht vorhanden
+ SHAREPASS=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 5 -d$'\t') # User-PW, bei Userhome nicht vorhanden
+
+ # Sharetyp bestimmen:
+ if [ "${SHAREPATH:0:2}" == '\\' ]; then
+ USER=$(echo "$SHAREUSER"|cut -d '\' -f 2)
+ MOUNTOPTS="$MOUNTOPTSCIFS"
+ else
+ MOUNTOPTS="$MOUNTOPTSNFS"
+ fi
+
+ # User-Homeverzeichnis?
+ if [ "${SHARENAME:0:5}" == "Home-" ]; then
+ logger "openslx sharemapper: home share \"$SHARENAME\" found (for PERSISTENT)."
+ export USER="${GLOBALUSER}"
+ export PASSWD="${PW}"
+ mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERHOMEDIR} 2>/dev/null 1>&2
+ unset USER
+ unset PASSWD
+ else
+ if [ -z "${SHARELETTER}" ]; then
+ logger "openslx sharemapper: $SHARELETTER not found. Do not know where to mount."
+ continue
+ else
+ USERSHAREDIR="${USERHOME}"/SHARE_"${CONFIGROW}" # ROHSHARES: Zeilennummer; Shares >=1
+ if [ ! -d "$USERSHAREDIR" ]; then
+ mkdir -p "$USERSHAREDIR" 2>/dev/null
+ chown "$LOCALUSER":$(id --group "$LOCALUSER") "$USERSHAREDIR"
+ chmod 700 "$USERSHAREDIR"
+ logger "openslx sharemapper: share mount dir $USERSHAREDIR created."
+ fi
+ fi
+ # Wenn kein Homeverzeichnis, dann share zuerst mit den Credentials aus der share-Konfig
+ # versuchen zu mounten; wenn nicht, dann mit den Hauptcredentials nachversuchen.
+ logger "openslx sharemapper: non-home share \"$SHARENAME\" (${CONFIGROW}) found."
+ export USER="${SHAREUSER}"
+ export PASSWD="${SHAREPASS}"
+ mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERSHAREDIR} 2>/dev/null 1>&2
+ ERR=$?
+ if [ "$ERR" -eq 1 ]; then
+ export USER="${GLOBALUSER}"
+ export PASSWD="${PW}"
+ logger "openslx sharemapper: Could not mount ${USERSHAREDIR}, now trying using user credentials."
+ mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERSHAREDIR} 2>/dev/null 1>&2 \
+ ERR=$? # ERR merken wg. Links aus USERSHAREDIR
+ if [ "$ERR" -eq 1 ]; then
+ logger "openslx sharemapper: Could not mount ${USERSHAREDIR} even using user credentials; giving up."
+ fi
+ unset USER
+ unset PASSWD
+ fi
+ if [ "$ERR" -eq 0 ]; then
+ logger "openslx sharemapper: Linking ${SHARELETTER} and $SHARENAME, if possible."
+ [ -n "${SHARELETTER}" ] && ln -s "$USERSHAREDIR" "${USERHOME}"/"$SHARELETTER"
+ [ -n "${SHARELETTER}" ] && ln -s "$USERSHAREDIR" "${USERHOME}"/"$SHARENAME"
+ fi
+ fi
+ done
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc
new file mode 100644
index 00000000..14a13f77
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc
@@ -0,0 +1,8 @@
+check_fallback() {
+ if [ $(mount | grep -c " $USERHOMEDIR type cifs \| $USERHOMEDIR type nfs") -lt 1 ]; then
+ logger "openslx sharemapper: fallback mode: home share check failed, doing fallback to vmware mode."
+ preliminaries_vmware
+ else
+ logger "openslx sharemapper: fallback mode: home share check passed, no fallback necessary."
+ fi
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc
new file mode 100644
index 00000000..f6f1cf7d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc
@@ -0,0 +1,21 @@
+postliminaries_native()
+{
+ # USERHOMEDIR=~/PERSISTENT, not ~! ################
+ rmdir "$USERHOMEDIR" && logger "openslx unmounter: home directory entry (PERSISTENT) deleted." \
+ || logger "openslx unmounter: could not delete home directory (PERSISTENT) entry - not empty / unmounted!"
+}
+
+postliminaries_vmware()
+{
+ unlink "$USERHOMEDIR"
+ ERR=$?
+ if [ "$ERR" -ne 0 ]; then
+ logger "openslx unmounter: vmware mode: could not unlink ${USERHOMEDIR}!"
+ logger "openslx unmounter: vmware mode: this is a severe problem; I do not know what to do - exiting!"
+ exit 1
+ else
+ logger "openslx unmounter: vmware mode: ${USERHOMEDIR} unlinked."
+ # checking whether there was a directory moved out earlier:
+ [ -d "${USERHOMEDIR}"_mov ] && mv "${USERHOMEDIR}"_mov "${USERHOMEDIR}"
+ fi
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc
new file mode 100644
index 00000000..e161b961
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc
@@ -0,0 +1,12 @@
+umount_home() {
+ umount /home/"${LOCALUSER}"/PERSISTENT && logger "openslx unmounter: umounted home (PERSISTENT)." \
+ || logger "openslx unmounter: could not home (PERSISTENT)!"
+}
+
+umount_shares() {
+ index=0
+ for SHARE in $( mount | grep SHARE | tr -s ' ' | cut -f 3 -d " " ); do
+ umount "${SHARE}" && logger "openslx unmounter: umounted ${SHARE}." \
+ || logger "openslx unmounter: could not umount ${SHARE}!"
+ done
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares
new file mode 100755
index 00000000..0c94f0aa
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# set -x
+
+logger "openslx sharemapper: Started."
+
+OWNDIR=$(dirname $0)
+for i in "$(dirname $0)"/includes/*.inc; do
+ source "$i"
+done
+
+# Wait for network connection to base system
+#!/bin/bash
+
+x=1
+while ! ping -w 1 -c 1 "${NATADDR}" 2>/dev/null 1>&2; do
+ [ "$x" -gt 20 ] && { logger "openslx sharemapper: could not reach base system. Giving up."; exit 1; }
+ let x=x+1
+ sleep 2
+done
+
+logger "openslx sharemapper: base system reaching; commencing."
+
+# REMAPMODE (remapMode): 0: None, 1 Native, 2 Native Fallback, 3 vmware
+# CREATEMISSING (createMissingRemap): 0: Nichts tun, 1 xdg-Verzeichnisse
+
+case "$REMAPMODE" in
+ 0) logger "openslx sharemapper: remapMode 0 (do nothing) detected."
+ exit 0
+ ;;
+ 1) logger "openslx sharemapper: remapMode 1 (native mode) detected."
+ preliminaries_native
+ get_creds # fills global var PW with (currently) decrypted password
+ get_shares # fills array ROHSHARES; row 0 global infos from (shares-)CONFIGFILE,
+ # following rows: column 1 share path, col 2 drive letter, col 3 share name,
+ # column 4 username, col 5 password.
+ mount_shares # mounts shares given in array ROHSHARES.
+ exit 0
+ ;;
+ 2) logger "openslx sharemapper: remapMode 2 (fallback mode) detected."
+ preliminaries_native
+ get_creds # fills global var PW with (currently) decrypted password
+ get_shares # fills array ROHSHARES; row 0 global infos from (shares-)CONFIGFILE,
+ # following rows: column 1 share path, col 2 drive letter, col 3 share name,
+ # column 4 username, col 5 password.
+ mount_shares # mounts shares given in array ROHSHARES.
+ check_fallback # checks for a mounted home and fallbacks to vmware share, if none found.
+ exit 0
+ ;;
+ 3) logger "openslx sharemapper: remapMode 3 (vmware mode) detected."
+ preliminaries_vmware
+ mount_shares # mounts shares given in array ROHSHARES - runvirt checks whether there's
+ # a home share given or not..
+ exit 0
+ ;;
+ *) logger "openslx sharemapper: unknown remapMode in $SLXCONFIGFILE; doing nothing end exiting with error."
+ exit 1.
+ ;;
+esac
+
+exit 0
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution
new file mode 100755
index 00000000..24a0594f
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+# Dieses Skript liest die Auflösungsdate HOSTRES.TXT aus der Diskette 2 (/dev/fd1). In dieser
+# Datei wird die native (maximale) Auflösung des Grundsystems bereitgestellt. fd1 wird vom
+# openslx-Grundsystem geliefert. Es loggt nach SYSLOG (syslog oder messages).
+#
+# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw...
+# set -x
+
+MOUNTDIR=/mnt/diskmount
+RESFILE="${MOUNTDIR}"/openslx.ini
+DISPLAY=:0.0
+
+check_resolution() {
+ # Now, let's wait even more seconds to see if another process re-changes res.:
+ ACTRES=$(xrandr|grep '*'|tr -s " "|cut -f 2 -d " ")
+ if [ "$ACTRES" != "$RESOLUTION" ]; then
+ logger "openslx resolution utility: resolution changed; re-changing."
+ xrandr --output ${AUSGABE} --mode ${RESOLUTION}
+ else
+ logger "openslx resolution utility: resolution unchanged."
+ fi
+}
+
+logger "openslx resolution utility started."
+
+# Da nun fremdgemountet wird, hier sicherheitshalber zur Kontrolle wg. Gross-/Kleinschreibung:
+RESFILE=$(find "${MOUNTDIR}" -iwholename "${RESFILE}")
+
+if [ -f "$RESFILE" ]; then
+ RESOLUTION=$(grep 'resolution=' "$RESFILE" | cut -d '=' -f 2)
+ if [ -z $RESOLUTION ]; then
+ logger "openslx resolution utility: resolution file $RESFILE seems to be empty!"
+ exit 1
+ fi
+ logger "openslx resolution utility: resolution file $RESFILE yields ${RESOLUTION}."
+else
+ logger "openslx resolution utility: resolution file $RESFILE not found!"
+ exit 1
+fi
+
+# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig!
+# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:.
+XAUTHDATEI=$(ps aux | grep -o "X.* \-auth *[^ ]*" | awk '{print $NF}')
+if [ -n "$XAUTHDATEI" ]; then
+ logger "openslx resolution utility: XAUTHFILE found."
+ XAUTHORITY="${XAUTHDATEI}"
+else
+ logger "openslx resolution utility: XAUTHFILE not found. Exiting."
+ exit 1
+fi
+
+# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das
+# erste 'connected' in der Ausgabe xrandrs:
+AUSGABE=$(xrandr -q|grep -m 1 " connected "|awk '{print $1}')
+if [ -z "$AUSGABE" ]; then
+ logger "openslx resolution utility: Could not detect output device. Exiting."
+ exit 1
+fi
+
+# Pruefen, ob xrand eine passende modeline ausgibt:
+if [ "$(xrandr | grep -c ${RESOLUTION})" -eq 0 ]; then
+ logger "openslx resolution utility: xrandr yields no fitting modeline; adding one."
+ MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g')
+ xrandr --newmode $(echo ${MODELINE})
+ xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1)
+ # Dann einzusteuernde Auflösung natürlich auf die neue ändern:
+ RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1)
+ logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})."
+fi
+
+# Auflösung per xrandr setzen:
+xrandr --output ${AUSGABE} --mode ${RESOLUTION}
+ERR=$?
+if [ $ERR -ne 0 ]; then
+ logger "openslx resolution utility: xrandr error code ${ERR}."
+else
+ logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set."
+fi
+
+# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung
+# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach,
+# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen
+# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht.
+
+# Now, let's wait some seconds to see if another process re-changes res.:
+sleep 5
+check_resolution
+
+# Now, let's wait some more seconds to see if another process re-changes res.:
+sleep 15
+check_resolution
+
+# Now, let's wait even more seconds to see if another process re-changes res.:
+sleep 20
+check_resolution
+
+# Now, let's wait even more seconds to see if another process re-changes res.:
+sleep 40
+check_resolution
+
+exit 0
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone
new file mode 100755
index 00000000..0dbbcf98
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone
@@ -0,0 +1,138 @@
+#!/bin/bash
+
+# Dieses Skript liest die Auflösungsdate HOSTRES.TXT aus der Diskette 2 (/dev/fd1). In dieser
+# Datei wird die native (maximale) Auflösung des Grundsystems bereitgestellt. fd1 wird vom
+# openslx-Grundsystem geliefert. Es loggt nach SYSLOG (syslog oder messages).
+#
+# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw...
+# set -x
+
+MOUNTDIR=/tmp/diskmount
+RESFILE="${MOUNTDIR}"/openslx.ini
+DISPLAY=:0.0
+
+function ausgang() {
+ umount "${MOUNTDIR}"
+ rmdir "${MOUNTDIR}"
+}
+
+check_resolution() {
+ # Now, let's wait even more seconds to see if another process re-changes res.:
+ ACTRES=$(xrandr|grep '*'|tr -s " "|cut -f 2 -d " ")
+ if [ "$ACTRES" != "$RESOLUTION" ]; then
+ logger "openslx resolution utility: resolution changed; re-changing."
+ xrandr --output ${AUSGABE} --mode ${RESOLUTION}
+ else
+ logger "openslx resolution utility: resolution unchanged."
+ fi
+}
+
+trap ausgang EXIT SIGHUP SIGINT SIGTERM
+
+logger "openslx resolution utility started."
+
+# Mountpunkt erzeugen:
+if [ ! -d "$MOUNTDIR" ]; then
+ mkdir "$MOUNTDIR"
+ logger "openslx resolution utility: mkdir'ed diskmount dir $MOUNTDIR."
+fi
+
+# Virtuelles Floppylaufwerk mounten
+mount /dev/fd1 "$MOUNTDIR" 2>/dev/null
+ERR=$?
+if [ $ERR -ne 0 ]; then
+ logger "openslx resolution utility: error code $ERR trying to mount /dev/fd1 to ${MOUNTDIR}. Remounting..."
+ mount -o remount /dev/fd1 "$MOUNTDIR" 2>/dev/null
+ ERR=$?
+ if [ $ERR -ne 0 ]; then
+ logger "openslx resolution utility: error code $ERR trying to remount /dev/fd1 to ${MOUNTDIR}. Giving up."
+ exit 1
+ else
+ logger "openslx resolution utility: remount of /dev/fd1 mounted to diskmount dir ${MOUNTDIR} succeeded."
+ fi
+else
+ logger "openslx resolution utility: /dev/fd1 mounted to diskmount dir ${MOUNTDIR}."
+fi
+
+# Das Mounten mit shortname=WIN95 erwies sich als nicht zuverlässig. Daher hier Kontrolle:
+RESFILE=$(find "${MOUNTDIR}" -iwholename "${RESFILE}")
+
+if [ -f "$RESFILE" ]; then
+ RESOLUTION=$(grep 'resolution=' "$RESFILE" | cut -d '=' -f 2)
+ if [ -z $RESOLUTION ]; then
+ logger "openslx resolution utility: resolution file $RESFILE seems to be empty!"
+ exit 1
+ fi
+ logger "openslx resolution utility: resolution file $RESFILE yields ${RESOLUTION}."
+else
+ logger "openslx resolution utility: resolution file $RESFILE not found!"
+ exit 1
+fi
+
+umount /dev/fd1
+ERR=$?
+if [ "$ERR" -ne 0 ]; then
+ logger "openslx resolution utility: error code $ERR trying to to unmount /dev/fd1. Please unmount by hand."
+fi
+
+# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig!
+# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:.
+XAUTHDATEI=$(ps aux | grep -o "X.* \-auth *[^ ]*" | awk '{print $NF}')
+if [ -n "$XAUTHDATEI" ]; then
+ logger "openslx resolution utility: XAUTHFILE found."
+ XAUTHORITY="${XAUTHDATEI}"
+else
+ logger "openslx resolution utility: XAUTHFILE not found. Exiting."
+ exit 1
+fi
+
+# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das
+# erste 'connected' in der Ausgabe xrandrs:
+AUSGABE=$(xrandr -q|grep -m 1 " connected "|awk '{print $1}')
+if [ -z "$AUSGABE" ]; then
+ logger "openslx resolution utility: Could not detect output device."
+ exit 1
+fi
+
+# Pruefen, ob xrand eine passende modeline ausgibt:
+if [ "$(xrandr | grep -c ${RESOLUTION})" -eq 0 ]; then
+ logger "openslx resolution utility: xrandr yields no fitting modeline; adding one."
+ MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g')
+ xrandr --newmode $(echo ${MODELINE})
+ xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1)
+ # Dann einzusteuernde Auflösung natürlich auf die neue ändern:
+ RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1)
+ logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})."
+fi
+
+# Auflösung per xrandr setzen:
+xrandr --output ${AUSGABE} --mode ${RESOLUTION}
+ERR=$?
+if [ $ERR -ne 0 ]; then
+ logger "openslx resolution utility: xrandr error code ${ERR}."
+else
+ logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set."
+fi
+
+# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung
+# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach,
+# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen
+# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht.
+
+# Now, let's wait some seconds to see if another process re-changes res.:
+sleep 5
+check_resolution
+
+# Now, let's wait some more seconds to see if another process re-changes res.:
+sleep 15
+check_resolution
+
+# Now, let's wait even more seconds to see if another process re-changes res.:
+sleep 20
+check_resolution
+
+# Now, let's wait even more seconds to see if another process re-changes res.:
+sleep 40
+check_resolution
+
+exit 0
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares
new file mode 100755
index 00000000..b028cf76
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# set -x
+
+logger "openslx sharemapper: umounter started."
+
+OWNDIR=$(dirname $0)
+for i in "$(dirname $0)"/includes/*.inc; do
+ source "$i"
+done
+
+# REMAPMODE (remapMode): 0: None, 1 Native, 2 Native Fallback, 3 vmware
+# CREATEMISSING (createMissingRemap): 0: Nichts tun, 1 xdg-Verzeichnisse
+
+case "$REMAPMODE" in
+ 0) logger "openslx sharemapper: umounter: remapMode 0 (do nothing) detected."
+ exit 0
+ ;;
+ 1) logger "openslx sharemapper: umounter: remapMode 1 (native mode) detected."
+ umount_shares
+ umount_home
+ postliminaries_native
+ ;;
+ 2) logger "openslx sharemapper: umounter: remapMode 2 (fallback mode) detected."
+ umount_shares
+ umount_home
+ postliminaries_native
+ exit 0
+ ;;
+ 3) logger "openslx sharemapper: umounter: remapMode 3 (vmware mode) detected."
+ postliminaries_vmware
+ exit 0
+ ;;
+ *) logger "openslx sharemapper: umounter: unknown remapMode in $SLXCONFIGFILE; doing nothing end exiting with error."
+ exit 1.
+ ;;
+esac
+
+exit 0
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer
new file mode 100755
index 00000000..978cee20
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+PS=$(which ps)
+GREP=$(which grep)
+LOGGER=$(which logger)
+MKDIR=$(which mkdir)
+MOUNT=$(which mount)
+MOUNTDIR=/mnt/diskmount/
+SERVICEFILE=openslx-scriptinstall.service
+
+# systemd erkennen
+case $(${PS} --pid 1 -o comm h) in
+ systemd) echo "openslx praeinstaller: systemd detected."
+ if [ -d /etc/systemd/system ]; then
+ SERVICEDIR=/etc/systemd/system/
+ else
+ SERVICEDIR=/usr/lib/systemd/system/
+ fi
+ echo "openslx praeinstaller: installing systemd service file to ${SERVICEDIR}/${SERVICEFILE}."
+
+ cat <<-HEREDOC > "$SERVICEDIR"/"$SERVICEFILE"
+ [Unit]
+ Description=openSLX script installer
+ Before=display-manager.service graphical.target
+
+ [Service]
+ Type=oneshot
+ ExecStartPre=${MKDIR} -p /mnt/diskmount
+ ExecStartPre=-${MOUNT} /dev/fd1 /mnt/diskmount
+ ExecStart=${LOGGER} "openslx service file: started."
+ ExecStart=${MOUNTDIR}/linux/vm_runtime
+ ExecStart=${LOGGER} "openslx service file: done."
+ RemainAfterExit=no
+ HEREDOC
+
+ [ ! -d /etc/systemd/system/graphical.target.wants ] && mkdir /etc/systemd/system/graphical.target.wants 2>/dev/null
+ [ ! -d /etc/systemd/system/basic.target.wants ] && mkdir /etc/systemd/system/basic.target.wants 2>/dev/null
+
+ ln -s "${SERVICEDIR}"/"${SERVICEFILE}" /etc/systemd/system/graphical.target.wants/"${SERVICEFILE}"
+ ln -s "${SERVICEDIR}"/"${SERVICEFILE}" /etc/systemd/system/basic.target.wants/"${SERVICEFILE}"
+
+ echo "openslx praeinstaller: doing systemd reload."
+ systemctl daemon-reload
+ ;;
+ init) echo "openslx praeinstaller: init(V) detected."
+ SERVICEDIR=/etc/init.d/
+ [ ! -d "${SERVICEDIR}" ] && { echo "openslx praeinstaller: No init directory $SERVICEDIR found, exiting."; exit 1; }
+ SERVICEFILE=openslx-scriptinstall
+ echo "openslx praeinstaller: installing init service file to ${SERVICEDIR}/${SERVICEFILE}."
+ cat <<-THEREDOC > "${SERVICEDIR}"/"${SERVICEFILE}"
+ #!/bin/sh -e
+ ### BEGIN INIT INFO
+ # Provides: openSLX_scriptinstaller
+ # Required-Start: 2 3 4 5
+ # Required-Stop: 0 1 6
+ # Default-Start: 2 3 4 5
+ # Default-Stop: 0 1 6
+ # X-Interactive: false
+ # Short-Description: openSLX script package starter.
+ ### END INIT INFO
+ #
+ # Starts via Xsetup patching the openSLX script package
+ # to correct screen resolution and mount network shares
+ # when Xsetup is started.
+
+ case "\$1" in
+ start) ${LOGGER} "openslx init file: started."
+ ${MKDIR} -p /mnt/diskmount
+ ${MOUNT} | ${GREP} -q /mnt/diskmount || ${MOUNT} /dev/fd1 /mnt/diskmount
+ ${MOUNTDIR}/linux/vm_runtime
+ ${LOGGER} "openslx init file: done."
+ ;;
+ stop|restart|force-reload) exit 0 ;;
+ *) echo "Usage: $0 {start}" >&2; exit 1 ;;
+ esac
+ THEREDOC
+ chmod +x "${SERVICEDIR}"/"${SERVICEFILE}"
+ echo "openslx praeinstaller: enabling ${SERVICEFILE}."
+ update-rc.d "${SERVICEFILE}" defaults
+ ;;
+ *) echo "openslx praeinstaller: Could not determine mother-of-all-processes (not systemd, not init)."
+ echo "openslx praeinstaller: Giving up, exiting."
+ exit 1
+esac
+
+exit 0
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime
new file mode 100755
index 00000000..0a81c38d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+# set -x
+
+# logger "openslx vm_runtime: Started."
+
+DISTRIBUTION=$(lsb_release -is | tr '[A-Z]' '[a-z]' | sed -r 's/[^a-z0-9]//g;s/project$//g;s/scientificsl$/scientific/g')
+VERSION=$(lsb_release -rs)
+SCRIPTDIR=/mnt/diskmount/linux/
+RESOLUTIONSCRIPT="${SCRIPTDIR}"/resolution
+SHARESCRIPT="${SCRIPTDIR}"/mnt_shares
+UMOUNTSCRIPT="${SCRIPTDIR}"/umnt_shares
+XSETUP=$(find /etc/X* -name "Xsetup" 2>/dev/null)
+XRESET=$(find /etc/X* -name "Xreset" 2>/dev/null)
+
+[ ! -f "${RESOLUTIONSCRIPT}" -o ! -f "${SHARESCRIPT}" ] && \
+ { logger "openslx vm_runtime: could not find needed scripts on disk. Exiting." ; exit 1 ; }
+
+write_xsetup() {
+ logger "openslx vm_runtime: writing ${XSETUP}..."
+ cat<<-BISHIER > "${XSETUP}"
+ #!/bin/sh
+ ${SHARESCRIPT} &
+ ${RESOLUTIONSCRIPT} &
+ BISHIER
+}
+
+patch_xsetup_shebang() {
+ # Patching after first line, to be exact.
+ logger "openslx vm_runtime: patching ${XSETUP} after shebang line, if necessary."
+ grep -q "${RESOLUTIONSCRIPT}" "${XSETUP}" || sed "1 a ${RESOLUTIONSCRIPT} \&" -i "${XSETUP}"
+ grep -q "${SHARESCRIPT}" "${XSETUP}" || sed "1 a ${SHARESCRIPT} \&" -i "${XSETUP}"
+}
+
+write_xreset() {
+ logger "openslx vm_runtime: writing ${XRESET}..."
+ cat<<-BISHIER > "${XRESET}"
+ #!/bin/sh
+ ${UMOUNTSCRIPT} &
+ BISHIER
+}
+
+patch_xreset_shebang() {
+ # Patching after first line, to be exact.
+ logger "openslx vm_runtime: patching ${XRESET} after shebang line, if necessary."
+ grep -q "${UMOUNTSCRIPT}" "${XRESET}" || sed "1 a ${UMOUNTSCRIPT} \&" -i "${XRESET}"
+}
+
+case "${DISTRIBUTION}" in
+ opensuse) logger "openslx vm_runtime: openSuse detected."
+ if [ ! -e "${XSETUP}" ]; then
+ XSETUP=/etc/X11/xdm/Xsetup
+ write_xsetup
+ else
+ logger "openslx vm_runtime: patching ${XSETUP}."
+ if ! [ grep -c /etc/sysconfig/displaymanager "$XSETUP" 2>/dev/null 1>&2 ]; then
+ logger "openslx vm_runtime: Xsetup: openSuse marker found, patching."
+ sed "s#/etc/sysconfig/displaymanager#/etc/sysconfig/displaymanager\n"${SHARESCRIPT}" \&\n${RESOLUTIONSCRIPT} \&#g" \
+ -i "${XSETUP}"
+ else
+ logger "openslx vm_runtime: Xsetup: openSuse marker not found, patching after shebang line."
+ xsetup_patch_shebang
+ fi
+ logger "openslx vm_runtime: patching ${RESET}."
+ patch_xreset_shebang
+ fi
+ ;;
+ ubuntu) logger "openslx vm_runtime: Ubuntu detected, version ${VERSION}."
+ # Ubuntu has at least in version 14.04 LTS a bug leading to missing Xsetup/Xreset entries:
+ grep -q "session-setup-script=/etc/X11/Xsetup" /etc/lightdm/lightdm.conf.d/50-myconfig.conf \
+ || { sed "$ a session-setup-script=/etc/X11/Xsetup" -i /etc/lightdm/lightdm.conf.d/50-myconfig.conf
+ logger "openslx vm_runtime: session-setup-script patched into /etc/lightdm/lightdm.conf.d/50-myconfig.conf."; }
+ grep -q "session-reset-script=/etc/X11/Xreset" /etc/lightdm/lightdm.conf.d/50-myconfig.conf \
+ || { sed "$ a session-reset-script=/etc/X11/Xreset" -i /etc/lightdm/lightdm.conf.d/50-myconfig.conf
+ logger "openslx vm_runtime: session-reset-script patched into /etc/lightdm/lightdm.conf.d/50-myconfig.conf."; }
+ if [ ! -e "${XSETUP}" ]; then
+ XSETUP=/etc/X11/Xsetup
+ write_xsetup
+ else
+ patch_xsetup_shebang
+ fi
+ if [ ! -e "${XRESET}" ]; then
+ XRESETP=/etc/X11/Xreset
+ write_xreset
+ else
+ patch_xreset_shebang
+ fi
+ ;;
+ debian) logger "openslx vm_runtime: Debian detected."
+ ;;
+ *) logger "openslx vm_runtime: Unknown distribution, exiting."
+ exit 1
+ ;;
+esac
+
+exit 0
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe b/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
index 114a0dc0..c0904c92 100755
--- a/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
Binary files differ
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc
new file mode 100644
index 00000000..974a5626
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc
@@ -0,0 +1,32 @@
+########################################################
+# 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 ..."
+
+declare -rg TMPCONFIG="$TMPDIR/vmconfig.tmp"
+
+# Assume legacy mode by default, only trigger "current" mode if everything else below worked
+LEGACY=yes
+if [ -z "$IMGUUID" ]; then # Keine uuid: Abbruch, Legacy
+ writelog "Could not extract a uuid param from ${xmlfile}. Triggering legacy mode."
+else
+ # Now getting template file:
+ if ! wget -T 6 -O "$TMPCONFIG" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}" 2>/dev/null >&2; then
+ writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}. Triggering legacy mode."
+ else
+ writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID} successful."
+ if [ ! -s "$TMPCONFIG" ]; then
+ writelog "Server sent zero byte virtual machine description file. Triggering legacy mode."
+ else
+ writelog "Triggering current (non-legacy) mode."
+ LEGACY= # everything worked - clear legacy mode variable (so we use the "current" mode)
+ fi
+ fi
+fi
+
+readonly LEGACY
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc
new file mode 100644
index 00000000..fdacc69c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc
@@ -0,0 +1,63 @@
+############################################
+# Include: Get needed values from XML file #
+############################################
+
+writelog "Parsing XML..."
+
+declare -rg VMSTORE_PATH=/mnt/vmstore
+
+get_xml () {
+ xmlextract "//settings/eintrag/${1}/@param" "${xmlfile}"
+}
+
+IMGUUID=$(get_xml "uuid")
+
+# # Name of the virt image
+SRC_IMG_ABSOLUTE=$(get_xml "image_path")
+SRC_IMG_RELATIVE=$(get_xml "image_name")
+
+if [ -z "${SRC_IMG_ABSOLUTE}${SRC_IMG_RELATIVE}" ]; then
+ writelog "Neither relative nor absolute path for image found in xml"
+ cleanexit 1
+fi
+
+if [ -n "$SRC_IMG_ABSOLUTE" ] && [ "${SRC_IMG_ABSOLUTE:0:1}" != "/" ]; then
+ writelog "Error parsing XML for absolute image path: given value doesn't start with '/': '$SRC_IMG_ABSOLUTE'"
+ cleanexit 1
+fi
+
+if [ -z "$SRC_IMG_ABSOLUTE" ]; then
+ SRC_IMG_ABSOLUTE="${VMSTORE_PATH}/${SRC_IMG_RELATIVE}"
+fi
+
+IMG_BASENAME=$(basename "$SRC_IMG_ABSOLUTE")
+writelog "Virtual image file name: $IMG_BASENAME"
+
+VM_DISPLAYNAME=$(get_xml "short_description")
+[ -z "$VM_DISPLAYNAME" ] && VM_DISPLAYNAME="${IMG_BASENAME}"
+
+# Define VM_NAME_CLEAN since VM_DISPLAYNAME can be long and contain weird characters
+VM_NAME_CLEAN=$(echo "${VM_DISPLAYNAME:0:32}" | sed -r 's/[^0-9a-zA-Z_-\.]+/_/g')
+
+# image is for the following virtual machine
+PLUGIN_ID=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# Extracting OS type (VM_OS_TYPE) from xml file. We don't care here whether VM_OS_TYPE is empty, as then
+# it will yield the default entries later on.
+VM_OS_TYPE=$(get_xml "os")
+
+readonly IMGUUID
+readonly SRC_IMG_ABSOLUTE SRC_IMG_RELATIVE
+readonly IMG_BASENAME
+readonly VM_DISPLAYNAME VM_NAME_CLEAN
+readonly PLUGIN_ID
+readonly VM_OS_TYPE
+
+writelog "VM UUID: $IMGUUID"
+writelog "Virtualization plugin: $PLUGIN_ID"
+writelog "VM name: $VM_DISPLAYNAME"
+writelog "VM short name: $VM_NAME_CLEAN"
+writelog "VM OS: $VM_OS_TYPE"
+writelog "Done parsing XML."
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc
new file mode 100644
index 00000000..508c9efe
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc
@@ -0,0 +1,113 @@
+###########################################
+# Include: Set hardware related variables #
+###########################################
+
+get_vm_id() {
+ local script=${BASH_SOURCE[-1]}
+ [ -z "$script" ] && script="$0"
+ if [ -n "$script" ]; then
+ script=$(readlink -f "$script")
+ if [ -n "$script" ] && [ -s "$script" ]; then
+ #bingo
+ VM_ID=$(ps ax | grep -F "$script" | grep -v 'grep' | grep -o -- "${script}.*\$" | sort -u | wc -l)
+ if [ "$VM_ID" -gt 0 ]; then
+ [ "${#VM_ID}" -eq 1 ] && VM_ID="0${VM_ID}"
+ [ "${#VM_ID}" -gt 2 ] && VM_ID="${VM_ID:0:2}"
+ [ "${#VM_ID}" -eq 2 ] && return
+ fi
+ fi
+ fi
+ # fallback: take last two digits of current pid...
+ VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2)
+ [ "${#VM_ID}" -eq 1 ] && VM_ID="0${VM_ID}"
+}
+
+get_vm_id
+
+# 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=1800
+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 ))"
+
+# Fill in VMID
+macaddrsuffix=$(echo "$macaddrsuffix" | sed "s/%VMID%/${VM_ID}/")
+
+if ! echo "$macaddrprefix" | 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 prefix (got $macaddrprefix)"
+fi
+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
+macaddr="$macaddrprefix:$macaddrsuffix"
+
+# 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"}
+# 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"}
+
+# Dynamically detect serial ports here instead of at boot time
+# (virtualization.conf), since USB serial ports get quite common
+# and might not be plugged in at boot time yet
+serial_0=
+#for port in $(awk '{ if ($1 ~ /^[0-9]+:/ && $2 != "uart:unknown") print "/dev/ttyS" sub(/:\$/, "", $1) }' /proc/tty/driver/serial); do
+for port in $serial_ports /dev/ttyUSB*; do
+ [ -c "$port" ] || continue
+ serial_0="$port"
+ break
+done
+
+parallel_0=
+for port in /dev/parport*; do
+ [ -c "$port" ] || continue
+ parallel_0="$port"
+ break
+done
+
+# RDP/VNC port (59001 - 59099)
+remotedesktopport="590${VM_ID}"
+
+# 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/vmchooser/run-virt-includes/set_runvirt_variables.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc
new file mode 100644
index 00000000..cd9a573a
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc
@@ -0,0 +1,26 @@
+######################################################
+# Include: Declaration of run-virt default variables #
+######################################################
+
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+USER="$(whoami)"
+LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log"
+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
+if ! mkdir -p "$TMPDIR"; then
+ slxlog "virt-tmpdir" "Could not create temporary directory '$TMPDIR' for session"
+ error_user "Konnte kein temporäres Arbeitsverzeichnis für die VM-Sitzung anlegen. Ein Computer-Neustart könnte das Problem lösen."
+ cleanexit 1
+ exit 1
+fi
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc
new file mode 100644
index 00000000..f0820ed7
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc
@@ -0,0 +1,12 @@
+
+setup_firewall () {
+ local LOGF="${TMPDIR}/firewall.log"
+ local RET
+ [ "$DISPLAY" = ":0" ] || return 0 # For now, to avoid conflicts, we only do this on display :0
+ slxfwtool "$IMGUUID" > "$LOGF" 2>&1
+ RET=$?
+ if [ "$RET" != "0" ]; then
+ slxlog "runvirt-firewall" "Error setting up firewall rules for lecture $IMGUUID (Exit code $RET)" "$LOGF"
+ fi
+ return 0
+}
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc
new file mode 100644
index 00000000..4240d9ca
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc
@@ -0,0 +1,98 @@
+###########################################################
+# Include: Setup dnbd for image access, nfs/cifs fallback #
+###########################################################
+
+# This will currently make sure that the variable
+# VM_DISKFILE_RO is set which will contain the
+# absolute path to the disk image to use for the vm
+# session.
+# When using DNBD3 this will differ from SRC_IMG_ABSOLUTE,
+# otherwise it will be identical.
+# In the future DNBD3 (or something else) might provide
+# a CoW layer so we don't need snapshots etc. anymore.
+# This include should set VM_DISKFILE_RW in that case to
+# indicate to the virt plugin that it doesn't need to
+# handle creating a temporary CoW layer itself.
+
+writelog "Setting up disk access for virtualizer/emulator ..."
+
+# Try to use dnbd3 to access the image
+unset VM_DISKFILE_RO
+unset dnbd3_fuse_mount_point
+
+setup_dnbd3 () {
+ # Mount path for images mounted with dnbd3-fuse
+ dnbd3_fuse_mount_point="$TMPDIR/dnbd3fuse.mnt"
+ mkdir -p "${dnbd3_fuse_mount_point}"
+ # start dnbd3-fuse in subshell
+ local dnbd3_tmplog="$TMPDIR/dnbd3fuse.log"
+ local dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM"
+ local TIMEOUT vm_revision
+ rm -f -- "$dnbd3_exitflag"
+ (
+ dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${SRC_IMG_RELATIVE}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1
+ RET=$?
+ touch "$dnbd3_exitflag"
+ if [ "$RET" != "0" ]; then
+ writelog "dnbd3-fuse stopped working (Exit code $RET)"
+ slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${SRC_IMG_RELATIVE}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}"
+ fi
+ ) &
+ # 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_RO="${dnbd3_fuse_mount_point}/img"
+ writelog "DNBD3: $SRC_IMG_RELATIVE on $VM_DISKFILE_RO with rid $vm_revision"
+ break
+ fi
+ [ "$TIMEOUT" = "OUT" -o -e "$dnbd3_exitflag" ] && break
+ sleep "$TIMEOUT"
+ done
+
+ if [ -z "$VM_DISKFILE_RO" ]; then
+ slxlog "virt-dnbd3" "No dnbd3 server for ${SRC_IMG_RELATIVE} found, trying NFS/CIFS..." "$dnbd3_tmplog"
+ writelog "No working dnbd3 server found :-("
+ fi
+}
+
+# See if we should setup dnbd3 image access at all
+if ! which dnbd3-fuse; then
+ writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH"
+elif [ -z "$SRC_IMG_RELATIVE" ]; then
+ writelog "Can't use dnbd3 as SRC_IMG_RELATIVE is not set"
+elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then
+ writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes"
+else
+ setup_dnbd3
+fi
+
+# VM_DISKFILE_RO will be empty if dnbd3 is not used or failed to connect.
+# Let's try to fall back to NFS/CIFS via file system
+if [ -z "$VM_DISKFILE_RO" ]; then
+ # Maybe we're reading a dnbd3 directory with RIDs encoded into the filename - use latest one
+ rid_suffix=$(ls -1 "${SRC_IMG_ABSOLUTE}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+$' | sort -n | tail -n 1)
+ if [ -n "$rid_suffix" ]; then
+ # found
+ VM_DISKFILE_RO="${SRC_IMG_ABSOLUTE}.r${rid_suffix}"
+ elif [ -e "$SRC_IMG_ABSOLUTE" ]; then
+ # try name we got from xml in the first place
+ VM_DISKFILE_RO="$SRC_IMG_ABSOLUTE"
+ fi
+fi
+
+# Check if virtual machine container file exists
+if [ -z "$VM_DISKFILE_RO" ] || ! [ -e "${VM_DISKFILE_RO}" ]; then
+ slxlog "virt-image-missing" "VM image $VM_DISKFILE_RO not found!"
+ writelog "Virtual machine image ${VM_DISKFILE_RO} not found!"
+ error_user "Das Image für die gewählte Virtuelle Maschine konnte nicht gefunden werden.
+Versuchen Sie zunächst, den Computer komplett neu zu starten. Sollte das Problem bestehen bleiben, wenden Sie sich bitte an den Support."
+ cleanexit 1
+fi
+
+readonly VM_DISKFILE_RO
+
+writelog "Disk file to use: $VM_DISKFILE_RO"
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc
new file mode 100644
index 00000000..2fb9310a
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc
@@ -0,0 +1,46 @@
+#####################################
+# 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="$!"
+
+{
+ sleep 2
+ # Check if tcpsvd is running. Do this a little delayed 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"
+ notify_user "Durcksystem" "Das Drucksystem konnte nicht initialisiert werden. Druckfunktion nicht verfügbar."
+ fi
+} &
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc
new file mode 100644
index 00000000..c6cece3d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc
@@ -0,0 +1,79 @@
+#!/bin/bash
+# ^-- Add shebang even though it's sourced so vim highlights bash specific features properly
+########################
+# Include: Setup sound #
+########################
+
+writelog "Starting sound setup ..."
+
+unset VOL
+if [ -r "/run/hwinfo" ] && source "/run/hwinfo"; then
+ # On startup, the volume of Master, PCM, Speaker, etc. will be set to 100%
+ # Some hardware with builtin speakers might be a bit too loud then, so you can
+ # define an exception table here. Array key is "Manufacturer//Model"
+ declare -A VOLUME_EXCEPTIONS
+ VOLUME_EXCEPTIONS["Hewlett-Packard//HP Compaq 8200 Elite CMT PC"]="85%" # This is bwPC3
+ # Read
+ VOL=${VOLUME_EXCEPTIONS["${HW_MANUF}//${HW_MODEL}"]}
+fi
+
+# Default to maximum volume
+if [ -z "$VOL" ]; then
+ VOL="100%"
+fi
+
+if true; then
+ # detecting which card is to be used
+ writelog --quiet "Detecting which sound card to use ..."
+ PROC="/proc/asound/cards"
+ if [ ! -r "$PROC" ]; then
+ writelog --quiet "'${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 --quiet "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 --quiet "Detected sound card index is: $SOUND_CARD_INDEX"
+ writelog --quiet "Sound card count: $SOUND_CARD_COUNT"
+
+ # Adjust sound volume (playback)... Random mixer names we have encountered during testing
+ writelog --quiet "Setting up volume..."
+ (
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Master' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'PCM' "100%" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'CD' "100%" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Headphone' "100%" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Front' "100%" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Speaker' "100%" 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' 'Mic'
+ 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 2>/dev/null >&2
+ ) 2>&1 | grep -v 'amixer: Unable to find'
+ writelog --quiet "Done setting up volume."
+fi >> "${LOGFILE}" 2>&1 # Don't pipe here since it would spawn a subshell so all variable modifications would be lost
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc
new file mode 100644
index 00000000..d9ae052c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc
@@ -0,0 +1,101 @@
+#!/bin/bash
+##############################################
+# Include: Setup virtual floppy for drive b: #
+##############################################
+
+declare -rg FLOPPYIMG="${TMPDIR}/floppy.img"
+declare -rg TMPHOME="${HOME}"
+declare -rg RUNSCRIPT="${TMPDIR}/runscript.tmp"
+
+wget -T 6 -O "${RUNSCRIPT}" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}/runscript" > /dev/null &
+WGET=$!
+
+dd "if=/dev/zero" "of=${FLOPPYIMG}" count=1440 bs=1024
+chmod 0600 "${FLOPPYIMG}"
+mkfs.fat "${FLOPPYIMG}" || mkfs.vfat "${FLOPPYIMG}" || mkdosfs "${FLOPPYIMG}"
+
+# Create file with resolution information etc.
+. "/opt/openslx/inc/shares"
+if [ -z "$SHARE_REMAP_MODE" ]; then
+ SHARE_REMAP_MODE_INI="0"
+ SHARE_REMAP_MODE="3"
+else
+ SHARE_REMAP_MODE_INI="$SHARE_REMAP_MODE"
+fi
+[ -z "$SHARE_CREATE_MISSING_REMAP" ] && SHARE_CREATE_MISSING_REMAP="1"
+declare -rg RESOLUTION=$(xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' \
+ | grep -o -E -m1 '[0-9]+x[0-9]+')
+
+# Legacy: HOSTRES.TXT
+cat > "${TMPDIR}/HOSTRES.TXT" <<-HIER
+${RESOLUTION}
+HIER
+
+# Create file for network shares to mount
+declare -rg SHARES="${TMPDIR}/shares.dat"
+touch "${SHARES}"
+chmod 0600 "${SHARES}"
+if ! pwdaemon --query "${TMPHOME}/.pwsocket" > "${SHARES}"; then
+ slxlog "virt-pwdaemon" "Could not start pwdaemon"
+else
+ sed -i 's/^/192.168.101.1\t/' "${SHARES}" # TODO: Depending on nettype (in case we have != nat some day)
+ if [ "${SHARE_REMAP_MODE}" = 1 -o "${SHARE_REMAP_MODE}" = 2 ] && [ -e "${TMPHOME}/.home" ]; then
+ NETHOME=$(cat "${TMPHOME}/.home")
+ [ -z "$SHARE_HOME_DRIVE" ] && SHARE_HOME_DRIVE="H:"
+ # Tab between items, so spaces can be used!
+ echo "${NETHOME} ${SHARE_HOME_DRIVE} Home-Verzeichnis" >> "${SHARES}"
+ fi
+ for VAR in ${!SHARE_LINE_*}; do
+ echo "${!VAR}" >> "${SHARES}"
+ done
+fi
+
+wait "$WGET"
+
+# Check downloaded runscript, handle extension marker
+EXT=
+if [ -s "$RUNSCRIPT" ]; then
+ EXT=$(head -n 1 "$RUNSCRIPT" | grep -o -i '^EXT=.*$' | cut -d '=' -f 2-)
+ [ -n "$EXT" ] && [ "x${EXT:0:1}" != "x." ] && EXT=".$EXT"
+fi
+
+# Write info file
+UNAME=
+[ -s "${HOME}/.account" ] && UNAME=$(cat "${HOME}/.account")
+[ -z "${UNAME}" ] && UNAME=$(whoami)
+cat > "${TMPDIR}/openslx.ini" <<-HIER
+[openslx]
+username=${UNAME}
+resolution=${RESOLUTION}
+createMissingRemap=${SHARE_CREATE_MISSING_REMAP}
+remapMode=${SHARE_REMAP_MODE_INI}
+homeDrive=${SHARE_HOME_DRIVE}
+scriptExt=${EXT}
+
+[remap]
+documents=${SHARE_DOCUMENTS}
+downloads=${SHARE_DOWNLOADS}
+desktop=${SHARE_DESKTOP}
+media=${SHARE_MEDIA}
+other=${SHARE_OTHER}
+HIER
+
+# Copy all them there filez into floppy image
+mcopy -i "${FLOPPYIMG}" "${TMPDIR}/openslx.ini" "${TMPDIR}/HOSTRES.TXT" "${SHARES}" "::/"
+mcopy -i "${FLOPPYIMG}" "$VMCHOOSER_DIR/data/openslx.exe" "::/"
+# Copy guest configuration (with added information) config.xml to be accessed
+# via virtual floppy
+mcopy -i "${FLOPPYIMG}" "$xmlfile" "::/config.xml"
+
+# Copying linux directory:
+mcopy -s -i "${FLOPPYIMG}" "$VMCHOOSER_DIR/data/linux" "::/"
+
+# User supplied runscript
+if [ -n "$EXT" ]; then
+ sed -i '1d' "${RUNSCRIPT}"
+ mcopy -i "${FLOPPYIMG}" "${RUNSCRIPT}" "::/runscript${EXT}"
+fi
+
+rm -f -- "${SHARES}" "${TMPDIR}/openslx.ini" "${TMPDIR}/HOSTRES.TXT"
+unset SHARES VAR NETHOME UNAME
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc
new file mode 100644
index 00000000..7709a85d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc
@@ -0,0 +1,34 @@
+##########################################################################
+# 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/$PLUGIN_ID/run-virt.include" ] ; then
+ slxlog "virt-plugin-missing" "Could not find run-virt.include for $PLUGIN_ID ($VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include)"
+ writelog "Failed because of missing ${PLUGIN_ID} plugin."
+ error_user "Konnte den Virtualisierer '$PLUGIN_ID' nicht finden. Starten der Virtuellen Maschine fehlgeschlagen.
+ Starten Sie den Computer neu und wenden Sie sich an den Support, wenn das Problem weiterhin besteht."
+ cleanexit 1
+fi
+
+self="${PLUGIN_ID}"
+
+if ! bash -n "$VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include"; then
+ slxlog "virt-plugin-syntax" "run-virt.include for $PLUGIN_ID contains syntax errors (bash -n run-virt.include failed)"
+ writelog "Erroneous run-virt.include for $PLUGIN_ID (syntax check)"
+ error_user "Das Start-Script für den Virtualisierer '$PLUGIN_ID' ist fehlerhaft.
+ Starten Sie den Computer neu und wenden Sie sich an den Support, wenn das Problem weiterhin besteht."
+ cleanexit 1
+fi
+
+setup_vm_commandline () {
+ # Now including the hypervisor specific include file:
+ if ! source "$VMCHOOSER_DIR/$PLUGIN_ID/run-virt.include"; then
+ slxlog "virt-plugin-error" "run-virt.include for $PLUGIN_ID could not be sourced properly."
+ writelog "Erroneous run-virt.include for ${PLUGIN_ID}? Source returned != 0"
+ error_user "Das Start-Script für den Virtualisierer '$PLUGIN_ID' hat einen fehlercode zurückgegeben.
+ Starten Sie den Computer neu, falls es beim Ausführen der VM zu Problemen kommt
+ und wenden Sie sich an den Support, wenn das Problem weiterhin besteht."
+ fi
+}
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc
new file mode 100644
index 00000000..da43f341
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc
@@ -0,0 +1,27 @@
+####################################################
+# Include: Start windowmanager for easier handling #
+####################################################
+
+# Some problems may arise with windows opening in background when
+# using eg. vmware without a window manager.
+
+FOUND_WM=
+for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do
+ if which $dm >/dev/null 2>&1 ; then
+ if [ "$dm" = "fvwm2" ] ; then
+ echo "EdgeScroll 0 0" > ${redodir}/fvwm
+ writelog "Starting fvwm2."
+ fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 &
+ else
+ writelog "Starting ${dm}."
+ $dm >/dev/null 2>&1 &
+ fi
+ FOUND_WM=1
+ break
+ fi
+done
+
+if [ -z "$FOUND_WM" ]; then
+ slxlog "virt-windowmanager" "Could not find any window manager to use!"
+ notify_user "Konnte keinen Window Manager finden. (Das ist schlecht!)"
+fi
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc
new file mode 100644
index 00000000..a2d442e4
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-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 239"
+
+# $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/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
new file mode 100644
index 00000000..ca475da0
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
@@ -0,0 +1,107 @@
+#######################################################
+# 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}"
+}
+
+notify_user() {
+ local TOPIC="$1"
+ shift
+ notify-send -u normal "$TOPIC" "$@"
+ writelog "Notify: **${TOPIC}**: $*"
+}
+
+error_user() {
+ local TOPIC="$1"
+ shift
+ local MSG TITLE BODY
+ if [ $# -gt 0 ]; then
+ MSG=" $TOPIC
+$*"
+ TITLE="$TOPIC"
+ BODY="$*"
+ else
+ MSG="$TOPIC"
+ TITLE="ERROR"
+ BODY="$TOPIC"
+ fi
+ # Zenity should yield the nicest result
+ zenity --error --title "$TITLE" --text "$BODY" && return
+ # QnD abuse printergui for error message as it's blocking
+ /opt/openslx/cups/printergui --error "$MSG" && return
+ # printergui might not exist, try fallback here
+ # unfortunately, i can only think of notify+sleep right now
+ notify-send -u critical "$TITLE" "$BODY"
+ sleep 10
+}
+
+# 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
+}
+
+# Check if the given variables are set (empty or not)
+isset() {
+ while [ $# -gt 0 ]; do
+ [ -z "${!1+x}" ] && return 1
+ shift
+ done
+ return 0
+}
+
+# Check if the given variables are not empty
+notempty() {
+ while [ $# -gt 0 ]; do
+ [ -z "${!1}" ] && return 1
+ shift
+ done
+ return 0
+}
+
+##
+# Extract given xpath from given xml file
+# e.g.: xmlextract '//node/nestednode/@attribute' "$file"
+# @param
+# @return Plain text, UTF-8
+xmlextract() {
+ xmlstarlet sel -T -E utf-8 -t -v "$1" "$2"
+}
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall b/core/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall
new file mode 100644
index 00000000..2773150c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall
@@ -0,0 +1,130 @@
+#!/bin/bash
+
+# Do not rename/move this script, or change fwtool.c accordingly
+
+[ "$UID" = "0" ] || exit 1
+
+declare -rg RULES=$(mktemp)
+
+[ -n "$RULES" ] || exit 2
+
+[ -n "$1" ] || exit 3
+
+[ "${#1}" -ge 10 ] || exit 4
+[ "${#1}" -lt 40 ] || exit 5
+
+. /opt/openslx/config
+
+for TOOL in iptables ip6tables; do
+ $TOOL -w -F runvirt-INPUT || $TOOL -w -N runvirt-INPUT
+ $TOOL -w -F runvirt-OUTPUT || $TOOL -w -N runvirt-OUTPUT
+
+ if ! $TOOL -w -C INPUT -i br0 -j runvirt-INPUT; then
+ $TOOL -w -A INPUT -i br0 -j runvirt-INPUT
+ fi
+ if ! $TOOL -w -C OUTPUT -o br0 -j runvirt-OUTPUT; then
+ $TOOL -w -A OUTPUT -o br0 -j runvirt-OUTPUT
+ fi
+ if ! $TOOL -w -C FORWARD -i br0 -j runvirt-INPUT; then
+ $TOOL -w -A FORWARD -i br0 -j runvirt-INPUT
+ fi
+ if ! $TOOL -w -C FORWARD -o br0 -j runvirt-OUTPUT; then
+ $TOOL -w -A FORWARD -o br0 -j runvirt-OUTPUT
+ fi
+ $TOOL -A runvirt-INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
+ $TOOL -A runvirt-OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
+done
+
+declare -rg AUTORULES=$(mktemp)
+
+add_ips () {
+ # add_ips "IN/OUT" "IP1 IP2 IPn" "PORT" "ACCEPT/REJECT"
+ local IP
+ [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ] && return 1
+ for IP in $2; do
+ echo "$1 $IP $3 $4" >> "${AUTORULES}"
+ done
+}
+
+add_ips "IN" "127.0.0.0/8" 0 "ACCEPT"
+add_ips "OUT" "127.0.0.0/8" 0 "ACCEPT"
+add_ips "OUT" "$SLX_DNS" 53 "ACCEPT"
+add_ips "OUT" "$SLX_DNBD3_SERVERS" 5003 "ACCEPT"
+add_ips "OUT" "$SLX_KCL_SERVERS $SLX_SERVER_IP" 0 "ACCEPT"
+
+if [ -n "$SLX_VM_NFS" ]; then
+ IP=
+ if [ "${SLX_VM_NFS:0:2}" = '//' ]; then
+ IP=${SLX_VM_NFS:2}
+ IP=${IP%%/*}
+ else
+ IP=${SLX_VM_NFS%%:*}
+ fi
+ [ -n "$IP" ] && add_ips "OUT" "$IP" 0 "ACCEPT"
+fi
+
+sort -u "${AUTORULES}" > "${RULES}"
+
+wget -T 6 -O - "${SLX_VMCHOOSER_BASE_URL}/lecture/$1/netrules" >> "${RULES}" 2> "${AUTORULES}"
+RET=$?
+
+if [ "$RET" != "0" ]; then
+ echo "wget exit code: $RET :-("
+ grep -q "ERROR 404" "${AUTORULES}" && exit 0
+ exit 6
+fi
+
+declare -rg V4='^[0-9]+(\.[0-9]+)*(/[0-9]+)?$'
+declare -rg V6='^([0-9a-fA-F]+|:)(:+[0-9a-fA-F]*)*(/[0-9]+)?$'
+
+while read -r DIR DEST PORT ACTION GARBAGE || [ -n "$DIR" ]; do
+ if [ -z "$DEST" -o -z "$PORT" -o -z "$ACTION" ]; then
+ echo "Invalid rule: '$DIR $DEST $PORT $ACTION'"
+ continue
+ fi
+ IPLINE1=" -w"
+ IPLINE2=
+ if [ "$DIR" = "IN" ]; then
+ IPLINE1+=" -A runvirt-INPUT"
+ elif [ "$DIR" = "OUT" ]; then
+ IPLINE1+=" -A runvirt-OUTPUT"
+ else
+ continue
+ fi
+ if ! [[ $PORT =~ ^[0-9]+$ ]] || [ "$PORT" -gt 65535 ]; then
+ echo "Invalid port: '$PORT'"
+ continue
+ fi
+ if [ "$DEST" != "*" ]; then
+ if [ "$DIR" = "OUT" ]; then
+ IPLINE1+=" -d $DEST"
+ else
+ IPLINE1+=" -s $DEST"
+ fi
+ fi
+ if [ "$PORT" != 0 ]; then
+ IPLINE2+=" --dport $PORT"
+ fi
+ IPLINE2+=" -j $ACTION"
+ # IPv6?
+ if ! [[ $DEST =~ $V4 ]]; then
+ if [ "$PORT" = 0 ]; then
+ ip6tables $IPLINE1 $IPLINE2
+ else
+ ip6tables $IPLINE1 -p tcp $IPLINE2
+ ip6tables $IPLINE1 -p udp $IPLINE2
+ fi
+ fi
+ # IPv4
+ if ! [[ $DEST =~ $V6 ]]; then
+ if [ "$PORT" = 0 ]; then
+ iptables $IPLINE1 $IPLINE2
+ else
+ iptables $IPLINE1 -p tcp $IPLINE2
+ iptables $IPLINE1 -p udp $IPLINE2
+ fi
+ fi
+done < "$RULES"
+
+exit 0
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt b/core/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt
new file mode 100755
index 00000000..b945cca2
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt
@@ -0,0 +1,119 @@
+#!/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.
+################################################################################
+
+declare -rg RUNVIRTINCLUDEDIR=/opt/openslx/vmchooser/run-virt-includes
+declare -rg xmlfile="$1"
+
+# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string())
+if ! source "${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc"; then
+ slxlog "run-virt" "Could not source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc"
+ exit 1
+fi
+
+trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM
+
+# Define default dirs / get configs
+source "${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc"
+
+# Read needed variables from XML file
+source "${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc"
+
+# Download meta data from server (e.g. vmx for vmware)
+source "${RUNVIRTINCLUDEDIR}/download_vm_metadata.inc"
+
+if ! isset IMGUUID TMPCONFIG TMPDIR USER; then
+ slxlog "run-virt" "Internal sanity check failed: One of IMGUUID TMPCONFIG TMPDIR USER is not set."
+ cleanexit 1
+fi
+
+if [ "$LEGACY" ]; then
+
+ # No longer supported - yay
+
+ error_user "Legacy Mode" "
+Die gewählte VM ist eine 'Legacy VM', für die unvollständige
+Metadaten auf dem bwLehrpool-Server hinterlegt sind. Diese
+werden nicht mehr unterstützt. Um diese VM weiterhin nutzen
+zu können, muss sie mittels der bwLehrpool-Suite heruntergeladen,
+einmal gebootet, und wieder hochgeladen werden.
+(Bei der Gelegenheit könnten z.B. auch gleich anfallende Updates
+eingespielt werden.)
+"
+ cleanexit 1
+
+ # End legacy warning
+fi
+
+# Proper meta data received - proceed normally
+
+# Helper that looks for virtualizer-specific include, show error to user if not found
+source "${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc"
+
+# For scanning for certain usb classes
+source "${RUNVIRTINCLUDEDIR}/usb_detector.inc"
+
+# Firewall
+source "${RUNVIRTINCLUDEDIR}/setup_firewall.inc" || writelog "Could not source setup_firewall"
+setup_firewall || writelog "Could not run setup_firewall"
+
+# Sound setup
+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"
+
+# Try to use dnbd3 to access the image, nfs/cifs fallback
+source "${RUNVIRTINCLUDEDIR}/setup_image_access.inc"
+
+# Window manager required for handling of popups etc.
+source "${RUNVIRTINCLUDEDIR}/start_windowmanager.inc"
+
+# Source run-virt.include of virtualizer
+setup_vm_commandline
+
+# It should have set this variable if all went well
+if [ -z "${VIRTCMD}" ]; then
+ error_user "Fehler beim Starten der VM-Sitzung" "
+Das Start-Script für den Virtualisierer $PLUGIN_ID hat kein Kommando
+zum Starten der Sitzung definiert. Kann Sitzung nicht initialisieren."
+ slxlog "virt-plugin-error" "run-virt.include for $PLUGIN_ID did not set VIRTCMD"
+ cleanexit 1
+fi
+
+writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}"
+# This will start the VM
+eval ${VIRTCMD} ${VIRTCMDOPTS}
+
+writelog "Virtualizer exited. Bye."
+
+# Postrun for commands after virtualization finishes
+if [ -n "${POSTRUN}" ]; then
+ eval ${POSTRUN} >/dev/null 2>&1
+fi
+
+cleanexit 0
+