summaryrefslogtreecommitdiffstats
path: root/remote/modules/vmchooser2/data
diff options
context:
space:
mode:
authorSimon Rettberg2014-05-04 13:38:28 +0200
committerSimon Rettberg2014-05-04 13:38:28 +0200
commite20da74f86f668bd5c247545d2a10d7dd17c3ccb (patch)
tree27a2859759031b1e3c35e17e5277c8fa50d26a6d /remote/modules/vmchooser2/data
parent[vmchooser-openslx] Remove pointless config module... (diff)
downloadtm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.tar.gz
tm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.tar.xz
tm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.zip
[vmchooser2] !
Diffstat (limited to 'remote/modules/vmchooser2/data')
l---------remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service1
-rw-r--r--remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service10
l---------remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service1
-rw-r--r--remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service9
-rw-r--r--remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf2
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/bin/clc.bash307
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/bin/vmchooser23
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading3
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store6
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env182
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc475
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt602
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter74
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf38
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf54
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf4
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exebin0 -> 8704 bytes
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exebin0 -> 12800 bytes
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart12
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.pngbin0 -> 5361 bytes
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.pngbin0 -> 3390 bytes
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini4
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.pngbin0 -> 9187 bytes
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.pngbin0 -> 3390 bytes
-rw-r--r--remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini4
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop10
26 files changed, 1821 insertions, 0 deletions
diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service b/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service
new file mode 120000
index 00000000..ad1590e8
--- /dev/null
+++ b/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service
@@ -0,0 +1 @@
+../vmchooser.service \ No newline at end of file
diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service b/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service
new file mode 100644
index 00000000..ff801963
--- /dev/null
+++ b/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Mount VM store per NFS
+After=network.target
+Requires=network.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-mount_vm_store
+RemainAfterExit=yes
diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service b/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service
new file mode 120000
index 00000000..d6a88c27
--- /dev/null
+++ b/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service
@@ -0,0 +1 @@
+../mount-vm-store.service \ No newline at end of file
diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service b/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service
new file mode 100644
index 00000000..1a5a980a
--- /dev/null
+++ b/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Sets up the vmchooser environment
+Wants=graphical.target
+Before=graphical.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-vmchooser_env
diff --git a/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf b/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf
new file mode 100644
index 00000000..3b2219d1
--- /dev/null
+++ b/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf
@@ -0,0 +1,2 @@
+d /tmp/vmchooser2 0777 root root
+d /tmp/vmchooser2/icons 0777 root root
diff --git a/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash b/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash
new file mode 100755
index 00000000..ee198c51
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash
@@ -0,0 +1,307 @@
+#!/bin/bash
+# Needs full bash
+
+# region header
+
+# Copyright Torben Sickert 16.12.2012
+
+# License
+# This library written by Torben Sickert stand under a creative commons
+# naming 3.0 unported license.
+# see http://creativecommons.org/licenses/by/3.0/deed.de
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+# Dependencies:
+
+# vmware or virtualbox
+
+# Notes:
+
+# USE "sudo bin/vmware-vmx --new-sn JJ237-G52E2-08X0C-C3306-0WCQ1"
+# To activate wmware workstation!
+
+# Abbreviation for "createLinkedClone".
+__NAME__='clc'
+
+# endregion
+
+# Provides the main module scope.
+function clc() {
+
+# region configuration
+
+ # region private properties
+
+ # region command line arguments
+
+ local _VERBOSE='no'
+ local _SUPPORTED_HYPERVISOR=('VMware' 'virtualBox')
+ # NOTE: This value will be determined automatically. If no hypervisor
+ # could be detected this value will be used as default.
+ # The first value from supported Machines is taken as default.
+ local _HYPERVISOR="$_SUPPORTED_HYPERVISOR"
+ local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--'
+
+ # endregion
+
+ local _STANDARD_OUTPUT=/dev/null
+ local _ERROR_OUTPUT=/dev/null
+ local _BASIC_IMAGE_CONFIGURATION_FILE_PATH=''
+ local _TARGET_PATH=''
+ local _CREATE_PERSISTENT_CONFIG='no'
+
+ # endregion
+
+# endregion
+
+# region functions
+
+ # region command line interface
+
+ # Prints a description about how to use this program.
+ function clcPrintUsageMessage() {
+ cat << EOF
+ $__NAME__ Generates a linked clone from given machine description file in
+ given target location.
+EOF
+ return $?
+ }
+
+ # Prints a description about how to use this program by providing examples.
+ function clcPrintUsageExamples() {
+ cat << EOF
+ # Getting a help message.
+ >>> $0 --help
+
+ # Creating a linked clone.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/
+
+ # Creating a linked clone in verbose mode.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d
+EOF
+ return $?
+ }
+
+ # Prints descriptions about each available command line option.
+ function clcPrintCommandLineOptionDescriptions() {
+ # NOTE; All letters are used for short options.
+ cat << EOF
+ -h --help Shows this help message.
+
+ -v --verbose Tells you what is going on (default: "$_VERBOSE").
+
+ -d --debug Gives you any output from all tools which are used
+ (default: "$_DEBUG").
+
+ -c --create-persistent-config If set an xml file for persistent openslx
+ boot will be created (default: "$_CREATE_PERSISTENT_CONFIG").
+EOF
+ return $?
+ }
+
+ # Provides a help message for this module.
+ function clcPrintHelpMessage() {
+ echo -e \
+ "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \
+ clcPrintUsageMessage "$@" && \
+ echo -e '\nExamples:\n' && \
+ clcPrintUsageExamples "$@" && \
+ echo -e '\nOption descriptions:\n' && \
+ clcPrintCommandLineOptionDescriptions "$@" && \
+ echo && \
+ return $?
+ }
+
+ # Provides the command line interface and interactive questions.
+ function clcCommandLineInterface() {
+ while true; do
+ case "$1" in
+ -h|--help)
+ shift
+ clcPrintHelpMessage "$0"
+ exit 0
+ ;;
+ -v|--verbose)
+ shift
+ _VERBOSE='yes'
+ ;;
+ -d|--debug)
+ shift
+ _DEBUG='yes'
+ _STANDARD_OUTPUT=/dev/stdout
+ _ERROR_OUTPUT=/dev/stderr
+ ;;
+ -c|--create-persistent-config)
+ shift
+ _CREATE_PERSISTENT_CONFIG='yes'
+ ;;
+
+ '')
+ shift
+ break 2
+ ;;
+ *)
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then
+ _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1"
+ elif [[ ! "$_TARGET_PATH" ]]; then
+ _TARGET_PATH="$1"
+ else
+ clcLog 'critical' \
+ "Given argument: \"$1\" is not available." '\n'
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ shift
+ ;;
+ esac
+ done
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \
+ [[ ! "$_TARGET_PATH" ]]; then
+ clcLog 'critical' \
+ "You have to provide a basic image configuration file and a destination path."
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ local supportedVirtualMachine
+ for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do
+ if [[ "$(clcGetXMLValue 'virtualMachine' | \
+ grep --ignore-case "$supportedVirtualMachine")" ]]; then
+ _HYPERVISOR="$supportedVirtualMachine"
+ clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor."
+ break
+ fi
+ done
+ clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \
+ return $?
+ }
+
+ # Grabs a value from currently loaded xml file.
+ function clcGetXMLValue() {
+ grep --ignore-case --only-matching "<$1 param=.*" \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }'
+ return $?
+ }
+
+ # Handles logging messages. Returns non zero and exit on log level error to
+ # support chaining the message into toolchain.
+ function clcLog() {
+ local loggingType='info'
+ local message="$1"
+ if [ "$2" ]; then
+ loggingType="$1"
+ message="$2"
+ fi
+ if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \
+ [ "$loggingType" == 'critical' ]; then
+ if [ "$3" ]; then
+ echo -e -n "$3"
+ fi
+ echo -e "${loggingType}: $message"
+ fi
+ if [ "$loggingType" == 'error' ]; then
+ exit 1
+ fi
+ }
+
+ # endregion
+
+ # region tools
+
+ # Returns the minimal vmx vmware configuration file content to create a
+ # snapshot.
+ function clcGetTemporaryVMXContent() {
+ cat << EOF
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "7"
+ide0:0.present = "TRUE"
+ide0:0.fileName = "$1"
+displayName = ""
+EOF
+ return $?
+ }
+
+ # Creates a snapshot from VMware generated virtual machine.
+ function clcCreateVMwareSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcGetTemporaryVMXContent "/var/lib/virt/vmware/$(clcGetXMLValue 'image_name')" \
+ 1>"$temporaryConfigurationFilePath" 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed files generated in \"$temporaryConfigurationPath\" generated." && \
+ vmrun snapshot "$temporaryConfigurationPath"*.vmx \
+ persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+ rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT"
+ fi
+ return $result
+ }
+
+ # Creates a snapshot from virtualBox generated virtual machine.
+ function clcCreateVirtualBoxSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ VBoxManage clonevm TODO ->(VMNAME) --snapshot base --options link \\
+ --basefolder "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ mv "${temporaryConfigurationPath}/Snapshots/"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ return $?
+ }
+
+ # Creates a persistent version of given config file.
+ function clcCreatePersistentConfig() {
+ cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed --in-place --regexp-extended \
+ "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ return $?
+ }
+
+ # endregion
+
+# endregion
+
+# region controller
+
+ clcCommandLineInterface "$@" || return $?
+ if [[ "$_CREATE_PERSISTENT_CONFIG" == 'yes' ]]; then
+ clcCreatePersistentConfig || \
+ clcLog 'error' 'Creating persitent config failed.'
+ else
+ "clcCreate${_HYPERVISOR}Snapshot" || \
+ clcLog 'error' 'Creating Linked Clone failed.'
+ fi
+ clcLog 'Program has successfully finished.' && \
+ return $?
+
+# endregion
+
+}
+
+# region footer
+
+if [[ "$0" == *"${__NAME__}.bash" ]]; then
+ "$__NAME__" "$@"
+fi
+
+# endregion
diff --git a/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser
new file mode 100755
index 00000000..7f53d202
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser
@@ -0,0 +1,23 @@
+#!/bin/ash
+
+# This script launches the real vmchooser (vmchooser.real)
+# It's here to pass the XML URL, coming from
+# /opt/openslx/config, as well as the pool filter (if any)
+
+. /opt/openslx/config
+
+if [ -n "$SLX_VMCHOOSER_BASE_URL" ]; then
+ URL="$SLX_VMCHOOSER_BASE_URL"
+elif [ -n "$SLX_PXE_SERVER_IP" ]; then
+ URL="http://$SLX_PXE_SERVER_IP/vmchooser/"
+else
+ slxlog "virt-vmchooser" "vmchooser: Could not determine URL to fetch VM list from! (need SLX_VMCHOOSER_BASE_URL)"
+ # TODO: Tell user
+fi
+
+if [ -n "$SLX_VM_POOL_FILTER" ]; then
+ vmchooser.real --url "$URL" --pool "$SLX_VM_POOL_FILTER"
+else
+ vmchooser.real --url "$URL"
+fi
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading b/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
new file mode 100755
index 00000000..b0909760
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
@@ -0,0 +1,3 @@
+#!/bin/ash
+
+iptables -t nat -A POSTROUTING -o br0 -s 192.168.101.0/24 -j MASQUERADE
diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store
new file mode 100755
index 00000000..831e25d8
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store
@@ -0,0 +1,6 @@
+#!/bin/ash
+
+. /opt/openslx/config || exit 1
+
+mkdir -p /mnt/vmstore
+mount -t nfs -o ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore
diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env
new file mode 100755
index 00000000..04ea4b0d
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env
@@ -0,0 +1,182 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2013 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# systemd-vmchooser_env
+# - This is the preparation script for the configuration of the virtuali-
+# zation tools used later on.
+################################################################################
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin:/opt/openslx/usr/bin:/opt/openslx/usr/sbin
+
+# source config file with vars (e.g. ipaddr, macaddr, hostname)
+. /opt/openslx/config
+
+# from plugins/vmchooser/XX_vmchooser.sh
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+
+mkdir -p "${VMCHOOSER_DIR}/data/loopimg"
+mkdir -p "${VMCHOOSER_DIR}/fd-loop" -m 1777
+
+# mount a clean tempfs (bug in UnionFS prevents loopmount to work)
+grep -qE "unionfs |aufs " /proc/mounts && \
+ mount -n -o size=1500k -t tmpfs vm-loopimg "${VMCHOOSER_DIR}/data/loopimg"
+
+# create an empty floppy image of 1.44 MByte size
+dd "if=/dev/zero" "of=${VMCHOOSER_DIR}/data/loopimg/fd.img" count=2880 bs=512 2>/dev/null
+chmod 0777 "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+
+# use dos formatter copied into stage3
+mkdosfs "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+mount -n -t msdos -o loop,umask=000 "${VMCHOOSER_DIR}/data/loopimg/fd.img" "${VMCHOOSER_DIR}/fd-loop"
+
+#pvs integration
+#if [ $vmchooser_pvs -ne 0 ]; then
+# sed -i /usr/share/xsessions/default.desktop \
+# -e "s,vmchooser$,vmchooser --pvs,"
+#fi
+
+# setup more scratch space for virtual machines, if configured
+mkdir -p /tmp/virt /var/log/samba /run/samba
+
+# enable normal users to setup the extended virtual machine redo file space
+# and image source via network block device (NBD only at the moment)
+# allow to start/stop samba on virtual devices (latter one ignores multiple
+# independent daemons)
+
+#cat >> /mnt/etc/sudoers << EOF
+# allow to start and stop the special /tmp redo file space (RAM + NBD/NFS server RAID)
+#ALL ALL=NOPASSWD: /sbin/losetup /dev/loop*
+#ALL ALL=NOPASSWD: /sbin/mdadm -C /dev/md0 -l linear --raid-devices=2 /dev/loop* /dev/*
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/sbin/nbd-client * * /dev/nbd*
+# allow to configure and start/stop samba services
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/bin/sed -i /etc/*/smb.conf -e *
+#ALL ALL=NOPASSWD: /usr/sbin/nmbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /usr/sbin/smbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/bin/killall nmbd smbd
+#EOF
+
+################################################################################
+### Determine hardware configuration
+################################################################################
+
+# estimate free mem
+mem_free=$(grep -i "^memfree:" /proc/meminfo | awk '{print $2}')
+mem_cached=$(grep -i "^cached:" /proc/meminfo | awk '{print $2}')
+mem_swapcached=$(grep -i "^swapcached:" /proc/meminfo | awk '{print $2}')
+[ -z "$mem_free" ] && mem_free="2048000"
+[ -z "$mem_cached" ] && mem_cached="0"
+[ -z "$mem_swapcached" ] && mem_swapcached="0"
+totalmem="$(expr $(expr $mem_free + $mem_cached + $mem_swapcached) / 1024)"
+echo "totalmem=${totalmem}" > "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# determine number of cpu cores
+CPU_CORES=$(grep '^processor.*:' /proc/cpuinfo | wc -l)
+if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then
+ echo "cpu_cores=${CPU_CORES}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else
+ echo 'cpu_cores=1' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# general machine architecture (32/64bit)
+echo "host_arch=$(uname -m)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# check for VT enabled CPU
+if grep -q '^flags.*\<vmx\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_intel"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ elif grep -q '^flags.*\<svm\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_amd"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ else
+ echo "vtflag=0" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# write mac
+if [ -n "$SLX_PXE_MAC" ]; then
+ echo "hostmacaddr=${SLX_PXE_MAC}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else ## Fallback:
+ echo "hostmacaddr=$(ip a | grep ether | grep -o -E -i '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+# read in ip address
+echo "hostip=${SLX_PXE_CLIENT_IP}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+# hostname
+echo "hostname=\"$(hostname -s)\"" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# get further hw information and check for traces of available optical and floppy drives
+j=0
+for cdrom in $(dmesg|grep -i "Attached scsi CD-ROM sr" | sed "s,.*Attached scsi CD-ROM ,,"); do
+ echo "cdrom_$j=/dev/${cdrom}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+j=0
+for floppy in $(dmesg|grep -i "Floppy drive"|sed "s,.*(s): ,,;s, is .*,,"); do
+ echo "floppy_$j=/dev/${floppy}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+################################################################################
+### Setup VM networking
+################################################################################
+
+# there will be three types of network interfaces for virtual machines available
+# all will be configured for every type of virtualization tool
+# a) br0 is the direct host bridge into the local LAN (br0 already exists)
+# vmnet0 for VMware
+# vboxnet0 for VirtualBox
+# kvmnet0* for Qemu/KVM
+# b) nat1 is an internal bridge which "NATes" into the local LAN (with DHCP)
+# vmnet1 for VMware
+# vboxnet1 for VirtualBox
+# kvmnet1* for Qemu/KVM
+# c) vsw2 is an internal host bridge to connect software defined LANs to
+# vmnet2 for VMware
+# vboxnet2 for VirtualBox
+# kvmnet2* for Qemu/KVM
+
+# creating and configuring nat0
+# 192.168.101.0/24 is vm nat. If you ever change this there are a couple of other files
+# where you'd need to make changes, so think twice before doing so. ;)
+brctl addbr nat1
+ip link set dev nat1 up
+ip addr add 192.168.101.1/24 dev nat1
+echo "1" >/proc/sys/net/ipv4/conf/nat1/forwarding
+echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
+# iptables masquerade rule is now inserted by /opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
+### iptables -t nat -A POSTROUTING -o br0 -s 192.168.0.0/16 -j MASQUERADE
+
+for wait in 1 1 2 2 3 end; do
+ grep '^SLX_DNS' "/opt/openslx/config" > /dev/null && break
+ [ "$wait" == "end" ] && echo "No DNS config found, using google dns" && break
+ echo "Waiting for DNS config.."
+ sleep "$wait"
+done
+
+# read the DNS configuration and configure the udhcpd
+[ -z "${SLX_DNS}" ] && SLX_DNS="8.8.8.8"
+sed -i "s,DNSSERVER,${SLX_DNS},;s,DOMAIN,${SLX_NET_DOMAIN}," \
+ /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+mkdir -p /var/lib/udhcpd
+udhcpd -S /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+# creating and configuring vsw2
+brctl addbr vsw2
+ip link set dev vsw2 up
+echo "1" >/proc/sys/net/ipv4/conf/vsw2/forwarding
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc
new file mode 100755
index 00000000..337dee44
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc
@@ -0,0 +1,475 @@
+#!/bin/bash
+
+# region header
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+ # region dependencies:
+
+# VMware Player - Runs a virtual machine.
+# VMware Workstation - Runs, edits, creates virtual machines for business
+# usage.
+# VirtualBox ver. 4+ - Plays, creates, edits virtual machines.
+# bash ver. 4+ - A sh-compatible command line interpreter.
+# cat - Concatenate and prints file contents.
+# echo - Prints chars.
+# grep - Prints lines which matches a given regular expression
+# pattern.
+# sed - Stream-editor for filtering and transformation text.
+# mktemp - Creates temporary files and folders.
+# dirname - Extracts the last element from a given file path.
+# mv - moves and renames file objects.
+# rm - Removes files and folders.
+# cp - Copies files and folders.
+# sleep - Delays program calls.
+# readlink - Print resolved symbolic links or canonical file names.
+
+ # endregion
+
+# Abbreviation for "createLinkedClone".
+__NAME__='vmchooser-clc'
+
+# endregion
+
+# Provides the main module scope.
+function vmchooser-clc() {
+
+# region configuration
+
+ # region private properties
+
+ # region command line arguments
+
+ local _VERBOSE='no'
+ # NOTE: You should write upper case first letters to support valid
+ # camel case method names to handle given hypervisor.
+ local _SUPPORTED_HYPERVISOR=('VMware' 'VirtualBox')
+ # NOTE: This value will be determined automatically. If no hypervisor
+ # could be detected this value will be used as default.
+ # The first value from supported Machines is taken as default.
+ local _HYPERVISOR="$_SUPPORTED_HYPERVISOR"
+ local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--'
+ local _PERSISTENT_CONFIG_TARGET=''
+ local _BASIC_IMAGE_CONFIGURATION_FILE_PATH=''
+ local _TARGET_PATH=''
+ local _VIRTUAL_BOX_SNAPSHOT_NAME='persistentUserSnapshot'
+
+ # endregion
+
+ local _STANDARD_OUTPUT=/dev/null
+ local _ERROR_OUTPUT=/dev/null
+ local _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH='/tmp/clcVirtualBoxSnapshotUUID'
+
+ # endregion
+
+# endregion
+
+# region functions
+
+ # region command line interface
+
+ # Prints a description about how to use this program.
+ function clcPrintUsageMessage() {
+ cat << EOF
+ $__NAME__ Generates a linked clone from given machine description file in
+ given target location.
+EOF
+ return $?
+ }
+
+ # Prints a description about how to use this program by providing examples.
+ function clcPrintUsageExamples() {
+ cat << EOF
+ # Getting a help message.
+ >>> $0 --help
+
+ # Creating a linked clone.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/
+
+ # Creating a linked clone configuration file.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -c
+
+ # Creating a linked clone in verbose mode.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d
+EOF
+ return $?
+ }
+
+ # Prints descriptions about each available command line option.
+ function clcPrintCommandLineOptionDescriptions() {
+ # NOTE; All letters are used for short options.
+ cat << EOF
+ -h --help Shows this help message.
+
+ -v --verbose Tells you what is going on (default: "$_VERBOSE").
+
+ -d --debug Gives you any output from all tools which are used
+ (default: "$_DEBUG").
+
+ -c --create-persistent-config PERSISTENT_IMAGE_FILE_PATH If set an xml file
+ for persistent openslx boot will be created referencing to given
+ persistent image path (default: "$_PERSISTENT_CONFIG_TARGET").
+
+ -v --virtualbox-snapshot-name NAME Provide a name for newly created
+ snapshots. (default: "$_VIRTUAL_BOX_SNAPSHOT_NAME").
+
+ -u --virtualbox-snapshot-uuid-file-path PATH Provide a file path where to
+ save the newly generated snapshot uuid (default: \
+ "$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH").
+EOF
+ return $?
+ }
+
+ # Provides a help message for this module.
+ function clcPrintHelpMessage() {
+ echo -e \
+ "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \
+ clcPrintUsageMessage "$@" && \
+ echo -e '\nExamples:\n' && \
+ clcPrintUsageExamples "$@" && \
+ echo -e '\nOption descriptions:\n' && \
+ clcPrintCommandLineOptionDescriptions "$@" && \
+ echo && \
+ return $?
+ }
+
+ # Provides the command line interface and interactive questions.
+ function clcCommandLineInterface() {
+ while true; do
+ case "$1" in
+ -h|--help)
+ shift
+ clcPrintHelpMessage "$0"
+ exit 0
+ ;;
+ -v|--verbose)
+ shift
+ _VERBOSE='yes'
+ ;;
+ -d|--debug)
+ shift
+ _DEBUG='yes'
+ _STANDARD_OUTPUT=/dev/stdout
+ _ERROR_OUTPUT=/dev/stderr
+ ;;
+ -c|--create-persistent-config)
+ shift
+ _PERSISTENT_CONFIG_TARGET="$1"
+ shift
+ ;;
+ -v|--virtualbox-snapshot-name)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_NAME="$1"
+ shift
+ ;;
+ -u|--virtualbox-snapshot-uuid-file-path)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH="$1"
+ shift
+ ;;
+
+ '')
+ shift
+ break 2
+ ;;
+ *)
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then
+ _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1"
+ elif [[ ! "$_TARGET_PATH" ]]; then
+ _TARGET_PATH="$1"
+ else
+ clcLog 'critical' \
+ "Given argument: \"$1\" is not available." '\n'
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ shift
+ ;;
+ esac
+ done
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \
+ [[ ! "$_TARGET_PATH" ]]; then
+ clcLog 'critical' \
+ "You have to provide a basic image configuration file and a destination path."
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ local supportedVirtualMachine
+ for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do
+ if [[ "$(clcGetXMLValue 'virtualMachine' | \
+ grep --ignore-case "$supportedVirtualMachine")" ]]; then
+ _HYPERVISOR="$supportedVirtualMachine"
+ clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor."
+ break
+ fi
+ done
+ clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \
+ return $?
+ }
+
+ # Grabs a value from currently loaded xml file.
+ function clcGetXMLValue() {
+ grep --ignore-case --only-matching "<$1 param=.*" \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }'
+ return $?
+ }
+
+ # Handles logging messages. Returns non zero and exit on log level error to
+ # support chaining the message into toolchain.
+ function clcLog() {
+ local loggingType='info'
+ local message="$1"
+ if [ "$2" ]; then
+ loggingType="$1"
+ message="$2"
+ fi
+ if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \
+ [ "$loggingType" == 'critical' ]; then
+ if [ "$3" ]; then
+ echo -e -n "$3"
+ fi
+ echo -e "${loggingType}: $message"
+ fi
+ if [ "$loggingType" == 'error' ]; then
+ exit 1
+ fi
+ }
+
+ # endregion
+
+ # region tools
+
+ # Returns the minimal vmx vmware configuration file content to create a
+ # snapshot.
+ function clcGetTemporaryVMXContent() {
+ cat << EOF
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "7"
+ide0:0.present = "TRUE"
+ide0:0.fileName = "$1"
+displayName = ""
+EOF
+ return $?
+ }
+
+ # This functions escapes every special meaning character for a sed
+ # replacement.
+ #
+ # Examples:
+ #
+ # >>> sed "s/myInputString/$(clcValidateSEDReplacement '\hans/peter&klaus')/g"
+ function clcValidateSEDReplacement() {
+## bash
+## sed --expression 's/\\/\\\\/g' --expression 's/\//\\\//g' \
+## --expression 's/&/\\\&/g' <<< "$1"
+ sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g' <<< "$1"
+##
+ return $?
+ }
+
+ # endregion
+
+ # region main tasks
+
+ # Creates a snapshot from VMware generated virtual machine.
+ function clcCreateVMwareSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Generate a temporary virtual machine configuration file \"$temporaryConfigurationFilePath\"." && \
+ clcGetTemporaryVMXContent "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" 1>"$temporaryConfigurationFilePath" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ vmrun snapshot "$temporaryConfigurationPath"*.vmx \
+ persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ fi
+ return $result
+ }
+
+ # Creates a snapshot from virtualBox generated virtual machine.
+ function clcCreateVirtualBoxSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## (cp --recursive ~/.VirtualBox/ \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+## mkdir --parents \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+ (cp -r ~/.VirtualBox/ \
+ "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ mkdir -p "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+##
+ # VBoxManage version to create snapshots.
+ clcLog 'Create a temporary virtual machine.' && \
+ # NOTE: Virtualbox needs 5 at leas 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ VBoxManage createvm --name tmp --basefolder \
+ "$temporaryConfigurationPath" --register 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Create a temporary virtual ide controller.' && \
+ VBoxManage storagectl tmp --name tmp --add ide 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Attach given virtual disk image to temporary virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --type hdd --medium "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ clcLog "Take a snapshot with name or uuid \"$_VIRTUAL_BOX_SNAPSHOT_NAME\"." && \
+ VBoxManage snapshot tmp take "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## local virtualBoxSnapshotUUID="$(basename \
+## "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+## --regexp-extended 's/\{(.+)\}\..+/\1/g')" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local virtualBoxSnapshotUUID="$(basename \
+ "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+ -r 's/\{(.+)\}\..+/\1/g')" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ echo "$virtualBoxSnapshotUUID" \
+ 1>"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Created snapshot uuid is \"$virtualBoxSnapshotUUID\" (uuid saved to \"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH\")." && \
+ clcLog "Copy result to given target path \"$_TARGET_PATH\"." && \
+ cp "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtualbox tries to consolidate with
+ # readonly basic image.
+ #VBoxManage snapshot tmp delete "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ # 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtual box has child images registered.
+ #VBoxManage closemedium disk "$(dirname \
+ # "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ # 'image_name')" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Detach given virtual disk image from temporary created virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --medium none 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Remove virtual dummy harddisk.' && \
+ VBoxManage storagectl tmp --name tmp --remove \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Unregister temporary created virtual machine.' && \
+ VBoxManage unregistervm tmp 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Restore virtualbox home directory.' && \
+## bash
+## rm --recursive --force ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+## 2>"$_ERROR_OUTPUT" && \
+## cp --recursive "${temporaryConfigurationPath}virtualBoxBackup/" \
+## ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## rm --recursive --force "$temporaryConfigurationPath" && \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ cp -r "${temporaryConfigurationPath}virtualBoxBackup/" \
+ ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf "$temporaryConfigurationPath" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ # NOTE: Virtualbox needs at least 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ return $?
+ fi
+ return $result
+ }
+
+ # Creates a persistent version of given configuration file.
+ function clcCreatePersistentConfig() {
+ clcLog "Create a persistent configuration file version from \"$_BASIC_IMAGE_CONFIGURATION_FILE_PATH\" in \"$_TARGET_PATH\"." && \
+ cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Edit short description.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Append "original_xml_file_path" tag.' && \
+## bash
+## sed --in-place --regexp-extended \
+## "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+## "$(readlink --canonicalize \
+## "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+## "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r \
+ "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+ "$(readlink -f \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ clcLog 'Edit image file path.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *image_name[^>]*param=\")[^\"]*(\")/\\1$(clcValidateSEDReplacement \
+ "$_PERSISTENT_CONFIG_TARGET")\\2/g" "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Convert configuration file from windows style line endings to unix line endings.' && \
+## bash
+## sed --in-place --regexp-extended 's/\r//g' "$_TARGET_PATH" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r 's/\r//g' "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ return $?
+ }
+
+ # endregion
+
+# endregion
+
+# region controller
+
+ clcCommandLineInterface "$@" || return $?
+ if [[ "$_PERSISTENT_CONFIG_TARGET" ]]; then
+ clcCreatePersistentConfig || \
+ clcLog 'error' 'Creating persistent configuration file failed.'
+ else
+ "clcCreate${_HYPERVISOR}Snapshot" || \
+ clcLog 'error' 'Creating Linked Clone failed.'
+ fi
+ clcLog 'Program has successfully finished.' && \
+ return $?
+
+# endregion
+
+}
+
+# region footer
+
+if [[ "$0" == *"${__NAME__}" ]]; then
+ "$__NAME__" "$@"
+fi
+
+# endregion
diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt
new file mode 100755
index 00000000..59cddfed
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt
@@ -0,0 +1,602 @@
+#!/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.
+################################################################################
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+
+# include general configuration from vmchooser
+[ -f "$VMCHOOSER_CONF_DIR/vmchooser.conf" ] && . "$VMCHOOSER_CONF_DIR/vmchooser.conf"
+# load general virtualization information
+[ -f "$VMCHOOSER_CONF_DIR/virtualization.conf" ] && . "$VMCHOOSER_CONF_DIR/virtualization.conf"
+# Load general openslx config
+[ -f "/opt/openslx/config" ] && . "/opt/openslx/config"
+
+################################################################################
+### Functions used throughout the script
+################################################################################
+
+# function to write to stdout and logfile
+LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log"
+writelog () {
+ # write to stdout
+ echo -e "$1"
+ # log into file
+ echo -e "$1" >> "${LOGFILE}"
+}
+
+# Clean exit will be called at the end of this script
+cleanexit () {
+ sleep 1
+ # remove config dirs when exit
+ if echo "${RMDIRS}" 2>/dev/null | grep -q "${xmlvirt}"; then
+ writelog "${xmlvirt} exited. Cleaning up... \c"
+ rm -rf -- ${RMDIRS} >/dev/null 2>&1
+ writelog "done"
+ fi
+ # Disconnect dnbd3 device
+ if [ -n "$dnbd3" ]; then
+ for timeout in 1 1 2; do
+ dnbd3-client -d "$dnbd3" -c -d "$dnbd3" -c && break
+ writelog "dnbd3 still busy...."
+ sleep "$timeout"
+ done
+ fi
+ # Kill LPD
+ kill "$PID_LPD"
+ # Remove spool directory for printjobs from VM
+ [ -n "${SPOOLDIR}" ] && rm -rf -- "${SPOOLDIR}"
+
+ [ $# -gt 0 ] && exit "$1"
+ exit 129 # No exit code was given :/
+}
+
+function rv_clean_string ()
+{
+ if [ "$#" -ge 1 ]; then
+ echo "$@" | tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]'
+ else
+ tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]'
+ fi
+}
+
+trap cleanexit SIGINT SIGTERM
+
+# check for important files used
+filecheck ()
+{
+ filecheck=$(LANG=us ls -lh ${diskfile} 2>&1)
+ writelog "Filecheck:\n${filecheck}\n"
+ noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l)
+ rightsfile=${diskfile}
+
+ # check if link
+ if [ -L "${diskfile}" ]; then
+ # take link target
+ rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}')
+ rightsfile=${vmdir}/${rightsfile}
+ filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1)
+ fi
+
+ # does file exist
+ if [ "${noimage}" -ge "1" ]; then
+ writelog "Virtual Machine Image Problem:\c "
+ writelog "\tThe image you've specified doesn't exist."
+ writelog "Filecheck says:\c "
+ writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory"
+ writelog "Hint:\c "
+ writelog "\t\t\tCompare spelling of the image with your options.\n"
+ exit 1
+ fi
+
+ # readable by calling user
+ if ! [ -r "${diskfile}" >/dev/null 2>&1 \
+ -o -r "${diskfile}" >/dev/null 2>&1 ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you've specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n"
+ exit 1
+ fi
+
+ # writable (for persistent-mode)?
+ if ! [ -w "${diskfile}" >/dev/null 2>&1 \
+ -o -w "${diskfile}" >/dev/null 2>&1 ] \
+ && [ "${np}" = "independent-persistent" ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you have specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n"
+ exit 1
+ fi
+}
+
+################################################################################
+### Get XML file and dir
+################################################################################
+
+## Added for persistent support.
+diskmode='nonpersistent'
+if [[ "$(grep --extended-regexp \
+ '< *short_description *param=".+ --persistent--"' "$1")" ]]; then
+ diskmode='persistent'
+ imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ originalImageFileName="$(grep -io '<image_name param=.*"' \
+ "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \
+ '{ print $2 }')"
+ originalVMDKFilePath="$(dirname \
+ "$originalXMLFilePath")/${originalImageFileName}"
+ # Added to workaround path prefix coming from temporary generated xml file
+ # by vmchooser.
+ if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \
+ "$imageFilePath")" ]]; then
+ imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \
+ <<< "$imageFilePath")
+ sed -ir \
+ "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \
+ 's/\\/\\\\/g' -e 's/\//\\\//g' -e \
+ 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1"
+ fi
+ # Create linked clone if not exists.
+ if [ ! -f "$imageFilePath" ]; then
+ mkdir -p "$(dirname "$imageFilePath")" && \
+ bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \
+ "$imageFilePath" --debug --verbose &>"${LOGFILE}"
+ fi
+fi
+##
+
+# absolute or relative path?
+xmlfile=$1
+if ls "${xmlfile}" 2>/dev/null | grep '/' >/dev/null 2>&1; then
+ xmlpath=$(dirname "${xmlfile}")
+ xmlfile=$(basename "${xmlfile}")
+else
+ xmlpath=${vmchooser_xmlpath}
+fi
+# full path
+xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
+
+DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")"
+
+################################################################################
+### Sanity checks
+################################################################################
+
+# test if the xml file is valid
+if ! [ -r "${xmlfile}" ]; then
+ writelog "${xmlfile} not a readable XML file!"
+ slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile"
+ exit 1
+fi
+
+# test if XML file
+if ! grep -q '<?xml' "${xmlfile}"; then
+ writelog "Submitted configuration file ${xmlfile} seems to have wrong XML format"
+ slxlog "virt-invalid-xml" "Malformed XML file: $xmlfile" "$xmlfile"
+ exit 1
+fi
+
+# check for running in graphical environment otherwise no much use here
+if [ -z "$DISPLAY" ]; then
+ echo -e "\n\tStart only within a graphical desktop!\n"
+ exit 1
+fi
+
+################################################################################
+### Logo for console
+################################################################################
+
+cat <<EOL
+ __ __
+ .----.--.--.-----.___.--.--.|__|.----.| |_
+ | _| | | |___| | || || _|| _|
+ |__| |_____|__|__| \___/ |__||__| |____|
+ OpenSLX virtual machine environment preparation script ...
+
+EOL
+
+################################################################################
+### Read needed variables from XML file
+################################################################################
+
+writelog "Starting configuration..."
+writelog "\tLogfile:\t\t${LOGFILE}"
+writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
+writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
+writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")"
+writelog "\tXML file:\t\t${xmlfile}"
+writelog "Enable 3D:\t\t${enable3d}"
+writelog "VM config:"
+
+# Name of the virt image
+imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+[ -z "$imgname" ] && imgname="${imgrelpath}"
+
+## Added for persistent support.
+if [[ "$userBranchFilePath" ]]; then
+ imgname="$userBranchFilePath"
+fi
+##
+
+# Imagename w/ full path
+if echo "${imgname}" | grep -q '^/'; then
+ imgpath="$(dirname "${imgname}")"
+ imgname="$(basename "${imgname}")"
+ vmpath="${imgpath}/${imgname}"
+ # If old vmchooser binary stuff
+ # We do not need folder name as it is already included by vmchooser
+elif echo "${xmlfile}" | grep -q '^/tmp/'; then
+ vmpath="$imgname"
+ imgname="$(basename "${imgname}")"
+## Added for persistent support.
+elif [[ "$userBranchFilePath" ]]; then
+ vmpath="$userBranchFilePath"
+##
+ # Else use same path as xml
+else
+ imgpath="${xmlpath}"
+ vmpath="${imgpath}/${imgname}"
+fi
+
+
+# Name of the virt machine, sed because of Windows formatting
+vm_name=$(grep -o 'short_description param=.*"' "${xmlfile}" \
+| sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+# If ${vm_name} not defined use ${xmlfile}
+vm_name="${vm_name:-${xmlfile%.xml}}"
+
+# Define vm_shortname since vm_name can be very long
+vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")"
+
+# vm_name = displayname, define for old scripts
+displayname="${vm_name}"
+
+# image is for the following virtual machine
+xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
+| sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# choose the proper virtualization/emulator plugin
+[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe"
+
+# make a guess from the filename extension if ${xmlvirt} is empty
+# (not set within the XML file)
+# TODO: implement possibility to submit own configuration files
+if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
+ writelog "No virtual machine parameter defined in ${xmlfile}"
+ writelog "Trying to guess VM...\c"
+ case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in
+ *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
+ xmlvirt="vmware"
+ ;;
+ *innotek*|*virtualbox*)
+ xmlvirt="virtualbox"
+ ;;
+ *qemu*|*kvm*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+ elif [ -z "${xmlvirt}" ]; then
+ case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in
+ vmdk)
+ xmlvirt="vmware"
+ ;;
+ vbox|vdi)
+ xmlvirt="virtualbox"
+ ;;
+ qcow*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="emufe"
+ ;;
+ esac
+ writelog "result:\t${xmlvirt}"
+fi
+
+# Definition of the client system
+vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
+
+# Definition of the networking the client system is connected to
+network_kind=$(grep -io '<network param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
+network_card=$(grep -io '<netcard param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
+override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
+
+# Set redirects to 0, see vmgrid if you want to define some
+redirects=0
+
+# Serial/parallel ports defined (e.g. "ttyS0" or "autodetect")
+serial=$(grep -io '<serialport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
+parallel=$(grep -io '<parport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
+
+writelog "\tVirtualization:\t\t$xmlvirt"
+writelog "\tVM name:\t\t$vm_name"
+writelog "\tVM short name:\t\t$vm_shortname"
+
+###############################################################################
+### Declaration of default variables
+###############################################################################
+
+# take last two digits of current pid...
+VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2)
+
+# Make sure cpu_cores is not empty
+cpu_cores=${cpu_cores:-"1"}
+
+# Amount of memory for the VM. Be generous if diff is written to HDD
+if mount | grep -q '^/dev/sd.*on.*/tmp'; then
+ reserve=20
+ min=768
+ max=1536
+else
+ reserve=65
+ min=768
+ max=8192
+fi
+
+# Calculate absulute amount of RAM that should stay available to the host
+reserve="$[ ( $totalmem * $reserve ) / 100 ]"
+# Respect some upper and lower bounds for the host amount
+[ "$reserve" -lt "$min" ] && reserve="$min"
+[ "$reserve" -gt "$max" ] && reserve="$max"
+
+# Get a result which can be divided by 4
+mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]"
+if [ -n "$mainvirtmem" ]; then
+ forcemem="$[ "$mainvirtmem" / 4 * 4 ]"
+ mem="$forcemem"
+fi
+hostmem="$[ $totalmem - $mem ]"
+
+# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are
+# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on
+# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes
+# and append $macaddrssuffix
+macguestpart="00:50:56:${VM_ID}"
+machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}')
+macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]")
+macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]")
+
+if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then
+ slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)"
+fi
+
+# Virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from virtualization.conf set then fdtest="TRUE"
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img"
+# if $cdrom_0 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# IDE is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+# TODO enable SCSI support instead of just disabling it.
+ide="TRUE"
+scsi="FALSE"
+hddrv="ide"
+audio="true"
+remotedesktopport="590${VM_ID}"
+
+
+# Enable 3D
+enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string)
+
+# Add rw share
+sharepath="${HOME}/PERSISTENT"
+sharename="home"
+
+# Set hostname: using original hostname and adding string
+hostname="virt-$(hostname)"
+
+writelog "\tVM Hostname:\t\t$hostname"
+
+################################################################################
+### Setup the rest of the environment and run the configured vm
+################################################################################
+# 8086:1e20
+if lspci -n | grep -E -i '8086:1e20( |$)'; then
+ VOL="100%" # bwPC 4: Speaker too quiet :-(
+else
+ VOL="80%"
+fi
+# Adjust sound volume
+amixer -q sset Master "$VOL" unmute 2>/dev/null
+amixer -q sset PCM "$VOL" unmute 2>/dev/null
+amixer -q sset CD "$VOL" unmute 2>/dev/null
+amixer -q sset Headphone "$VOL" unmute 2>/dev/null
+amixer -q sset Front "$VOL" unmute 2>/dev/null
+amixer -q sset Speaker "$VOL" unmute 2>/dev/null # annoying built-in speaker
+amixer -q sset 'Front Mic' "$VOL" unmute 2>/dev/null # to be checked if Mic is actually activated
+amixer -q sset 'Rear Mic' "$VOL" unmute 2>/dev/null # =""=
+amixer -q -c pcsp sset Master "0%" mute 2>/dev/null # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded
+
+# Start printer daemon
+QUEUE="STANDARD" # This has to match the queue you configured in your VM
+USER="$(whoami)"
+SPOOLDIR=
+### Disabled: 100megs is not enough, some jobs are HUGE, try to use temp which should be on disk
+## Try using user's tmpfs home first, as it gets wiped on logout
+#if [ -n "${HOME}" ] && [ -w "${HOME}" ]; then
+# SPOOLDIR="${HOME}/.spool"
+# mkdir -p "${SPOOLDIR}/${QUEUE}"
+#fi
+# If failed, try to fall back to /tmp
+if [ -z "${SPOOLDIR}" ] || [ ! -w "${SPOOLDIR}/${QUEUE}" ]; then
+ SPOOLDIR="/tmp/printergui-${USER}-$$-${RANDOM}"
+ rm -rf -- "${SPOOLDIR}"
+ if ! mkdir -p "${SPOOLDIR}/${QUEUE}"; then
+ slxlog "virt-spooldir" "Could not create spool directory ($SPOOLDIR) for $USER - printing will not work!"
+ # TODO: Warn user
+ fi
+ chmod 0700 "${SPOOLDIR}/${QUEUE}"
+fi
+
+# Start the lpdaemon listening on the given port
+# TODO: externalize with something like runtvirt.d (other parts might benefit from that too)
+tcpsvd -E 192.168.101.1 5515 \
+ lpd "$SPOOLDIR" \
+ ash -c "/opt/openslx/cups/printergui '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" &
+
+# PID to kill the process
+PID_LPD="$!"
+
+# Copy guest configuration (with added information) config.xml to be accessed
+# via virtual floppy
+cp "$xmlfile" "$VMCHOOSER_DIR/fd-loop/config.xml"
+# Add another file with resolution information
+xrandr | grep -o -E 'connected\s*[0-9]+x[0-9]+\+0\+0' | grep -o -E '[0-9]+x[0-9]+' | head -n 1 > "$VMCHOOSER_DIR/fd-loop/hostres.txt"
+# Add our magic openslx binary that sets the correct guest resolution
+cp "$VMCHOOSER_DIR/data/openslx.exe" "$VMCHOOSER_DIR/fd-loop/"
+
+# Try to use dnbd3 to access the image
+unset vm_diskfile
+unset vm_revision
+unset dnbd3
+unset dnbd3error
+if [ -n "$SLX_DNBD3_SERVERS" -o -n "$SLX_DNBD3_PRIO_SERVERS" ] && [ "x$SLX_VM_DNBD3" = "xyes" ]; then
+ if [ -e "/dev/dnbd0" -a -e "/var/run/dnbd3.socket" ]; then
+ # Shuffle server list
+ [ -n "$SLX_DNBD3_SERVERS" ] && TMP_SERVERS=$(for SRV in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SRV"; done | sort -u | sed -r 's/^[0-9]+ //')
+ for SRV in $SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS; do
+ dnbd3=$(dnbd3-client -h "$SRV" -i "${imgrelpath}" -r 0)
+ RET=$?
+ if [ "$RET" = "0" ]; then
+ vm_revision=$(cat "/sys/block/${dnbd3#/dev/}/net/rid")
+ writelog "DNBD3: $vm_diskfile on $dnbd3 with rid $vm_revision"
+ vm_diskfile="$dnbd3"
+ vmpath="$vm_diskfile"
+ break
+ fi
+ dnbd3error="$dnbd3error ($RET/$dnbd3)"
+ usleep 200000
+ done
+ if [ -z "$vm_diskfile" ]; then
+ slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found ($SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS $dnbd3error), trying NFS/CIFS..."
+ writelog "No working dnbd3 server found :-("
+ fi
+ else
+ writelog "Won't use dnbd3 as it's not loaded, or the daemon is not running..."
+ fi
+else
+ writelog "Won't use dnbd3 as no servers are given in config"
+fi
+
+# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system
+if [ -z "$vm_diskfile" ]; then
+ new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -1)
+ [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}"
+ vm_diskfile="$vmpath"
+fi
+
+# Check if virtual machine container file exists
+if ! [ -e "${vmpath}" ]; then
+ slxlog "virt-image-missing" "VM image $vmpath not found!"
+ writelog "Virtual machine image ${vmpath} not found!"
+ cleanexit 1
+fi
+
+writelog "Used diskfile: $vm_diskfile"
+
+# Get all virtual machine specific stuff from the respective include file
+if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then
+ # TODO: Tell user
+ slxlog "virt-plugin-missing" "Could not find run-virt.include for $xmlvirt ($VMCHOOSER_DIR/$xmlvirt/run-virt.include)"
+ writelog "Failed because of missing ${xmlvirt} plugin."
+ cleanexit 1
+fi
+
+self="${xmlvirt}"
+if ! . "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then
+ slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced (contains syntax errors?)" "$xmlvirt"
+ writelog "Erroneous run-virt.include for $xmlvirt"
+fi
+
+# start a windowmanager for easier handling
+# (expect problems w/ windows opening in background w/ vmware without wm)
+for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do
+ if which $dm >/dev/null 2>&1 ; then
+ if [ "$dm" = "fvwm2" ] ; then
+ echo "EdgeScroll 0 0" > ${redodir}/fvwm
+ fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 &
+ else
+ $dm >/dev/null 2>&1 &
+ fi
+ break
+ fi
+done
+
+# Start poolvideoswitch if we find the autostarter file
+#if [ -e /etc/xdg/autostart/pvsgui.desktop ]; then
+# /usr/local/bin/pvsgui -p 2 -b >/dev/null 2>&1 &
+#fi
+
+if [[ "$DO_PROFILE" -ge "1" ]]; then
+ wget "http://132.230.8.113/profile/do.php?action=start" &
+fi
+
+# Check if tcpsvd is running. Do this down here so we do not check immediately after trying to spawn it,
+# as this could result in success even if it's not really working
+if ! kill -0 "$PID_LPD"; then
+ slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session"
+fi
+
+# Configure and start samba service to provide user's home directory
+#if [ -f /usr/sbin/smbd ] ; then
+# sudo /opt/openslx/bin/sed -i /opt/openslx/vmchooser/smb.conf -e "s,USER,$USER,"
+# sudo /usr/sbin/nmbd -s /opt/openslx/vmchooser/config/smb.conf
+# sudo /usr/sbin/smbd -s /opt/openslx/vmchooser/config/smb.conf
+#fi
+
+# This will start the VM
+writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}"
+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/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter
new file mode 100755
index 00000000..5fd8acc5
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter
@@ -0,0 +1,74 @@
+#!/bin/bash
+# Probably needs bash somewhere
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2009 - RZ Uni FR
+# Copyright (c) 2007..2011 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xmlfilter.sh
+# - This script is invoked by the vmchooser tool. It simply filters xml-
+# files (taking the path to these files in $1). You might modify it in any
+# way to match your needs, e.g. ask some database instead. You can re-
+# implement it in any other programming language too. You simply have to
+# return a list of proper xml files to be interpreted by the vmchooser
+# binary). Please check for vmchooser.sh too ...
+# -----------------------------------------------------------------------------
+
+# This script .
+#
+# currently:
+# - filter for slxgrp (which comes from /etc/machine-setup)
+#
+
+# include default directories
+. /opt/openslx/config
+
+if [ -f "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf" ]; then
+ . "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf"
+fi
+
+function handlePersistentVM() {
+ if grep --extended-regexp -q "<persistent param=\"(|.+:)$USER(|:.+)\"" "$1"; then
+ # If this virtual machine is useable as persistent version for current
+ # user we provide an additional persistent version.
+ # TODO: This evil black magic needs to be rewritten some day (by someone who understands it)
+ local originalImagePath=$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+ local imageName=$(basename "$originalImagePath")
+ eval export SLX_VM_PERSISTENT_PATH="${SLX_VM_PERSISTENT_PATH}" && \
+ local imagePath="${SLX_VM_PERSISTENT_PATH}${imageName}"
+ local persistentConfigVersionFilePath="$(mktemp --directory)/$(basename "$1")"
+ local vmchooserFilePath="$(dirname "$0")/vmchooser-clc"
+ if [ ! -f "$vmchooserFilePath" ]; then
+ vmchooserFilePath='/opt/openslx/scripts/vmchooser-clc'
+ fi
+ "$vmchooserFilePath" "$1" "$persistentConfigVersionFilePath" \
+ --create-persistent-config "$imagePath" && \
+ echo "$persistentConfigVersionFilePath"
+ fi
+}
+
+for FILE in $(find -L "$1" -iname "*.xml"); do
+ # filter all xmls which aren't set active
+ grep -i -q "<active param=.*true.*" "$FILE" || continue
+ # HACK: filter all virtualbox images, as vbox is not ready yet
+ grep -i -q "<virtualmachine param=.*virtualbox.*" "$FILE" && continue
+ if [ -n "${SLX_VM_POOL_FILTER}" ]; then
+ # filter all xmls with pool-param not equal to vmchooser::env
+ if [ $(grep "<pools param=\"${SLX_VM_POOL_FILTER}\"" "$FILE" | wc -l) -eq 1 ]; then
+ handlePersistentVM "$FILE"
+ echo "$FILE"
+ fi
+ else
+ handlePersistentVM "$FILE"
+ # if there is no pool set, just take all available xmls
+ echo "$FILE"
+ fi
+done
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf
new file mode 100644
index 00000000..d8966f71
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf
@@ -0,0 +1,38 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2013 - OpenSLX GmbH
+#
+# This program/file 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 feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# smb.conf
+# - basic samba configuration file for OpenSLX host-internal networking
+################################################################################
+[global]
+ workgroup = OPENSLX
+ netbios name = HOMESERVER
+ security = SHARE
+ server string = Home and Print Provider
+ bind interfaces only = Yes
+ interfaces = nat1
+ pid directory = /run/samba
+
+[userhome]
+ comment = Home Directory of USER
+ path = /home/USER/PERSISTENT
+ create mask = 0700
+ guest ok = No
+ read only = No
+
+[scratch]
+ comment = Host System Temp Folder
+ path = /tmp
+ create mask = 0700
+ guest ok = Yes
+ read only = No
+ browseable = Yes
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
new file mode 100644
index 00000000..bca1397c
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
@@ -0,0 +1,54 @@
+# Copyright (c) 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/
+# -----------------------------------------------------------------------------
+# udhcpd.conf
+# - This is the udhcpd configuration file servicing the nat1 interface for
+# the various virtualization services. DNSSERVER and DOMAIN are replaced
+# before deamon start in systemd script.
+################################################################################
+
+# start and end of the IP lease block
+start 192.168.101.20
+end 192.168.101.100
+max_leases 80
+
+# interface that udhcpd will use
+interface nat1
+
+# how long an offered address is reserved (leased) in seconds
+offer_time 6000
+
+# location of the leases file
+lease_file /var/lib/udhcpd/udhcpd-nat1.leases
+
+# location of the pid file
+pidfile /var/run/udhcpd-nat1.pid
+
+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 lprsrv 192.168.101.1
+#option ntpsrv NTPSERVER
+
+# additional options known to udhcpd not used in OpenSLX at the moment
+#subnet #timezone
+#router #timesvr
+#namesvr #dns
+#logsvr #cookiesvr
+#lprsvr #bootsize
+#domain #swapsvr
+#rootpath #ipttl
+#mtu #broadcast
+#wins #lease
+#ntpsrv #tftp
+#bootfile #wpad
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf
new file mode 100644
index 00000000..b4355880
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf
@@ -0,0 +1,4 @@
+theme=bwlehrpool
+pvs=0
+base=/mnt/vmstore
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe
new file mode 100644
index 00000000..88f89418
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe
new file mode 100755
index 00000000..8b320003
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart
new file mode 100755
index 00000000..86511458
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart
@@ -0,0 +1,12 @@
+#!/bin/ash
+
+SOURCEPATH="/opt/openslx/vmchooser/sessionstart.d"
+
+if [ -d "$SOURCEPATH" ]; then
+ for file in $SOURCEPATH/*; do
+ . "$file" || slxlog "vmchooser-sessionstart" "Could not source $file at session start!" "$file"
+ done
+fi
+
+exit 0
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png
new file mode 100644
index 00000000..c9d8ab0d
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png
new file mode 100644
index 00000000..8ca9347b
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini
new file mode 100644
index 00000000..90d00617
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini
@@ -0,0 +1,4 @@
+background-color=#ffffff
+image-right=bwlehrpool-right.png
+image-left=bwlehrpool-left.png
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png
new file mode 100644
index 00000000..900dd867
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png
new file mode 100644
index 00000000..8ca9347b
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png
Binary files differ
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini
new file mode 100644
index 00000000..57a22821
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini
@@ -0,0 +1,4 @@
+background-color=#ffffff
+image-right=openslx-right.png
+image-left=openslx-left.png
+
diff --git a/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop b/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop
new file mode 100755
index 00000000..9d3a472d
--- /dev/null
+++ b/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=virtual machine chooser (default)
+Name[de]=Virtuelle Maschine auswählen
+Comment=This session starts the vm session chooser
+Comment[de]=Diese Sitzung startet das Auswahlmenü für die vorhandenen Sitzungen
+Exec=/opt/openslx/bin/vmchooser -c /opt/openslx/vmchooser/config/vmchooser.conf
+TryExec=/opt/openslx/bin/vmchooser
+Icon=
+Type=Application