From 6806ae4a850fc7785a8c05304237cf53b5b8f951 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Fri, 23 Dec 2016 13:12:09 +0100 Subject: merge with latest dev version (tm-scripts commit f5a59daf8d70a9027118292cd40b18c221897408) --- .../pam_script_auth.d/99-run_virt_credentials | 41 ++++++ .../pam_script_ses_close.d/runvirt-firewall-clear | 17 +++ .../opt/openslx/scripts/systemd-mount_vm_store | 13 +- .../data/opt/openslx/scripts/systemd-run_virt_env | 63 +++++----- .../data/opt/openslx/scripts/vmchooser-run_virt | 117 +---------------- .../opt/openslx/vmchooser/config/udhcpd-nat1.conf | 5 +- .../data/opt/openslx/vmchooser/data/linux/LIESMICH | 24 ++++ .../data/opt/openslx/vmchooser/data/linux/README | 21 ++++ .../vmchooser/data/linux/includes/00_vars.inc | 29 +++++ .../vmchooser/data/linux/includes/10_functions.inc | 51 ++++++++ .../data/linux/includes/10_preliminaries.inc | 20 +++ .../data/linux/includes/15_set_trapping.inc | 14 +++ .../vmchooser/data/linux/includes/20_get_creds.inc | 27 ++++ .../data/linux/includes/30_get_shares.inc | 22 ++++ .../data/linux/includes/30_mount_shares.inc | 66 ++++++++++ .../data/linux/includes/40_check_fallback.inc | 8 ++ .../data/linux/includes/50_postliminaries.inc | 21 ++++ .../vmchooser/data/linux/includes/50_umounter.inc | 12 ++ .../opt/openslx/vmchooser/data/linux/mnt_shares | 62 +++++++++ .../opt/openslx/vmchooser/data/linux/resolution | 102 +++++++++++++++ .../vmchooser/data/linux/resolution_standalone | 138 +++++++++++++++++++++ .../opt/openslx/vmchooser/data/linux/umnt_shares | 40 ++++++ .../opt/openslx/vmchooser/data/linux/vm_installer | 87 +++++++++++++ .../opt/openslx/vmchooser/data/linux/vm_runtime | 97 +++++++++++++++ .../data/opt/openslx/vmchooser/data/openslx.exe | Bin 15360 -> 53248 bytes .../run-virt-includes/download_vm_metadata.inc | 32 +++++ .../run-virt-includes/get_xml_file_variables.inc | 63 ++++++++++ .../set_runvirt_hardware_variables.inc | 113 +++++++++++++++++ .../run-virt-includes/set_runvirt_variables.inc | 26 ++++ .../vmchooser/run-virt-includes/setup_firewall.inc | 12 ++ .../run-virt-includes/setup_image_access.inc | 98 +++++++++++++++ .../run-virt-includes/setup_printer_lpd.inc | 46 +++++++ .../vmchooser/run-virt-includes/setup_sound.inc | 79 ++++++++++++ .../run-virt-includes/setup_virtual_floppy.inc | 101 +++++++++++++++ .../run-virt-includes/setup_vm_hypervisor.inc | 34 +++++ .../run-virt-includes/start_windowmanager.inc | 27 ++++ .../vmchooser/run-virt-includes/usb_detector.inc | 77 ++++++++++++ .../vmchooser_runvirt_functions.inc | 107 ++++++++++++++++ .../opt/openslx/vmchooser/scripts/set-firewall | 130 +++++++++++++++++++ .../data/opt/openslx/vmchooser/vmchooser-run_virt | 119 ++++++++++++++++++ 40 files changed, 2008 insertions(+), 153 deletions(-) create mode 100644 core/modules/run-virt/data/opt/openslx/scripts/pam_script_auth.d/99-run_virt_credentials create mode 100644 core/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear mode change 100755 => 120000 core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt (limited to 'core/modules/run-virt/data') 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 deleted file mode 100755 index 1e591389..00000000 --- a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -# Full bash required -# ----------------------------------------------------------------------------- -# Copyright (c) 2007..2010 - RZ Uni FR -# Copyright (c) 2007..2013 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# run-virt.sh -# - This is the generic wrapper for the several virtualization solutions. -# The idea is to setup a set of variables used by at least two different -# tools and then include the specific plugin which configures the speci- -# fied virtualization tool. -################################################################################ - -RUNVIRTINCLUDEDIR=/opt/openslx/scripts/includes -xmlfile="$1" - -# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string()) -source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc && trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM -# Define default dirs / get configs -source ${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc -# Function to detect whether we can use the new way (vmx via http) or the old way (legacy): -source ${RUNVIRTINCLUDEDIR}/detect_legacy.inc # This yields LEGACY, IMGUUID, IMGVMX -# For scanning for certain usb classes -source "${RUNVIRTINCLUDEDIR}/usb_detector.inc" - -if [ "$LEGACY" ]; then - # check for important files used (filecheck()) - vestigial? - source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc - # Get XML file and dir, legacy (old way) - source ${RUNVIRTINCLUDEDIR}/get_xml_file_dir_legacy.inc # xmlfile=$1 - # xml file sanity checks, legacy - source ${RUNVIRTINCLUDEDIR}/check_runvirt_xml_sanity_legacy.inc - # print console logo - source ${RUNVIRTINCLUDEDIR}/print_runvirt_console_logo.inc - # Read needed variables from XML file - source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables_legacy.inc - # Declaration of hardware relatedt variables - source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables_legacy.inc - # Sound setup the rest of the environment and run the configured vm - source ${RUNVIRTINCLUDEDIR}/setup_sound.inc - # Start printer daemon - source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc - # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc. - source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc - # Try to use dnbd3 to access the image, nfs/cifs fallback - source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc - # Get all virtual machine specific stuff from the respective include file - source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc - # start a windowmanager for easier handling - source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc - # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!) - source ${RUNVIRTINCLUDEDIR}/start_pvs.inc - # Check if tcpsvd is running. Do not check immediately after spawning, - # as this could result in success even if it's not really working. - source ${RUNVIRTINCLUDEDIR}/check_lpd.inc -else - # check for important files used (filecheck()) - vestigial? - # This include does not currently work. TODO. - # source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc && filecheck - - # Read needed variables from XML file - source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc - - # Sound setup the rest of the environment and run the configured vm - source ${RUNVIRTINCLUDEDIR}/setup_sound.inc - - # Declaration of hardware relatedt variables - source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.inc - - # Start printer daemon - source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc - - # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc. - source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc - - # Get all virtual machine specific stuff from the respective include file - source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc - - # start a windowmanager for easier handling - source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc - - # Try to use dnbd3 to access the image, nfs/cifs fallback - source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc - - # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!) - source ${RUNVIRTINCLUDEDIR}/start_pvs.inc - - # Check if tcpsvd is running. Do not check immediately after spawning, - # as this could result in success even if it's not really working. - source ${RUNVIRTINCLUDEDIR}/check_lpd.inc - -fi - -# This will start the VM -writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}" - -# Transported from vmware-runvirt include -sync - -eval ${VIRTCMD} ${VIRTCMDOPTS} -writelog "Bye." - -# Postrun for commands after virtualization finishes -if [ -n "${POSTRUN}" ]; then - eval ${POSTRUN} >/dev/null 2>&1 -fi - -cleanexit 0 diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt new file mode 120000 index 00000000..447f98bc --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt @@ -0,0 +1 @@ +/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 Binary files a/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe and b/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe 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 + -- cgit v1.2.3-55-g7522