summaryrefslogtreecommitdiffstats
path: root/remote/modules
diff options
context:
space:
mode:
Diffstat (limited to 'remote/modules')
-rwxr-xr-xremote/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter27
-rwxr-xr-xremote/modules/cron/data/opt/openslx/scripts/cron-sendmail8
-rwxr-xr-xremote/modules/debug-report-bwlp/data/opt/openslx/bin/debug_report115
-rw-r--r--remote/modules/debug-report-bwlp/module.build23
-rw-r--r--remote/modules/debug-report-bwlp/module.conf4
-rw-r--r--remote/modules/debug-report-bwlp/module.conf.debian4
-rw-r--r--remote/modules/debug-report-bwlp/module.conf.opensuse4
-rw-r--r--remote/modules/debug-report-bwlp/module.conf.ubuntu4
-rwxr-xr-xremote/modules/debug/data/opt/openslx/bin/debug_report36
-rwxr-xr-xremote/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx41
-rw-r--r--remote/modules/dmidecode/module.build27
-rw-r--r--remote/modules/dmidecode/module.conf4
-rw-r--r--remote/modules/dnbd3/module.build17
-rw-r--r--remote/modules/dnbd3/module.conf3
-rw-r--r--remote/modules/dnbd3/module.conf.ubuntu2
-rwxr-xr-xremote/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update70
-rwxr-xr-xremote/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats44
-rw-r--r--remote/modules/hardware-stats/module.conf4
-rw-r--r--remote/modules/kdm/data/etc/kde4/kdm/kdmrc1
-rw-r--r--remote/modules/kernel-vanilla/module.conf2
-rw-r--r--remote/modules/nvidia_kernel/module.build2
-rw-r--r--remote/modules/nvidia_kernel/module.conf2
-rw-r--r--remote/modules/nvidia_libs/module.conf2
-rw-r--r--remote/modules/pam-bwidm/data/opt/openslx/bwidm_soap.xml36
-rwxr-xr-xremote/modules/pam-bwidm/data/opt/openslx/scripts/pam_bwidm73
-rw-r--r--remote/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share9
-rwxr-xr-xremote/modules/pam/data/opt/openslx/scripts/pam_script_ses_close2
-rwxr-xr-xremote/modules/pam/data/opt/openslx/scripts/pam_script_ses_open3
-rw-r--r--remote/modules/pam/module.conf1
-rw-r--r--remote/modules/pam/module.conf.ubuntu8
-rw-r--r--remote/modules/pam/module.conf.ubuntu.143
-rwxr-xr-xremote/modules/printergui/data/opt/openslx/scripts/run-virt_print6
l---------remote/modules/pvs2/data/etc/systemd/system/multi-user.target.wants/pvsmgr.service1
-rw-r--r--remote/modules/pvs2/data/etc/systemd/system/pvsmgr.service12
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/bin/pvsstartup16
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/iptables/rules.d/10-pvs11
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/pvs2/lockDesktop.sh25
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr28
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/scripts/systemd-pvsmgr22
-rwxr-xr-xremote/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient41
-rw-r--r--remote/modules/pvs2/module.build5
-rw-r--r--remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include12
-rwxr-xr-xremote/modules/run-virt/data/opt/openslx/scripts/includes/TEST.sh6
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc13
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc53
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc26
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc50
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc103
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc120
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc12
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc87
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc73
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc64
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc22
-rw-r--r--remote/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear17
-rwxr-xr-xremote/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store5
-rwxr-xr-xremote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env33
l---------[-rwxr-xr-x]remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt112
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf5
-rwxr-xr-xremote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exebin61952 -> 53248 bytes
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc)8
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc63
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc)21
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc)2
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc12
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc98
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc)13
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc79
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc)27
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc34
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc)0
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc)2
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc (renamed from remote/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc)31
-rw-r--r--remote/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall130
-rwxr-xr-xremote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt119
-rw-r--r--remote/modules/run-virt/fwtool/main.c32
-rw-r--r--remote/modules/run-virt/module.build3
-rw-r--r--remote/modules/run-virt/module.conf2
-rw-r--r--remote/modules/run-virt/module.conf.ubuntu2
-rwxr-xr-xremote/modules/run-virt/winres/compile2
-rw-r--r--remote/modules/run-virt/winres/winres.c209
-rw-r--r--remote/modules/safe-mode/data/etc/X11/Xsession.d/00-exam-mode9
l---------remote/modules/screen-standby/data/etc/X11/Xreset.d/screen-standby1
l---------remote/modules/screen-standby/data/etc/X11/Xsession.d/screen-standby1
l---------remote/modules/screen-standby/data/etc/X11/Xsetup.d/screen-standby1
-rwxr-xr-xremote/modules/screen-standby/data/opt/openslx/scripts/screen-standby29
-rw-r--r--remote/modules/screen-standby/module.build13
-rw-r--r--remote/modules/screen-standby/module.conf5
-rwxr-xr-xremote/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl10
-rw-r--r--remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include6
-rwxr-xr-xremote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include400
-rw-r--r--remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include4
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/bin/vmchooser5
-rwxr-xr-xremote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session13
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc (renamed from remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc)6
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc1
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc316
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc (renamed from remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc)79
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc60
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc64
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc151
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc152
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc5
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc29
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc189
-rw-r--r--remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include37
-rw-r--r--remote/modules/vmware/module.conf6
-rw-r--r--remote/modules/xorg/module.build10
-rw-r--r--remote/modules/xorg/module.conf4
-rw-r--r--remote/modules/xorg/module.conf.ubuntu49
-rwxr-xr-xremote/modules/xscreensaver/data/etc/X11/Xsession.d/95-xscreensaver33
-rw-r--r--remote/modules/xscreensaver/module.build13
-rw-r--r--remote/modules/xscreensaver/module.conf8
-rw-r--r--remote/modules/xscreensaver/module.conf.ubuntu6
114 files changed, 2118 insertions, 2047 deletions
diff --git a/remote/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter b/remote/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter
index 503e44fa..b747d257 100755
--- a/remote/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter
+++ b/remote/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter
@@ -55,13 +55,28 @@ if [ ${#OUTPUTNAMES[@]} -eq 2 ]; then
# Either of them a projector?
BEAMER=
+ MAYBEAMER=
+ SMALL=
for i in 0 1; do
- WIDTH=$(grep -E "^${OUTPUTNAMES[$i]}.*[0-9]+mm x [0-9]+mm" <<<"$XRANDR" | head -n 1 | grep -o -E ' [0-9]+mm x' | grep -o -E '[0-9]+')
- if [ -z "$WIDTH" ] || [ "$WIDTH" -eq 0 ] || [ "$WIDTH" -gt 900 ]; then
- echo "Screen $i is beamer, width is '$WIDTH'"
- BEAMER=$i
- fi
+ WIDTH=$(grep -E "^${OUTPUTNAMES[$i]}.*[0-9]+mm x [0-9]+mm" <<<"$XRANDR" | head -n 1 | grep -o -E ' [0-9]+mm x' | grep -o -E '[0-9]+')
+ if [ -z "$WIDTH" ] || [ "$WIDTH" -eq 0 ] || [ "$WIDTH" -gt 900 ]; then
+ echo "Screen $i is beamer, width is '$WIDTH'"
+ BEAMER=$i
+ elif [ -n "$WIDTH" ] && [ "$WIDTH" -gt 700 ]; then
+ MAYBEAMER=$i
+ elif [ -n "$WIDTH" ] && [ "$WIDTH" -lt 550 ]; then
+ SMALL=yes
+ fi
done
+ if [ -z "$BEAMER" ] && [ -n "$MAYBEAMER" ] && [ -n "$SMALL" ]; then
+ # This is a hack on top of the other hack; we already treat outputs reporting a sufficiently large width
+ # as beamers, as we have encountered such devices in the wild. However, we might have just a large TV connected
+ # that is intended to be used just like a beamer to present the screen to the audience. So if we have a screen
+ # that is at least 70cm wide and the other one is no wider than 55cm we treat this as a beamer setup aswell.
+ # The reasoning here is that if it were a dual screen setup, the screens should be roughly the same size.
+ echo "Treating $MAYBEAMER as beamer as size difference is big enough"
+ BEAMER=$MAYBEAMER
+ fi
if [ -n "$BEAMER" ]; then
echo "${OUTPUTNAMES[$BEAMER]} is a beamer. "
@@ -160,6 +175,6 @@ if [ ${#OUTPUTNAMES[@]} -eq 2 ]; then
fi
fi
else
- echo "\e[32mOther than two outputs.\e[0m"
+ echo -e "\e[32mOther than two outputs.\e[0m"
fi
diff --git a/remote/modules/cron/data/opt/openslx/scripts/cron-sendmail b/remote/modules/cron/data/opt/openslx/scripts/cron-sendmail
index 3ce2a19d..f46c226d 100755
--- a/remote/modules/cron/data/opt/openslx/scripts/cron-sendmail
+++ b/remote/modules/cron/data/opt/openslx/scripts/cron-sendmail
@@ -10,16 +10,14 @@ if [ "x$SLX_CRON_MAIL" = "xslxlog" ]; then
SUBJ=$(grep '^Subject: .*$' "$TMP" | cut -c 10-)
if [ -n "$SUBJ" ]; then
- slxlog "cron" "$SUBJ" "$TMP"
+ slxlog --delete "cron" "$SUBJ" "$TMP"
fi
-
- rm -f -- "$TMP"
elif [ -n "$SLX_CRON_MAIL" ] && [ -x "$SLX_CRON_MAIL" ]; then
# see if SLX_CRON_MAIL is a valid binary and use that
- $SLX_CRON_MAIL $@
+ $SLX_CRON_MAIL "$@"
elif which sendmail 2> /dev/null; then
# fallback to sendmail
- sendmail $@
+ sendmail "$@"
elif which logger 2> /dev/null; then
# nothing worked, write to syslog if logger is present
TMP=$(mktemp /tmp/cron.XXXXXXXX)
diff --git a/remote/modules/debug-report-bwlp/data/opt/openslx/bin/debug_report b/remote/modules/debug-report-bwlp/data/opt/openslx/bin/debug_report
new file mode 100755
index 00000000..e0d7a9b8
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/data/opt/openslx/bin/debug_report
@@ -0,0 +1,115 @@
+#!/bin/bash
+# bash because of {,} expansion
+
+TOOLS="
+ journalctl
+ systemctl
+ loginctl
+ lspci
+ lsusb
+ lsmod
+ mount
+ dmesg
+ dmidecode
+"
+
+URL="http://132.230.8.113/error_report.php"
+
+if [ "$UID" != "0" ]; then
+ echo "Debug Reports können nur von root versendet werden" >&2
+ exit 1
+fi
+
+if ! curl -H "Expect:" -f -s -S --connect-timeout 5 "$URL" > /dev/null; then
+ echo "Kann den Debug-Report-Server in Freiburg nicht erreichen. :-(" >&2
+ exit 1
+fi
+
+rm -rf /tmp/debug-report
+mkdir -p /tmp/debug-report/{static,generated}
+
+if [ ! -d /tmp/debug-report ]; then
+ echo "FEHLER: Konnte /tmp/debug-report nicht erstellen!" >&2
+ exit 1
+fi
+
+if ! cd /tmp/debug-report; then
+ echo "Cannot go to /tmp/debug-report"
+ exit 1
+fi
+
+cat > err-desc <<HEREEND
+
+# Bitte hier kurz eine passende Fehlerbeschreibung eingeben, anschließend
+# Strg+O, ENTER, Strg+X, ENTER drücken.
+HEREEND
+
+nano -w err-desc
+
+if ! grep -vqE '(^$)|(^# )' err-desc; then
+ echo "Fehlerberichterstattung aufgrund leerer Beschreibung abgebrochen."
+ exit 1
+fi
+
+echo -n "Beginne mit dem Erstellen des Fehlerberichts..."
+
+. /opt/openslx/config
+
+echo "TIME INFORMATION (hwclock, date):" > metadata
+hwclock >> metadata
+date >> metadata
+for srv in $SLX_NTP_SERVER 0.de.pool.ntp.org; do
+ ntpdate -u -q -p 2 -t 1 "$srv" >> metadata 2> /dev/null && break
+done
+echo -n "..."
+
+cp /opt/openslx/config /tmp/udhcpclog static/ 2> /dev/null
+echo -n "."
+
+FILES=$(find /tmp/vmware* /tmp/virt /tmp/vmchooser* -type f \( -name "*.log" -o -name "*.conf" -o -name "*.xml" \) 2> /dev/null)
+if [ -n "$FILES" ]; then
+ tar ckf static/vm-related.tar $FILES
+fi
+
+echo -n "."
+
+cp /var/log/Xorg.0.lo* static/ 2> /dev/null
+cp /var/log/{auth.log,kdm.log,syslog,messages,user.log} static/ 2> /dev/null
+cp /proc/{cpu,mem}info static/ 2> /dev/null
+echo -n "."
+
+for tool in $TOOLS; do
+ $tool > "generated/${tool}-out" 2> "generated/${tool}-err"
+ echo -n "."
+done
+
+ip a > "generated/ip-a-out" 2> "generated/ip-a-err"
+echo -n "."
+
+systemctl status > "generated/systemctl-status-out" 2> "generated/systemctl-status-err"
+echo -n "."
+
+ps auxf > "generated/ps-out" 2> "generated/ps-err"
+echo -n "."
+
+find generated/ -type f -name "*-err" -size 0 -delete > /dev/null 2>/dev/null
+
+echo "..fertig!"
+
+cd /tmp
+rm -f -- error-report.tar.gz
+echo -n "Packe Fehlerbericht ein..."
+if ! tar czf error-report.tar.gz debug-report; then
+ echo "Fehler beim Packen des Berichts!" >&2
+ exit 1
+fi
+echo "....fertig!"
+
+echo -n "Lade Fehlerbericht hoch...."
+if ! curl -H "Expect:" -f -s -S -F "file=@error-report.tar.gz;filename=report" "$URL" > /dev/null; then
+ echo "Fehler beim Hochladen des Fehlerberichts :-(" >&2
+ exit 1
+fi
+
+echo "Fehlerbericht erfolgreich versendet!"
+
diff --git a/remote/modules/debug-report-bwlp/module.build b/remote/modules/debug-report-bwlp/module.build
new file mode 100644
index 00000000..1be608b8
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/module.build
@@ -0,0 +1,23 @@
+fetch_source() {
+ :
+}
+
+build() {
+
+ for BIN in $REQUIRED_BINARIES; do
+ OPT="${BIN:0:1}"
+ [[ "$BIN" == @* ]] && BIN=$(echo "$BIN" | cut -c 2-)
+ BIN_LOCATION=$(which ${BIN})
+ if [ ! -z ${BIN_LOCATION} -a -e ${BIN_LOCATION} ]; then
+ tarcopy "$(get_link_chain ${BIN_LOCATION})" "${MODULE_BUILD_DIR}"
+ elif [ "$OPT" != "@" ]; then
+ perror "'${BIN}' not found on system."
+ else
+ pwarning "'${BIN}' not found on the system."
+ fi
+ done
+}
+
+post_copy() {
+ :
+}
diff --git a/remote/modules/debug-report-bwlp/module.conf b/remote/modules/debug-report-bwlp/module.conf
new file mode 100644
index 00000000..45830ef8
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/module.conf
@@ -0,0 +1,4 @@
+REQUIRED_BINARIES="
+ curl
+ nano
+"
diff --git a/remote/modules/debug-report-bwlp/module.conf.debian b/remote/modules/debug-report-bwlp/module.conf.debian
new file mode 100644
index 00000000..14ae2d29
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/module.conf.debian
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ nano
+"
diff --git a/remote/modules/debug-report-bwlp/module.conf.opensuse b/remote/modules/debug-report-bwlp/module.conf.opensuse
new file mode 100644
index 00000000..14ae2d29
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/module.conf.opensuse
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ nano
+"
diff --git a/remote/modules/debug-report-bwlp/module.conf.ubuntu b/remote/modules/debug-report-bwlp/module.conf.ubuntu
new file mode 100644
index 00000000..14ae2d29
--- /dev/null
+++ b/remote/modules/debug-report-bwlp/module.conf.ubuntu
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ nano
+"
diff --git a/remote/modules/debug/data/opt/openslx/bin/debug_report b/remote/modules/debug/data/opt/openslx/bin/debug_report
index 4cdfae4e..40f0c310 100755
--- a/remote/modules/debug/data/opt/openslx/bin/debug_report
+++ b/remote/modules/debug/data/opt/openslx/bin/debug_report
@@ -1,4 +1,5 @@
-#!/bin/ash
+#!/bin/bash
+# bash because of {,} expansion
TOOLS="
journalctl
@@ -8,6 +9,7 @@ TOOLS="
lsusb
lsmod
mount
+ dmidecode
"
URL="http://132.230.8.113/error_report.php"
@@ -30,37 +32,49 @@ if [ ! -d /tmp/debug-report ]; then
exit 1
fi
-cd /tmp/debug-report
+if ! cd /tmp/debug-report; then
+ echo "Cannot go to /tmp/debug-report"
+ exit 1
+fi
cat > err-desc <<HEREEND
# Bitte hier kurz eine passende Fehlerbeschreibung eingeben, anschließend
-# Strg+O, ENTER, und Strg+X drücken.
+# Strg+O, ENTER, Strg+X, ENTER drücken.
HEREEND
nano -w err-desc
+if ! grep -vqE '(^$)|(^# )' err-desc; then
+ echo "Fehlerberichterstattung aufgrund leerer Beschreibung abgebrochen."
+ exit 1
+fi
+
echo -n "Beginne mit dem Erstellen des Fehlerberichts..."
. /opt/openslx/config
-echo "TIME INFORMATION:" > metadata
+echo "TIME INFORMATION (hwclock, date):" > metadata
hwclock >> metadata
date >> metadata
-for srv in 132.230.1.9 $SLX_NTP_SERVER 0.de.pool.ntp.org; do
- ntpdate -u -q -p 2 -t 1 "$srv" >> metadata && break
+for srv in $SLX_NTP_SERVER 0.de.pool.ntp.org; do
+ ntpdate -u -q -p 2 -t 1 "$srv" >> metadata 2> /dev/null && break
done
echo -n "..."
cp /opt/openslx/config /tmp/udhcpclog static/ 2> /dev/null
echo -n "."
-find /tmp/vmware* -name "*.log" -exec cp {} static/ \; 2> /dev/null
+FILES=$(find /tmp/vmware* /tmp/virt /tmp/vmchooser* -type f \( -name "*.log" -o -name "*.conf" -o -name "*.xml" \) 2> /dev/null)
+if [ -n "$FILES" ]; then
+ tar ckf static/vm-related.tar $FILES
+fi
+
echo -n "."
cp /var/log/Xorg.0.lo* static/ 2> /dev/null
cp /var/log/{auth.log,kdm.log,syslog,messages,user.log} static/ 2> /dev/null
-cp /proc/cpuinfo static/ 2> /dev/null
+cp /proc/{cpu,mem}info static/ 2> /dev/null
echo -n "."
for tool in $TOOLS; do
@@ -74,13 +88,15 @@ echo -n "."
systemctl status > "generated/systemctl-status-out" 2> "generated/systemctl-status-err"
echo -n "."
-ps aux > "generated/ps-out" 2> "generated/ps-err"
+ps auxf > "generated/ps-out" 2> "generated/ps-err"
echo -n "."
+find generated/ -type f -name "*-err" -size 0 -delete > /dev/null 2>/dev/null
+
echo "..fertig!"
cd /tmp
-rm -f error-report.tar.gz
+rm -f -- error-report.tar.gz
echo -n "Packe Fehlerbericht ein..."
if ! tar czf error-report.tar.gz debug-report; then
echo "Fehler beim Packen des Berichts!" >&2
diff --git a/remote/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx b/remote/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx
index dd8cd8ba..776f3f3b 100755
--- a/remote/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx
+++ b/remote/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx
@@ -87,16 +87,29 @@ case "$1" in
# Update resolver configuration file
CONF=""
+ # Own domain suffix
if [ -n "$domain" ]; then
- printf -v CONF "${CONF}domain $domain\n"
+ :
elif [ -n "$dns_fqdn" ]; then
domain="${dns_fqdn#*.}"
- printf -v CONF "${CONF}domain $domain\n"
elif [ -n "$SLX_NET_DOMAIN" ]; then
domain="$SLX_NET_DOMAIN"
- printf -v CONF "${CONF}domain $domain\n"
fi
+ if [ -n "$domain" ]; then
+ printf -v CONF "${CONF}domain ${domain%% *}\n"
+ fi
+ # Add domain to list of search domains if not in there yet
+ if [ -n "$domain" ] && [ -n "$search" ]; then
+ FOUND=no
+ for sd in $search; do
+ [ "x$sd" = "x$domain" ] && FOUND=yes
+ done
+ [ "$FOUND" = "no" ] && search="$domain $search"
+ elif [ -n "$domain" ]; then
+ search="$domain"
+ fi
+ # Search domains
if [ -n "$search" ]; then
printf -v CONF "${CONF}search $search\n"
elif [ -n "$SLX_SEARCH_DOMAIN" ]; then
@@ -125,6 +138,15 @@ case "$1" in
if [ "$interface" == "br0" ]; then
# Update IP
sed -i "s/^\(SLX_PXE_CLIENT_IP=\).*$/\1'$ip'/" /opt/openslx/config
+ # Write DOMAIN and SEARCH to /opt/openslx/config if empty
+ if [ -z "$SLX_NET_DOMAIN" ] && [ -n "$domain" ]; then
+ sed -i "/^SLX_NET_DOMAIN=/d" /opt/openslx/config
+ echo "SLX_NET_DOMAIN='$domain'" >> /opt/openslx/config
+ fi
+ if [ -z "$SLX_NET_SEARCH" ] && [ -n "$search" ]; then
+ sed -i "/^SLX_NET_SEARCH=/d" /opt/openslx/config
+ echo "SLX_NET_SEARCH='$search'" >> /opt/openslx/config
+ fi
# Only if network is not ready yet
if [ ! -e "/run/network/network-ready" ]; then
@@ -150,16 +172,6 @@ case "$1" in
fi
fi
- # if domain is given from dhcp, save it to openslx config for later use in VMs
- if [ -n "$domain" ]; then
- # check if SLX_NET_DOMAIN is in the config at all
- if grep '^SLX_NET_DOMAIN=' /opt/openslx/config 2>/dev/null; then
- sed -i "s/^\(SLX_NET_DOMAIN=\).*$/\1'$domain'/" /opt/openslx/config
- else
- # not set, add it
- echo "SLX_NET_DOMAIN='$domain'" >> /opt/openslx/config
- fi
- fi
# Update /etc/issue for proper spacing
/opt/openslx/scripts/openslx-create_issue
touch "/run/network/network-ready"
@@ -200,9 +212,6 @@ case "$1" in
# "default route exists" target
if [ -n "$router" ] && [ ! -e "/run/network/gateway-ready" ]; then
touch "/run/network/gateway-ready"
- # Write to openslx-config
- echo "# Config written by openslx-dhcp-script (3)" >> /opt/openslx/config
- echo "SLX_DNS='$dns'" >> /opt/openslx/config
systemctl start network-gateway.target &
fi
diff --git a/remote/modules/dmidecode/module.build b/remote/modules/dmidecode/module.build
new file mode 100644
index 00000000..1d58d03c
--- /dev/null
+++ b/remote/modules/dmidecode/module.build
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+
+fetch_source() {
+ [ -d "${MODULE_DIR}/src/.git" ] && return 0
+ rm -rf -- "${MODULE_DIR}/src"
+ git clone "${REQUIRED_GIT}" "${MODULE_DIR}/src" || perror "Could not create ${MODULE_DIR}/src"
+}
+
+build() {
+
+ # compilation
+ cd "${MODULE_DIR}/src" || perror "Could not cd to '${MODULE_DIR}/src'. Did fetch_source work?"
+
+ make || perror "Could not compile dmidecode using 'make'."
+
+ # NO MAKE INSTALL: Copy to build dir, since there are no shared libs linked in
+ mkdir -p "${MODULE_BUILD_DIR}/usr/sbin"
+ cp "${MODULE_DIR}/src/dmidecode" "${MODULE_BUILD_DIR}/usr/sbin/" || perror "Could not copy dmidecode binary to ${MODULE_BUILD_DIR}"
+
+ cd - &>/dev/null
+}
+
+post_copy() {
+ :
+}
+
diff --git a/remote/modules/dmidecode/module.conf b/remote/modules/dmidecode/module.conf
new file mode 100644
index 00000000..3f58cff4
--- /dev/null
+++ b/remote/modules/dmidecode/module.conf
@@ -0,0 +1,4 @@
+REQUIRED_GIT="git://git.savannah.nongnu.org/dmidecode.git"
+REQUIRED_BINARIES="
+ dmidecode
+"
diff --git a/remote/modules/dnbd3/module.build b/remote/modules/dnbd3/module.build
index 1594b9ab..b1bf7613 100644
--- a/remote/modules/dnbd3/module.build
+++ b/remote/modules/dnbd3/module.build
@@ -27,19 +27,28 @@ build() {
cd "$MODULE_DIR/src/kmod" || perror "Could not CD to standalone dnbd3 kmod dir"
make MODULE_NAME=dnbd3 KDIR="$KERNEL_HEADERS_DIR" || perror "Could not compile kernel module"
mkdir -p "$MODULE_BUILD_DIR/lib/modules/dnbd3" || perror "Could not create lib/modules/dnbd3"
- mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin" || perror "Coould not create opt/openslx/bin"
- cp "$MODULE_DIR/src/kmod/dnbd3.ko" "$MODULE_BUILD_DIR/lib/modules/dnbd3/" || perror "could not cp dnbd3.ko"
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin" || perror "Could not create opt/openslx/bin"
+ cp "$MODULE_DIR/src/kmod/dnbd3.ko" "$MODULE_BUILD_DIR/lib/modules/dnbd3/" || perror "Could not copy dnbd3.ko"
cd "$MODULE_BUILD_DIR/opt/openslx/bin" || perror "Could not cd to build dir for client binary"
- cmake "$MODULE_DIR/src/dnbd3" || perror "Could not cmake"
+ cmake \
+ -DBUILD_FUSE_CLIENT=ON \
+ -DBUILD_KERNEL_MODULE=ON \
+ -DBUILD_SERVER=OFF \
+ -DBUILD_STRESSTEST=OFF \
+ "$MODULE_DIR/src/dnbd3" || perror "Could not cmake"
make dnbd3-client || perror "Could not make dnbd3-client"
make dnbd3-fuse || perror "Could not make dnbd3-fuse"
chown root:root "dnbd3-client" "dnbd3-fuse"
chmod +xs "dnbd3-client"
chmod +x "dnbd3-fuse"
cd "$MODULE_DIR"
+
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
}
post_copy() {
:
}
-
diff --git a/remote/modules/dnbd3/module.conf b/remote/modules/dnbd3/module.conf
index 29442db7..fba4a88b 100644
--- a/remote/modules/dnbd3/module.conf
+++ b/remote/modules/dnbd3/module.conf
@@ -1,9 +1,10 @@
REQUIRED_MODULES="kernel"
REQUIRED_GIT="git://git.openslx.org/dnbd3.git"
-REQUIRED_COMMIT="6d6455b271ac99c5862691620e1217ed7b3b78b4"
+REQUIRED_COMMIT="0df5be95c5073dfe03234abd26c9b60340f48bdf"
REQUIRED_BINARIES="
dnbd3-client
dnbd3-fuse
+ fusermount
"
REQUIRED_DIRECTORIES="
/lib/modules
diff --git a/remote/modules/dnbd3/module.conf.ubuntu b/remote/modules/dnbd3/module.conf.ubuntu
index 8033437b..69b5b9de 100644
--- a/remote/modules/dnbd3/module.conf.ubuntu
+++ b/remote/modules/dnbd3/module.conf.ubuntu
@@ -1,9 +1,11 @@
REQUIRED_CONTENT_PACKAGES="
cmake
+ fuse
"
REQUIRED_INSTALLED_PACKAGES="
cmake
zlib1g-dev
libfuse-dev
+ fuse
"
diff --git a/remote/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update b/remote/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update
index 9ab77f4f..df8dab45 100755
--- a/remote/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update
+++ b/remote/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update
@@ -10,16 +10,76 @@ UUID=$(cat "/run/system-uuid")
[ -z "$UUID" ] && exit 1
USED=0
+Name=
for SESSION in $(loginctl | awk '{print $1}'); do
unset Display Remote State
- eval $(loginctl -p Display -p Remote -p State -p Class show-session "$SESSION")
- if [ -n "$Display" ] && [ "$Remote" = "no" ] && [ "$State" = "active" -o "$State" = "online" ] && [ "$Class" = "user" ]; then
- USED=1
- break;
+ eval $(loginctl -p Display -p Remote -p State -p Class -p Name show-session "$SESSION")
+ if [ "$Display" = ":0" ] && [ "$Remote" = "no" ] && [ "$State" = "active" -o "$State" = "online" ] && [ "$Class" = "user" ]; then
+ USED=1 # We only consider sessions on the primary display, which should always be the case
+ break
fi
done
+# Also report usage of /tmp and swap
+TMP=$(df -P /tmp | grep -m1 ' /tmp$')
+TMP_SIZE=$(echo $TMP | awk '{print $2}')
+TMP_FREE=$(echo $TMP | awk '{print $4}')
+SWAP_FREE=$(grep -m1 ^SwapFree: /proc/meminfo | awk '{print $2}')
+
curl -s --data-urlencode "type=~runstate" --data-urlencode "uuid=$UUID" --data-urlencode "used=$USED" \
- "$SLX_REMOTE_LOG" > /dev/null 2>&1
+ --data-urlencode "user=$Name" --data-urlencode "tmpsize=$TMP_SIZE" --data-urlencode "tmpfree=$TMP_FREE" \
+ --data-urlencode "swapfree=$SWAP_FREE" "$SLX_REMOTE_LOG" > /dev/null 2>&1
+
+# Warn user if tmp or swap usage is high; system might crash soon
+WARN=
+if [ "$SWAP_FREE" -gt 0 ] && [ "$SWAP_FREE" -lt 500000 ]; then # less than 500MB swap
+ WARN="$WARN
+Der Arbeitsspeicher des Computers ist fast voll.
+The computer is running out of RAM."
+fi
+if [ -n "$TMP_FREE" ] && [ "$TMP_FREE" -lt 500000 ]; then
+ WARN="$WARN
+Es verbleibt wenig temporärer Speicher für die Arbeitsdaten der laufenden VM.
+Little temporary storage is left for the current VM."
+fi
+
+if [ -n "$WARN" ]; then
+ WARN="$WARN
+
+Bitte sichern Sie Ihre Arbeit und starten Sie den PC neu.
+Please save your work and reboot this machine.
+
+Sie können einen bwLehrpool-Admin bitten, eine größere ID-44-Partition einzurichten.
+You could ask a bwLehrpool administrator to create a larger ID-44 partition."
+ for d in $(who | awk '{print $2}' | sort -u); do
+ if [ "${d:0:1}" = ":" ]; then
+ # X11
+ export DISPLAY=$d
+ export XAUTHORITY=$(ps a | grep " $DISPLAY " | grep -o -- '-auth.*$' | grep -m1 -v grep | awk '{print $2}')
+ notify-send -u critical "System instabil" "$WARN"
+ unset DISPLAY XAUTHORITY
+ elif [ "${d:0:3}" = "tty" ]; then
+ # Regular tty
+ cat > "/dev/$d" <<EOF
+ *
+ ***************************
+ $WARN
+ ***************************
+ *
+EOF
+ elif [ "${d:0:3}" = "pts" ]; then
+ # pts - xterm or ssh session
+ cat > "/dev/pts/${d:3}" <<EOF
+ *
+ ***************************
+ $WARN
+ ***************************
+ *
+EOF
+ fi
+ done
+fi
+
+exit 0
diff --git a/remote/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats b/remote/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats
index 94c2094f..6f4e25ec 100755
--- a/remote/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats
+++ b/remote/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats
@@ -40,7 +40,7 @@ fi
MAC=${BOOTIF:3}
# 2) Get machine UUID, with fallback to MAC address if it fails for some reason
-UUID=$(dmidecode -s system-uuid | head -n 1)
+UUID=$(dmidecode -q -s system-uuid | grep -v '^#' | head -n 1)
if [ "${#UUID}" -ne "36" ]; then
echo "Determined UUID (${UUID}) has not expected length of 36, falling back to MAC..."
UUID="000000000000000-$BOOTIF"
@@ -49,7 +49,10 @@ fi
# 3) Uptime in seconds
UPTIME=$(grep -o -E '^[0-9]+' /proc/uptime)
-# 4) Number of real CPU cores
+# 4) Number of real and virtual CPU cores
+# Virtual, cheap way
+VCORES=$(grep '^processor\s' /proc/cpuinfo | sort -u | wc -l)
+# Real cores
CPUCORES=$(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -u | wc -l)
# Fallback 1...
if [ -z "$CPUCORES" ] || [ "$CPUCORES" = "0" ]; then
@@ -66,7 +69,7 @@ fi
CPUMODEL=$(grep -m1 '^model name\s*:' /proc/cpuinfo | sed 's/^model name\s*:\s*//;s/\s\s*/ /g;s/^ //;s/ $//')
# 6) RAM
-RAM=$(grep '^MemTotal:' /proc/meminfo | awk '{print $2}')
+RAM=$(grep -m1 '^MemTotal:' /proc/meminfo | awk '{print $2}')
RAM=$(( $RAM / 1024 ))
if [ -z "$RAM" ] || [ "$RAM" -lt 500 ]; then
# Fallback to dmidecode
@@ -143,24 +146,26 @@ fi
# A) Read system model and manufacturer
dmidec() {
- local LMODEL=$(dmidecode "$@" 2>/dev/null | grep -v '^Invalid' | sed 's/\s\s*/ /g;s/^ //;s/ $//')
- case "$LMODEL" in
+ local RETVAL=$(dmidecode "$@" 2>/dev/null | grep -v '^#' | grep -v '^Invalid' | sed 's/\s\s*/ /g;s/^ //;s/ $//')
+ case "$RETVAL" in
""|*"Product Name"*|*"be filled"*|"unknown"|*"product name"*)
- LMODEL="Unknown"
+ RETVAL="Unknown"
;;
esac
- echo "$LMODEL"
+ echo "$RETVAL"
}
-MODEL=$(dmidec -s system-product-name)
-MANUF=$(dmidec -s system-manufacturer)
+
+HW_MODEL=$(dmidec -q -s system-product-name)
+HW_MANUF=$(dmidec -q -s system-manufacturer)
# Try fallback to baseboard
-if [ "$MODEL" = "Unknown" ]; then
- MODEL=$(dmidec -s baseboard-product-name)
- MANUF=$(dmidec -s baseboard-manufacturer)
+if [ "$HW_MODEL" = "Unknown" ]; then
+ HW_MODEL=$(dmidec -q -s baseboard-product-name)
+ HW_MANUF=$(dmidec -q -s baseboard-manufacturer)
fi
-if [ "$MANUF" != "Unknown" ]; then
- MODEL="$MODEL ($MANUF)"
+MODEL="$HW_MODEL"
+if [ "$HW_MANUF" != "Unknown" ]; then
+ MODEL="$MODEL ($HW_MANUF)"
fi
# n) Dump raw data to a file
@@ -169,7 +174,7 @@ cat > "$DATAFILE" <<-EOF
############################### CPU #####################################
Sockets: $(grep '^physical id' /proc/cpuinfo | sort -u | wc -l)
Real cores: $CPUCORES
-Virtual cores: $(grep '^processor' /proc/cpuinfo | sort -u | wc -l)
+Virtual cores: $VCORES
######################## Partition tables ###############################
EOF
cat "$FDISK" >> "$DATAFILE"
@@ -198,11 +203,20 @@ HDDCOUNT=0
for size in $(cat "$FDISK" | grep -E '^Disk /dev.*[0-9]{11,} bytes' | grep -o -E '[0-9]{11,}'); do
[ "$size" -gt 50000000000 ] && HDDCOUNT=$(( HDDCOUNT + 1 ))
done
+bashesc () {
+ sed s/\'/\'\"\'\"\'/g <<<$*
+}
+HW_MANUF=$(bashesc "$HW_MANUF")
+HW_MODEL=$(bashesc "$HW_MODEL")
cat > "/run/hwinfo" <<HORST
HW_KVM='${VT}'
HW_ID44='${ID44}'
HW_MBRAM='${RAM}'
HW_HDDCOUNT='${HDDCOUNT}'
+HW_MANUF='${HW_MANUF}'
+HW_MODEL='${HW_MODEL}'
+HW_CORES='${CPUCORES}'
+HW_THREADS='${VCORES}'
HORST
# Fire away
diff --git a/remote/modules/hardware-stats/module.conf b/remote/modules/hardware-stats/module.conf
index 5850b267..8e371d5b 100644
--- a/remote/modules/hardware-stats/module.conf
+++ b/remote/modules/hardware-stats/module.conf
@@ -1,6 +1,8 @@
+REQUIRED_MODULES="
+ dmidecode
+"
REQUIRED_BINARIES="
rdmsr
- dmidecode
blockdev
"
diff --git a/remote/modules/kdm/data/etc/kde4/kdm/kdmrc b/remote/modules/kdm/data/etc/kde4/kdm/kdmrc
index 5f9f9e39..b14a7929 100644
--- a/remote/modules/kdm/data/etc/kde4/kdm/kdmrc
+++ b/remote/modules/kdm/data/etc/kde4/kdm/kdmrc
@@ -3,6 +3,7 @@ PidFile=/var/run/kdm.pid
ServerVTs=-7
# Always spawn :0 (this is the default but it won't hurt)
StaticServers=:0
+GreeterUID=kdm
[X-*-Greeter]
UseTheme=true
diff --git a/remote/modules/kernel-vanilla/module.conf b/remote/modules/kernel-vanilla/module.conf
index a0973a2b..ff83a9c8 100644
--- a/remote/modules/kernel-vanilla/module.conf
+++ b/remote/modules/kernel-vanilla/module.conf
@@ -1,5 +1,5 @@
REQUIRED_BINARIES=""
REQUIRED_LIBRARIES=""
REQUIRED_DIRECTORIES=""
-REQUIRED_KERNEL="4.4.13"
+REQUIRED_KERNEL="4.8.5"
REQUIRED_GIT="git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git"
diff --git a/remote/modules/nvidia_kernel/module.build b/remote/modules/nvidia_kernel/module.build
index cbe38d6a..22a0dcc7 100644
--- a/remote/modules/nvidia_kernel/module.build
+++ b/remote/modules/nvidia_kernel/module.build
@@ -39,7 +39,7 @@ build() {
local NVIDIA_MODULES="$MODULE_BUILD_DIR/lib/modules/nvidia/"
mkdir -p "$NVIDIA_MODULES"
pinfo "Copying kernel modules..."
- for file in nvidia.ko nvidia-uvm.ko nvidia-modeset.ko; do
+ for file in nvidia.ko nvidia-uvm.ko nvidia-modeset.ko nvidia-drm.ko; do
RESULT=$(find "$ROOTUPPERDIR/NVIDIA/kernel" -name "$file" | head -n 1)
[ -z "$RESULT" ] && perror "Could not find built module $file in ./NVIDIA/kernel"
pinfo "Fetching ${file}..."
diff --git a/remote/modules/nvidia_kernel/module.conf b/remote/modules/nvidia_kernel/module.conf
index 7832f59b..b05fa883 100644
--- a/remote/modules/nvidia_kernel/module.conf
+++ b/remote/modules/nvidia_kernel/module.conf
@@ -1,4 +1,4 @@
-REQUIRED_VERSION="361.28"
+REQUIRED_VERSION="367.57"
REQUIRED_NVIDIA="NVIDIA-Linux-x86_64-$REQUIRED_VERSION.run"
REQUIRED_URL="http://download.nvidia.com/XFree86/Linux-x86_64/$REQUIRED_VERSION/$REQUIRED_NVIDIA"
diff --git a/remote/modules/nvidia_libs/module.conf b/remote/modules/nvidia_libs/module.conf
index 60e507eb..45069ac2 100644
--- a/remote/modules/nvidia_libs/module.conf
+++ b/remote/modules/nvidia_libs/module.conf
@@ -1,4 +1,4 @@
-REQUIRED_VERSION="361.28"
+REQUIRED_VERSION="367.57"
REQUIRED_NVIDIA="NVIDIA-Linux-x86_64-$REQUIRED_VERSION.run"
REQUIRED_URL="http://download.nvidia.com/XFree86/Linux-x86_64/$REQUIRED_VERSION/$REQUIRED_NVIDIA"
diff --git a/remote/modules/pam-bwidm/data/opt/openslx/bwidm_soap.xml b/remote/modules/pam-bwidm/data/opt/openslx/bwidm_soap.xml
index ef2c9490..ec7f3ff8 100644
--- a/remote/modules/pam-bwidm/data/opt/openslx/bwidm_soap.xml
+++ b/remote/modules/pam-bwidm/data/opt/openslx/bwidm_soap.xml
@@ -1,22 +1,14 @@
-<SOAP-ENV:Envelope
- xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
- xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
- xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:ecp="urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp">
- <SOAP-ENV:Header>
- </SOAP-ENV:Header>
- <SOAP-ENV:Body>
- <samlp:AuthnRequest
- ID="__RANDOM_STRING__2"
- ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS"
- AssertionConsumerServiceURL="__AssertionConsumerUrl__"
- IssueInstant="__2016-04-11T1:24:00Z__"
- Version="2.0"
- >
- <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
- __REMOTE_ENTITY_ID__
- </saml:Issuer>
- <samlp:NameIDPolicy AllowCreate="1"/>
- </samlp:AuthnRequest>
- </SOAP-ENV:Body>
-</SOAP-ENV:Envelope>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+ <S:Body>
+ <samlp:AuthnRequest
+ xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
+ AssertionConsumerServiceURL="https://bwlp-masterserver.ruf.uni-freiburg.de/Shibboleth.sso/SAML2/ECP"
+ ID="%REQUESTID%"
+ IssueInstant="%TIMESTAMP%"
+ ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS"
+ Version="2.0">
+ <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://bwlp-masterserver.ruf.uni-freiburg.de/shibboleth</saml:Issuer>
+ <samlp:NameIDPolicy AllowCreate="1"/>
+ </samlp:AuthnRequest>
+ </S:Body>
+</S:Envelope>
diff --git a/remote/modules/pam-bwidm/data/opt/openslx/scripts/pam_bwidm b/remote/modules/pam-bwidm/data/opt/openslx/scripts/pam_bwidm
index 13e40cb9..92379719 100755
--- a/remote/modules/pam-bwidm/data/opt/openslx/scripts/pam_bwidm
+++ b/remote/modules/pam-bwidm/data/opt/openslx/scripts/pam_bwidm
@@ -8,6 +8,15 @@
# fix PATH as PAM clears it
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+# grab the password from stdin asap, since there is no guarantee some tool just reads it
+unset USER_PASSWORD
+if [ "x$PAM_TYPE" == "xauth" ]; then
+ read -r USER_PASSWORD > /dev/null 2>&1
+ readonly USER_PASSWORD
+ [ -z "$USER_PASSWORD" ] && echo "No password given." && exit 1
+fi
+
if ! busybox which curl || ! busybox which mktemp; then
echo "'curl/mktemp' missing. This script won't work without it."
exit 1
@@ -27,14 +36,16 @@ exec > "${LOGFILE}" 2>&1
# check if we are allowed to run
. /opt/openslx/config
-[ -z "${SLX_BWIDM_AUTH}" -o "x${SLX_BWIDM_AUTH}" != "xyes" ] && echo "bwIDM login disabled in openslx-config." && exit 1
-
-# grab the password from stdin asap, since there is no garantee some tool just reads it
-unset USER_PASSWORD
-if [ "x$PAM_TYPE" == "xauth" ]; then
- read -r USER_PASSWORD > /dev/null 2>&1
- readonly USER_PASSWORD
- [ -z "$USER_PASSWORD" ] && echo "No password given." && exit 1
+if [ "x${SLX_BWIDM_AUTH}" = "xyes" ]; then
+ : # Allow everything
+elif [ "x${SLX_BWIDM_AUTH}" = "xselective" ]; then
+ if [ -z "${SLX_BWIDM_ORGS}" ]; then
+ echo "bwIDM selective mode with empty org list - exiting"
+ exit 1
+ fi
+else
+ echo "bwIDM login disabled in openslx-config."
+ exit 1
fi
# sanity check on PAM_USER: contains '@'?
@@ -50,6 +61,21 @@ readonly USER_ORGANISATION="${PAM_USER#*@}"
[ -z "$USER_ORGANISATION" ] && echo "Could not parse organisation from given login: ${PAM_USER}. Aborting." && exit 1
[ -z "$USER_USERNAME" ] && echo "Could not parse user from given login: ${PAM_USER}. Aborting." && exit 1
+# Check if we're in selective mode and if so, whether the user's organization is whitelisted
+if [ "x${SLX_BWIDM_AUTH}" = "xselective" ]; then
+ FOUND=
+ for org in ${SLX_BWIDM_ORGS}; do
+ if [ "x$org" = "x$USER_ORGANISATION" ]; then
+ FOUND=ya
+ break
+ fi
+ done
+ if [ -z "$FOUND" ]; then
+ echo "bwIDM organization $USER_ORGANISATION not in whitelist, abort"
+ exit 1
+ fi
+fi
+
# The given username is valid. Now we get the list of IdPs from the bwlp masterserver
# and try to find the user's organisation
@@ -76,7 +102,7 @@ USER_ECP_URL="$(awk -v idp="${USER_ORGANISATION}" -F '=' '{if($1==idp) print $2}
# now create the bwidm group: find the first free GID from 1000 "downwards" to 100
BWIDM_GROUP="$(getent group bwidm)"
if [ -z "$BWIDM_GROUP" ]; then
- BWIDM_GID=1000
+ BWIDM_GID=999
while [ "$BWIDM_GID" -gt 100 ]; do
getent group "$BWIDM_GID" || break
let BWIDM_GID--
@@ -107,18 +133,35 @@ readonly SOAP_ENVELOPE="/opt/openslx/bwidm_soap.xml"
# now the pam-type specific part starts
if [ "x$PAM_TYPE" == "xauth" ]; then
+ HA='Accept: text/html; application/vnd.paos+xml'
+ HP='PAOS: ver="urn:liberty:paos:2003-08";"urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp"'
+ CT='Content-Type: application/vnd.paos+xml; charset=utf-8'
+ NOW=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
+ HOST=$(echo "${USER_ECP_URL}" | awk -F '/' '{print $3}')
+ RID="_c${RANDOM}a${RANDOM}f${RANDOM}f${RANDOM}e${RANDOM}e${RANDOM}"
+ RID="${RID:0:32}"
+ REQUEST=$(sed "s/%TIMESTAMP%/${NOW}/g;s/%REQUESTID%/${RID}/g" "${SOAP_ENVELOPE}")
+ NETRC=$(mktemp -p /run/)
+ [ -z "$NETRC" ] && NETRC="/run/netrc_$$_${USER}_${RANDOM}.tmp"
+ touch "$NETRC"
+ chmod 0600 "$NETRC"
# now we are ready to actually send the credentials to the IdP
# to be sure everything is working as expected
- # we will first send a wrong password (by repeating the given password) and expect a 401
- ret=$(curl --connect-timeout 5 --max-time 15 -o /dev/null -w "%{http_code}" -d @"${SOAP_ENVELOPE}" -H "Content-Type: application/vnd.paos+xml" --basic -u "${USER_USERNAME}:${USER_PASSWORD}${USER_PASSWORD}" "$USER_ECP_URL")
+ # we will first send a wrong password and expect a 401
+ echo "machine ${HOST} login ${USER_USERNAME} password ___invalid-INVALID++~" > "${NETRC}"
+ ret=$(curl --connect-timeout 5 --max-time 15 -o /dev/null -w "%{http_code}" -d "${REQUEST}" -H "$CT" -H "$HP" -H "$HA" --basic --netrc-file "$NETRC" "$USER_ECP_URL")
if [ "x$ret" != "x401" ]; then
# this means something else is bad, just exit
echo "False authentication attempt did not return 401 as expected but: $ret"
+ rm -- "${NETRC}"
exit 7
fi
# the fake auth call behaved as expected, do the actualy login
- ret=$(curl --connect-timeout 5 --max-time 15 -o /dev/null -w "%{http_code}" -d @"${SOAP_ENVELOPE}" -H "Content-Type: application/vnd.paos+xml" --basic -u "${USER_USERNAME}:${USER_PASSWORD}" "$USER_ECP_URL")
+ echo "machine ${HOST} login ${USER_USERNAME} password ${USER_PASSWORD}" > "${NETRC}"
+ ret=$(curl --connect-timeout 5 --max-time 15 -o /dev/null -w "%{http_code}" -d "${REQUEST}" -H "$CT" -H "$HP" -H "$HA" --basic --netrc-file "$NETRC" "$USER_ECP_URL")
+ echo "machine ${HOST} login ${USER_USERNAME} password ********************" > "${NETRC}" # It should be a tmpfs but you never know
+ rm -- "${NETRC}"
if [ "x$ret" == "x200" ]; then
# auth succeeded, lets create a local user representing the bwIDM user
@@ -166,8 +209,10 @@ exit 1
mainret=$?
if [ "x$mainret" == "x7" ]; then
# exit code 7 is our marker to push the logfile to the sat
- slxlog "pam-bwidm" "Internal error during bwIDM authentication" "${LOGFILE}"
- ( sleep 1; rm -f -- "${LOGFILE}" ) &
+ slxlog --delete "pam-bwidm" "Internal error during bwIDM authentication" "${LOGFILE}"
exit 1
+else
+ rm -- "${LOGFILE}"
fi
exit "${mainret}"
+
diff --git a/remote/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share b/remote/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share
index 670943f4..d0bd8842 100644
--- a/remote/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share
+++ b/remote/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share
@@ -118,12 +118,13 @@ mount_share() {
# check for failures
if [ -e "${SIGNAL}" ]; then
- slxlog "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' failed. (Args: ${MOUNT_OPTS}" "${MOUNT_OUTPUT}"
- rm -f -- "${SIGNAL}"
+ slxlog --delete "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' failed. (Args: '${MOUNT_OPTS}')" "${MOUNT_OUTPUT}"
+ rm -f -- "${SIGNAL}"
elif kill -9 "${MOUNT_PID}" 2>/dev/null; then
- slxlog "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' timed out. (Args: ${MOUNT_OPTS}" "${MOUNT_OUTPUT}"
+ slxlog --delete "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' timed out. (Args: '${MOUNT_OPTS}')" "${MOUNT_OUTPUT}"
+ else
+ rm -f -- "${MOUNT_OUTPUT}"
fi
- ( sleep 2; rm -f -- "${MOUNT_OUTPUT}" ) &
# always unset credentials
unset USER
diff --git a/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_close b/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_close
index cd35a86b..e4a7c1b4 100755
--- a/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_close
+++ b/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_close
@@ -6,6 +6,8 @@ export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/o
# can only work if script is run as root
[ "x$(whoami)" = "xroot" ] || exit 0
+[ "x${PAM_SERVICE%greeter}" != "x${PAM_SERVICE}" ] && exit 0
+
# NSA needs to know
if [ "x$PAM_SERVICE" != "xsu" -a "x$PAM_SERVICE" != "xsudo" ]; then
. /opt/openslx/config
diff --git a/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_open b/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_open
index 8ab34708..b918278e 100755
--- a/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_open
+++ b/remote/modules/pam/data/opt/openslx/scripts/pam_script_ses_open
@@ -3,6 +3,9 @@
# Needed as pam_script clears PATH
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+# just exit for greeter sessions
+[ "x${PAM_SERVICE%greeter}" != "x${PAM_SERVICE}" ] && exit 0
+
# NSA needs to know
if [ "x$PAM_SERVICE" != "xsu" -a "x$PAM_SERVICE" != "xsudo" ]; then
. /opt/openslx/config
diff --git a/remote/modules/pam/module.conf b/remote/modules/pam/module.conf
index 4e2e01a1..4fe76253 100644
--- a/remote/modules/pam/module.conf
+++ b/remote/modules/pam/module.conf
@@ -3,6 +3,7 @@ REQUIRED_BINARIES="
rpc.gssd
rpc.idmapd
sslconnect
+ unix_chkpwd
"
REQUIRED_LIBRARIES="
nsswitch
diff --git a/remote/modules/pam/module.conf.ubuntu b/remote/modules/pam/module.conf.ubuntu
index d675116c..7b2ceb50 100644
--- a/remote/modules/pam/module.conf.ubuntu
+++ b/remote/modules/pam/module.conf.ubuntu
@@ -9,8 +9,8 @@ REQUIRED_INSTALLED_PACKAGES="
libnfsidmap2
nfs-common
libpam0g-dev
- ncpfs
cifs-utils
+ libpam-modules-bin
"
REQUIRED_CONTENT_PACKAGES="
libpam0g
@@ -25,15 +25,11 @@ REQUIRED_CONTENT_PACKAGES="
ldap-utils
libnfsidmap2
nfs-common
- ncpfs
cifs-utils
+ libpam-modules-bin
"
REQUIRED_BINARIES+="
nwmsg
- ncpmount
- ncpumount
- mount.ncp
- mount.ncpfs
mount.cifs
"
REQUIRED_DIRECTORIES+="
diff --git a/remote/modules/pam/module.conf.ubuntu.14 b/remote/modules/pam/module.conf.ubuntu.14
index 64ead96a..455be684 100644
--- a/remote/modules/pam/module.conf.ubuntu.14
+++ b/remote/modules/pam/module.conf.ubuntu.14
@@ -1,4 +1,3 @@
-# TODO fix and re-add ncp support !
REQUIRED_INSTALLED_PACKAGES="
libpam-ldap
libnss-ldapd
@@ -11,6 +10,7 @@ REQUIRED_INSTALLED_PACKAGES="
nfs-common
libpam0g-dev
cifs-utils
+ libpam-modules-bin
"
REQUIRED_CONTENT_PACKAGES="
libpam0g
@@ -26,6 +26,7 @@ REQUIRED_CONTENT_PACKAGES="
libnfsidmap2
nfs-common
cifs-utils
+ libpam-modules-bin
"
REQUIRED_BINARIES+="
mount.cifs
diff --git a/remote/modules/printergui/data/opt/openslx/scripts/run-virt_print b/remote/modules/printergui/data/opt/openslx/scripts/run-virt_print
index ba352778..2f98b1ff 100755
--- a/remote/modules/printergui/data/opt/openslx/scripts/run-virt_print
+++ b/remote/modules/printergui/data/opt/openslx/scripts/run-virt_print
@@ -53,6 +53,12 @@ else
errlog "printergui-nogs" "Warning: Cannot validate file prior to printing: gs binary not found"
fi
+# Set username prefix if found
+. /opt/openslx/config
+if [ -n "$SLX_PRINT_USER_PREFIX" ]; then
+ export PWGUI_USERPREFIX="$SLX_PRINT_USER_PREFIX"
+fi
+
# Try to print
$PRINTERGUI "$USER" "$FILE"
RET=$?
diff --git a/remote/modules/pvs2/data/etc/systemd/system/multi-user.target.wants/pvsmgr.service b/remote/modules/pvs2/data/etc/systemd/system/multi-user.target.wants/pvsmgr.service
new file mode 120000
index 00000000..cab88a66
--- /dev/null
+++ b/remote/modules/pvs2/data/etc/systemd/system/multi-user.target.wants/pvsmgr.service
@@ -0,0 +1 @@
+../pvsmgr.service \ No newline at end of file
diff --git a/remote/modules/pvs2/data/etc/systemd/system/pvsmgr.service b/remote/modules/pvs2/data/etc/systemd/system/pvsmgr.service
new file mode 100644
index 00000000..281e1ab4
--- /dev/null
+++ b/remote/modules/pvs2/data/etc/systemd/system/pvsmgr.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Fetch up to date pvsmgr config
+DefaultDependencies=no
+After=tmp.target
+Wants=tmp.target
+Before=graphical.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-pvsmgr
+RemainAfterExit=yes
+
diff --git a/remote/modules/pvs2/data/opt/openslx/bin/pvsstartup b/remote/modules/pvs2/data/opt/openslx/bin/pvsstartup
index def24a81..16a01708 100755
--- a/remote/modules/pvs2/data/opt/openslx/bin/pvsstartup
+++ b/remote/modules/pvs2/data/opt/openslx/bin/pvsstartup
@@ -1,15 +1,25 @@
#!/bin/ash
-# TODO UNTESTED!
timediff=5
+counter=0
+
+. /opt/openslx/config
+EXAM=
+if [ -n "$SLX_EXAM" ]; then
+ EXAM="--exam-mode"
+fi
+
while [ $timediff -gt 3 ]; do
start="$(date +%s)"
- pvsclient $@
+ pvsclient $EXAM "$@"
ret=$?
end="$(date +%s)"
- /opt/openslx/pvs2/unlock.sh
+ /opt/openslx/pvs2/kb-unlock.sh
[ "$ret" == "0" ] && break
timediff=$(( end - start ))
+ counter=$(( counter + 1 ))
+ [ $counter -gt 8 ] && break
done
+exit $ret
diff --git a/remote/modules/pvs2/data/opt/openslx/iptables/rules.d/10-pvs b/remote/modules/pvs2/data/opt/openslx/iptables/rules.d/10-pvs
new file mode 100755
index 00000000..a24491fa
--- /dev/null
+++ b/remote/modules/pvs2/data/opt/openslx/iptables/rules.d/10-pvs
@@ -0,0 +1,11 @@
+#!/bin/ash
+
+# Allow PVS ports
+# Control connection - server and client perspective
+iptables -I ipt-helper-INPUT 1 -i br0 -p tcp --dport 5194 -j ACCEPT
+iptables -I ipt-helper-OUTPUT 1 -o br0 -p tcp --dport 5194 -j ACCEPT
+# UDP discovery - server and client perspective
+iptables -I ipt-helper-INPUT 1 -i br0 -p udp --dport 3492 -j ACCEPT
+iptables -I ipt-helper-OUTPUT 1 -o br0 -p udp --dport 3492 -j ACCEPT
+# VNC connection - incoming (client) only - small range as we use -autoport
+iptables -I ipt-helper-INPUT 1 -i br0 -p tcp --dport 54112:54122 -j ACCEPT
diff --git a/remote/modules/pvs2/data/opt/openslx/pvs2/lockDesktop.sh b/remote/modules/pvs2/data/opt/openslx/pvs2/lockDesktop.sh
new file mode 100755
index 00000000..c9cfc421
--- /dev/null
+++ b/remote/modules/pvs2/data/opt/openslx/pvs2/lockDesktop.sh
@@ -0,0 +1,25 @@
+#!/bin/ash
+
+# Problem: While any application (e.g. VMware) is holding the mouse and
+# keyboard grab, xscreensaver couldn't grab them, so it will ignore the
+# locking request. Without the keyboard grab, all input would still go
+# to the vmware window below the black screen, which is, you know, bad,
+# since you cannot enter your password to unlock the workstation again.
+
+# So we minimize vmware, lock the screen, and then restore vmware.
+# TODO: Add other virtualizers (vbox, kvm) later if needed.
+WINDOWS=$(xdotool search --class vmplayer)
+for window in $WINDOWS; do
+ xdotool windowminimize $window
+done
+# move mouse pointer to the center of the screen to avoid some problems with ghost clicks
+xdotool mousemove --polar 0 0 --sync
+
+# now actually lock
+xscreensaver-command --lock
+
+# above lock call is blocking, so now xscreensaver should be active - let's restore vmware
+for window in $WINDOWS; do
+ xdotool windowmap $window
+done
+
diff --git a/remote/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr b/remote/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr
index 7a6c13d9..5531518a 100755
--- a/remote/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr
+++ b/remote/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr
@@ -1,4 +1,30 @@
#!/bin/ash
+. /opt/openslx/config
+
+# Try to get fresh version from server
+CONF=
+if [ -n "$SLX_PVS_CONFIG_URL" ]; then
+ DST="$(mktemp)"
+ wget -T 5 -O "${DST}" "$SLX_PVS_CONFIG_URL"
+ [ -s "${DST}" ] && CONF="--config=${DST}"
+fi
+
openbox &
-exec /opt/openslx/bin/pvsmgr --manager-only
+
+timediff=5
+counter=0
+
+while [ $timediff -gt 3 ]; do
+ start="$(date +%s)"
+ /opt/openslx/bin/pvsmgr "$CONF" "$@"
+ ret=$?
+ [ "$ret" == "0" ] && break
+ end="$(date +%s)"
+ timediff=$(( end - start ))
+ counter=$(( counter + 1 ))
+ [ $counter -gt 8 ] && break
+done
+
+exit $ret
+
diff --git a/remote/modules/pvs2/data/opt/openslx/scripts/systemd-pvsmgr b/remote/modules/pvs2/data/opt/openslx/scripts/systemd-pvsmgr
new file mode 100755
index 00000000..1a56e8d0
--- /dev/null
+++ b/remote/modules/pvs2/data/opt/openslx/scripts/systemd-pvsmgr
@@ -0,0 +1,22 @@
+#!/bin/ash
+
+. /opt/openslx/config
+DST="/opt/openslx/pvs2/pvs2.ini"
+
+# Try to get fresh version from server
+if [ -n "$SLX_PVS_CONFIG_URL" ]; then
+ wget -T 10 -O "${DST}.new" "$SLX_PVS_CONFIG_URL"
+ [ -s "${DST}.new" ] && mv -f "${DST}.new" "${DST}"
+fi
+
+# If this is a dedicated PVS station, make it launch right away
+if [ -n "$SLX_PVS_DEDICATED" ] && cd /opt/openslx/xsessions; then
+ for file in *.desktop; do
+ cp -f "/usr/share/xsessions/pvs2mgr.desktop" "$file"
+ done
+ # patch autologin into kdmrc
+ sed -i '/AutoLogin.*=/d;/^\[X-.*-Core\]/a AutoLoginEnable=true\nAutoLoginUser=demo\nAutoLoginAgain=true\nAutoLoginDelay=0' "/etc/kde/kdm/kdmrc"
+fi
+
+exit 0
+
diff --git a/remote/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient b/remote/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient
index 86f26a17..5ff03227 100755
--- a/remote/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient
+++ b/remote/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient
@@ -1,6 +1,6 @@
#!/bin/ash
-# SESSION_TYPE can be either 'VSESSION' or 'XSESSION' - currently not evaluated
+# SESSION_TYPE can be either 'VSESSION' or 'XSESSION'
# detect session command of the PVS-Manager session by looking at the xsession file
PVSMGR_SESSION_CMD=
@@ -17,10 +17,43 @@ if [ -n "${PVSMGR_SESSION_CMD}" ]; then
# do not start pvsclient if we are running the pvs manager session
[ "x${SESSION_CMD}" == "x${PVSMGR_SESSION_CMD}" ] && exit 0
fi
+
+# Download fresh copy of config file if possible
+. /opt/openslx/config
+PVSCONFIG=
+if [ -n "$SLX_PVS_CONFIG_URL" ]; then
+ [ -z "$UID" ] && UID="$(id -u)"
+ [ -z "$HOME" ] && HOME="$(getent passwd "$UID" | head -n 1 | awk -F ':' '{print $6}')"
+ mkdir -p "$HOME/.tmp"
+ if wget -T 5 -O "$HOME/.tmp/pvs2.ini.tmp" "$SLX_PVS_CONFIG_URL"; then
+ mv -f "$HOME/.tmp/pvs2.ini.tmp" "$HOME/.tmp/pvs2.ini"
+ fi
+ if ! [ -s "$HOME/.tmp/pvs2.ini" ] && [ -s "/opt/openslx/pvs2/pvs2.ini" ]; then
+ cp -f "/opt/openslx/pvs2/pvs2.ini" "$HOME/.tmp/pvs2.ini"
+ fi
+ if [ -s "$HOME/.tmp/pvs2.ini" ]; then
+ PVSCONFIG="--config=$HOME/.tmp/pvs2.ini"
+ fi
+fi
+
# If the ENV var PVS has been set by vmchooser start pvsclient
-if [ -n "$PVS_AUTO_CONNECT" -a "$PVS_AUTO_CONNECT" == "TRUE" ]; then
- pvsstartup --auto &
+if [ "$PVS_AUTO_CONNECT" == "TRUE" ]; then
+ pvsstartup "$PVSCONFIG" --auto &
else
- pvsstartup &
+ pvsstartup "$PVSCONFIG" &
fi
+
+# Finally, handle hybrid mode where the pvsmgr is launched on the second desktop
+# alongside the actual vm. (make sure this is a VSESSION!)
+if [ "$SESSION_TYPE" == "VSESSION" ]; then
+ {
+ wt="PVS2-Manager"
+ pvsmgr "$PVSCONFIG" --manager-only &
+ for i in 100 100 200 200 200 300 500 500 1000; do
+ usleep $(( i * 1000 )) || sleep 1
+ wmctrl -r "$wt" -t 1
+ done
+ } &
+fi
+
exit 0
diff --git a/remote/modules/pvs2/module.build b/remote/modules/pvs2/module.build
index 70b88350..607b6d5f 100644
--- a/remote/modules/pvs2/module.build
+++ b/remote/modules/pvs2/module.build
@@ -26,9 +26,10 @@ build() {
# copy external scripts under 'sample_configuration'
mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/pvs2/"
if [ -d "${SRCDIR}/sample_configuration" ]; then
- cp ${SRCDIR}/sample_configuration/*.sh "${MODULE_BUILD_DIR}/opt/openslx/pvs2/" \
+ # Do not copy lockDesktop.sh - we ship a modified one
+ cp "${SRCDIR}/sample_configuration"/{kb-lock,kb-unlock,switchToManager,switchBack}.sh "${MODULE_BUILD_DIR}/opt/openslx/pvs2/" \
|| perror "Could not copy external scripts to '${MODULE_BUILD_DIR}/opt/openslx/pvs2/'!"
- chmod +x ${MODULE_BUILD_DIR}/opt/openslx/pvs2/*.sh \
+ chmod +x "${MODULE_BUILD_DIR}/opt/openslx/pvs2"/*.sh \
|| perror "Could not set executable bit for external scripts."
fi
diff --git a/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include b/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include
index 29360159..81bf9218 100644
--- a/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include
+++ b/remote/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include
@@ -44,16 +44,16 @@ mkdir -m 1777 -p ${QKTMPDIR} 2>/dev/null
diskfile=${vmpath}
# check the file type
-if echo ${imgname} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then
- imgtype=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]")
+if echo ${IMG_BASENAME} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then
+ imgtype=$(echo ${IMG_BASENAME##*.} | tr "[a-z]" "[A-Z]")
else
- writelog "${imgname} is not a valid image type (img|qcow*|vmdk), exiting!"
+ writelog "${IMG_BASENAME} is not a valid image type (img|qcow*|vmdk), exiting!"
exit 1
fi
# set the emulator/virtualization options for various operating systems
sound="es1370"
-case "${vmostype}" in
+case "${VM_OS_TYPE}" in
beos*)
VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
sound="sb16"
@@ -91,8 +91,8 @@ esac
#VIRTCMDOPTS="${VIRTCMDOPTS} -alt-grab"
# display name, remove blanks because of cmdline problems
-displayname=$(echo ${displayname} | sed -e "s, ,-,g;s,(,[,g;s,),],g")
-VIRTCMDOPTS="${VIRTCMDOPTS} -name ${displayname}"
+VM_DISPLAYNAME=$(echo ${VM_DISPLAYNAME} | sed -e "s, ,-,g;s,(,[,g;s,),],g")
+VIRTCMDOPTS="${VIRTCMDOPTS} -name ${VM_DISPLAYNAME}"
writelog "Directories:"
writelog "\tTMPDIR:\t\t\t$QKTMPDIR"
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/TEST.sh b/remote/modules/run-virt/data/opt/openslx/scripts/includes/TEST.sh
deleted file mode 100755
index fd5f755d..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/TEST.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-. usb_detector.inc
-
-get_usb_devices "bla=%VENDOR% kacke=%PRODUCT%" 0:6 0:7 0:e 0:10
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc
deleted file mode 100644
index cfaf811e..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-############################################
-# Include: Checking whether lpd is running #
-############################################
-
-# Check if tcpsvd is running. Do this down here so we do not check
-# immediately after trying to spawn it, as this could result in
-# success even if it's not really working.
-
-if ! kill -0 "$PID_LPD"; then
- slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session"
- notify_user "Durcksystem" "Das Drucksystem konnte nicht initialisiert werden. Druckfunktion nicht verfügbar."
-fi
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc
deleted file mode 100644
index fbb0bc70..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc
+++ /dev/null
@@ -1,53 +0,0 @@
-#################################################################
-# Include: Check for important files used by vmchooser_run-virt #
-#################################################################
-
-# WARNING: This is perhaps vestigial!
-
-filecheck() {
- filecheck=$(LANG=us ls -lh ${diskfile} 2>&1)
- writelog "Filecheck:\n${filecheck}\n"
- noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l)
- rightsfile=${diskfile}
-
- # check if link
- if [ -L "${diskfile}" ]; then
- # take link target
- rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}')
- rightsfile=${vmdir}/${rightsfile}
- filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1)
- fi
-
- # does file exist
- if [ "${noimage}" -ge "1" ]; then
- writelog "Virtual Machine Image Problem:\c "
- writelog "\tThe image you've specified doesn't exist."
- writelog "Filecheck says:\c "
- writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory"
- writelog "Hint:\c "
- writelog "\t\t\tCompare spelling of the image with your options.\n"
- exit 1
- fi
- # readable by calling user
- if ! [ -r "${diskfile}" >/dev/null 2>&1 \
- -o -r "${diskfile}" >/dev/null 2>&1 ]; then
- writelog "Vmware Image Problem:\c "
- writelog "\tThe image you've specified has wrong rights."
- writelog "Filecheck says:\t\t$(echo ${filecheck} \
- | awk '{print $1" "$3" "$4}') ${rightsfile}"
- writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n"
- exit 1
- fi
-
- # writable (for persistent-mode)?
- if ! [ -w "${diskfile}" >/dev/null 2>&1 \
- -o -w "${diskfile}" >/dev/null 2>&1 ] \
- && [ "${np}" = "independent-persistent" ]; then
- writelog "Vmware Image Problem:\c "
- writelog "\tThe image you have specified has wrong rights."
- writelog "Filecheck says:\t\t$(echo ${filecheck} \
- | awk '{print $1" "$3" "$4}') ${rightsfile}"
- writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n"
- exit 1
- fi
-}
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc
deleted file mode 100644
index 0e720a06..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc
+++ /dev/null
@@ -1,26 +0,0 @@
-#######################################################
-# Include: check xml file for sanity (legacy, old way #
-#######################################################
-
-# test if the xml file is valid
-if ! [ -r "${xmlfile}" ]; then
- writelog "${xmlfile} not a readable XML file!"
- slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile"
- error_user "Die XML-Datei der gewählten Sitzung ist nicht lesbar oder existiert nicht"
- 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"
- error_user "Die XML-Datei der gewählten Sitzung hat ein ungültiges Format"
- exit 1
-fi
-
-# check for running in graphical environment otherwise no much use here
-if [ -z "$DISPLAY" ]; then
- writelog -e "\n\tStart only within a graphical desktop!\n"
- exit 1
-fi
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc
deleted file mode 100644
index c3c6f7b3..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc
+++ /dev/null
@@ -1,50 +0,0 @@
-#########################################################
-# Include: Get xml file and directory (legacy, old way) #
-#########################################################
-
-## Added for persistent support.
-diskmode='nonpersistent'
-if [[ "$(grep --extended-regexp \
- '< *short_description *param=".+ --persistent--"' "$1")" ]]; then
- diskmode='persistent'
- imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
- [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
- originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
- originalImageFileName="$(grep -io '<image_name param=.*"' \
- "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \
- '{ print $2 }')"
- originalVMDKFilePath="$(dirname \
- "$originalXMLFilePath")/${originalImageFileName}"
- # Added to workaround path prefix coming from temporary generated xml file
- # by vmchooser.
- if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \
- "$imageFilePath")" ]]; then
- imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \
- <<< "$imageFilePath")
- sed -ir \
- "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \
- 's/\\/\\\\/g' -e 's/\//\\\//g' -e \
- 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1"
- fi
- # Create linked clone if not exists.
- if [ ! -f "$imageFilePath" ]; then
- mkdir -p "$(dirname "$imageFilePath")" && \
- bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \
- "$imageFilePath" --debug --verbose &>"${LOGFILE}"
- fi
-fi
-
-# absolute or relative path?
-xmlfile=$1
-if ls "${xmlfile}" 2>/dev/null | grep '/' >/dev/null 2>&1; then
- xmlpath=$(dirname "${xmlfile}")
- xmlfile=$(basename "${xmlfile}")
-else
- xmlpath=${vmchooser_xmlpath}
-fi
-# full path
-xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
-
-DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")"
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
deleted file mode 100644
index b7ed648c..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
+++ /dev/null
@@ -1,103 +0,0 @@
-###########################################
-# Include: Set hardware related variables #
-###########################################
-
-writelog "Starting configuration..."
-writelog "\tLogfile:\t\t${LOGFILE}"
-writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
-writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
-writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")"
-writelog "\tXML file:\t\t${xmlfile}"
-writelog "Enable 3D:\t\t${enable3d}"
-writelog "VM config:"
-
-# # Name of the virt image
-imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-# [ -z "$imgname" ] && imgname="${imgrelpath}"
-imgrelpath=${imgrelpath#/mnt/vmstore/}
-
-writelog "Virtual image file name: $imgname"
-
-# Imagename w/ full path
-if echo "${imgname}" | grep -q '^/'; then
- imgpath="$(dirname "${imgname}")"
- imgname="$(basename "${imgname}")"
- vmpath="${imgpath}/${imgname}"
- # If old vmchooser binary stuff
- # We do not need folder name as it is already included by vmchooser
-elif echo "${xmlfile}" | grep -q '^/tmp/'; then
- vmpath="$imgname"
- imgname="$(basename "${imgname}")"
- ## Added for persistent support.
-else
- # Else use same path as xml
- imgpath="${xmlpath}"
- vmpath="${imgpath}/${imgname}"
-fi
-
-# If ${vm_name} not defined use ${xmlfile}
-vm_name="${vm_name:-${xmlfile%.xml}}"
-
-# Define vm_shortname since vm_name can be very long
-vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")"
-
-# vm_name = displayname, define for old scripts
-displayname="${vm_name}"
-
-# image is for the following virtual machine
-xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-
-# choose the proper virtualization/emulator plugin
-[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe"
-
-# Extracting OS type (vmostype) from xml file. We don't care here whether vmostype is empty, as then
-# it will yield the default entries later on.
-vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-
-# make a guess from the filename extension if ${xmlvirt} is empty
-# (not set within the XML file)
-# TODO: implement possibility to submit own configuration files
-if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
- writelog "No virtual machine parameter defined in ${xmlfile}"
- writelog "Trying to guess VM...\c"
- case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in
- *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
- xmlvirt="vmware"
- ;;
- *innotek*|*virtualbox*)
- xmlvirt="virtualbox"
- ;;
- *qemu*|*kvm*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="none"
- ;;
- esac
- elif [ -z "${xmlvirt}" ]; then
- case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in
- vmdk)
- xmlvirt="vmware"
- ;;
- vbox|vdi)
- xmlvirt="virtualbox"
- ;;
- qcow*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="emufe"
- ;;
- esac
- writelog "result:\t${xmlvirt}"
-fi
-
-# Set redirects to 0, see vmgrid if you want to define some
-redirects=0
-
-writelog "\tVirtualization:\t\t$xmlvirt"
-writelog "\tVM name:\t\t$vm_name"
-writelog "\tVM short name:\t\t$vm_shortname"
-writelog "\tVM OS:\t\t$vmostype"
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc
deleted file mode 100644
index 3fdc06d2..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc
+++ /dev/null
@@ -1,120 +0,0 @@
-###########################################
-# Include: Set hardware related variables #
-###########################################
-
-writelog "Starting configuration..."
-writelog "\tLogfile:\t\t${LOGFILE}"
-writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
-writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
-writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")"
-writelog "\tXML file:\t\t${xmlfile}"
-writelog "Enable 3D:\t\t${enable3d}"
-writelog "VM config:"
-
-# Name of the virt image
-imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-[ -z "$imgname" ] && imgname="${imgrelpath}"
-imgrelpath=${imgrelpath#/mnt/vmstore/}
-
-## Added for persistent support.
-if [[ "$userBranchFilePath" ]]; then
- imgname="$userBranchFilePath"
-fi
-
-# Imagename w/ full path
-if echo "${imgname}" | grep -q '^/'; then
- imgpath="$(dirname "${imgname}")"
- imgname="$(basename "${imgname}")"
- vmpath="${imgpath}/${imgname}"
- # If old vmchooser binary stuff
- # We do not need folder name as it is already included by vmchooser
-elif echo "${xmlfile}" | grep -q '^/tmp/'; then
- vmpath="$imgname"
- imgname="$(basename "${imgname}")"
- ## Added for persistent support.
-elif [[ "$userBranchFilePath" ]]; then
- vmpath="$userBranchFilePath"
-else
- # Else use same path as xml
- imgpath="${xmlpath}"
- vmpath="${imgpath}/${imgname}"
-fi
-
-# Name of the virt machine, sed because of Windows formatting
-vm_name=$(grep -o 'short_description param=.*"' "${xmlfile}" \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-
-# If ${vm_name} not defined use ${xmlfile}
-vm_name="${vm_name:-${xmlfile%.xml}}"
-
-# Define vm_shortname since vm_name can be very long
-vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")"
-
-# vm_name = displayname, define for old scripts
-displayname="${vm_name}"
-
-# image is for the following virtual machine
-xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-
-# choose the proper virtualization/emulator plugin
-[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe"
-
-# make a guess from the filename extension if ${xmlvirt} is empty
-# (not set within the XML file)
-# TODO: implement possibility to submit own configuration files
-if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
- writelog "No virtual machine parameter defined in ${xmlfile}"
- writelog "Trying to guess VM...\c"
- case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in
- *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
- xmlvirt="vmware"
- ;;
- *innotek*|*virtualbox*)
- xmlvirt="virtualbox"
- ;;
- *qemu*|*kvm*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="none"
- ;;
- esac
- elif [ -z "${xmlvirt}" ]; then
- case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in
- vmdk)
- xmlvirt="vmware"
- ;;
- vbox|vdi)
- xmlvirt="virtualbox"
- ;;
- qcow*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="emufe"
- ;;
- esac
- writelog "result:\t${xmlvirt}"
-fi
-
-# Definition of the client system
-vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
-
-# Definition of the networking the client system is connected to
-network_kind=$(grep -io '<network param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
-network_card=$(grep -io '<netcard param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
-override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
-
-# Set redirects to 0, see vmgrid if you want to define some
-redirects=0
-
-# Serial/parallel ports defined (e.g. "ttyS0" or "autodetect")
-serial=$(grep -io '<serialport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
-parallel=$(grep -io '<parport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
-
-writelog "\tVirtualization:\t\t$xmlvirt"
-writelog "\tVM name:\t\t$vm_name"
-writelog "\tVM short name:\t\t$vm_shortname"
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc
deleted file mode 100644
index 649cf956..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-#######################################
-# Include: Print Logo for console use #
-#######################################
-
-cat <<EOL
- __ __
- .----.--.--.-----.___.--.--.|__|.----.| |_
- | _| | | |___| | || || _|| _|
- |__| |_____|__|__| \___/ |__||__| |____|
- OpenSLX virtual machine environment preparation script ...
-
-EOL
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc
deleted file mode 100644
index 05d55f00..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc
+++ /dev/null
@@ -1,87 +0,0 @@
-###########################################
-# Include: Set hardware related variables #
-###########################################
-
-# take last two digits of current pid...
-VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2)
-
-# Make sure cpu_cores is not empty
-cpu_cores=${cpu_cores:-"1"}
-
-# Amount of memory for the VM. Be generous if diff is written to HDD
-if mount | grep -q '^/dev/sd.*on.*/tmp'; then
- reserve=20
- min=768
- max=1536
-else
- reserve=65
- min=768
- max=8192
-fi
-
-# Calculate absulute amount of RAM that should stay available to the host
-reserve="$[ ( $totalmem * $reserve ) / 100 ]"
-# Respect some upper and lower bounds for the host amount
-[ "$reserve" -lt "$min" ] && reserve="$min"
-[ "$reserve" -gt "$max" ] && reserve="$max"
-
-# Get a result which can be divided by 4
-mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]"
-if [ -n "$mainvirtmem" ]; then
- forcemem="$[ "$mainvirtmem" / 4 * 4 ]"
- mem="$forcemem"
-fi
-hostmem="$[ $totalmem - $mem ]"
-
-# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are
-# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on
-# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes
-# and append $macaddrssuffix
-macguestpart="00:50:56:${VM_ID}"
-machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}')
-macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]")
-macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]")
-
-if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then
- slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)"
-fi
-
-# Virtual fd/cd/dvd and drive devices, floppy b: for configuration
-# if $floppy_0 from virtualization.conf set then fdtest="TRUE"
-fdtest=${floppy_0:+"TRUE"}
-# if $fdtest not set floppy0="FALSE", else "TRUE"
-floppy0=${fdtest:-"FALSE"}
-# if $cdrom_0 from virtualization.conf set then cdtest="TRUE"
-cdtest=${cdrom_0:+"TRUE"}
-# if $cdtest not set cdrom0="FALSE", else "TRUE"
-cdrom0=${cdtest:-"FALSE"}
-# if $cdrom_1 from virtualization.conf set then cdtest="TRUE"
-cdtest=${cdrom_1:+"TRUE"}
-# if $cdtest not set cdrom1="FALSE", else "TRUE"
-cdrom1=${cdtest:-"FALSE"}
-# IDE is expected default, test for the virtual disk image type should
-# be done while creating the runscripts ...
-# TODO enable SCSI support instead of just disabling it.
-ide="TRUE"
-scsi="FALSE"
-hddrv="ide"
-audio="true"
-remotedesktopport="590${VM_ID}"
-
-
-# Enable 3D
-enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string)
-
-# Add rw share for home dir
-homesharepath="${HOME}/PERSISTENT"
-homesharename="home"
-
-# Add common share
-commonsharepath="${HOME}/SHARE"
-commonsharename="share"
-
-# Set hostname: using original hostname and adding string
-hostname="virt-$(hostname)"
-
-writelog "\tVM Hostname:\t\t$hostname"
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
deleted file mode 100644
index 337562dc..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
+++ /dev/null
@@ -1,73 +0,0 @@
-###########################################################
-# Include: Setup dnbd for image access, nfs/cifs fallback #
-###########################################################
-
-writelog "Now in setup_image_access.inc ..."
-
-# Try to use dnbd3 to access the image
-unset vm_diskfile
-unset vm_revision
-unset dnbd3_fuse_mount_point
-unset dnbd3_tmplog
-if ! which dnbd3-fuse; then
- writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH"
-elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then
- writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes"
-else
- # Mount path for images mounted with dnbd3-fuse
- dnbd3_fuse_mount_point="$TMPDIR/dnbd3fuse.mnt"
- mkdir -p "${dnbd3_fuse_mount_point}"
- # start dnbd3-fuse in subshell
- dnbd3_tmplog="$TMPDIR/dnbd3fuse.log"
- dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM"
- rm -f -- "$dnbd3_exitflag"
- (
- dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${imgrelpath}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1
- RET=$?
- touch "$dnbd3_exitflag"
- if [ "$RET" != "0" ]; then
- writelog "dnbd3-fuse stopped working (Exit code $RET)"
- slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${imgrelpath}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}"
- fi
- sleep 2
- rm -f -- "$dnbd3_tmplog" "$dnbd3_exitflag"
- ) &
- # give it a bit of time
- usleep 250000
- # check if we have the image
- for TIMEOUT in 0.5 1 1 OUT; do
- if [ -r "${dnbd3_fuse_mount_point}/img" ]; then
- vm_revision="$(grep -m 1 "^Revision:" "${dnbd3_fuse_mount_point}/status" | cut -d" " -f2)"
- vm_diskfile="${dnbd3_fuse_mount_point}/img"
- writelog "DNBD3: $imgrelpath on $vm_diskfile with rid $vm_revision"
- vmpath="$vm_diskfile"
- break
- fi
- [ "$TIMEOUT" = "OUT" -o -e "$dnbd3_exitflag" ] && break
- sleep "$TIMEOUT"
- done
-
- if [ -z "$vm_diskfile" ]; then
- slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found, trying NFS/CIFS..." "$dnbd3_tmplog"
- writelog "No working dnbd3 server found :-("
- fi
-fi
-
-# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system
-if [ -z "$vm_diskfile" ]; then
- new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -n 1)
- [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}"
- vm_diskfile="$vmpath"
-fi
-
-# Check if virtual machine container file exists
-if ! [ -e "${vmpath}" ]; then
- slxlog "virt-image-missing" "VM image $vmpath not found!"
- writelog "Virtual machine image ${vmpath} not found!"
- 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
-
-writelog "Virtual machine disk file: $vm_diskfile"
-
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
deleted file mode 100644
index 201c0ff5..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
+++ /dev/null
@@ -1,64 +0,0 @@
-########################
-# Include: Setup sound #
-########################
-# 8086:1e20: Sound card in bwPX4
-
-writelog "Starting sound setup ..."
-
-if lspci -n | grep -E -i '8086:1e20( |$)'; then
- VOL="100%" # bwPC 4: Speaker too quiet :-(
-else
- VOL="85%"
-fi
-
-if true; then
- # detecting which card is to be used
- writelog "Detecting which sound card to use ..."
- PROC="/proc/asound/cards"
- if [ ! -r "$PROC" ]; then
- writelog "'${PROC}' not found or not readable."
- SOUND_CARD_INDEX=0
- SOUND_CARD_COUNT=1
- else
- # Try to filter HDMI cards first
- SOUND_CARD_INDEX=$(grep -v -i 'HDMI' "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1)
- # If empty, try again with all
- [ -z "${SOUND_CARD_INDEX}" ] && SOUND_CARD_INDEX=$(cat "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1)
- if [ -z "${SOUND_CARD_INDEX}" ]; then
- writelog "No sound card found."
- SOUND_CARD_INDEX=0
- fi
- SOUND_CARD_COUNT=$(grep -E '^[[:space:]]{0,2}[0-9]+[[:space:]]+' "${PROC}" | wc -l)
- fi
-
- SOUND_CARD_INDEX="$(grep -E -o '[0-9]+' <<<$SOUND_CARD_INDEX)"
- writelog "Detected sound card index is: $SOUND_CARD_INDEX"
- writelog "Sound card count: $SOUND_CARD_COUNT"
-
- # Adjust sound volume (playback)... Random mixer names we have encountered during testing
- writelog "Setting up volume..."
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Master' "$VOL" unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'PCM' "$VOL" unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'CD' "$VOL" unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Headphone' "$VOL" unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Front' "$VOL" unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Speaker' "$VOL" unmute
- # Recording. It seems that (most) devices need the volume set to 0, so you
- # don't hear your own mic input, but should be unmuted. Also on some cards,
- # you need to set the cap option on the mic you want to use, while other cards
- # will just ignore that option.
- # Plus, most cards have a Capture mixer, which needs to be set to cap too, and
- # have its volume turned up. (There'll probably be some cards that need yet
- # another setup, but this works for now on 4 tested cards)
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic Boost' "50%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic' "0%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic Boost' "50%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic' "0%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic Boost' "50%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic' "0%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Capture' "100%" cap unmute
- amixer -q -c "$SOUND_CARD_INDEX" sset 'Input Source' 'Front Mic' # Let's hope nobody uses rear mic...
- # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded
- amixer -q -c pcsp sset Master "0%" mute
- writelog "Done setting up volume."
-fi >> "${LOGFILE}" 2>&1
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc b/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc
deleted file mode 100644
index 33fd363b..00000000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-##########################################################################
-# Include: Setup virtual machine hypervisor via vm-specific include file #
-##########################################################################
-
-# Get all virtual machine specific stuff from the respective include file
-if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then
- 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."
- error_user "Konnte den Virtualisierer '$xmlvirt' 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="${xmlvirt}"
-
-# Now including the hypervisor specific include file:
-if ! source "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then
- slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced (contains syntax errors?)" "$xmlvirt"
- writelog "Erroneous run-virt.include for $xmlvirt"
- error_user "Das Start-Script für den Virtualisierer '$xmlvirt' ist fehlerhaft.
- Starten Sie den Computer neu und wenden Sie sich an den Support, wenn das Problem weiterhin besteht."
-fi
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/pam_script_ses_close.d/runvirt-firewall-clear b/remote/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/remote/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/remote/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
index 363e5253..235cf4be 100755
--- a/remote/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
+++ b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
@@ -31,13 +31,12 @@ fi > "$OUTFILE" 2>&1
if [ "$RET" -ne "0" ]; then
if [ -s "$OUTFILE" ]; then
- slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot." "$OUTFILE"
- sleep 1
+ 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/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
index ba3122a1..cf94b3a2 100755
--- a/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
+++ b/remote/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
@@ -30,21 +30,6 @@ VMCHOOSER_DIR="/opt/openslx/vmchooser"
VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
DHCP_NAT_CONF="/opt/openslx/vmchooser/config/udhcpd-nat1.conf"
-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"
-
# setup more scratch space for virtual machines, if configured
mkdir -p /tmp/virt /var/log/samba /run/samba
@@ -168,17 +153,23 @@ 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}," \
- "${DHCP_NAT_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
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
index 5353d21a..447f98bc 100755..120000
--- a/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
+++ b/remote/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
@@ -1,111 +1 @@
-#!/bin/bash
-# Full bash required
-# -----------------------------------------------------------------------------
-# Copyright (c) 2007..2010 - RZ Uni FR
-# Copyright (c) 2007..2013 - OpenSLX GmbH
-#
-# This program is free software distributed under the GPL version 2.
-# See http://openslx.org/COPYING
-#
-# If you have any feedback please consult http://openslx.org/feedback and
-# send your suggestions, praise, or complaints to feedback@openslx.org
-#
-# General information about OpenSLX can be found at http://openslx.org/
-# -----------------------------------------------------------------------------
-# run-virt.sh
-# - This is the generic wrapper for the several virtualization solutions.
-# The idea is to setup a set of variables used by at least two different
-# tools and then include the specific plugin which configures the speci-
-# fied virtualization tool.
-################################################################################
-
-RUNVIRTINCLUDEDIR=/opt/openslx/scripts/includes
-xmlfile="$1"
-
-# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string())
-source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc && trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM
-# Define default dirs / get configs
-source ${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc
-# Function to detect whether we can use the new way (vmx via http) or the old way (legacy):
-source ${RUNVIRTINCLUDEDIR}/detect_legacy.inc # This yields LEGACY, IMGUUID, IMGVMX
-# For scanning for certain usb classes
-source "${RUNVIRTINCLUDEDIR}/usb_detector.inc"
-
-if [ "$LEGACY" ]; then
- # check for important files used (filecheck()) - vestigial?
- source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc
- # Get XML file and dir, legacy (old way)
- source ${RUNVIRTINCLUDEDIR}/get_xml_file_dir_legacy.inc # xmlfile=$1
- # xml file sanity checks, legacy
- source ${RUNVIRTINCLUDEDIR}/check_runvirt_xml_sanity_legacy.inc
- # print console logo
- source ${RUNVIRTINCLUDEDIR}/print_runvirt_console_logo.inc
- # Read needed variables from XML file
- source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables_legacy.inc
- # Declaration of hardware relatedt variables
- source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables_legacy.inc
- # Sound setup the rest of the environment and run the configured vm
- source ${RUNVIRTINCLUDEDIR}/setup_sound.inc
- # Start printer daemon
- source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc
- # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc.
- source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc
- # Try to use dnbd3 to access the image, nfs/cifs fallback
- source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc
- # Get all virtual machine specific stuff from the respective include file
- source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc
- # start a windowmanager for easier handling
- source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc
- # 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
-
- # Check if tcpsvd is running. Do not check immediately after spawning,
- # as this could result in success even if it's not really working.
- source ${RUNVIRTINCLUDEDIR}/check_lpd.inc
-
-fi
-
-# This will start the VM
-writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}"
-
-# Transported from vmware-runvirt include
-sync
-
-eval ${VIRTCMD} ${VIRTCMDOPTS}
-writelog "Bye."
-
-# Postrun for commands after virtualization finishes
-if [ -n "${POSTRUN}" ]; then
- eval ${POSTRUN} >/dev/null 2>&1
-fi
-
-cleanexit 0
+/opt/openslx/vmchooser/vmchooser-run_virt \ No newline at end of file
diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf b/remote/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
index bca1397c..95d8ebc0 100644
--- a/remote/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
index 8b98311a..c0904c92 100755
--- a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
Binary files differ
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc
index f77e955b..974a5626 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/download_vm_metadata.inc
@@ -7,19 +7,15 @@
writelog "Detecting current/legacy mode ..."
-# First, let's try to extract an imguuid from xmlfile:
-declare -rg IMGUUID=$(grep -i -o '<uuid param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
declare -rg TMPCONFIG="$TMPDIR/vmconfig.tmp"
-writelog "IMGUUID extracted: $IMGUUID"
-
# 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 -O "$TMPCONFIG" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}" 2>/dev/null >&2; then
+ 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."
@@ -32,3 +28,5 @@ else
fi
fi
+readonly LEGACY
+
diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/get_xml_file_variables.inc b/remote/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/remote/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/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc
index 9a46bc88..7ef03c1c 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_hardware_variables.inc
@@ -19,6 +19,7 @@ get_vm_id() {
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
@@ -38,18 +39,18 @@ else
fi
# Calculate absulute amount of RAM that should stay available to the host
-reserve="$[ ( $totalmem * $reserve ) / 100 ]"
+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 ]"
+mem="$(( ( ( totalmem - reserve ) / 4 ) * 4 ))"
if [ -n "$mainvirtmem" ]; then
- forcemem="$[ "$mainvirtmem" / 4 * 4 ]"
+ forcemem="$(( mainvirtmem / 4 * 4 ))"
mem="$forcemem"
fi
-hostmem="$[ $totalmem - $mem ]"
+hostmem="$(( totalmem - mem ))"
# Fill in VMID
macaddrsuffix=$(echo "$macaddrsuffix" | sed "s/%VMID%/${VM_ID}/")
@@ -75,17 +76,9 @@ cdrom0=${cdtest:-"FALSE"}
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)
+# RDP/VNC port (59001 - 59099)
+remotedesktopport="590${VM_ID}"
# Add rw share for home dir
homesharepath="${HOME}/PERSISTENT"
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc
index 4c4ccf1d..cd9a573a 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/set_runvirt_variables.inc
@@ -4,8 +4,8 @@
VMCHOOSER_DIR="/opt/openslx/vmchooser"
VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
-LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log"
USER="$(whoami)"
+LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log"
TMPDIR="/tmp/virt/${USER}/$$"
readonly VMCHOOSER_DIR VMCHOOSER_CONF_DIR LOGFILE TMPDIR USER
diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_firewall.inc
new file mode 100644
index 00000000..f0820ed7
--- /dev/null
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_image_access.inc
new file mode 100644
index 00000000..4240d9ca
--- /dev/null
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc
index ee0b2c70..2fb9310a 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_printer_lpd.inc
@@ -31,3 +31,16 @@ tcpsvd -E 192.168.101.1 5515 \
# 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/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_sound.inc
new file mode 100644
index 00000000..c6cece3d
--- /dev/null
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc
index ff562b20..d9ae052c 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_virtual_floppy.inc
@@ -5,6 +5,10 @@
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}"
@@ -19,7 +23,7 @@ else
SHARE_REMAP_MODE_INI="$SHARE_REMAP_MODE"
fi
[ -z "$SHARE_CREATE_MISSING_REMAP" ] && SHARE_CREATE_MISSING_REMAP="1"
-RESOLUTION=$(xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' \
+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
@@ -46,7 +50,16 @@ else
done
fi
-# Info file
+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)
@@ -57,6 +70,7 @@ resolution=${RESOLUTION}
createMissingRemap=${SHARE_CREATE_MISSING_REMAP}
remapMode=${SHARE_REMAP_MODE_INI}
homeDrive=${SHARE_HOME_DRIVE}
+scriptExt=${EXT}
[remap]
documents=${SHARE_DOCUMENTS}
@@ -66,8 +80,7 @@ media=${SHARE_MEDIA}
other=${SHARE_OTHER}
HIER
-
-# Copy all them there files into floppy image
+# 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
@@ -77,6 +90,12 @@ 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/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/setup_vm_hypervisor.inc
new file mode 100644
index 00000000..7709a85d
--- /dev/null
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc
index da43f341..da43f341 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/start_windowmanager.inc
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc
index 9769c81d..a2d442e4 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/usb_detector.inc
@@ -2,7 +2,7 @@
# 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"
+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:
diff --git a/remote/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
index af9758e2..ca475da0 100644
--- a/remote/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc
+++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
@@ -36,6 +36,9 @@ $*"
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
@@ -74,3 +77,31 @@ rv_clean_string() {
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/remote/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall b/remote/modules/run-virt/data/opt/openslx/vmchooser/scripts/set-firewall
new file mode 100644
index 00000000..2773150c
--- /dev/null
+++ b/remote/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/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt b/remote/modules/run-virt/data/opt/openslx/vmchooser/vmchooser-run_virt
new file mode 100755
index 00000000..b945cca2
--- /dev/null
+++ b/remote/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
+
diff --git a/remote/modules/run-virt/fwtool/main.c b/remote/modules/run-virt/fwtool/main.c
new file mode 100644
index 00000000..9e272384
--- /dev/null
+++ b/remote/modules/run-virt/fwtool/main.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int main(int argc, char **argv)
+{
+ if (argc < 2) {
+ puts("Nee\n");
+ return 1;
+ }
+ char * const nargv[] = {
+ "bash",
+ "/opt/openslx/vmchooser/scripts/set-firewall",
+ argv[1],
+ 0
+ };
+ char * const nenv[] = {
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin",
+ "HOME=/root",
+ "LC_ALL=C",
+ "LANG=C",
+ 0
+ };
+
+ setresuid(0, 0, 0);
+ setregid(0, 0);
+
+ execve("/bin/bash", nargv, nenv);
+}
+
diff --git a/remote/modules/run-virt/module.build b/remote/modules/run-virt/module.build
index e9b0d581..56afd839 100644
--- a/remote/modules/run-virt/module.build
+++ b/remote/modules/run-virt/module.build
@@ -11,9 +11,10 @@ build () {
# Compile pwdaemon
mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/bin"
gcc -std=gnu99 -o "${MODULE_BUILD_DIR}/opt/openslx/bin/pwdaemon" -Os "${MODULE_DIR}/pw_daemon.c" || perror "Could not compile the pwdaemon"
+ gcc -std=gnu99 -o "${MODULE_BUILD_DIR}/opt/openslx/bin/slxfwtool" -Os "${MODULE_DIR}/fwtool/main.c" || perror "Could not compile slxfwtool"
}
post_copy() {
- :
+ chmod +s "${TARGET_BUILD_DIR}/opt/openslx/bin/slxfwtool" || perror "Could not set suid bit on slxfwtool"
}
diff --git a/remote/modules/run-virt/module.conf b/remote/modules/run-virt/module.conf
index b52fae0e..cc1b34a6 100644
--- a/remote/modules/run-virt/module.conf
+++ b/remote/modules/run-virt/module.conf
@@ -2,5 +2,7 @@ REQUIRED_BINARIES="
lsusb
mcopy
pwdaemon
+ slxfwtool
+ xmlstarlet
"
diff --git a/remote/modules/run-virt/module.conf.ubuntu b/remote/modules/run-virt/module.conf.ubuntu
index b06efa7a..b6008fa0 100644
--- a/remote/modules/run-virt/module.conf.ubuntu
+++ b/remote/modules/run-virt/module.conf.ubuntu
@@ -1,9 +1,11 @@
REQUIRED_INSTALLED_PACKAGES="
usbutils
mtools
+ xmlstarlet
"
REQUIRED_CONTENT_PACKAGES="
usbutils
mtools
+ xmlstarlet
"
diff --git a/remote/modules/run-virt/winres/compile b/remote/modules/run-virt/winres/compile
index 772571fb..da2f59eb 100755
--- a/remote/modules/run-virt/winres/compile
+++ b/remote/modules/run-virt/winres/compile
@@ -2,7 +2,7 @@
rm -- winres.exe
i686-w64-mingw32-windres -i winres.rc -o resource.res -O coff
-i686-w64-mingw32-gcc -Wall -Wextra -pedantic -Wno-unused-parameter -std=c99 -Os -Wl,--subsystem,windows -o winres.exe winres.c resource.res -lole32 -luuid -lgdi32 -lws2_32 -lshell32 -lmpr
+i686-w64-mingw32-gcc -Wall -Wextra -pedantic -Wno-unused-parameter -flto -std=c99 -Os -Wl,--subsystem,windows -o winres.exe winres.c resource.res -lole32 -luuid -lgdi32 -lws2_32 -lshell32 -lmpr -lshlwapi
rm -- resource.res
if strip winres.exe; then
echo "Successfully created winres.exe"
diff --git a/remote/modules/run-virt/winres/winres.c b/remote/modules/run-virt/winres/winres.c
index 1c5650b8..44654161 100644
--- a/remote/modules/run-virt/winres/winres.c
+++ b/remote/modules/run-virt/winres/winres.c
@@ -4,6 +4,7 @@
#define WIN32_LEAN_AND_MEAN
#define _UNICODE
#define UNICODE
+#define NO_SHLWAPI_STRFCNS
#include <windows.h>
#include <winsock2.h>
#include <winnetwk.h>
@@ -21,6 +22,8 @@
#include <shlguid.h>
#include <strsafe.h>
#include <tlhelp32.h>
+#include <shlwapi.h>
+#include <shellapi.h>
DEFINE_GUID(ID_IAudioEndpointVolume, 0x5CDF2C82, 0x841E, 0x4546, 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A);
DEFINE_GUID(ID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6);
@@ -30,6 +33,7 @@ DEFINE_GUID(ID_MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4,
typedef struct {
const char* path;
+ const char* pathIp;
const char* letter;
const char* shortcut;
const char* user;
@@ -43,6 +47,9 @@ static const ssize_t KEYLEN = 16;
#define SETTINGS_FILE "B:\\OPENSLX.INI"
#define SETTINGS_FILE_W L"B:\\OPENSLX.INI"
+static BOOL _debug = FALSE;
+
+static HINSTANCE hKernel32, hShell32;
static OSVERSIONINFO winVer;
static BOOL bGetShares = FALSE;
static netdrive_t drives[DRIVEMAX];
@@ -60,6 +67,9 @@ static int _folderStatus = FS_UNKNOWN; // -1 = Not handled yet, 0 = patching fai
static int _remapMode = RM_NONE;
static const char* _remapHomeDrive = NULL;
+#define SCRIPTFILELEN (50)
+char _scriptFile[SCRIPTFILELEN];
+
struct {
BOOL documents;
BOOL downloads;
@@ -69,6 +79,7 @@ struct {
} remap;
static BOOL _createMissingRemap = FALSE;
+static void setPowerState();
static int setResolution();
static int muteSound();
static int setShutdownText();
@@ -186,27 +197,69 @@ exit_func:
bInProc = FALSE;
}
-static void loadPaths()
+typedef HRESULT (*GFPTYPE)(HWND, int, HANDLE, DWORD, wchar_t*);
+typedef HRESULT (*GSFTYPE)(HWND, int, ITEMIDLIST**);
+typedef BOOL (*ID2PTYPE)(const ITEMIDLIST*, wchar_t*);
+
+/**
+ * Load given path (CSIDL). Store in default (must be allocated to hold at least MAX_PATH+1 chars).
+ * If it could not be retrieved by CSIDL and envName is not NULL, it will be read from the
+ * environment if possible.
+ * fallback will be used if everything else fails.
+ * fallback can be NULL, in which case the fallback is empty.
+ */
+static void loadPath(wchar_t *dest, int csidl, wchar_t *envName, wchar_t *fallback)
{
- // Determine a couple of default directories
- if (SHGetFolderPathW(HWND_DESKTOP, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, programsPath) != S_OK) {
- DWORD ret = GetEnvironmentVariableW(L"ProgramFiles", programsPath, MAX_PATH+1);
- if (ret == 0 || ret > MAX_PATH) {
- StringCchPrintfW(programsPath, MAX_PATH+1, L"C:\\Program Files");
+ if (hShell32 != NULL) {
+ GFPTYPE aGetFolderPath = (GFPTYPE)GetProcAddress(hShell32, "SHGetFolderPathW");
+ if (aGetFolderPath != NULL) {
+ if ((aGetFolderPath)(HWND_DESKTOP, csidl, NULL, SHGFP_TYPE_CURRENT, dest) == S_OK)
+ return;
}
- }
- if (SHGetFolderPathW(HWND_DESKTOP, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, windowsPath) != S_OK) {
- DWORD ret = GetEnvironmentVariableW(L"windir", windowsPath, MAX_PATH+1);
- if (ret == 0 || ret > MAX_PATH) {
- StringCchPrintfW(windowsPath, MAX_PATH+1, L"C:\\WINDOWS");
+ // Fallback
+ GSFTYPE aGetSpecialFolder = (GSFTYPE)GetProcAddress(hShell32, "SHGetSpecialFolderLocation");
+ ID2PTYPE aPathToId = (ID2PTYPE)GetProcAddress(hShell32, "SHGetPathFromIDListW");
+ if (aGetSpecialFolder != NULL && aPathToId != NULL) {
+ ITEMIDLIST *list = NULL;
+ HRESULT ret1 = (aGetSpecialFolder)(HWND_DESKTOP, csidl, &list);
+ BOOL ret2 = FALSE;
+ if (ret1 == 0) {
+ ret2 = (aPathToId)(list, dest);
+ }
+ if (list != NULL) {
+ CoTaskMemFree(list);
+ }
+ if (ret2)
+ return;
}
}
- if (SHGetFolderPathW(HWND_DESKTOP, CSIDL_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, desktopPath) != S_OK) {
- desktopPath[0] = 0;
+ if (envName != NULL) {
+ // Fallback
+ DWORD ret = GetEnvironmentVariableW(envName, dest, MAX_PATH+1);
+ if (ret > 0 && ret <= MAX_PATH)
+ return;
+ }
+ if (fallback != NULL) {
+ StringCchPrintfW(programsPath, MAX_PATH+1, fallback);
+ return;
}
+ *dest = '\0';
+}
+
+static void loadPaths()
+{
+ // Determine a couple of default directories
+ // dest, id, env, fallback
+ loadPath(programsPath, CSIDL_PROGRAM_FILES, L"ProgramFiles", L"C:\\Program Files");
+ loadPath(windowsPath, CSIDL_WINDOWS, L"windir", L"C:\\WINDOWS");
+ loadPath(desktopPath, CSIDL_DESKTOPDIRECTORY, NULL, NULL);
if (GetTempPathW(MAX_PATH+1, tempPath) == 0) {
- tempPath[0] = 0;
+ DWORD ret = GetEnvironmentVariableW(L"TEMP", tempPath, MAX_PATH+1);
+ if (ret == 0 || ret > MAX_PATH) {
+ tempPath[0] = 0;
+ }
}
+ //wlog(L"Programs: %s, Windows: %s, Desktop: %s, Temp: %s", programsPath, windowsPath, desktopPath, tempPath);
StringCchPrintfW(logFile, LOGFILELEN, L"%s\\%s", desktopPath, L"openslx.log");
FILE *tfh = _wfopen(logFile, L"a+");
if (tfh == NULL) {
@@ -238,16 +291,28 @@ static void loadPaths()
buffer[1] = ':';
buffer[2] = '\0';
_remapHomeDrive = strdup(buffer);
+ // Get extension for autorun script
+ GetPrivateProfileStringA("openslx", "scriptExt", "", buffer, sizeof(buffer), SETTINGS_FILE);
+ StringCchPrintfA(_scriptFile, SCRIPTFILELEN, "B:\\runscript%s", buffer);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
+ hKernel32 = LoadLibraryW(L"kernel32.dll");
+ if (hKernel32 == NULL) {
+ alog("Cannot load kernel32.dll");
+ }
+ hShell32 = LoadLibraryW(L"shell32.dll");
+ if (hShell32 == NULL) {
+ alog("Cannot load shell32.dll");
+ }
winVer.dwOSVersionInfoSize = sizeof(winVer);
BOOL retVer = GetVersionEx(&winVer);
- CoInitialize(NULL);
+ CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
_startTime = GetTickCount();
loadPaths();
if (lpCmdLine != NULL && strstr(lpCmdLine, "debug") != NULL) {
+ _debug = TRUE;
alog("Windows Version %d.%d", (int)winVer.dwMajorVersion, (int)winVer.dwMinorVersion);
}
// Mute sound by default
@@ -255,12 +320,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
muteSound();
// Disable screen saver as it might give the false impression that the session is securely locked
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
- // Disable standby and idle-mode (this is a VM!)
- if (winVer.dwMajorVersion >= 6) { // Vista+
- SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_AWAYMODE_REQUIRED);
- } else { // XP/2003
- SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
- }
+ // Same with standby
+ setPowerState();
// Any network shares to mount?
readShareFile();
if (bGetShares || _remapMode != RM_NONE) {
@@ -285,12 +346,18 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
alog("Could not create timer for resolution setting: %d", (int)GetLastError());
}
}
+ // Runscript (if any)
+ if (PathFileExistsA(_scriptFile)) {
+ ShellExecuteA(NULL, "open", _scriptFile, NULL, "B:\\", SW_SHOWNORMAL);
+ }
// Message pump
MSG Msg;
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
+ FreeLibrary(hKernel32);
+ FreeLibrary(hShell32);
return 0;
}
@@ -333,6 +400,25 @@ static int execute(wchar_t *path, wchar_t *arguments)
return (int)exitCode;
}
+typedef EXECUTION_STATE (WINAPI *TETYPE)(EXECUTION_STATE);
+
+static void setPowerState()
+{
+ // Disable standby and idle-mode (this is a VM!)
+ if (hKernel32 == NULL || winVer.dwMajorVersion < 5 || (winVer.dwMajorVersion == 5 && winVer.dwMinorVersion < 1))
+ return;
+ TETYPE aExecState = (TETYPE)GetProcAddress(hKernel32, "SetThreadExecutionState");
+ if (aExecState == NULL) {
+ alog("Cannot get SetThreadExecutionState from kernel32.dll");
+ return;
+ }
+ if (winVer.dwMajorVersion >= 6) { // Vista+
+ (aExecState)(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_AWAYMODE_REQUIRED);
+ } else { // XP/2003
+ (aExecState)(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
+ }
+}
+
static int setResolution()
{
int ret;
@@ -482,6 +568,37 @@ static char* getToken(char **ptr, BOOL doDup)
return dest;
}
+const char* uncReplaceFqdnByIp(const char* path)
+{
+ if (path == NULL || path[0] != '\\' || path[1] != '\\')
+ return NULL;
+ const char *host = path + 2;
+ const char *rest = strchr(host, '\\');
+ if (rest == NULL || rest - host >= 200)
+ return NULL;
+ char name[201];
+ strncpy(name, host, rest - host);
+ name[rest-host] = '\0';
+ if (_debug) {
+ alog("Trying to resolve '%s'...", name);
+ }
+ struct hostent *remote = gethostbyname(name);
+ if (remote == NULL || remote->h_addrtype != AF_INET || remote->h_addr_list[0] == 0)
+ return NULL;
+ struct in_addr addr;
+ addr.s_addr = *(u_long*)remote->h_addr_list[0];
+ char *ip = inet_ntoa(addr);
+ if (ip == NULL)
+ return NULL;
+ size_t len = 2 /* \\ */ + strlen(ip) /* 1.2.3.4 */ + strlen(rest) /* \path\to\share */ + 1 /* nullchar */;
+ char *retval = malloc(len);
+ snprintf(retval, len, "\\\\%s%s", ip, rest);
+ if (_debug) {
+ alog("Turned '%s' into '%s'", path, retval);
+ }
+ return retval;
+}
+
#define FREENULL(x) do { free((void*)(x)); (x) = NULL; } while (0)
static void readShareFile()
@@ -513,6 +630,9 @@ static void readShareFile()
if (d->path == NULL || d->path[0] == '\0')
goto drive_fail;
d->success = FALSE;
+ // Hack: For unknown reasons, with some servers mounting fails using a fqdn, but using the ip address instead succeeds.
+ d->pathIp = uncReplaceFqdnByIp(d->path);
+ //
idx++;
continue;
drive_fail:
@@ -667,11 +787,14 @@ static void postSuccessfulMount(const netdrive_t *d, wchar_t *letter)
}
}
-static BOOL mountNetworkShare(const netdrive_t *d)
+static BOOL mountNetworkShare(const netdrive_t *d, BOOL useIp)
{
wchar_t path[BUFLEN] = L"", user[BUFLEN] = L"", pass[BUFLEN] = L"", letter[10] = L"", shortcut[BUFLEN] = L"";
int ok = -1;
- ok &= MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)d->path, -1, (LPWSTR)path, BUFLEN) > 0;
+ if (useIp && d->pathIp[0] == '\0')
+ return FALSE;
+ const char *uncPath = useIp ? d->pathIp : d->path;
+ ok &= MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)uncPath, -1, (LPWSTR)path, BUFLEN) > 0;
if (d->letter != NULL) {
ok &= MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)d->letter, -1, (LPWSTR)letter, 10) > 0;
}
@@ -685,7 +808,7 @@ static BOOL mountNetworkShare(const netdrive_t *d)
ok &= MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)d->shortcut, -1, (LPWSTR)shortcut, BUFLEN) > 0;
}
if (!ok || path[0] == 0) { // Convert failed/no path - return true anyways since retrying wouldn't change anything
- alog("mountNetworkShare: utf8 to utf16 failed, or path empty (src: '%s')", d->path);
+ alog("mountNetworkShare: utf8 to utf16 failed, or path empty (src: '%s')", uncPath);
return TRUE;
}
DWORD retval;
@@ -744,7 +867,9 @@ static BOOL mountNetworkShares()
break;
if (drives[i].success)
continue;
- if (mountNetworkShare(&drives[i])) {
+ if (mountNetworkShare(&drives[i], FALSE)) {
+ drives[i].success = TRUE;
+ } else if (mountNetworkShare(&drives[i], TRUE)) {
drives[i].success = TRUE;
} else {
failCount++;
@@ -788,7 +913,7 @@ static void remapViaSharedFolder()
}
}
// Map vmware shared folder
- mountNetworkShare(&d);
+ mountNetworkShare(&d, FALSE);
}
static char* xorString(const uint8_t* text, int len, const uint8_t* key)
@@ -931,6 +1056,9 @@ static BOOL patchRegPath(BOOL *patchOk, BOOL *anyMapped, HKEY hKey, wchar_t *let
return FALSE;
}
+typedef HANDLE (WINAPI *SNTYPE)(DWORD, DWORD);
+typedef BOOL (WINAPI *P32TYPE)(HANDLE, PROCESSENTRY32W*);
+
static void patchUserPaths(wchar_t *letter)
{
LONG ret;
@@ -989,15 +1117,36 @@ static void patchUserPaths(wchar_t *letter)
return;
}
// Kill explorer
+ // Late binding
+ if (hKernel32 == NULL || winVer.dwMajorVersion < 5 || (winVer.dwMajorVersion == 5 && winVer.dwMinorVersion < 1)) {
+ return;
+ }
+ SNTYPE aCreateSnapshot;
+ P32TYPE aProcessFirst, aProcessNext;
+ aCreateSnapshot = (SNTYPE)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
+ if (aCreateSnapshot == NULL) {
+ alog("No CreateToolhelp32Snapshot in kernel.dll");
+ return;
+ }
+ aProcessFirst = (P32TYPE)GetProcAddress(hKernel32, "Process32FirstW");
+ if (aProcessFirst == NULL) {
+ alog("No Process32FirstW in kernel.dll");
+ return;
+ }
+ aProcessNext = (P32TYPE)GetProcAddress(hKernel32, "Process32NextW");
+ if (aProcessNext == NULL) {
+ alog("No Process32NextW in kernel.dll");
+ return;
+ }
PROCESSENTRY32W entry;
entry.dwSize = sizeof(PROCESSENTRY32W);
- HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (snapshot != INVALID_HANDLE_VALUE && Process32FirstW(snapshot, &entry)) {
+ HANDLE snapshot = (aCreateSnapshot)(TH32CS_SNAPPROCESS, 0);
+ if (snapshot != INVALID_HANDLE_VALUE && (aProcessFirst)(snapshot, &entry)) {
do {
if (_wcsicmp(entry.szExeFile, L"explorer.exe") == 0) {
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
if (hProcess == NULL) {
- alog("Opening explorer.exe failed");
+ alog("Cannot OpenProcess explorer.exe: Remapped paths will not work properly (GetLastError=%d)", (int)GetLastError());
} else {
if (TerminateProcess(hProcess, 23)) {
killOk = TRUE;
@@ -1005,7 +1154,7 @@ static void patchUserPaths(wchar_t *letter)
CloseHandle(hProcess);
}
}
- } while (Process32NextW(snapshot, &entry));
+ } while ((aProcessNext)(snapshot, &entry));
} else {
alog("Could not get process list");
}
diff --git a/remote/modules/safe-mode/data/etc/X11/Xsession.d/00-exam-mode b/remote/modules/safe-mode/data/etc/X11/Xsession.d/00-exam-mode
new file mode 100644
index 00000000..d4ab5359
--- /dev/null
+++ b/remote/modules/safe-mode/data/etc/X11/Xsession.d/00-exam-mode
@@ -0,0 +1,9 @@
+#!/bin/ash Being sourced but hey
+
+. /opt/openslx/config
+
+if [ "x$SLX_EXAM" = "xyes" ]; then
+ # Force usage of vmchooser
+ set -- "$(which vmchooser)"
+fi
+
diff --git a/remote/modules/screen-standby/data/etc/X11/Xreset.d/screen-standby b/remote/modules/screen-standby/data/etc/X11/Xreset.d/screen-standby
new file mode 120000
index 00000000..b25fe082
--- /dev/null
+++ b/remote/modules/screen-standby/data/etc/X11/Xreset.d/screen-standby
@@ -0,0 +1 @@
+/opt/openslx/scripts/screen-standby \ No newline at end of file
diff --git a/remote/modules/screen-standby/data/etc/X11/Xsession.d/screen-standby b/remote/modules/screen-standby/data/etc/X11/Xsession.d/screen-standby
new file mode 120000
index 00000000..b25fe082
--- /dev/null
+++ b/remote/modules/screen-standby/data/etc/X11/Xsession.d/screen-standby
@@ -0,0 +1 @@
+/opt/openslx/scripts/screen-standby \ No newline at end of file
diff --git a/remote/modules/screen-standby/data/etc/X11/Xsetup.d/screen-standby b/remote/modules/screen-standby/data/etc/X11/Xsetup.d/screen-standby
new file mode 120000
index 00000000..b25fe082
--- /dev/null
+++ b/remote/modules/screen-standby/data/etc/X11/Xsetup.d/screen-standby
@@ -0,0 +1 @@
+/opt/openslx/scripts/screen-standby \ No newline at end of file
diff --git a/remote/modules/screen-standby/data/opt/openslx/scripts/screen-standby b/remote/modules/screen-standby/data/opt/openslx/scripts/screen-standby
new file mode 100755
index 00000000..74a09556
--- /dev/null
+++ b/remote/modules/screen-standby/data/opt/openslx/scripts/screen-standby
@@ -0,0 +1,29 @@
+#!/bin/ash
+
+# This is usually sourced by Xstartup/session/reset
+
+do_standby_stuff () {
+ . /opt/openslx/config
+ # Make sure SLX_SCREEN_STANDBY_TIMEOUT is numeric
+ TO=${SLX_SCREEN_STANDBY_TIMEOUT}
+ [ -z "${TO}" ] && TO=0
+ [ "${TO}" -gt 0 ] || [ "${TO}" -lt 100 ] || TO=600
+ [ "${TO}" -lt 0 ] && TO=0
+ MIN=$(( TO / 60 ))
+ [ "$MIN" -gt 60 ] && MIN=60
+ # Set
+ setterm -blank "$MIN"
+ setterm -powerdown "$MIN"
+ if [ "${TO}" = 0 ]; then
+ # Off
+ xset s "${TO}" "${TO}"
+ xset s off -dpms
+ else
+ xset +dpms
+ xset s "${TO}" "${TO}"
+ fi
+}
+
+do_standby_stuff &
+true
+
diff --git a/remote/modules/screen-standby/module.build b/remote/modules/screen-standby/module.build
new file mode 100644
index 00000000..435a7b10
--- /dev/null
+++ b/remote/modules/screen-standby/module.build
@@ -0,0 +1,13 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ list_packet_files > "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/remote/modules/screen-standby/module.conf b/remote/modules/screen-standby/module.conf
new file mode 100644
index 00000000..96ca18d4
--- /dev/null
+++ b/remote/modules/screen-standby/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES="
+"
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES="
+"
diff --git a/remote/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl b/remote/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl
index 1eef0a23..979fde62 100755
--- a/remote/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl
+++ b/remote/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl
@@ -5,6 +5,7 @@
. /opt/openslx/config
[ -z "$SLX_SMARTCTL_MIN_REALLOC" ] && SLX_SMARTCTL_MIN_REALLOC=0
+DELAY=
FILES=
for dev in /dev/sd?; do
@@ -20,14 +21,21 @@ for dev in /dev/sd?; do
# report if applicable
if [ -n "$OVERALL" ]; then
slxlog "smartctl-fail" "Failed HDD: $dev reports health as $OVERALL" "$FILE"
+ DELAY=yes
fi
if [ -n "$REALLOC" ] && [ "$REALLOC" -gt "$SLX_SMARTCTL_MIN_REALLOC" ]; then
slxlog "smartctl-realloc" "Failing HDD: $dev has $REALLOC reallocated sectors!" "$FILE"
+ DELAY=yes
fi
if [ -n "$SPINRETRY_VAL" ] && [ "$SPINRETRY_VAL" -le "$SPINRETRY_THR" ]; then
slxlog "smartctl-spinretry" "Failing HDD: $dev has bad spin retry count! ($SPINRETRY_VAL/$SPINRETRY_THR)" "$FILE"
+ DELAY=yes
fi
done
-sleep 2 # give slxlog a little time, as it's running async
+
+[ -n "$DELAY" ] && sleep 2 # give slxlog a little time, as it's running async
[ -n "$FILES" ] && rm -f -- $FILES # list, no ""
+# Keep it that way instead of using --delete or --sync sonce it would add up; this way we're doing it just once here
+
+exit 0
diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include
index 1f0b209a..344ccc48 100644
--- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include
+++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include
@@ -11,10 +11,14 @@
# -----------------------------------------------------------------------------
# Include file (general template) for run-virt.include of the virtualbox plugin
+# TODO: Move this server side (just like vmware)
+# !! A lot of variable names have changed and are NOT updated here !!
+# Oh and for the love of god remove the above comment when this works again
+
cat << EOF > "${machconfig}"
<?xml version="1.0"?>
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.14-linux">
- <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}">
+ <Machine uuid="{${machineuuid}}" name="${VM_DISPLAYNAME}" OSType="${VM_OS_TYPE}">
<MediaRegistry>
<HardDisks>
<HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}"/>
diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include
index 1b116f32..59dd712d 100755
--- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include
+++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include
@@ -14,261 +14,165 @@
# - component for virtualbox of the vmchooser plugin vmchooser-run_virt
################################################################################
+[ -r /run/hwinfo ] && source /run/hwinfo
+
################################################################################
### declaration of default variables
################################################################################
-VMCHOOSERVBOX="/opt/openslx/vmchooser/${self}"
-confdir="${TMPDIR}/vbox" # dir for configs
-export VBOX_USER_HOME=${confdir} # instead of $HOME/.VirtualBox
-# define dirs and files which can be removed after exit, be carefull!
-# TODO: Machanism not in use anymore. A better approach would be anyways to
-# Define a fixed directory which can be deleted recursively on exit. $TMPDIR
-# would be a start.
-#RMDIRS="${snapshotdir} ${confdir} /tmp/virt/.vbox-${USER}-ipc"
-# rm -rf ${RMDIRS} 2>/dev/null
-machfolder="${confdir}/Machines"
-# use vm_shortname for dir and config names since vm_name can be very long
-machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
-diskfolder="${confdir}/HardDisks"
-snapshotdir=${machfolder}/${vm_shortname}/Snapshots
-mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
-[ -z "${diskless}" ] && diskless=0 # check if diskless var empty?
-guestaudio="HDA" # default guest audio controller (SB16, AC97, HDA)
-vb_network_card="82540EM" # default guest network adaptor (Am79C970A, Am79C973, 82540EM)
+if ! isset VM_NAME_CLEAN IMG_BASENAME SRC_IMG_ABSOLUTE VM_OS_TYPE; then
+ env=$(mktemp)
+ env > "$env"
+ slxlog -d "virt-vbox-init" "A required variable is not set." "$env"
+ writelog "Incomplete variable set passed from main run-virt"
+ error_user "Wichtige variablen, die das VBox Plugin benötigt, wurden nicht
+gesetzt. Kann die VM nicht starten."
+ cleanexit 1
+fi
+
+declare -rg VMCHOOSERVBOX="/opt/openslx/vmchooser/${self}"
+declare -rg VBOX_ROOT="${TMPDIR}/vbox" # dir for configs
+declare -rg VBOX_MACHINES_DIR="${VBOX_ROOT}/Machines"
+declare -rg VBOX_SNAPSHOT_DIR="${VBOX_MACHINES_DIR}/${VM_NAME_CLEAN}/Snapshots"
+declare -rg VBOX_HDD_DIR="${VBOX_ROOT}/HardDisks"
+declare -rg VBOX_HDD_LINK="${VBOX_HDD_DIR}/${IMG_BASENAME}"
+
+export VBOX_USER_HOME="${VBOX_ROOT}" # instead of $HOME/.VirtualBox
+
+# use VM_NAME_CLEAN for dir and config names since VM_DISPLAYNAME can be very long
+VBOX_MACHINE_CONFIG="${VBOX_MACHINES_DIR}/${VM_NAME_CLEAN}/${VM_NAME_CLEAN}.xml"
+mkdir -p "${VBOX_HDD_DIR}" "${VBOX_SNAPSHOT_DIR}" 2>/dev/null
enable2d="true" # default setting for accelerated 2D grapics (OS dependent)
vram="128" # set default graphics ram
+snapshotuuid="34f617be-192a-46b3-a8ae-bce1029e093f" # snapshot UUID is static
-# configure our own rwimg, empty image which we provide
-if [ "${imgmode}" = "rwimg" ]; then
- imgname="${vm_shortname}.vdi" # what is our rwimg called?
- vmpath=${imgpath}/${imgname}
- if ! [ -e "${vmpath}" ]; then
- cat /opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz | gunzip > "${vmpath}"
+# link to image, determine extension (type)
+imgfmt=$(echo ${SRC_IMG_ABSOLUTE##*.} | tr '[a-z]' '[A-Z]')
+if [ -n "$VM_DISKFILE_RW" ]; then
+ ln -sf "${VM_DISKFILE_RW}" "${VBOX_HDD_LINK}"
+else
+ ln -sf "${VM_DISKFILE_RO}" "${VBOX_HDD_LINK}"
+ # image is RO, we only support VDI?
+ if [ "$imgfmt" != "VDI" ]; then
+ writelog "Image is not VDI, cannot create snapshot.."
+ error_log "Die gewählte VM nutzt VBox, hat aber kein VDI image (sondern '$imgfmt'), kann VM nicht starten."
+ cleanexit 1
fi
fi
-# link to image
-diskfile="${diskfolder}/${imgname}"
-[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}
-
-# check the file type
-if echo ${imgname} | grep -qiE "vdi|vhd" && [ ${diskless} -eq 0 ]; then
- imgfmt=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]")
-elif [ ${diskless} -eq 0 ]; then
- writelog "${imgname} is not a valid image format (vdi|vhd), exiting!"
- cleanexit 1
-fi
-
-npaging="false" # nested paging: Default: not enabled
-enablevt="false" # VT: Default: not enabled
-[ ${vtflag} -eq 0 ] && cpu_cores=1 # check for VT, if not available only 1 cpu supported
-[ ${vtflag} -eq 1 ] && enablevt="true"
# Setting some default variables
shfolders="TRUE"
+enablevt="true"
# set some base configuration depending on the guest operating system
-case "${vmostype}" in
- win31*)
- guestaudio="SB16"
- vb_network_card="Am79C973"
- vmostype="Windows31"
+case "${VM_OS_TYPE}" in
+ Windows31)
mem="32"
vram="16"
cpu_cores=1
enablevt="false"
shfolders="FALSE"
- ;;
- winnt*)
- guestaudio="SB16"
- vb_network_card="Am79C973"
- vmostype="Windows31"
- mem="32"
+ ;;
+ WindowsNT)
+ mem="4096"
vram="16"
- cpu_cores=1
+ cpu_cores=4
enablevt="false"
shfolders="FALSE"
- ;;
- win95*)
- vmostype="Windows95"
- guestaudio="SB16"
- vb_network_card="Am79C973"
- mem="92"
+ ;;
+ Windows95)
+ mem="128"
vram="32"
cpu_cores=1
enablevt="false"
shfolders="FALSE"
- ;;
- win98*)
- vmostype="Windows98"
- guestaudio="SB16"
- vb_network_card="Am79C973"
+ ;;
+ Windows98)
mem="256"
vram="64"
cpu_cores=1
shfolders="FALSE"
- ;;
- winme*)
- vmostype="WindowsMe"
- guestaudio="AC97"
- vb_network_card="Am79C973"
+ ;;
+ WindowsMe)
mem="256"
vram="64"
cpu_cores=1
shfolders="FALSE"
- ;;
- winxp*|windowsxp*)
- vmostype="WindowsXP"
- guestaudio="AC97"
- ;;
- winvista*|windowsvista*)
- vmostype="WindowsVista"
- ;;
- windows7*)
- vmostype="Windows7"
- ;;
- windows8*)
- vmostype="Windows8"
- ;;
- linux*|*ubuntu*|*suse*|debian*|*sci*)
- if echo "${vmostype}" | grep -q "64"; then
- vmostype="Linux26_64"
- # check for vtflag
- if [ ${vtflag} -ne 1 ]; then
- writelog "You are trying to boot a 64 bit OS without a VT enabled CPU"
- writelog "This is not supported, exiting!"
- cleanexit 1
- fi
- # check if host is only 32 bit, then use only 1 cpu (only 1 supported)
- if echo "${host_arch}" | grep -qE "i.86"; then
- cpu_cores=1
- fi
- else
- vmostype="Linux26"
- fi
- ;;
- os2*)
+ ;;
+ WindowsXP)
+ ;;
+ WindowsVista)
+ ;;
+ Windows7)
+ ;;
+ Windows8)
+ ;;
+ OS2eCS)
mem="256"
- vmostype="OS2eCS"
cpu_cores=1
enable2d="false"
- ;;
- macos*|MacOS*)
- vmostype="MacOS"
+ ;;
+ MacOS)
enable2d="false"
- ;;
+ ;;
+ Linux*)
+ ;;
*)
- vmostype="Other"
+ VM_OS_TYPE="Other"
enable2d="false"
- ;;
+ ;;
esac
+if [ "$HW_KVM" != "ENABLED" ]; then
+ enablevt="false"
+ cpu_cores=1 # check for VT, if not available only 1 cpu supported
+fi
+
writelog "Directories:"
-writelog "\tConfig dir:\t\t$confdir"
-writelog "\tMachines dir:\t\t$machfolder"
-writelog "\tMachine config:\t\t$machconfig"
-[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder"
+writelog "\tConfig dir:\t\t$VBOX_ROOT"
+writelog "\tMachines dir:\t\t$VBOX_MACHINES_DIR"
+writelog "\tMachine config:\t\t$VBOX_MACHINE_CONFIG"
################################################################################
### Hardware checks
################################################################################
# remove ':' from MAC addr for vbox and generate a VDE (virtual device ethernet)
-# MAC addr from the first one (put in prefix 0DE)
+# MAC addr from the first one (put in prefix 00DE)
macaddr=$(echo ${macaddr} | sed 's/://g')
vdemacaddr=$(echo ${macaddr} | sed 's/^..../00DE/g')
machineuuid="00000000-0000-0000-0000-${macaddr}" # machine UUID, MAC addr part of it
machineuuid=$(echo ${machineuuid} | tr "[A-Z]" "[a-z]") # cosmetical, since UUID in lower case
-# get UUID of VBox image, if not diskless
-[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \
- | grep UUID | grep -v "Parent UUID" | awk '{print $2}' \
- | grep -v use ) # nec. for VBox >= 4
-imgtype="Immutable" # make disk immutable
-snapshotuuid="34f617be-192a-46b3-a8ae-bce1029e093f" # snapshot UUID is static
-imageuuid=${snapshotuuid} # imageuuid in machine.include, default snapshotuuid
-
-# check if rw image
-# remove disk and add rwimg if set
-if echo "${imgmode}" | grep -q rw; then
- # lock existing?
- if [ -e "${vmpath}.lock" ]; then
- writelog "This rw image is already in use."
- writelog "Found lock: ${vmpath}.lock, exiting!"
- writelog "Remove lock if you are sure that this is not the case"
- cleanexit 1
- # image rw?
- elif ! [ -w ${vmpath} ]; then
- writelog "You defined mode rw, but image ${vmpath} is not rw! \c"
- writelog "Please correct, exiting!"
- cleanexit 1
- fi
- touch "${vmpath}.lock" # add lock
- #RMDIRS="${RMDIRS} ${vmpath}.lock" # remove lock after VM stopped TODO See note at the top
+# get UUID of VBox image
+diskuuid=$(VBoxManage -q showvdiinfo ${VBOX_HDD_LINK} \
+ | grep UUID | grep -v "Parent UUID" | awk '{print $2}' \
+ | grep -v use ) # nec. for VBox >= 4
+
+
+if [ -n "$VM_DISKFILE_RW" ]; then
+ # Image is already RW - easy
imgtype="Normal"
- imageuuid=${diskuuid} # replace image uuid in machine config
-elif [ ${diskless} -eq 0 ]; then
- # use temp disk as snapshot
- cat ${VMCHOOSERVBOX}/empty-diff.vdi.gz \
- | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
- # patch the disk file uuid into the snapshot vdi file
- dd if=${diskfile} of="${snapshotdir}/{${snapshotuuid}}.vdi" seek=424 \
- skip=392 bs=1 count=16 conv=notrunc
+ imageuuid=${diskuuid}
+else
+ # use temp disk as snapshot to get CoW
+ imgtype="Immutable" # make disk immutable
+ imageuuid=${snapshotuuid}
+ < "${VMCHOOSERVBOX}/empty-diff.vdi.gz" gunzip > "${VBOX_SNAPSHOT_DIR}/{${snapshotuuid}}.vdi"
+ # patch the disk file uuid into the snapshot vdi file:
+ # We read from offset 424 in the source HDD and write to offset 392 in out prepared
+ # CoW container. 16 bytes will be copied, which is the binary UUID
+ # TODO: This requires the image to be a vdi/vdh; Afaik, vbox supports vmdk,
+ # so this code would break in that case. Can we use the diskuuid we got via
+ # VBoxManage, convert to binary, and patch it
+ dd if=${VBOX_HDD_LINK} of="${VBOX_SNAPSHOT_DIR}/{${snapshotuuid}}.vdi" seek=424 \
+ skip=392 bs=16 count=1 conv=notrunc
fi
-# TODO: MEM muss noch angepasst werden. Maschine crasht wenn mehr als 50% MEM
-# memory part equal to vmware plugin
-# percentage of memory to use for virtualbox in standard case
-#if [ -n "${forcemem}" ]; then
-# mem="${forcemem}"
-#else
-# permem=30
-# if [ "${totalmem}" -ge "1600" ]; then
-# permem=40
-# fi
-# # check if /tmp is on harddisk
-# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
-# permem=60
-# id44="1"
-# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
-# # (40% vmware | 40% confdir(vmem...) | 20% host
-# # VMplayer 2+ issue
-# # TODO: makes this sense for vbox?
-# #if [ "${totalmem}" -ge "2500" ]; then
-# #permem=40
-# #rmdir ${snapshotdir}
-# #snapshotdirold=${snapshotdir}
-# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
-# #mkdir -p ${snapshotdir}
-# #ln -sf ${snapshotdir} ${snapshotdirold}
-# #fi
-# fi
-# mem=$(expr ${totalmem} / 100 \* ${permem})
-# if [ "${id44}" = "1" ]; then
-# hostmem=$(expr ${totalmem} - ${mem})
-# else
-# hostmem=$(expr ${totalmem} - ${mem} - ${mem})
-# fi
-# #permem=40
-# #mem=$(expr ${totalmem} * ${permem})
-#fi
-
-# translate network cards
-case "${network_card}" in
- e1000)
- vb_network_card="82540EM"
- ;;
- virtio)
- vb_network_card="virtio"
- ;;
- *)
- network_card="pcnet"
- vb_network_card="Am79C973"
-esac
-
# translate network kinds (nat, bridged, host-only)
+# TODO: Server should prepare this in returned xml
case "${network_kind}" in
bridge*)
network_kind='HostOnlyInterface name="vboxnet0"'
@@ -280,57 +184,19 @@ case "${network_kind}" in
network_kind='HostOnlyInterface name="vboxnet1"'
esac
-# configure 3d settings
-case "${enable3d}" in
- *true*|*yes*)
- enable3d="true"
- ;;
- *)
- enable3d="false"
- ;;
-esac
+boot="HardDisk"
-# translate boot, use if set else set to HardDisk
-# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
-# support nfs and tftp as well
-case ${boot} in
- n*|tftp)
- boot="Network"
- if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then
- vm_name=${vm_shortname} # use vm_shortname to avoid Problems /w TFTP in NAT
- mkdir -p ${confdir}/TFTP # link TFTP dir for NAT TFTP boots
- if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then
- cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe
- else
- writelog "${virtualbox_tftpdir}/pxelinux.0 not found!"
- writelog "Network boot won't work, exiting!"
- cleanexit 1
- fi
- for i in $(ls ${virtualbox_tftpdir}); do
- ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i}
- done
- fi
- ;;
- # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
- *)
- boot="HardDisk"
- ;;
-esac
-
-vrdpport=${remotedesktopport} # external GUI
-
-[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "\tSnapshots dir:\t\t$VBOX_SNAPSHOT_DIR"
writelog "Diskimage:"
-[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile"
-[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt"
-[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype"
- writelog "\tVMostype:\t\t$vmostype"
- writelog "\tMachine UUID:\t\t$machineuuid"
-[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "\tDisk file:\t\t$VBOX_HDD_LINK"
+writelog "\tDisk type:\t\t$imgtype"
+writelog "\tVMostype:\t\t$VM_OS_TYPE"
+writelog "\tMachine UUID:\t\t$machineuuid"
+writelog "\tDisk UUID:\t\t$diskuuid"
writelog "Virtual Hardware:"
writelog "\tCPU cores:\t\t${cpu_cores}\c"
-[ ${vtflag} -eq 0 ] && writelog ""
-[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)"
+writelog ""
+[ "$HW_KVM" = "ENABLED" ] && writelog " (VT enabled CPU)"
writelog "\tGuest RAM:\t\t${mem} MB"
# echo nur wenn hostmem gesetzt
[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB"
@@ -338,10 +204,7 @@ writelog "\tMAC address:\t\t$macaddr"
writelog "\tNetwork card:\t\t${vb_network_card}"
writelog "\tNetwork kind:\t\t${network_kind}"
writelog "\tBooting from:\t\t${boot}\c"
-[ ${diskless} -eq 0 ] && writelog ""
-[ ${diskless} -eq 1 ] && writelog " 'diskless'"
-# TODO: server start activate via xml, etc...
-#writelog "\tGuest VRDP port:\t${vrdpport}"
+writelog ""
writelog "\tCD-ROM1:\t\t${cdrom0}"
#writelog "\tCD-ROM2:\t\t${cdrom1}"
writelog "\tFloppy_A:\t\t${floppy0}"
@@ -357,60 +220,31 @@ writelog "\tShared Folders '${sharename}':\t${sharepath}"
# Shares given?
if [ "x$shfolders" != "xFALSE" ]; then
- sharelist="<SharedFolders>
+ sharelist="<SharedFolders>
<SharedFolder name=\"${homesharename}\" hostPath=\"${homesharepath}\" writable=\"true\"/>
<SharedFolder name=\"${commonsharename}\" hostPath=\"${commonsharepath}\" writable=\"true\"/>
</SharedFolders>"
else
- sharelist=''
+ sharelist=''
fi
-source ${VMCHOOSERVBOX}/virtualbox.include # create Virtualbox.xml
+source "${VMCHOOSERVBOX}/virtualbox.include" # create Virtualbox.xml
# remove snapshot disk when using rw images
if [ "${imgtype}" != "Immutable" ]; then
- sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
+ sed -i "/${snapshotuuid}/d" "${VBOX_ROOT}/VirtualBox.xml"
fi
# TODO: add rawdisk if requested
#"raw.vmdk" format="VMDK" type="Writethrough"/>
-source ${VMCHOOSERVBOX}/machine.include # create machine.xml
+source "${VMCHOOSERVBOX}/machine.include" # create machine.xml
# remove CD-ROM if not available
if [ "${cdrom0}" != "TRUE" ]; then
- sed -i "/HostDrive/d" ${machconfig}
- sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig}
- sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" ${machconfig}
-fi
-
-# if diskless remove all disks
-if [ ${diskless} -eq 1 ]; then
- sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml"
- sed -i "/${imageuuid}/d" ${machconfig}
- sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig}
- sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->/d" ${machconfig}
-fi
-
-# define redirects
-if [ ${redirects} -ge 1 ]; then
- (( i=1 ))
- writelog "\tGuest redirects:\t\c"
- while [ ${i} -le ${redirects} ]; do
- extradataitem='<ExtraDataItem name="VBoxInternal/Devices'
- extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config"
- extradataitem="${extradataitem}/${redirect_name[$i]}/"
- extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>"
- extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>"
- extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>"
- sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
- ${extradataitem}${extradatahostport}\n\
- ${extradataitem}${extradataprotocol}\n\
- </ExtraData>," "${machconfig}"
- writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}"
- tabspace='\t\t\t\t'
- (( i=$i+1 ))
- done
+ sed -i "/HostDrive/d" "${VBOX_MACHINE_CONFIG}"
+ sed -i '/AttachedDevice.*type="DVD"/d' "${VBOX_MACHINE_CONFIG}"
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" "${VBOX_MACHINE_CONFIG}"
fi
################################################################################
diff --git a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include
index 62143c54..70a036a8 100644
--- a/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include
+++ b/remote/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include
@@ -11,7 +11,7 @@
# -----------------------------------------------------------------------------
# Include file (general template) for run-virt.include of the virtualbox plugin
-cat << EOF > "${confdir}/VirtualBox.xml"
+cat << EOF > "${VBOX_ROOT}/VirtualBox.xml"
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-linux">
<Global>
<ExtraData>
@@ -27,7 +27,7 @@ cat << EOF > "${confdir}/VirtualBox.xml"
<ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/>
</ExtraData>
<MachineRegistry>
- <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/>
+ <MachineEntry uuid="{${machineuuid}}" src="Machines/${VM_NAME_CLEAN}/${VM_NAME_CLEAN}.xml"/>
</MachineRegistry>
<MediaRegistry>
<HardDisks>
diff --git a/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser
index 0cf04135..2588c884 100755
--- a/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser
+++ b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser
@@ -38,12 +38,13 @@ fi
[ -n "$SLX_VMCHOOSER_TEMPLATES" ] && EXTRA="$EXTRA --template-mode $SLX_VMCHOOSER_TEMPLATES"
[ -n "$SLX_VMCHOOSER_FORLOCATION" ] && EXTRA="$EXTRA --location-mode $SLX_VMCHOOSER_FORLOCATION"
[ "$HW_KVM" != "ENABLED" ] && EXTRA="$EXTRA --no-vtx"
+[ -n "$SLX_EXAM" ] && EXTRA="$EXTRA --exam-mode"
# No quotes around $EXTRA!
if [ -z "$SLX_LOCATIONS" ]; then
- exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" $EXTRA
+ exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" --start-uuid "$SLX_EXAM_START" $EXTRA
fi
# No quotes around $EXTRA!
-exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" --locations "$SLX_LOCATIONS" $EXTRA
+exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" --start-uuid "$SLX_EXAM_START" --locations "$SLX_LOCATIONS" $EXTRA
diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session
index 2499b3b7..fb8ae9eb 100755
--- a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session
+++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session
@@ -1,5 +1,16 @@
#!/bin/ash
-[ -n "$SESSION_NAME" ] && slxlog ".vmchooser-session-name" "$SESSION_NAME"
+[ -z "${SESSION_UUID}${SESSION_NAME}" ] && exit 0
+
+. /opt/openslx/config
+
+[ -z "$SLX_REMOTE_LOG" ] && exit 0
+
+REALUSER=$(whoami)
+LOGUSER=0
+[ "x$SLX_REMOTE_LOG_SESSIONS" = "xyes" ] && LOGUSER=1
+
+curl --data-urlencode "type=.vmchooser-session" --data-urlencode "uuid=$SESSION_UUID" --data-urlencode "name=$SESSION_NAME" \
+ --data-urlencode "user=$REALUSER" --data-urlencode "loguser=$LOGUSER" "$SLX_REMOTE_LOG"
exit 0
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc
index 555688bf..96363de3 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc
@@ -13,12 +13,6 @@ mkdir -p "$confdir" >/dev/null 2>&1
mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1
touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1
-# create preferences file ${vmhome}/preferences
-source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file
-
-# create VMware config file (conffile)
-source "${VMWAREINCLUDEDIR}/create_vmware_config_file.inc"
-
# link to conffile if confdir != redodir
[ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc
index b618041c..d50402f3 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc
@@ -68,4 +68,5 @@ create_vmhome_preferences_file() {
echo 'pref.hotkey.rightControl = "true"' >> "$vmhome/preferences"
fi
writelog "Vmware preferences file created in $vmhome."
+ true
}
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc
deleted file mode 100644
index df6e6f39..00000000
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc
+++ /dev/null
@@ -1,316 +0,0 @@
-########################################
-# Include: Create vmware startup files #
-########################################
-
-create_vmware_config_file_legacy() {
- echo "# This configuration file was generated by $0" > "$conffile"
-
- MAXMEM="9999999"
- MAXCORES="4"
- shfolders="TRUE"
- sound="es1371"
-
- # define hardware configuration depending on the guest OS used
- # this needs to be fixed and is the base for the creation of new VMs
- case "$vmostype" in
- win31*|windows31*)
- vmostype="win31"
- shfolders="FALSE"
- sound="sb16"
- MAXMEM="32"
- MAXCORES="1"
- ;;
- winnt*|windowsnt*)
- vmostype="winnt"
- shfolders="FALSE"
- sound="sb16"
- MAXMEM="1000"
- MAXCORES="2"
- ;;
- win95*|windows95*)
- vmostype="win95"
- shfolders="FALSE"
- MAXMEM="96"
- MAXCORES="1"
- ;;
- win98*|windows98*)
- vmostype="win98"
- MAXMEM="256"
- MAXCORES="1"
- ;;
- winme*|windowsme*)
- vmostype="winme"
- MAXMEM="384"
- MAXCORES="1"
- ;;
- win2000|windows2000|win2000pro*)
- vmostype="win2000pro"
- MAXMEM="4000"
- MAXCORES="2"
- ;;
- win2000srv*|windows2000srv*|win2000serv*|windows2000serv*)
- vmostype="win2000serv"
- shfolders="FALSE"
- MAXMEM="4000"
- MAXCORES="4"
- ;;
- win2000adv*|windows2000adv*|win2000dat*|windows2000dat*)
- vmostype="win2000advserv"
- shfolders="FALSE"
- MAXMEM="8000"
- MAXCORES="8"
- ;;
- winnet*64|win*2003*64|windowsnet*64)
- vmostype="winnetstandard-64"
- MAXMEM="8000"
- ;;
- winnet*|win*2003*|windowsnet*)
- vmostype="winnetstandard"
- MAXMEM="4000"
- ;;
- winxphome*|windowsxphome*)
- vmostype="winxphome"
- MAXMEM="4000"
- MAXCORES="1"
- ;;
- winxp*64|windowsxp*64)
- vmostype="winxppro-64"
- MAXMEM="8000"
- MAXCORES="2"
- ;;
- winxp*|windowsxp*)
- vmostype="winxppro"
- MAXMEM="4000"
- MAXCORES="1"
- ;;
- winvista*64|windowsvista*64)
- vmostype="winvista-64"
- MAXMEM="16000"
- MAXCORES="2"
- ;;
- winvista*|windowsvista*)
- vmostype="winvista"
- MAXMEM="8000"
- MAXCORES="2"
- ;;
- win7*64|windows7*64)
- vmostype="windows7-64"
- MAXMEM="32000"
- MAXCORES="4"
- ;;
- win7*|windows7*)
- vmostype="windows7"
- MAXMEM="8000"
- MAXCORES="4"
- ;;
- win8*64|windows8*64)
- vmostype="windows8-64"
- MAXMEM="32000"
- MAXCORES="4"
- ;;
- win8*|windows8*)
- vmostype="windows8"
- MAXMEM="8000"
- MAXCORES="4"
- ;;
- win*64)
- MAXMEM="16000"
- MAXCORES="4"
- ;;
- win*)
- MAXMEM="8000"
- ;;
- dos|msdos*|ms-dos*)
- vmostype="dos"
- shfolders="FALSE"
- MAXMEM="128"
- ;;
- macos*64)
- vmostype="freebsd-64"
- MAXMEM="4000"
- MAXCORES="2"
- ;;
- macos*)
- vmostype="freebsd"
- MAXMEM="4000"
- MAXCORES="1"
- ;;
- beos*)
- vmostype="other"
- shfolders="FALSE"
- ;;
- # Unknown guestOS setting in .xml - use conservative defaults
- *64)
- vmostype="other-64"
- shfolders="FALSE"
- MAXMEM="123456"
- MAXCORES="4"
- ;;
- *)
- vmostype="other"
- shfolders="FALSE"
- MAXMEM="8000"
- MAXCORES="1"
- ;;
- esac
- real_core_count="$cpu_cores"
- [ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES"
- # It currently makes no sense to set the virtual number of cores
- # to a different value than the virtual number of cores per virtual CPU.
- cores_per_socket="$cpu_cores"
-
- if [ "x$shfolders" != "xFALSE" ] && [ "$SHARE_REMAP_MODE" != 1 ]; then
- enable_share='sharedFolder.option = "alwaysEnabled"'
- HGFS_DISABLED="FALSE"
- else
- enable_share=
- HGFS_DISABLED="TRUE"
- fi
-
- [ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM"
- [ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
-
- if [ -n "$FLOPPYIMG" ]; then
- floppy1="TRUE"
- else
- floppy1="FALSE"
- fi
-
- cat >> "$conffile" <<-HEREEND
- .encoding = "UTF-8"
- config.version = "8"
-
- # general hardware (ehci, 3d accel)
- ehci.present = "TRUE"
- $FORCE3D
- mks.enable3d = "$enable3d"
-
- monitor.virtual_mmu = "automatic"
- monitor.virtual_exec = "automatic"
-
- # id
- virtualHW.version = "$hwver"
- displayName = "$displayname"
- guestOS = "$vmostype"
-
- # CPU/MEM
- numvcpus = "$cpu_cores"
- cpuid.coresPerSocket = "$cores_per_socket"
- maxvcpus = "$real_core_count"
- memsize = "$mem"
- MemAllowAutoScaleDown = "FALSE"
- MemTrimRate = "-1"
-
- # ide-disks
- ide0:0.present = "$ide"
- ide0:0.fileName = "$vm_diskfile"
- ## Edited for persistent mode.
- ide0:0.mode = "independent-${diskmode}"
- ##
- ide1:0.present = "$cdrom0"
- ide1:0.autodetect = "TRUE"
- ide1:0.fileName = "auto detect"
- ide1:0.deviceType = "cdrom-raw"
- ide1:1.present = "$cdrom1"
- ide1:1.autodetect = "TRUE"
- ide1:1.fileName = "auto detect"
- ide1:1.deviceType = "cdrom-raw"
-
- # scsi-disks
- scsi0.present = "$scsi"
- scsi0:0.present = "$scsi"
- scsi0:0.fileName = "$vm_diskfile"
- scsi0.virtualDev = "$hddrv"
- ## Edited for persistent mode.
- scsi0:0.mode = "independent-${diskmode}"$stateFileConfiguration
- ##
-
- # floppies
- floppy0.present = "$floppy0"
- floppy0.startConnected = "TRUE"
- floppy0.autodetect = "TRUE"
- floppy0.fileName = "auto detect"
-
- # we need floppy b: for the client configuration
- floppy1.present = "$floppy1"
- floppy1.readonly = "TRUE"
- floppy1.startConnected = "TRUE"
- floppy1.fileType = "file"
- floppy1.fileName = "$FLOPPYIMG"
-
- # nics
- ethernet0.present = "TRUE"
- ethernet0.addressType = "static"
- $network_virtualDev
- #ethernet0.connectionType = "hostonly"
- ethernet0.connectionType = "custom"
- ethernet0.vnet = "$hostdev"
- ethernet0.address = "00:50:56:$macaddrsuffix"
- ethernet0.wakeOnPcktRcv = "FALSE"
-
- # sound
- sound.present = "TRUE"
- $sound_fileName
- sound.virtualdev = "$sound"
- pciSound.enableVolumeControl = "FALSE"
- sound.enableVolumeControl = "FALSE"
-
- # svga
- svga.autodetect = "TRUE"
-
- # usb
- usb.present = "TRUE"
- usb.generic.autoconnect = "TRUE"
-
- # pci configuration
- usb.pciSlotNumber = "16"
- ethernet0.pciSlotNumber = "17"
- sound.pciSlotNumber = "18"
- ehci.pciSlotNumber = "19"
- scsi0.pciSlotNumber = "20"
-
- $PCIE
-
- # shared folders
- $enable_share
- sharedFolder0.present = "$shfolders"
- sharedFolder0.enabled = "$shfolders"
- sharedFolder0.expiration = "never"
- sharedFolder0.guestName = "$homesharename"
- sharedFolder0.hostPath = "$homesharepath"
- sharedFolder0.readAccess = "TRUE"
- sharedFolder0.writeAccess = "TRUE"
- sharedFolder1.present = "$shfolders"
- sharedFolder1.enabled = "$shfolders"
- sharedFolder1.expiration = "never"
- sharedFolder1.guestName = "$commonsharename"
- sharedFolder1.hostPath = "$commonsharepath"
- sharedFolder1.readAccess = "TRUE"
- sharedFolder1.writeAccess = "TRUE"
- sharedFolder.maxNum = "2"
-
- # dirs/configs
- tmpDirectory = "$redodir"
- redoLogDir = "$redodir"
- mainMem.useNamedFile = "TRUE"
- snapshot.disabled = "TRUE"
- tools.syncTime = "TRUE"
- isolation.tools.hgfs.disable = "$HGFS_DISABLED"
- hgfs.mapRootShare = "TRUE"
- isolation.tools.dnd.disable = "FALSE"
- isolation.tools.copy.enable = "TRUE"
- isolation.tools.paste.enabled = "TRUE"
-
- # serial port
- serial0.present = "$serial"
- $serialdev
-
- # parallel port
- parallel0.present = "$parallel"
- parallel0.bidirectional = "$paralbidi"
- $paraldev
- HEREEND
-
- # set the appropriate permissions for the vmware config file
- chmod u+rwx "${conffile}" >/dev/null 2>&1
-}
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc
index 9e0bfe4f..11ea2e3a 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc
@@ -1,9 +1,7 @@
########################################
-# Include: Create vmware startup files #
+# Include: Determine hw limitations depending on hwver and guest os #
########################################
-writelog "Creating vmware configuration file: $conffile"
-
MAXMEM="9999999"
MAXCORES="4"
shfolders="TRUE"
@@ -11,114 +9,116 @@ sound="es1371"
# define hardware configuration depending on the guest OS used
# this needs to be fixed and is the base for the creation of new VMs
-case "$vmostype" in
+case "$VM_OS_TYPE" in
win31*|windows31*)
- vmostype="win31"
+ VM_OS_TYPE="win31"
shfolders="FALSE"
sound="sb16"
MAXMEM="32"
MAXCORES="1"
;;
winnt*|windowsnt*)
- vmostype="winnt"
+ VM_OS_TYPE="winnt"
shfolders="FALSE"
sound="sb16"
MAXMEM="1000"
MAXCORES="2"
;;
win95*|windows95*)
- vmostype="win95"
+ VM_OS_TYPE="win95"
shfolders="FALSE"
MAXMEM="96"
MAXCORES="1"
;;
win98*|windows98*)
- vmostype="win98"
+ VM_OS_TYPE="win98"
MAXMEM="256"
MAXCORES="1"
;;
winme*|windowsme*)
- vmostype="winme"
+ VM_OS_TYPE="winme"
MAXMEM="384"
MAXCORES="1"
;;
win2000|windows2000|win2000pro*)
- vmostype="win2000pro"
+ VM_OS_TYPE="win2000pro"
MAXMEM="4000"
MAXCORES="2"
;;
win2000srv*|windows2000srv*|win2000serv*|windows2000serv*)
- vmostype="win2000serv"
+ VM_OS_TYPE="win2000serv"
shfolders="FALSE"
MAXMEM="4000"
MAXCORES="4"
;;
win2000adv*|windows2000adv*|win2000dat*|windows2000dat*)
- vmostype="win2000advserv"
+ VM_OS_TYPE="win2000advserv"
shfolders="FALSE"
MAXMEM="8000"
MAXCORES="8"
;;
winnet*64|win*2003*64|windowsnet*64)
- vmostype="winnetstandard-64"
+ VM_OS_TYPE="winnetstandard-64"
MAXMEM="8000"
+ MAXCORES="8"
;;
winnet*|win*2003*|windowsnet*)
- vmostype="winnetstandard"
+ VM_OS_TYPE="winnetstandard"
MAXMEM="4000"
+ MAXCORES="8"
;;
winxphome*|windowsxphome*)
- vmostype="winxphome"
+ VM_OS_TYPE="winxphome"
MAXMEM="4000"
- MAXCORES="1"
+ MAXCORES="2"
;;
winxp*64|windowsxp*64)
- vmostype="winxppro-64"
+ VM_OS_TYPE="winxppro-64"
MAXMEM="8000"
- MAXCORES="2"
+ MAXCORES="8"
;;
winxp*|windowsxp*)
- vmostype="winxppro"
+ VM_OS_TYPE="winxppro"
MAXMEM="4000"
- MAXCORES="1"
+ MAXCORES="4"
;;
winvista-64)
- vmostype="winvista-64"
+ VM_OS_TYPE="winvista-64"
MAXMEM="16000"
- MAXCORES="2"
+ MAXCORES="4"
;;
windows7-64)
- vmostype="windows7-64"
+ VM_OS_TYPE="windows7-64"
MAXMEM="32000"
- MAXCORES="4"
+ MAXCORES="8"
;;
windows8-64)
- vmostype="windows8-64"
+ VM_OS_TYPE="windows8-64"
MAXMEM="32000"
MAXCORES="8"
;;
windows9-64)
- vmostype="windows9-64"
+ VM_OS_TYPE="windows9-64"
MAXMEM="64000"
MAXCORES="8"
;;
winvista)
- vmostype="winvista"
+ VM_OS_TYPE="winvista"
MAXMEM="8000"
MAXCORES="2"
;;
windows7)
- vmostype="windows7"
+ VM_OS_TYPE="windows7"
MAXMEM="8000"
MAXCORES="4"
;;
windows8)
- vmostype="windows8"
+ VM_OS_TYPE="windows8"
MAXMEM="8000"
MAXCORES="4"
;;
windows9)
- vmostype="windows9"
+ VM_OS_TYPE="windows9"
MAXMEM="8000"
MAXCORES="4"
;;
@@ -128,37 +128,39 @@ case "$vmostype" in
;;
win*)
MAXMEM="8000"
+ MAXCORES="1"
;;
dos|msdos*|ms-dos*)
- vmostype="dos"
+ VM_OS_TYPE="dos"
shfolders="FALSE"
MAXMEM="128"
+ MAXCORES="1"
;;
macos*64)
- vmostype="freebsd-64"
+ VM_OS_TYPE="freebsd-64"
MAXMEM="4000"
MAXCORES="2"
;;
macos*)
- vmostype="freebsd"
+ VM_OS_TYPE="freebsd"
MAXMEM="4000"
MAXCORES="1"
;;
beos*)
- vmostype="other"
+ VM_OS_TYPE="other"
shfolders="FALSE"
;;
# Unknown guestOS setting in .xml - this encompasses linux too,
# as there is a multitude of different distributions. Perhaps further
# action will be needed if this leads to problems with exotic OSs.
*64)
- vmostype="other-64"
+ VM_OS_TYPE="other-64"
# shfolders="FALSE"
MAXMEM="123456"
MAXCORES="4"
;;
*)
- vmostype="other"
+ VM_OS_TYPE="other"
# shfolders="FALSE"
MAXMEM="8000"
MAXCORES="1"
@@ -179,8 +181,5 @@ else
fi
[ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM"
-[ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
-
-# set the appropriate permissions for the vmware config file
-chmod u+rwx "${conffile}" >/dev/null 2>&1
+[ "$HWVER" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc
new file mode 100644
index 00000000..41986b2a
--- /dev/null
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc
@@ -0,0 +1,60 @@
+##################################################
+# Include: Print vm config summary into log file #
+##################################################
+
+# log script information
+writelog "# File created by $0 (VMware version ${vmware_version})\n# on $(date)\n"
+## Edited for persistent mode.
+writelog "Starting with ${diskmode} mode ...\n"
+##
+
+# write all results to logfile
+# log disksetup
+writelog "Directories:"
+writelog "\tConfdir:\t${confdir}"
+writelog "\tConffile:\t${conffile}"
+writelog "\tRedodir:\t${redodir}"
+writelog "\tVMhome:\t\t${vmhome}"
+writelog "\t/tmp info: $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')"
+# hw setup
+writelog "Hardware:"
+writelog "\tMAC:\t\t$macaddr"
+if [ -n "${network_card}" ]; then
+ writelog "\tNet Adaptor:\t${network_card}"
+fi
+writelog "\tMem:\t\t${mem} MB"
+
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB"
+writelog "\tCD-ROM1:\t${cdrom0}"
+writelog "\tCD-ROM2:\t${cdrom1}"
+writelog "\tFloppy_A:\t${floppy0}"
+if [ "${serial}" = "TRUE" ]; then
+ writelog "\tSerial Port:\t${serialdev}"
+fi
+if [ "${parallel}" = "TRUE" ]; then
+ writelog "\tParallel Port:\t${paraldev}"
+fi
+
+writelog "Shared folders:"
+if [ "${HGFS_DISABLED}" = "FALSE" ]; then
+ writelog "\tNo shared folders enabled."
+else
+ writelog "\Shared folders enabled."
+fi
+
+# image
+writelog "Diskimage:"
+writelog "\tDiskfile:\t${VM_DISKFILE_RO}"
+writelog "\tHWVersion:\t${HWVER}"
+writelog "\tVMostype:\t${VM_OS_TYPE}"
+
+# misc
+writelog "Misc:"
+writelog "\tDisplayname:\t${VM_DISPLAYNAME}"
+if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then
+ writelog "\t3D Graphics:\tenabled"
+fi
+# empty line at end
+writelog ""
+
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc
deleted file mode 100644
index f7ee634a..00000000
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc
+++ /dev/null
@@ -1,64 +0,0 @@
-###############################
-# Include: Logging and stdout #
-###############################
-
-logging() {
- # log script information
- writelog "# File created by $0 (VMware version ${vmware_version})\n# on $(date)\n"
- ## Edited for persistent mode.
- writelog "Starting with ${diskmode} mode ...\n"
- ##
-
- # write all results to logfile
- # log disksetup
- writelog "Directories:"
- writelog "\tConfdir:\t${confdir}"
- writelog "\tConffile:\t${conffile}"
- writelog "\tRedodir:\t${redodir}"
- writelog "\tVMhome:\t\t${vmhome}"
- writelog "\t/tmp info: $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')"
- # hw setup
- writelog "Hardware:"
- writelog "\tMAC:\t\t$macaddr"
- if [ -n "${network_card}" ]; then
- writelog "\tNet Adaptor:\t${network_card}"
- fi
- writelog "\tMem:\t\t${mem} MB"
-
- # echo nur wenn hostmem gesetzt
- [ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB"
- writelog "\tMax. res.:\t${xres}x${yres}"
- writelog "\tCD-ROM1:\t${cdrom0}"
- writelog "\tCD-ROM2:\t${cdrom1}"
- writelog "\tFloppy_A:\t${floppy0}"
- if [ "${serial}" = "TRUE" ]; then
- writelog "\tSerial Port:\t${serialdev}"
- fi
- if [ "${parallel}" = "TRUE" ]; then
- writelog "\tParallel Port:\t${paraldev}"
- fi
-
- writelog "Shared folders:"
- if [ "${HGFS_DISABLED}" = "FALSE" ]; then
- writelog "\tNo shared folders enabled."
- else
- writelog "\Shared folders enabled."
- fi
-
- # image
- writelog "Diskimage:"
- writelog "\tDiskfile:\t${diskfile}"
- writelog "\tDisktype:\t${hddrv}"
- writelog "\tHWVersion:\t${hwver}"
- writelog "\tVMostype:\t${vmostype}"
-
- # misc
- writelog "Misc:"
- writelog "\tDisplayname:\t${displayname}"
- if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then
- writelog "\t3D Graphics:\tenabled"
- fi
- # empty line at end
- writelog ""
-
-}
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc
index 878e9a9d..dec80e1d 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc
@@ -4,156 +4,5 @@
writelog "Parsing virtual machine description file..."
-# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE
-# and VM_DISK_REDOLOGDIR.
-# IMAGE=$(grep -io '<image_path.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-sed -i 's#%VM_DISK_PATH%#'"$vm_diskfile"'#g' "${TMPCONFIG}"
-sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "${TMPCONFIG}"
-sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "${TMPCONFIG}"
-
-# Ethernet: All we do is entering a generated MAC, as we do not want to interfere
-# in the possible case no networking is wanted.
-writelog "Guest MAC: $macaddr"
-echo 'ethernet0.addressType = "static"' >> "${TMPCONFIG}"
-echo 'ethernet0.address = "'"${macaddr}"'"' >> "${TMPCONFIG}"
-
-# DVD, CDROM
-# XXX: For now it's save to assume ide channel 1 is free, as we support only one HDD, and it it's IDE, it's on channel 0
-cat >> "${TMPCONFIG}" <<-HEREEND
-ide1:0.present = "$cdrom0"
-ide1:0.autodetect = "TRUE"
-ide1:0.fileName = "auto detect"
-ide1:0.deviceType = "cdrom-raw"
-ide1:1.present = "$cdrom1"
-ide1:1.autodetect = "TRUE"
-ide1:1.fileName = "auto detect"
-ide1:1.deviceType = "cdrom-raw"
-HEREEND
-
-if [ -n "$FLOPPYIMG" ]; then
- floppy1="TRUE"
-else
- floppy1="FALSE"
-fi
-
-# Floppies:
-cat >> "${TMPCONFIG}" <<-HEREEND
-floppy0.present = "$floppy0"
-floppy0.startConnected = "FALSE"
-floppy0.autodetect = "TRUE"
-floppy0.fileName = "auto detect"
-floppy1.present = "$floppy1"
-floppy1.startConnected = "TRUE"
-floppy1.fileType = "file"
-floppy1.fileName = "$FLOPPYIMG"
-HEREEND
-
-writelog "numvcpus = ${cpu_cores} - maxvcpus=${real_core_count}"
-
-# RAM, CPUs
-cat >> "${TMPCONFIG}" <<-HEREEND
-numvcpus = "$cpu_cores"
-cpuid.coresPerSocket = "$cores_per_socket"
-maxvcpus = "$real_core_count"
-memsize = "$mem"
-MemAllowAutoScaleDown = "FALSE"
-MemTrimRate = "-1"
-HEREEND
-
-# USB
-if [ -n "$SLX_EXAM" ]; then
- # Exam mode: No USB (TODO: Configurable)
- sed -i '/^usb\./d' "${TMPCONFIG}"
- echo 'usb.present = "FALSE"' >> "${TMPCONFIG}"
-else
- cat >> "${TMPCONFIG}" <<-HEREEND
- usb.present = "TRUE"
- usb.generic.autoconnect = "TRUE"
- HEREEND
-fi
-
-# shared folders
-if [ "$HGFS_DISABLED" = "FALSE" ]; then
- cat >> "${TMPCONFIG}" <<-HEREEND
- sharedFolder.option = "alwaysEnabled"
- sharedFolder0.present = "$shfolders"
- sharedFolder0.enabled = "$shfolders"
- sharedFolder0.expiration = "never"
- sharedFolder0.guestName = "$homesharename"
- sharedFolder0.hostPath = "$homesharepath"
- sharedFolder0.readAccess = "TRUE"
- sharedFolder0.writeAccess = "TRUE"
- sharedFolder1.present = "$shfolders"
- sharedFolder1.enabled = "$shfolders"
- sharedFolder1.expiration = "never"
- sharedFolder1.guestName = "$commonsharename"
- sharedFolder1.hostPath = "$commonsharepath"
- sharedFolder1.readAccess = "TRUE"
- sharedFolder1.writeAccess = "FALSE"
- sharedFolder.maxNum = "2"
- hgfs.mapRootShare = "TRUE"
- hgfs.linkRootShare = "TRUE"
- HEREEND
-fi
-
-# Isolation tools: settings
-cat >> "${TMPCONFIG}" <<-HEREEND
-isolation.tools.hgfs.disable = "$HGFS_DISABLED"
-isolation.tools.dnd.disable = "FALSE"
-isolation.tools.copy.enable = "TRUE"
-isolation.tools.paste.enabled = "TRUE"
-HEREEND
-
-# Serial, parallel: Empty, nothing is being currently set. TODO later.
-
-# Graphics, GPU: 3D will be enabled (even if vmware doesn't support the chip) if we whitelisted it.
-if [ -n "$SLX_VMWARE_3D" ]; then
- writelog "FORCE3D set - overriding 3D in vmx file."
- echo 'mks.gl.allowBlacklistedDrivers = "TRUE"' >> "${TMPCONFIG}"
- # We override... play safe and cap the hwVersion to 10, since some i915 chips goofed up with 12
- # Investigate if we might have to do this in other cases where we don't override
- if grep -qi '^mks.enable3d.*true' "${TMPCONFIG}"; then
- vmw_cap_hw_version "10"
- fi
-else
- writelog "FORCE3D not set - 3D will only work if GPU/driver is whitelisted by vmware."
-fi
-
-# Disable DPI scaling information passing via vmware tools
-sed -i '/^gui.applyHostDisplayScaling/d' "${TMPCONFIG}"
-echo 'gui.applyHostDisplayScalingToGuest = "FALSE"' >> "${TMPCONFIG}"
-
-# Additinal exam mode settings
-if [ -n "$SLX_EXAM" ]; then
- echo 'gui.restricted = "true"' >> "${TMPCONFIG}"
-fi
-
-# Killing duplicate lines (output much nicer than sort -u):
-awk '!a[$0]++' "${TMPCONFIG}" > "${TMPCONFIG}.tmp" && mv "${TMPCONFIG}.tmp" "${TMPCONFIG}"
-
-# Apply $maxhardwareversion to final VMX
HWVER=$(grep -i -m1 '^virtualHW.version *= *' "${TMPCONFIG}" | awk -F '=' '{print $2}' | sed -r 's/[^0-9]//g')
-if [ -n "$HWVER" ] && [ "$HWVER" -gt "$maxhardwareversion" ]; then
- writelog "Hardware version capped to $maxhardwareversion (was $HWVER)"
- sed -i 's/^virtualHW\.version.*$/virtualHW.version = "'$maxhardwareversion'"/I' "${TMPCONFIG}"
- HWVER="$maxhardwareversion"
-fi
-
-# Enable nested virtualization if not specified in remote vmx
-if [ -e "/run/hwinfo" ] && ! grep -qi '^vhv\.enable' "${TMPCONFIG}" \
- && grep -qE '^flags\s*:.*\b(ept|npt)\b' "/proc/cpuinfo" \
- && [ "$HWVER" -ge "9" ]; then
- . "/run/hwinfo"
- [ "${HW_KVM}" = "ENABLED" ] && echo 'vhv.enable = "TRUE"' >> "${TMPCONFIG}"
-fi
-# TODO: Need a way to check if supported by hardware before enabling!
-#grep -qi '^vpmc\.enable' "${TMPCONFIG}" || echo 'vpmc.enable = "TRUE"' >> "${TMPCONFIG}"
-
-# Disable space check warnings
-sed -i '/^mainMem.freeSpaceCheck/d' "${TMPCONFIG}"
-echo 'mainMem.freeSpaceCheck = "FALSE"' >> "${TMPCONFIG}"
-
-# At last_ Let's copy it to $confdir/run-vmware.conf
-cp -p "${TMPCONFIG}" "$conffile" && writelog "Copied TMPDIR/IMGUUID ${TMPCONFIG} to conffile ${conffile}" || \
- ( writelog "Could not copy TMPDIR/IMGUUID -${TMPCONFIG}- to conffile ${conffile}!"; cleanexit 1 )
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc
deleted file mode 100644
index 22718839..00000000
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc
+++ /dev/null
@@ -1,152 +0,0 @@
-#########################################
-# Include: Hardware checks and settings #
-#########################################
-
-set_hardware_legacy() {
-
-# use different network card (default e1000, vlance, vmxnet)
-if [ -n "${network_card}" ]; then
- network_virtualDev="ethernet0.virtualDev = \"${network_card}\""
-else
- network_virtualDev='ethernet0.virtualDev = "e1000"'
-fi
-
-# use different network card (default e1000, vlance, vmxnet)
-hostdev="/dev/vmnet1"
-case "${network_kind}" in
- bridge|bridged)
- hostdev="/dev/vmnet0"
- ;;
- nat)
- hostdev="/dev/vmnet1"
- ;;
- hostonly|host-only)
- hostdev="/dev/vmnet2"
- ;;
-esac
-
-# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio)
-sound="es1371"
-
-# set sound card explicitly if there is more than one card in the host system
-sound_fileName='sound.fileName = "-1"
-sound.autodetect = "TRUE"'
-
-# check for 3D configuration setting
-case "$enable3d" in
- true|yes)
- enable3d="TRUE"
- ;;
- *)
- enable3d="FALSE"
- ;;
-esac
-
-# check for whitelisted HW-3D
-FORCE3D=""
-if [ -n "$SLX_VMWARE_3D" ]; then
- FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"'
-fi
-
-# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect")
-case "$serial" in
- tty*)
- if [ -e "/dev/$serial" ]; then
- serialdev="serial0.filename = \"/dev/${serial}\""
- serial="TRUE"
- else
- serialdev="# no serial port configured"
- serial="FALSE"
- fi
- ;;
- auto*)
- serialdev="serial0.autodetect = \"TRUE\""
- serial="TRUE"
- ;;
- *)
- serialdev="# no serial port configured"
- serial="FALSE"
- ;;
-esac
-
-case "$parallel" in
- lp*|parport*)
- if [ -e "/dev/$parallel" ]; then
- paraldev="parallel0.filename = \"/dev/${parallel}\""
- paralbidi="TRUE"
- parallel="TRUE"
- else
- paraldev="# no parallel port configured"
- paralbidi="FALSE"
- parallel="FALSE"
- fi
- ;;
- auto*)
- paraldev="parallel0.autodetect = \"TRUE\""
- paralbidi="TRUE"
- parallel="TRUE"
- ;;
- *)
- paraldev="# no parallel port configured"
- paralbidi="FALSE"
- parallel="FALSE"
- ;;
-esac
-
-# check if ide/scsi and hwver of image
-# read only the first 30 lines to be sure
-imghead=$(head -n 30 "${diskfile}")
-
-## Added to handle persistent snapshots.
-if [[ "$originalVMDKFilePath" ]]; then
- echo "Select \"${originalVMDKFilePath}\" as information base for \"${diskfile}\"."
- imghead=$(head -n 30 "$originalVMDKFilePath") && \
-
- # Support suspend mode.
- stateFilePath="$(readlink -f "$(dirname "$diskfile")/"*.vmss)" && \
- if [ -f "$stateFilePath" ]; then
- echo "Found state file \"$stateFilePath\"." && \
- stateFileConfiguration="
- checkpoint.vmState = \"$stateFilePath\""
- fi
- POSTRUN="stateFilePath=\"\$(readlink -f \"${confdir}/\"*.vmss)\" && memoryFilePath=\"\$(readlink -f \"${confdir}/\"*.vmem)\" && [ -f \"\$stateFilePath\" ] && echo \"Saving state and memory file \\\"\$stateFilePath\\\" and \\\"\$memoryFilePath\\\".\" && mv -f \"\$stateFilePath\" \"$(dirname "$diskfile")/\" && mv -f \"\$memoryFilePath\" \"$(dirname "$diskfile")/\""
-fi
-
-##
-hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}')
-
-
-if [ -z "$override_hddtype" ]; then
- hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}')
-else
- hddrv=$override_hddtype
-fi
-
-PCIE=
-case "${hddrv}" in
- ide)
- ide="TRUE"
- scsi="FALSE"
- ;;
- lsisas*)
- ide="FALSE"
- scsi="TRUE"
- PCIE='pciBridge4.present = "TRUE"
- pciBridge4.virtualDev = "pcieRootPort"
- pciBridge4.functions = "8"'
- ;;
- lsilogic|buslogic)
- ide="FALSE"
- scsi="TRUE"
- ;;
- scsi)
- ide="FALSE"
- scsi="TRUE"
- hddrv="lsilogic"
- ;;
- *)
- slxlog "virt-vmware-hdd" "vmware: Unknown HDD adapter type $hddrv"
- ;;
-esac
-
-}
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc
index 0c45ee59..da820bc6 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc
@@ -3,8 +3,6 @@
#####################################################################
set_vmware_include_variables() {
- [ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800
-
# temporary disk space for logs, etc...
redodir="/tmp/virt/vmware/${USER}.$$"
@@ -14,9 +12,6 @@ set_vmware_include_variables() {
# configfile
conffile="${confdir}/run-vmware.conf"
- # diskfile
- diskfile="${vmpath}"
-
# users vmware config folder
[ -z "${HOME}" ] && HOME=$(getent passwd "$(whoami)" | awk -F ':' '{print $6}')
vmhome="${HOME}/.vmware"
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc
deleted file mode 100644
index 52a341ba..00000000
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################
-# Include: Write config files #
-###############################
-
-write_config_files_legacy() {
- # create vmware directories
- mkdir -p "$redodir" >/dev/null 2>&1
- mkdir -p "$confdir" >/dev/null 2>&1
- mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1
- touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1
-
- # create preferences file ${vmhome}/preferences
- source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file
-
- # create VMware config file (conffile)
- source "${VMWAREINCLUDEDIR}/create_vmware_config_file_legacy.inc" && create_vmware_config_file_legacy
-
- # link to conffile if confdir != redodir
- [ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1
-
- # sync is needed to ensure that data is really written to virtual disk
- # TODO: Move to general run-virt, right before exec of vm
- sync
-
- # own nvram. We need it for floppy drive b, default nvram has just drive a
- if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then
- slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'"
- fi
-}
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc
new file mode 100644
index 00000000..e664f02f
--- /dev/null
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc
@@ -0,0 +1,189 @@
+
+# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE
+# and VM_DISK_REDOLOGDIR.
+sed -i 's#%VM_DISK_PATH%#'"$VM_DISKFILE_RO"'#g' "${TMPCONFIG}"
+sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "${TMPCONFIG}"
+sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "${TMPCONFIG}"
+
+# Ethernet: All we do is entering a generated MAC, as we do not want to interfere
+# in the possible case no networking is wanted.
+writelog "Guest MAC: $macaddr"
+echo 'ethernet0.addressType = "static"' >> "${TMPCONFIG}"
+echo 'ethernet0.address = "'"${macaddr}"'"' >> "${TMPCONFIG}"
+
+# DVD, CDROM
+# XXX: For now it's safe to assume ide channel 1 is free, as we support only one HDD, and if it's IDE, it's on channel 0
+cat >> "${TMPCONFIG}" <<-HEREEND
+ide1:0.present = "$cdrom0"
+ide1:0.autodetect = "TRUE"
+ide1:0.fileName = "auto detect"
+ide1:0.deviceType = "cdrom-raw"
+ide1:1.present = "$cdrom1"
+ide1:1.autodetect = "TRUE"
+ide1:1.fileName = "auto detect"
+ide1:1.deviceType = "cdrom-raw"
+HEREEND
+
+if [ -n "$FLOPPYIMG" ]; then
+ floppy1="TRUE"
+else
+ floppy1="FALSE"
+fi
+
+# Floppies:
+cat >> "${TMPCONFIG}" <<-HEREEND
+floppy0.present = "$floppy0"
+floppy0.startConnected = "FALSE"
+floppy0.autodetect = "TRUE"
+floppy0.fileName = "auto detect"
+floppy1.present = "$floppy1"
+floppy1.startConnected = "TRUE"
+floppy1.fileType = "file"
+floppy1.fileName = "$FLOPPYIMG"
+HEREEND
+
+writelog "numvcpus = ${cpu_cores} - maxvcpus=${real_core_count}"
+
+# RAM, CPUs
+cat >> "${TMPCONFIG}" <<-HEREEND
+numvcpus = "$cpu_cores"
+cpuid.coresPerSocket = "$cores_per_socket"
+maxvcpus = "$real_core_count"
+memsize = "$mem"
+MemAllowAutoScaleDown = "FALSE"
+MemTrimRate = "-1"
+HEREEND
+
+# USB fallback: Only write usb config if there's none
+if ! grep -q -i "^usb\.present" "${TMPCONFIG}"; then
+ # Nothing found, go ahead
+ if [ -n "$SLX_EXAM" ]; then
+ # Exam mode: Default to no USB
+ sed -i '/^usb\./Id' "${TMPCONFIG}"
+ echo 'usb.present = "FALSE"' >> "${TMPCONFIG}"
+ else
+ cat >> "${TMPCONFIG}" <<-HEREEND
+ usb.present = "TRUE"
+ HEREEND
+ fi
+fi
+sed -i '/^usb\.generic\.autoconnect/Id' "${TMPCONFIG}"
+echo 'usb.generic.autoconnect = "TRUE"' >> "${TMPCONFIG}"
+# USB 3.0 support changes quality and has different side effects
+# with every minor release of vmware. Always force 2.0 for now.
+# TODO: Get it fixed by vmware?
+sed -i '/^ehci\.present/Id;/^usb_xhci\.present/Id' "${TMPCONFIG}"
+echo 'ehci.present = "TRUE"' >> "${TMPCONFIG}"
+
+# shared folders
+if [ "$HGFS_DISABLED" = "FALSE" ]; then
+ cat >> "${TMPCONFIG}" <<-HEREEND
+ sharedFolder.option = "alwaysEnabled"
+ sharedFolder0.present = "$shfolders"
+ sharedFolder0.enabled = "$shfolders"
+ sharedFolder0.expiration = "never"
+ sharedFolder0.guestName = "$homesharename"
+ sharedFolder0.hostPath = "$homesharepath"
+ sharedFolder0.readAccess = "TRUE"
+ sharedFolder0.writeAccess = "TRUE"
+ sharedFolder1.present = "$shfolders"
+ sharedFolder1.enabled = "$shfolders"
+ sharedFolder1.expiration = "never"
+ sharedFolder1.guestName = "$commonsharename"
+ sharedFolder1.hostPath = "$commonsharepath"
+ sharedFolder1.readAccess = "TRUE"
+ sharedFolder1.writeAccess = "FALSE"
+ sharedFolder.maxNum = "2"
+ hgfs.mapRootShare = "TRUE"
+ hgfs.linkRootShare = "TRUE"
+ HEREEND
+fi
+
+# Isolation tools: settings
+cat >> "${TMPCONFIG}" <<-HEREEND
+isolation.tools.hgfs.disable = "$HGFS_DISABLED"
+isolation.tools.dnd.disable = "FALSE"
+isolation.tools.copy.enable = "TRUE"
+isolation.tools.paste.enabled = "TRUE"
+HEREEND
+
+# Serial, parallel: Empty, nothing is being currently set. TODO later.
+
+# Graphics, GPU: 3D will be enabled (even if vmware doesn't support the chip) if we whitelisted it.
+if [ -n "$SLX_VMWARE_3D" ]; then
+ writelog "FORCE3D set - overriding 3D in vmx file."
+ echo 'mks.gl.allowBlacklistedDrivers = "TRUE"' >> "${TMPCONFIG}"
+ # We override... play safe and cap the hwVersion to 10, since some i915 chips goofed up with 12
+ # Investigate if we might have to do this in other cases where we don't override
+ if grep -qi '^mks.enable3d.*true' "${TMPCONFIG}"; then
+ vmw_cap_hw_version "10"
+ fi
+else
+ writelog "FORCE3D not set - 3D will only work if GPU/driver is whitelisted by vmware."
+fi
+
+# Disable DPI scaling information passing via vmware tools
+sed -i '/^gui.applyHostDisplayScaling/Id' "${TMPCONFIG}"
+echo 'gui.applyHostDisplayScalingToGuest = "FALSE"' >> "${TMPCONFIG}"
+
+# Additinal exam mode settings
+if [ -n "$SLX_EXAM" ]; then
+ echo 'gui.restricted = "true"' >> "${TMPCONFIG}"
+fi
+
+# Hack resolution if we know the desired one is not in the default list of vmx_svga
+# For now, only do it on the odd ones, as we don't know if this has any side effects
+# This seems unnecessary on Win7 but is required on WinXP - need more research for other OSs
+case "$RESOLUTION" in
+ 1600x900|2560x1440|2880x1800|3200x1800)
+ X=${RESOLUTION%x*}
+ Y=${RESOLUTION#*x}
+ BYTES=$(( ( ( X * Y * 4 + 65535 ) / 65536 ) * 65536 ))
+ [ "$BYTES" -lt 16777216 ] && BYTES=16777216
+ cat >> "${TMPCONFIG}" <<-EOF
+ svga.autodetect = "FALSE"
+ svga.vramSize = $BYTES
+ svga.maxWidth = $X
+ svga.maxHeight = $Y
+ EOF
+ ;;
+esac
+
+# Killing duplicate lines (output much nicer than sort -u):
+awk '!a[$0]++' "${TMPCONFIG}" > "${TMPCONFIG}.tmp" && mv -f "${TMPCONFIG}.tmp" "${TMPCONFIG}"
+
+# Apply $maxhardwareversion to final VMX
+if [ -n "$HWVER" ] && [ "$HWVER" -gt "$maxhardwareversion" ]; then
+ writelog "Hardware version capped to $maxhardwareversion (was $HWVER)"
+ sed -i 's/^virtualHW\.version.*$/virtualHW.version = "'$maxhardwareversion'"/I' "${TMPCONFIG}"
+ HWVER="$maxhardwareversion"
+fi
+
+# Enable nested virtualization if not specified in remote vmx
+if [ -e "/run/hwinfo" ] && ! grep -qi '^vhv\.enable' "${TMPCONFIG}" \
+ && grep -qE '^flags\s*:.*\b(ept|npt)\b' "/proc/cpuinfo" \
+ && [ "$HWVER" -ge "9" ]; then
+ . "/run/hwinfo"
+ [ "${HW_KVM}" = "ENABLED" ] && echo 'vhv.enable = "TRUE"' >> "${TMPCONFIG}"
+fi
+# TODO: Need a way to check if supported by hardware before enabling!
+#grep -qi '^vpmc\.enable' "${TMPCONFIG}" || echo 'vpmc.enable = "TRUE"' >> "${TMPCONFIG}"
+
+# Disable space check warnings
+sed -i '/^mainMem.freeSpaceCheck/Id' "${TMPCONFIG}"
+echo 'mainMem.freeSpaceCheck = "FALSE"' >> "${TMPCONFIG}"
+
+# See if there are any USB devices connected that we want to pass through immediately
+get_usb_devices 'usb.autoConnect.deviceXXXXX = "0x%VENDOR%:0x%PRODUCT%"' \
+ | sed -r 's/0x0+/0x/g' \
+ | awk '{sub(/XXXXX/,NR-1)}1' \
+ >> "${TMPCONFIG}"
+
+# At last_ Let's copy it to $confdir/run-vmware.conf
+if cp -p "${TMPCONFIG}" "$conffile"; then
+ writelog "Copied TMPDIR/IMGUUID ${TMPCONFIG} to conffile ${conffile}"
+else
+ writelog "Could not copy TMPDIR/IMGUUID -${TMPCONFIG}- to conffile ${conffile}!"
+ cleanexit 1
+fi
+
diff --git a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include
index 4d263272..f66bc9b8 100644
--- a/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include
+++ b/remote/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include
@@ -20,7 +20,7 @@
################################################################################
VMWAREINCLUDEDIR=/opt/openslx/vmchooser/vmware/includes
-vmostype=$(rv_clean_string "$vmostype")
+VM_OS_TYPE=$(rv_clean_string "$VM_OS_TYPE")
# declaration of default variables for vmware
source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables
@@ -33,32 +33,23 @@ vmw_cap_hw_version() {
[ "$1" -lt "$maxhardwareversion" ] && maxhardwareversion="$1"
}
-if [ "$LEGACY" ]; then
- # hardware checks
- source "${VMWAREINCLUDEDIR}/set_hardware_legacy.inc" && set_hardware_legacy
- # write configuration files
- # write_config_files calls:
- # set_vmhome_preferences_header
- # set_vmware_startup_file
- source "${VMWAREINCLUDEDIR}/write_config_files_legacy.inc" && write_config_files_legacy
-else
- # write configuration files
- source "${VMWAREINCLUDEDIR}/write_config_files.inc"
+# get information from downloaded vmx
+source "${VMWAREINCLUDEDIR}/parse_vmx.inc"
- # parse the given vmx file
- source "${VMWAREINCLUDEDIR}/parse_vmx.inc"
-fi
+# determine limitations wrt RAM and CPU count of VM
+source "${VMWAREINCLUDEDIR}/determine_hardware_limitations.inc"
-# logging and stdout
-# needs writelog() from vmchooser-run_virt
-source "${VMWAREINCLUDEDIR}/logging.inc" && logging
+# create file and directory structure for vmware setup
+source "${VMWAREINCLUDEDIR}/create_static_directory_structure.inc"
-# See if there are any USB devices connected that we want to pass through immediately
-get_usb_devices 'usb.autoConnect.deviceXXXXX = "0x%VENDOR%:0x%PRODUCT%"' \
- | sed -r 's/0x0+/0x/g' \
- | awk '{sub(/XXXXX/,NR-1)}1' \
- >> "$conffile"
+# create preferences file ${vmhome}/preferences
+source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file
+# parse the given vmx file
+source "${VMWAREINCLUDEDIR}/write_final_vmx.inc"
+
+# print summary - needs writelog() from vmchooser-run_virt
+source "${VMWAREINCLUDEDIR}/log_config_summary.inc"
# For debugging
cp "$conffile" "/tmp/vmware-last-config"
diff --git a/remote/modules/vmware/module.conf b/remote/modules/vmware/module.conf
index 697ba546..d3a84d80 100644
--- a/remote/modules/vmware/module.conf
+++ b/remote/modules/vmware/module.conf
@@ -1,4 +1,4 @@
-REQUIRED_DOWNLOAD_BASE="http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.1.0/3272444/linux/core/"
+REQUIRED_DOWNLOAD_BASE="http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.5.1/4542065/linux/core/"
REQUIRED_TYPE="workstation"
REQUIRED_MODULES="kernel"
REQUIRED_DIRECTORIES="
@@ -38,8 +38,8 @@ REQUIRED_VMWARE_DELETIONS="
/etc/cups/thnuclnt.convs
/etc/cups/thnuclnt.types
/etc/modprobe.d/vmware-fuse.conf
- /lib/modules/3.11.0-13-generic/misc/vmnet.ko
- /lib/modules/3.11.0-13-generic/misc/vmmon.ko
+ /lib/modules/*-generic/misc/vmnet.ko
+ /lib/modules/*-generic/misc/vmmon.ko
/usr/share/mime/packages/vmware-player.xml
/usr/share/applications/vmware*
/usr/share/desktop-directories/vmware-ace-vms.directory
diff --git a/remote/modules/xorg/module.build b/remote/modules/xorg/module.build
index 16e0bb5b..f7678f65 100644
--- a/remote/modules/xorg/module.build
+++ b/remote/modules/xorg/module.build
@@ -12,11 +12,17 @@ build() {
tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
# copy udev rules to correct location
- [ -d "${MODULE_BUILD_DIR}/lib/udev" ] && mv "${MODULE_BUILD_DIR}/lib/udev" "${MODULE_BUILD_DIR}/usr/lib/"
+ if [ -d "${MODULE_BUILD_DIR}/lib/udev" ]; then
+ cp -r "${MODULE_BUILD_DIR}/lib/udev" "${MODULE_BUILD_DIR}/usr/lib/"
+ fi
+ if [ -d "${MODULE_BUILD_DIR}/etc/udev" ]; then
+ cp -r "${MODULE_BUILD_DIR}/etc/udev" "${MODULE_BUILD_DIR}/usr/lib/"
+ fi
+ rm -rf -- "${MODULE_BUILD_DIR}/lib/udev" "${MODULE_BUILD_DIR}/etc/udev"
}
post_copy() {
mkdir -p "${TARGET_BUILD_DIR}/etc/X11"
- [ ! -e ${TARGET_BUILD_DIR}/etc/X11/X ] && ln -s /usr/bin/Xorg ${TARGET_BUILD_DIR}/etc/X11/X
+ [ ! -e ${TARGET_BUILD_DIR}/etc/X11/X ] && ln -s /usr/bin/Xorg ${TARGET_BUILD_DIR}/etc/X11/X
}
diff --git a/remote/modules/xorg/module.conf b/remote/modules/xorg/module.conf
index 2fc6ab94..6aacc654 100644
--- a/remote/modules/xorg/module.conf
+++ b/remote/modules/xorg/module.conf
@@ -11,6 +11,7 @@ REQUIRED_BINARIES="
xkbevd
xrandr
xset
+ xdotool
xkbcomp
vmmouse_detect
"
@@ -18,6 +19,9 @@ REQUIRED_DIRECTORIES="
/usr/share/X11
/usr/share/fonts
/etc/fonts
+ /usr/bin
+ /bin
+ /usr/lib/udev
"
REQUIRED_FILES="
"
diff --git a/remote/modules/xorg/module.conf.ubuntu b/remote/modules/xorg/module.conf.ubuntu
index 90a46747..4f063440 100644
--- a/remote/modules/xorg/module.conf.ubuntu
+++ b/remote/modules/xorg/module.conf.ubuntu
@@ -1,10 +1,7 @@
REQUIRED_INSTALLED_PACKAGES="
- fonts-dejavu-core
- fonts-dejavu-extra
- ttf-dejavu-core
- x11-xserver-utils
-"
-REQUIRED_CONTENT_PACKAGES="
+ fonts-dejavu-core
+ fonts-dejavu-extra
+ ttf-dejavu-core
xserver-xorg$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-core$UBUNTU_XORG_PKG_SUFFIX
libgl1-mesa-dri$UBUNTU_XORG_PKG_SUFFIX
@@ -12,18 +9,47 @@ REQUIRED_CONTENT_PACKAGES="
xkb-data
x11-xkb-utils
x11-xserver-utils
+ xdotool
xserver-xorg-input-evdev$UBUNTU_XORG_PKG_SUFFIX
- xserver-xorg-input-mouse$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-synaptics$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-input-vmmouse$UBUNTU_XORG_PKG_SUFFIX
- xserver-xorg-video-intel$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-wacom$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-ati$UBUNTU_XORG_PKG_SUFFIX
- xserver-xorg-video-vesa$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-fbdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-intel$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-mga$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-nouveau$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-radeon$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-sisusb$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vesa$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-vmware$UBUNTU_XORG_PKG_SUFFIX
+"
+REQUIRED_CONTENT_PACKAGES="
+ fonts-dejavu-core
+ fonts-dejavu-extra
+ ttf-dejavu-core
+ xserver-xorg$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-core$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-dri$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-glx$UBUNTU_XORG_PKG_SUFFIX
+ xkb-data
+ x11-xkb-utils
+ x11-xserver-utils
+ xdotool
+ xserver-xorg-input-evdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-synaptics$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-vmmouse$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-wacom$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-ati$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-fbdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-intel$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-mga$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-nouveau$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-radeon$UBUNTU_XORG_PKG_SUFFIX
xserver-xorg-video-sisusb$UBUNTU_XORG_PKG_SUFFIX
- xserver-xorg-video-nouveau$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vesa$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vmware$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-input-mouse$UBUNTU_XORG_PKG_SUFFIX
@xserver-xorg-video-openchrome$UBUNTU_XORG_PKG_SUFFIX
@xserver-xorg-video-savage$UBUNTU_XORG_PKG_SUFFIX
@xserver-xorg-video-trident$UBUNTU_XORG_PKG_SUFFIX
@@ -36,9 +62,6 @@ REQUIRED_CONTENT_PACKAGES="
@xserver-xorg-video-geode$UBUNTU_XORG_PKG_SUFFIX
@xserver-xorg-video-s3$UBUNTU_XORG_PKG_SUFFIX
@xserver-xorg-video-tdfx$UBUNTU_XORG_PKG_SUFFIX
- fonts-dejavu-core
- fonts-dejavu-extra
- ttf-dejavu-core
"
REQUIRED_DIRECTORIES+="
diff --git a/remote/modules/xscreensaver/data/etc/X11/Xsession.d/95-xscreensaver b/remote/modules/xscreensaver/data/etc/X11/Xsession.d/95-xscreensaver
new file mode 100755
index 00000000..fc6588ae
--- /dev/null
+++ b/remote/modules/xscreensaver/data/etc/X11/Xsession.d/95-xscreensaver
@@ -0,0 +1,33 @@
+#!/bin/ash
+
+if which xscreensaver; then
+ [ -z "$UID" ] && UID=$(id -u)
+ [ -z "$HOME" ] && HOME="$(getent passwd "$UID" | head -n 1 | awk -F ':' '{print $6}')"
+ if ! [ -s "$HOME/.xscreensaver" ]; then
+ . /opt/openslx/config
+ NUM=${SLX_SCREEN_STANDBY_TIMEOUT}
+ if [ -n "$NUM" ] && [ "$NUM" -gt 60 ]; then
+ SECS=0$(( NUM % 60 ))
+ MINS=0$(( ( NUM / 60 ) % 60 ))
+ HRS=0$(( ( NUM / 3600 ) % 60 ))
+ STANDBY="${HRS:$(( ${#HRS} - 2 )):2}:${MINS:$(( ${#MINS} - 2 )):2}:${SECS:$(( ${#SECS} - 2 )):2}"
+ else
+ STANDBY=0:00:00
+ fi
+ cat > "$HOME/.xscreensaver" <<EOF
+mode: blank
+timeout: 24:00:00
+lock: True
+lockTimeout: 0:00:10
+fade: False
+unfade: False
+dpmsEnabled: True
+dpmsStandby: $STANDBY
+dpmsSuspend: $STANDBY
+dpmsOff: $STANDBY
+EOF
+ fi
+ xscreensaver -no-splash &
+fi
+true
+
diff --git a/remote/modules/xscreensaver/module.build b/remote/modules/xscreensaver/module.build
new file mode 100644
index 00000000..435a7b10
--- /dev/null
+++ b/remote/modules/xscreensaver/module.build
@@ -0,0 +1,13 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ list_packet_files > "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/remote/modules/xscreensaver/module.conf b/remote/modules/xscreensaver/module.conf
new file mode 100644
index 00000000..2134f0cb
--- /dev/null
+++ b/remote/modules/xscreensaver/module.conf
@@ -0,0 +1,8 @@
+REQUIRED_BINARIES="
+ xscreensaver
+ xscreensaver-command
+"
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES="
+ /etc/pam.d/
+"
diff --git a/remote/modules/xscreensaver/module.conf.ubuntu b/remote/modules/xscreensaver/module.conf.ubuntu
new file mode 100644
index 00000000..b25b886f
--- /dev/null
+++ b/remote/modules/xscreensaver/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ xscreensaver
+"
+REQUIRED_INSTALLED_PACKAGES="
+ xscreensaver
+"