From 6806ae4a850fc7785a8c05304237cf53b5b8f951 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Fri, 23 Dec 2016 13:12:09 +0100 Subject: merge with latest dev version (tm-scripts commit f5a59daf8d70a9027118292cd40b18c221897408) --- .../data/opt/openslx/vmchooser/data/linux/LIESMICH | 24 ++++ .../data/opt/openslx/vmchooser/data/linux/README | 21 ++++ .../vmchooser/data/linux/includes/00_vars.inc | 29 +++++ .../vmchooser/data/linux/includes/10_functions.inc | 51 ++++++++ .../data/linux/includes/10_preliminaries.inc | 20 +++ .../data/linux/includes/15_set_trapping.inc | 14 +++ .../vmchooser/data/linux/includes/20_get_creds.inc | 27 ++++ .../data/linux/includes/30_get_shares.inc | 22 ++++ .../data/linux/includes/30_mount_shares.inc | 66 ++++++++++ .../data/linux/includes/40_check_fallback.inc | 8 ++ .../data/linux/includes/50_postliminaries.inc | 21 ++++ .../vmchooser/data/linux/includes/50_umounter.inc | 12 ++ .../opt/openslx/vmchooser/data/linux/mnt_shares | 62 +++++++++ .../opt/openslx/vmchooser/data/linux/resolution | 102 +++++++++++++++ .../vmchooser/data/linux/resolution_standalone | 138 +++++++++++++++++++++ .../opt/openslx/vmchooser/data/linux/umnt_shares | 40 ++++++ .../opt/openslx/vmchooser/data/linux/vm_installer | 87 +++++++++++++ .../opt/openslx/vmchooser/data/linux/vm_runtime | 97 +++++++++++++++ 18 files changed, 841 insertions(+) create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer create mode 100755 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime (limited to 'core/modules/run-virt/data/opt/openslx/vmchooser/data/linux') diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH new file mode 100644 index 00000000..326af2a4 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH @@ -0,0 +1,24 @@ +Dieses Paket besteht aus folgenden Skripten: + +vm_installer: Dieses Skript einmalig in einer lokalen, permanenten (also + nicht innerhalb des Poolsystems) Virtuellen Maschine ausführen. + Es schreibt eine systemd-Servicedatei und verlinkt diese, um + beim Systemstart per vm_runtime die Skripte zu Auflösungsan- + passung und Einhängung eventuell übergebener Netzlaufwerke + nach Hochladung der VM in das Poolsystem automatisch zu starten. + Das Skript kann von der gemounteten (Pseudo-)Diskette /dev/fd1 + aus oder einzelstehend gestartet werden. + Unterstützung für init-basierte Systeme folgt noch. +vm_runtime: Dieses Skript wird beim booten der VM aufgerufen und patcht + Xsetup, um beim grafischen Start der VM die Skripte shares + und resolution aufzurufen. +mnt_shares: Liest die auf Pseudodiskette gegebene shares.dat aus und hängt + ggf. darin angegebene Netzlaufwerke ein. +resolution: Stellt die Auflösung der VM anhand der übergebenen Auflösung + des Grundsystems ein. + +resolution_standalone: Einzelstehende Version des resolution-Skriptes, die + keine Vorarbeiten seitens systemd bzw. vm_runtime benötigt. + Für geeignete Einbindung innerhalb der VM muss daher selbst + gesorgt werden. + diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README new file mode 100644 index 00000000..12777c67 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README @@ -0,0 +1,21 @@ +This package consists of the following scripts: + +vm_installer: This script is to be started once in a local, permanent (so + not within the pool system environment) virtual machine. It + writes a systemd service file and links it, so the scripts + for resolution setting and mounting network shares will be + started at boot time at boot time via vm_runtime. + It may be run from the mounted (pseudo) disk drive /dev/fd1 + or from elsewhere. + init will be supported at later time. +vm_runtime: Will be started at boot time and patches Xsetup, so the + scripts mnt_shares and resolution will be started at graphical + login. +mnt_shares: Reads the config file shares.dat from (pseudo) disk drive and + mounts therein given network shares. +resolution: Sets resolution within the virtual machine according to base + system resolution given via config file openslx.ini. + +resolution_standalone: Standalone version of resolution sctipt. Needs no + preliminary work done by systemd or vm_runtime. + One has to embed/start it via adequate means by hand. diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc new file mode 100644 index 00000000..bb7ae3a1 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/00_vars.inc @@ -0,0 +1,29 @@ +### Variablen ##################################### +LOCALUSER=student +USERHOME=/home/"$LOCALUSER" +USERHOMEDIR=/home/"$LOCALUSER"/PERSISTENT +DISKMOUNTDIR=/mnt/diskmount +SLXCONFIGFILE="$DISKMOUNTDIR"/openslx.ini +CONFIGFILE="$DISKMOUNTDIR"/shares.dat +KEYTEMP=$(mktemp -t XXXXXXXXXX.dat) +RAWKEYTEMP=$(mktemp -t XXXXXXXXXX.dat) +BYTES=256 +declare -a ROHSHARES + +if [ ! $(mount 2>/dev/null | grep -q "$DISKMOUNTDIR") ]; then + [ ! -d "$DISKMOUNTDIR" ] && mkdir -p "$DISKMOUNTDIR" + mount /dev/fd1 "$DISKMOUNTDIR" 2>/dev/null 1>&2 # Zu erl.: Fehlerfangen +fi + +NATADDR=$(head -n 1 "$CONFIGFILE" | cut -f 1 -d$'\t') +PORT=$(head -n 1 "$CONFIGFILE" | cut -f 2 -d$'\t') +SCHLUESSEL=$(head -n 1 "$CONFIGFILE" | cut -f 4 -d$'\t') +GLOBALDOMAINUSER=$(head -n 1 "$CONFIGFILE" | cut -f 5 -d$'\t') +GLOBALUSER=$(echo "$GLOBALDOMAINUSER" | cut -d '\' -f 2) + +REMAPMODE=$(grep 'remapMode=' "$SLXCONFIGFILE" | cut -d '=' -f 2) +CREATEMISSING=$(grep 'createMissingRemap=' "$SLXCONFIGFILE" | cut -d '=' -f 2) + +MOUNTOPTSCIFS="-v -t cifs -o uid=$(id --user "$LOCALUSER"),gid=$(id --group "$LOCALUSER"),forceuid,forcegid,file_mode=0700,dir_mode=0700,nobrl,noacl" +MOUNTOPTSNFS="-v -t nfs4 -o rw,nosuid,nodev,nolock,intr,hard,sloppy" +### Variablen Ende ################################ diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc new file mode 100644 index 00000000..97767c51 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_functions.inc @@ -0,0 +1,51 @@ +### Funktionen #################################### + +function xor() +{ local RES=($(echo "$1" | sed "s/../0x& /g")) + shift 1 + while [[ "$1" ]]; do + local ONE=($(echo "$1" | sed "s/../0x& /g")) + local COUNT1=${#RES[@]} + if [ $COUNT1 -lt ${#ONE[@]} ]; then + COUNT1=${#ONE[@]} + fi + for (( i = 0; i < $COUNT1; i++ )); do + RES[$i]=$((${ONE[$i]:-0} ^ ${RES[$i]:-0})) + done + shift 1 + done + printf "%02x" "${RES[@]}" +} + +function already_mounted() +{ + # Ausgabe: gemountet = true = 0, nicht gemountet = false = 1 + local AUSGANG + mount | grep -q " ${1} " && AUSGANG=0 || AUSGANG=1 + return $AUSGANG +} + +function mounter() +{ + # Ausgabe: konnte mounten: 0, konnte nicht mounten: 1, schon gemountet 2 + already_mounted "$3" + ERR=$? + if [ "$ERR" -eq 0 ]; then + logger "openslx sharemapper: $3 already mounted." + AUSGANG=2 + else + mount $1 $2 $3 2>/dev/null 1>&2 + ERR=$? + if [ "$ERR" -gt 0 ]; then + logger "openslx sharemapper: could not mount ${2} to ${3}." + AUSGANG=1 + else + logger "openslx sharemapper: ${2} mounted to ${3}." + AUSGANG=0 + fi + fi + return $AUSGANG +} + +### Funktionen Ende ############################### + diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc new file mode 100644 index 00000000..bcbd6ec1 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/10_preliminaries.inc @@ -0,0 +1,20 @@ +preliminaries_native() +{ + # USERHOMEDIR=~/PERSISTENT, not ~! ################ + [ -h "$USERHOMEDIR" ] && unlink "$USERHOMEDIR" + [ ! -d "$USERHOMEDIR" ] && mkdir -p "$USERHOMEDIR" +} + +preliminaries_vmware() +{ + # USERHOMEDIR=~/PERSISTENT, not ~! ################ + if [ -d "$USERHOMEDIR" ]; then + logger "openslx sharemapper: vmware mode: USERHOMEDIR ${USERHOMEDIR} is a directory, moving to ${USERHOMEDIR}_mov." + mv "$USERHOMEDIR" "${USERHOMEDIR}"_mov + fi + + [ -h "$USERHOMEDIR" ] && unlink "$USERHOMEDIR" + logger "openslx sharemapper: vmware mode: linking $USERHOMEDIR to /mnt/hgfs/home." + ln -s /mnt/hgfs/home "$USERHOMEDIR" || \ + logger "openslx sharemapper: vmware mode: Could not link to vmware hgfs mount dir." +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc new file mode 100644 index 00000000..c49b99ff --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/15_set_trapping.inc @@ -0,0 +1,14 @@ +function ausgang() +{ rm -f "$KEYTEMP" + rm -f "$RAWKEYTEMP" + # umount "$DISKMOUNTDIR" # as mounted by systemd now. +} + +function set_trapping() +{ + ### Trap ########################################## + trap ausgang EXIT SIGHUP SIGINT SIGTERM + ################################################### +} + +set_trapping diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc new file mode 100644 index 00000000..c6f6ffcb --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc @@ -0,0 +1,27 @@ +function get_creds() +{ + # udp-Socket erzeugen Kanal erzeugen:: + exec 13<>/dev/udp/"$NATADDR"/"$PORT" + + # temp. Datei - wer hat Angst vor Nullbytes? Ich! Ich! Ich! + head -n 1 "$CONFIGFILE" |cut -f3 -d$'\t' | while read -n 2 CODE; do [ -n "$CODE" ] && printf "\x$CODE"; done >"$KEYTEMP" + # Auf Socket fuer Grundsystem schreiben: + cat "$KEYTEMP" >&13 + + # Serverantwort pwdaemon in temp. Datei schreiben: + timeout 2s dd bs=$BYTES count=1 of="$RAWKEYTEMP" <&13 2>/dev/null + + # Kanal zu Socket schließen: + exec 13<&- + exec 13>&- + + # Wieviele Zeichen (Bytes 1 und 2 der Paketnutzlast)? + ANZAHL=$((16#$(dd if=$RAWKEYTEMP bs=1 count=2 2>/dev/null|hexdump -e '1/1 "%02x"'))) + + # Und raus-xor-en: + PW=$( xor $(dd if="$RAWKEYTEMP" bs=1 skip=2 2>/dev/null|hexdump -e '1/1 "%02x"') \ + $(head -n 1 "$CONFIGFILE" | cut -f 4 -d$'\t') | sed 's/../\\x&/g') + + PW=$(echo -e "$PW") # \x...-Ausdrücke zu ASCII + PW="${PW:0:${ANZAHL}}" # ...und Rest nach ANZAHL abhacken. +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc new file mode 100644 index 00000000..70b17236 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc @@ -0,0 +1,22 @@ +function get_shares() +{ + i=0 + while read -r LINIE; do + ROHSHARES[i]="$LINIE" + ((i++)) + done < "$CONFIGFILE" + +# echo "${#ROHSHARES[@]} eingelesen:" +# for (( i = 0; i < ${#ROHSHARES[@]}; i++ )); do +# echo -n "$i " +# echo "${ROHSHARES[i]}" +# done + + let SHAREZAHL=${#ROHSHARES[@]}-1 + if [ "$SHAREZAHL" -lt 1 ]; then + logger "openslx sharemapper: No shares to map/mount found in config file $CONFIGFILE." + exit 0 + else + logger "openslx sharemapper: $SHAREZAHL share(s) found." + fi +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc new file mode 100644 index 00000000..b1320d01 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/30_mount_shares.inc @@ -0,0 +1,66 @@ +function mount_shares() +{ + for (( CONFIGROW = 1; CONFIGROW < ${#ROHSHARES[@]}; CONFIGROW++ )); do + SHAREPATH=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 1 -d$'\t') # cifs- oder nfs-Share + SHARELETTER=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 2 -d$'\t' | \ + sed 's/://g') # Laufwerksbuchstabe ohne : + SHARENAME=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 3 -d$'\t' | sed 's/ /_/g') # Leerzeichen raus. + SHAREUSER=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 4 -d$'\t') # Username, bei Userhome nicht vorhanden + SHAREPASS=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 5 -d$'\t') # User-PW, bei Userhome nicht vorhanden + + # Sharetyp bestimmen: + if [ "${SHAREPATH:0:2}" == '\\' ]; then + USER=$(echo "$SHAREUSER"|cut -d '\' -f 2) + MOUNTOPTS="$MOUNTOPTSCIFS" + else + MOUNTOPTS="$MOUNTOPTSNFS" + fi + + # User-Homeverzeichnis? + if [ "${SHARENAME:0:5}" == "Home-" ]; then + logger "openslx sharemapper: home share \"$SHARENAME\" found (for PERSISTENT)." + export USER="${GLOBALUSER}" + export PASSWD="${PW}" + mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERHOMEDIR} 2>/dev/null 1>&2 + unset USER + unset PASSWD + else + if [ -z "${SHARELETTER}" ]; then + logger "openslx sharemapper: $SHARELETTER not found. Do not know where to mount." + continue + else + USERSHAREDIR="${USERHOME}"/SHARE_"${CONFIGROW}" # ROHSHARES: Zeilennummer; Shares >=1 + if [ ! -d "$USERSHAREDIR" ]; then + mkdir -p "$USERSHAREDIR" 2>/dev/null + chown "$LOCALUSER":$(id --group "$LOCALUSER") "$USERSHAREDIR" + chmod 700 "$USERSHAREDIR" + logger "openslx sharemapper: share mount dir $USERSHAREDIR created." + fi + fi + # Wenn kein Homeverzeichnis, dann share zuerst mit den Credentials aus der share-Konfig + # versuchen zu mounten; wenn nicht, dann mit den Hauptcredentials nachversuchen. + logger "openslx sharemapper: non-home share \"$SHARENAME\" (${CONFIGROW}) found." + export USER="${SHAREUSER}" + export PASSWD="${SHAREPASS}" + mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERSHAREDIR} 2>/dev/null 1>&2 + ERR=$? + if [ "$ERR" -eq 1 ]; then + export USER="${GLOBALUSER}" + export PASSWD="${PW}" + logger "openslx sharemapper: Could not mount ${USERSHAREDIR}, now trying using user credentials." + mounter "${MOUNTOPTS}" ${SHAREPATH} ${USERSHAREDIR} 2>/dev/null 1>&2 \ + ERR=$? # ERR merken wg. Links aus USERSHAREDIR + if [ "$ERR" -eq 1 ]; then + logger "openslx sharemapper: Could not mount ${USERSHAREDIR} even using user credentials; giving up." + fi + unset USER + unset PASSWD + fi + if [ "$ERR" -eq 0 ]; then + logger "openslx sharemapper: Linking ${SHARELETTER} and $SHARENAME, if possible." + [ -n "${SHARELETTER}" ] && ln -s "$USERSHAREDIR" "${USERHOME}"/"$SHARELETTER" + [ -n "${SHARELETTER}" ] && ln -s "$USERSHAREDIR" "${USERHOME}"/"$SHARENAME" + fi + fi + done +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc new file mode 100644 index 00000000..14a13f77 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/40_check_fallback.inc @@ -0,0 +1,8 @@ +check_fallback() { + if [ $(mount | grep -c " $USERHOMEDIR type cifs \| $USERHOMEDIR type nfs") -lt 1 ]; then + logger "openslx sharemapper: fallback mode: home share check failed, doing fallback to vmware mode." + preliminaries_vmware + else + logger "openslx sharemapper: fallback mode: home share check passed, no fallback necessary." + fi +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc new file mode 100644 index 00000000..f6f1cf7d --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_postliminaries.inc @@ -0,0 +1,21 @@ +postliminaries_native() +{ + # USERHOMEDIR=~/PERSISTENT, not ~! ################ + rmdir "$USERHOMEDIR" && logger "openslx unmounter: home directory entry (PERSISTENT) deleted." \ + || logger "openslx unmounter: could not delete home directory (PERSISTENT) entry - not empty / unmounted!" +} + +postliminaries_vmware() +{ + unlink "$USERHOMEDIR" + ERR=$? + if [ "$ERR" -ne 0 ]; then + logger "openslx unmounter: vmware mode: could not unlink ${USERHOMEDIR}!" + logger "openslx unmounter: vmware mode: this is a severe problem; I do not know what to do - exiting!" + exit 1 + else + logger "openslx unmounter: vmware mode: ${USERHOMEDIR} unlinked." + # checking whether there was a directory moved out earlier: + [ -d "${USERHOMEDIR}"_mov ] && mv "${USERHOMEDIR}"_mov "${USERHOMEDIR}" + fi +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc new file mode 100644 index 00000000..e161b961 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/50_umounter.inc @@ -0,0 +1,12 @@ +umount_home() { + umount /home/"${LOCALUSER}"/PERSISTENT && logger "openslx unmounter: umounted home (PERSISTENT)." \ + || logger "openslx unmounter: could not home (PERSISTENT)!" +} + +umount_shares() { + index=0 + for SHARE in $( mount | grep SHARE | tr -s ' ' | cut -f 3 -d " " ); do + umount "${SHARE}" && logger "openslx unmounter: umounted ${SHARE}." \ + || logger "openslx unmounter: could not umount ${SHARE}!" + done +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares new file mode 100755 index 00000000..0c94f0aa --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/mnt_shares @@ -0,0 +1,62 @@ +#!/bin/bash + +# set -x + +logger "openslx sharemapper: Started." + +OWNDIR=$(dirname $0) +for i in "$(dirname $0)"/includes/*.inc; do + source "$i" +done + +# Wait for network connection to base system +#!/bin/bash + +x=1 +while ! ping -w 1 -c 1 "${NATADDR}" 2>/dev/null 1>&2; do + [ "$x" -gt 20 ] && { logger "openslx sharemapper: could not reach base system. Giving up."; exit 1; } + let x=x+1 + sleep 2 +done + +logger "openslx sharemapper: base system reaching; commencing." + +# REMAPMODE (remapMode): 0: None, 1 Native, 2 Native Fallback, 3 vmware +# CREATEMISSING (createMissingRemap): 0: Nichts tun, 1 xdg-Verzeichnisse + +case "$REMAPMODE" in + 0) logger "openslx sharemapper: remapMode 0 (do nothing) detected." + exit 0 + ;; + 1) logger "openslx sharemapper: remapMode 1 (native mode) detected." + preliminaries_native + get_creds # fills global var PW with (currently) decrypted password + get_shares # fills array ROHSHARES; row 0 global infos from (shares-)CONFIGFILE, + # following rows: column 1 share path, col 2 drive letter, col 3 share name, + # column 4 username, col 5 password. + mount_shares # mounts shares given in array ROHSHARES. + exit 0 + ;; + 2) logger "openslx sharemapper: remapMode 2 (fallback mode) detected." + preliminaries_native + get_creds # fills global var PW with (currently) decrypted password + get_shares # fills array ROHSHARES; row 0 global infos from (shares-)CONFIGFILE, + # following rows: column 1 share path, col 2 drive letter, col 3 share name, + # column 4 username, col 5 password. + mount_shares # mounts shares given in array ROHSHARES. + check_fallback # checks for a mounted home and fallbacks to vmware share, if none found. + exit 0 + ;; + 3) logger "openslx sharemapper: remapMode 3 (vmware mode) detected." + preliminaries_vmware + mount_shares # mounts shares given in array ROHSHARES - runvirt checks whether there's + # a home share given or not.. + exit 0 + ;; + *) logger "openslx sharemapper: unknown remapMode in $SLXCONFIGFILE; doing nothing end exiting with error." + exit 1. + ;; +esac + +exit 0 + diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution new file mode 100755 index 00000000..24a0594f --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution @@ -0,0 +1,102 @@ +#!/bin/bash + +# Dieses Skript liest die Auflösungsdate HOSTRES.TXT aus der Diskette 2 (/dev/fd1). In dieser +# Datei wird die native (maximale) Auflösung des Grundsystems bereitgestellt. fd1 wird vom +# openslx-Grundsystem geliefert. Es loggt nach SYSLOG (syslog oder messages). +# +# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw... +# set -x + +MOUNTDIR=/mnt/diskmount +RESFILE="${MOUNTDIR}"/openslx.ini +DISPLAY=:0.0 + +check_resolution() { + # Now, let's wait even more seconds to see if another process re-changes res.: + ACTRES=$(xrandr|grep '*'|tr -s " "|cut -f 2 -d " ") + if [ "$ACTRES" != "$RESOLUTION" ]; then + logger "openslx resolution utility: resolution changed; re-changing." + xrandr --output ${AUSGABE} --mode ${RESOLUTION} + else + logger "openslx resolution utility: resolution unchanged." + fi +} + +logger "openslx resolution utility started." + +# Da nun fremdgemountet wird, hier sicherheitshalber zur Kontrolle wg. Gross-/Kleinschreibung: +RESFILE=$(find "${MOUNTDIR}" -iwholename "${RESFILE}") + +if [ -f "$RESFILE" ]; then + RESOLUTION=$(grep 'resolution=' "$RESFILE" | cut -d '=' -f 2) + if [ -z $RESOLUTION ]; then + logger "openslx resolution utility: resolution file $RESFILE seems to be empty!" + exit 1 + fi + logger "openslx resolution utility: resolution file $RESFILE yields ${RESOLUTION}." +else + logger "openslx resolution utility: resolution file $RESFILE not found!" + exit 1 +fi + +# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig! +# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:. +XAUTHDATEI=$(ps aux | grep -o "X.* \-auth *[^ ]*" | awk '{print $NF}') +if [ -n "$XAUTHDATEI" ]; then + logger "openslx resolution utility: XAUTHFILE found." + XAUTHORITY="${XAUTHDATEI}" +else + logger "openslx resolution utility: XAUTHFILE not found. Exiting." + exit 1 +fi + +# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das +# erste 'connected' in der Ausgabe xrandrs: +AUSGABE=$(xrandr -q|grep -m 1 " connected "|awk '{print $1}') +if [ -z "$AUSGABE" ]; then + logger "openslx resolution utility: Could not detect output device. Exiting." + exit 1 +fi + +# Pruefen, ob xrand eine passende modeline ausgibt: +if [ "$(xrandr | grep -c ${RESOLUTION})" -eq 0 ]; then + logger "openslx resolution utility: xrandr yields no fitting modeline; adding one." + MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g') + xrandr --newmode $(echo ${MODELINE}) + xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1) + # Dann einzusteuernde Auflösung natürlich auf die neue ändern: + RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1) + logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})." +fi + +# Auflösung per xrandr setzen: +xrandr --output ${AUSGABE} --mode ${RESOLUTION} +ERR=$? +if [ $ERR -ne 0 ]; then + logger "openslx resolution utility: xrandr error code ${ERR}." +else + logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set." +fi + +# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung +# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach, +# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen +# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht. + +# Now, let's wait some seconds to see if another process re-changes res.: +sleep 5 +check_resolution + +# Now, let's wait some more seconds to see if another process re-changes res.: +sleep 15 +check_resolution + +# Now, let's wait even more seconds to see if another process re-changes res.: +sleep 20 +check_resolution + +# Now, let's wait even more seconds to see if another process re-changes res.: +sleep 40 +check_resolution + +exit 0 diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone new file mode 100755 index 00000000..0dbbcf98 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution_standalone @@ -0,0 +1,138 @@ +#!/bin/bash + +# Dieses Skript liest die Auflösungsdate HOSTRES.TXT aus der Diskette 2 (/dev/fd1). In dieser +# Datei wird die native (maximale) Auflösung des Grundsystems bereitgestellt. fd1 wird vom +# openslx-Grundsystem geliefert. Es loggt nach SYSLOG (syslog oder messages). +# +# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw... +# set -x + +MOUNTDIR=/tmp/diskmount +RESFILE="${MOUNTDIR}"/openslx.ini +DISPLAY=:0.0 + +function ausgang() { + umount "${MOUNTDIR}" + rmdir "${MOUNTDIR}" +} + +check_resolution() { + # Now, let's wait even more seconds to see if another process re-changes res.: + ACTRES=$(xrandr|grep '*'|tr -s " "|cut -f 2 -d " ") + if [ "$ACTRES" != "$RESOLUTION" ]; then + logger "openslx resolution utility: resolution changed; re-changing." + xrandr --output ${AUSGABE} --mode ${RESOLUTION} + else + logger "openslx resolution utility: resolution unchanged." + fi +} + +trap ausgang EXIT SIGHUP SIGINT SIGTERM + +logger "openslx resolution utility started." + +# Mountpunkt erzeugen: +if [ ! -d "$MOUNTDIR" ]; then + mkdir "$MOUNTDIR" + logger "openslx resolution utility: mkdir'ed diskmount dir $MOUNTDIR." +fi + +# Virtuelles Floppylaufwerk mounten +mount /dev/fd1 "$MOUNTDIR" 2>/dev/null +ERR=$? +if [ $ERR -ne 0 ]; then + logger "openslx resolution utility: error code $ERR trying to mount /dev/fd1 to ${MOUNTDIR}. Remounting..." + mount -o remount /dev/fd1 "$MOUNTDIR" 2>/dev/null + ERR=$? + if [ $ERR -ne 0 ]; then + logger "openslx resolution utility: error code $ERR trying to remount /dev/fd1 to ${MOUNTDIR}. Giving up." + exit 1 + else + logger "openslx resolution utility: remount of /dev/fd1 mounted to diskmount dir ${MOUNTDIR} succeeded." + fi +else + logger "openslx resolution utility: /dev/fd1 mounted to diskmount dir ${MOUNTDIR}." +fi + +# Das Mounten mit shortname=WIN95 erwies sich als nicht zuverlässig. Daher hier Kontrolle: +RESFILE=$(find "${MOUNTDIR}" -iwholename "${RESFILE}") + +if [ -f "$RESFILE" ]; then + RESOLUTION=$(grep 'resolution=' "$RESFILE" | cut -d '=' -f 2) + if [ -z $RESOLUTION ]; then + logger "openslx resolution utility: resolution file $RESFILE seems to be empty!" + exit 1 + fi + logger "openslx resolution utility: resolution file $RESFILE yields ${RESOLUTION}." +else + logger "openslx resolution utility: resolution file $RESFILE not found!" + exit 1 +fi + +umount /dev/fd1 +ERR=$? +if [ "$ERR" -ne 0 ]; then + logger "openslx resolution utility: error code $ERR trying to to unmount /dev/fd1. Please unmount by hand." +fi + +# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig! +# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:. +XAUTHDATEI=$(ps aux | grep -o "X.* \-auth *[^ ]*" | awk '{print $NF}') +if [ -n "$XAUTHDATEI" ]; then + logger "openslx resolution utility: XAUTHFILE found." + XAUTHORITY="${XAUTHDATEI}" +else + logger "openslx resolution utility: XAUTHFILE not found. Exiting." + exit 1 +fi + +# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das +# erste 'connected' in der Ausgabe xrandrs: +AUSGABE=$(xrandr -q|grep -m 1 " connected "|awk '{print $1}') +if [ -z "$AUSGABE" ]; then + logger "openslx resolution utility: Could not detect output device." + exit 1 +fi + +# Pruefen, ob xrand eine passende modeline ausgibt: +if [ "$(xrandr | grep -c ${RESOLUTION})" -eq 0 ]; then + logger "openslx resolution utility: xrandr yields no fitting modeline; adding one." + MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g') + xrandr --newmode $(echo ${MODELINE}) + xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1) + # Dann einzusteuernde Auflösung natürlich auf die neue ändern: + RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1) + logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})." +fi + +# Auflösung per xrandr setzen: +xrandr --output ${AUSGABE} --mode ${RESOLUTION} +ERR=$? +if [ $ERR -ne 0 ]; then + logger "openslx resolution utility: xrandr error code ${ERR}." +else + logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set." +fi + +# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung +# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach, +# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen +# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht. + +# Now, let's wait some seconds to see if another process re-changes res.: +sleep 5 +check_resolution + +# Now, let's wait some more seconds to see if another process re-changes res.: +sleep 15 +check_resolution + +# Now, let's wait even more seconds to see if another process re-changes res.: +sleep 20 +check_resolution + +# Now, let's wait even more seconds to see if another process re-changes res.: +sleep 40 +check_resolution + +exit 0 diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares new file mode 100755 index 00000000..b028cf76 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/umnt_shares @@ -0,0 +1,40 @@ +#!/bin/bash + +# set -x + +logger "openslx sharemapper: umounter started." + +OWNDIR=$(dirname $0) +for i in "$(dirname $0)"/includes/*.inc; do + source "$i" +done + +# REMAPMODE (remapMode): 0: None, 1 Native, 2 Native Fallback, 3 vmware +# CREATEMISSING (createMissingRemap): 0: Nichts tun, 1 xdg-Verzeichnisse + +case "$REMAPMODE" in + 0) logger "openslx sharemapper: umounter: remapMode 0 (do nothing) detected." + exit 0 + ;; + 1) logger "openslx sharemapper: umounter: remapMode 1 (native mode) detected." + umount_shares + umount_home + postliminaries_native + ;; + 2) logger "openslx sharemapper: umounter: remapMode 2 (fallback mode) detected." + umount_shares + umount_home + postliminaries_native + exit 0 + ;; + 3) logger "openslx sharemapper: umounter: remapMode 3 (vmware mode) detected." + postliminaries_vmware + exit 0 + ;; + *) logger "openslx sharemapper: umounter: unknown remapMode in $SLXCONFIGFILE; doing nothing end exiting with error." + exit 1. + ;; +esac + +exit 0 + diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer new file mode 100755 index 00000000..978cee20 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer @@ -0,0 +1,87 @@ +#!/bin/bash + +PS=$(which ps) +GREP=$(which grep) +LOGGER=$(which logger) +MKDIR=$(which mkdir) +MOUNT=$(which mount) +MOUNTDIR=/mnt/diskmount/ +SERVICEFILE=openslx-scriptinstall.service + +# systemd erkennen +case $(${PS} --pid 1 -o comm h) in + systemd) echo "openslx praeinstaller: systemd detected." + if [ -d /etc/systemd/system ]; then + SERVICEDIR=/etc/systemd/system/ + else + SERVICEDIR=/usr/lib/systemd/system/ + fi + echo "openslx praeinstaller: installing systemd service file to ${SERVICEDIR}/${SERVICEFILE}." + + cat <<-HEREDOC > "$SERVICEDIR"/"$SERVICEFILE" + [Unit] + Description=openSLX script installer + Before=display-manager.service graphical.target + + [Service] + Type=oneshot + ExecStartPre=${MKDIR} -p /mnt/diskmount + ExecStartPre=-${MOUNT} /dev/fd1 /mnt/diskmount + ExecStart=${LOGGER} "openslx service file: started." + ExecStart=${MOUNTDIR}/linux/vm_runtime + ExecStart=${LOGGER} "openslx service file: done." + RemainAfterExit=no + HEREDOC + + [ ! -d /etc/systemd/system/graphical.target.wants ] && mkdir /etc/systemd/system/graphical.target.wants 2>/dev/null + [ ! -d /etc/systemd/system/basic.target.wants ] && mkdir /etc/systemd/system/basic.target.wants 2>/dev/null + + ln -s "${SERVICEDIR}"/"${SERVICEFILE}" /etc/systemd/system/graphical.target.wants/"${SERVICEFILE}" + ln -s "${SERVICEDIR}"/"${SERVICEFILE}" /etc/systemd/system/basic.target.wants/"${SERVICEFILE}" + + echo "openslx praeinstaller: doing systemd reload." + systemctl daemon-reload + ;; + init) echo "openslx praeinstaller: init(V) detected." + SERVICEDIR=/etc/init.d/ + [ ! -d "${SERVICEDIR}" ] && { echo "openslx praeinstaller: No init directory $SERVICEDIR found, exiting."; exit 1; } + SERVICEFILE=openslx-scriptinstall + echo "openslx praeinstaller: installing init service file to ${SERVICEDIR}/${SERVICEFILE}." + cat <<-THEREDOC > "${SERVICEDIR}"/"${SERVICEFILE}" + #!/bin/sh -e + ### BEGIN INIT INFO + # Provides: openSLX_scriptinstaller + # Required-Start: 2 3 4 5 + # Required-Stop: 0 1 6 + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # X-Interactive: false + # Short-Description: openSLX script package starter. + ### END INIT INFO + # + # Starts via Xsetup patching the openSLX script package + # to correct screen resolution and mount network shares + # when Xsetup is started. + + case "\$1" in + start) ${LOGGER} "openslx init file: started." + ${MKDIR} -p /mnt/diskmount + ${MOUNT} | ${GREP} -q /mnt/diskmount || ${MOUNT} /dev/fd1 /mnt/diskmount + ${MOUNTDIR}/linux/vm_runtime + ${LOGGER} "openslx init file: done." + ;; + stop|restart|force-reload) exit 0 ;; + *) echo "Usage: $0 {start}" >&2; exit 1 ;; + esac + THEREDOC + chmod +x "${SERVICEDIR}"/"${SERVICEFILE}" + echo "openslx praeinstaller: enabling ${SERVICEFILE}." + update-rc.d "${SERVICEFILE}" defaults + ;; + *) echo "openslx praeinstaller: Could not determine mother-of-all-processes (not systemd, not init)." + echo "openslx praeinstaller: Giving up, exiting." + exit 1 +esac + +exit 0 + diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime new file mode 100755 index 00000000..0a81c38d --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_runtime @@ -0,0 +1,97 @@ +#!/bin/bash + +# set -x + +# logger "openslx vm_runtime: Started." + +DISTRIBUTION=$(lsb_release -is | tr '[A-Z]' '[a-z]' | sed -r 's/[^a-z0-9]//g;s/project$//g;s/scientificsl$/scientific/g') +VERSION=$(lsb_release -rs) +SCRIPTDIR=/mnt/diskmount/linux/ +RESOLUTIONSCRIPT="${SCRIPTDIR}"/resolution +SHARESCRIPT="${SCRIPTDIR}"/mnt_shares +UMOUNTSCRIPT="${SCRIPTDIR}"/umnt_shares +XSETUP=$(find /etc/X* -name "Xsetup" 2>/dev/null) +XRESET=$(find /etc/X* -name "Xreset" 2>/dev/null) + +[ ! -f "${RESOLUTIONSCRIPT}" -o ! -f "${SHARESCRIPT}" ] && \ + { logger "openslx vm_runtime: could not find needed scripts on disk. Exiting." ; exit 1 ; } + +write_xsetup() { + logger "openslx vm_runtime: writing ${XSETUP}..." + cat<<-BISHIER > "${XSETUP}" + #!/bin/sh + ${SHARESCRIPT} & + ${RESOLUTIONSCRIPT} & + BISHIER +} + +patch_xsetup_shebang() { + # Patching after first line, to be exact. + logger "openslx vm_runtime: patching ${XSETUP} after shebang line, if necessary." + grep -q "${RESOLUTIONSCRIPT}" "${XSETUP}" || sed "1 a ${RESOLUTIONSCRIPT} \&" -i "${XSETUP}" + grep -q "${SHARESCRIPT}" "${XSETUP}" || sed "1 a ${SHARESCRIPT} \&" -i "${XSETUP}" +} + +write_xreset() { + logger "openslx vm_runtime: writing ${XRESET}..." + cat<<-BISHIER > "${XRESET}" + #!/bin/sh + ${UMOUNTSCRIPT} & + BISHIER +} + +patch_xreset_shebang() { + # Patching after first line, to be exact. + logger "openslx vm_runtime: patching ${XRESET} after shebang line, if necessary." + grep -q "${UMOUNTSCRIPT}" "${XRESET}" || sed "1 a ${UMOUNTSCRIPT} \&" -i "${XRESET}" +} + +case "${DISTRIBUTION}" in + opensuse) logger "openslx vm_runtime: openSuse detected." + if [ ! -e "${XSETUP}" ]; then + XSETUP=/etc/X11/xdm/Xsetup + write_xsetup + else + logger "openslx vm_runtime: patching ${XSETUP}." + if ! [ grep -c /etc/sysconfig/displaymanager "$XSETUP" 2>/dev/null 1>&2 ]; then + logger "openslx vm_runtime: Xsetup: openSuse marker found, patching." + sed "s#/etc/sysconfig/displaymanager#/etc/sysconfig/displaymanager\n"${SHARESCRIPT}" \&\n${RESOLUTIONSCRIPT} \&#g" \ + -i "${XSETUP}" + else + logger "openslx vm_runtime: Xsetup: openSuse marker not found, patching after shebang line." + xsetup_patch_shebang + fi + logger "openslx vm_runtime: patching ${RESET}." + patch_xreset_shebang + fi + ;; + ubuntu) logger "openslx vm_runtime: Ubuntu detected, version ${VERSION}." + # Ubuntu has at least in version 14.04 LTS a bug leading to missing Xsetup/Xreset entries: + grep -q "session-setup-script=/etc/X11/Xsetup" /etc/lightdm/lightdm.conf.d/50-myconfig.conf \ + || { sed "$ a session-setup-script=/etc/X11/Xsetup" -i /etc/lightdm/lightdm.conf.d/50-myconfig.conf + logger "openslx vm_runtime: session-setup-script patched into /etc/lightdm/lightdm.conf.d/50-myconfig.conf."; } + grep -q "session-reset-script=/etc/X11/Xreset" /etc/lightdm/lightdm.conf.d/50-myconfig.conf \ + || { sed "$ a session-reset-script=/etc/X11/Xreset" -i /etc/lightdm/lightdm.conf.d/50-myconfig.conf + logger "openslx vm_runtime: session-reset-script patched into /etc/lightdm/lightdm.conf.d/50-myconfig.conf."; } + if [ ! -e "${XSETUP}" ]; then + XSETUP=/etc/X11/Xsetup + write_xsetup + else + patch_xsetup_shebang + fi + if [ ! -e "${XRESET}" ]; then + XRESETP=/etc/X11/Xreset + write_xreset + else + patch_xreset_shebang + fi + ;; + debian) logger "openslx vm_runtime: Debian detected." + ;; + *) logger "openslx vm_runtime: Unknown distribution, exiting." + exit 1 + ;; +esac + +exit 0 + -- cgit v1.2.3-55-g7522