From b21d2bb616a2b0ecd641707a783b84903d97ce36 Mon Sep 17 00:00:00 2001 From: Christian Rößler Date: Wed, 25 Jul 2018 16:08:45 +0200 Subject: [run-virt] linux scripts extended (minimised, user etc). TO BE TESTED! --- .../vmchooser/data/linux/includes/00_vars.inc | 5 ++ .../vmchooser/data/linux/includes/10_functions.inc | 31 +++++++++ .../vmchooser/data/linux/includes/20_get_creds.inc | 2 +- .../data/linux/includes/30_mount_shares.inc | 50 ++++++++++++++ .../data/linux/includes/60_resolution.inc | 77 ++++++++++++++++++++++ .../vmchooser/data/linux/includes/90_runscript.inc | 69 +++++++++++++++---- 6 files changed, 221 insertions(+), 13 deletions(-) create mode 100644 core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/60_resolution.inc (limited to 'core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes') 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 index e8e0ae91..939becf6 100644 --- 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 @@ -24,6 +24,11 @@ GLOBALUSER=$(echo "$GLOBALDOMAINUSER" | cut -d '\' -f 2) REMAPMODE=$(grep '^remapMode=' "$SLXCONFIGFILE" | cut -d '=' -f 2) CREATEMISSING=$(grep '^createMissingRemap=' "$SLXCONFIGFILE" | cut -d '=' -f 2) +SCRIPTUSER=$(grep '^scriptUser=' "$SLXCONFIGFILE" | cut -d '=' -f 2) +SCRIPTVISIBILITY=$(grep '^scriptVisibility=' "$SLXCONFIGFILE" | cut -d '=' -f 2) +SCRIPTEXT=$(grep scriptExt "$DISKMOUNTDIR/openslx.ini" | cut -f 2 -d "=") + + # CIFSVERSIONS="3.11 3.0 2.1 2.0 1.0" CIFSVERSIONS="3.0 2.1 1.0 3.11 2.0" 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 index d6fd7caa..38213e86 100644 --- 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 @@ -1,5 +1,7 @@ ### Funktionen #################################### +### Funktionen Mounter ############################ + function xor() { local RES=($(echo "$1" | sed "s/../0x& /g")) shift 1 @@ -112,5 +114,34 @@ function mount_share() fi } +### Funktionen Mounter Ende ####################### + +### Funktionen resolution ######################### + +get_xauthfile() +{ + # Das ist mitunter ein Problem, da die richtige xauth zu finden - Distroabhängig! + for wartezeit in 1 2 3 5 10 10 0 ende; do + [ "$wartezeit" = "ende" ] && { logger "openslx resolution utility: XAUTHFILE not found. Exiting."; exit 1; } + XAUTHORITY=$(ps aux | grep -o "root.*X.* \-auth *[^ ]*" | awk '{print $NF}') + [ -n "${XAUTHORITY}" ] && break + sleep $wartezeit + done + logger "openslx resolution utility: XAUTHFILE found." +} + + +check_resolution() { + ACTRES=$(DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr|grep '*'|tr -s " "|cut -f 2 -d " ") + if [ "$ACTRES" != "$RESOLUTION" ]; then + logger "openslx resolution utility: resolution changed; re-changing." + DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --output ${AUSGABE} --mode ${RESOLUTION} + else + logger "openslx resolution utility: resolution unchanged." + fi +} + +### Funktionen resolution Ende #################### + ### Funktionen Ende ############################### 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 index c6f6ffcb..f0081658 100644 --- 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 @@ -10,7 +10,7 @@ function get_creds() # 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>&- 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 index cc71f23c..7447dd41 100644 --- 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 @@ -39,3 +39,53 @@ function mount_shares() fi done } + +mnt_shares() { + logger "openslx sharemapper: Started." + + # Wait for network connection to base system + 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." + ;; + 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. + ;; + 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. + ;; + 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.. + ;; + *) logger "openslx sharemapper: unknown remapMode in $SLXCONFIGFILE; doing nothing." + ;; + esac + + # By the way: We also have to start a bwLehrpool-Suite given script (runscript). For convenience we will start it here and + # after mounting shares, as perhaps a given script needs mounted shares. + exit 0 +} diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/60_resolution.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/60_resolution.inc new file mode 100644 index 00000000..55f24407 --- /dev/null +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/60_resolution.inc @@ -0,0 +1,77 @@ +set_resolution() +{ + DISPLAY="${1}.0" + logger "openslx resolution utility started." + + # Da nun fremdgemountet wird, hier sicherheitshalber zur Kontrolle wg. Gross-/Kleinschreibung: + SLXCONFIGFILE=$(find "${DISKMOUNTDIR}" -iwholename "${SLXCONFIGFILE}") + + if [ -f "$SLXCONFIGFILE" ]; then + RESOLUTION=$(grep 'resolution=' "$SLXCONFIGFILE" | cut -d '=' -f 2) + if [ -z $RESOLUTION ]; then + logger "openslx resolution utility: resolution file $SLXCONFIGFILE seems to be empty!" + exit 1 + fi + logger "openslx resolution utility: resolution file $SLXCONFIGFILE yields ${RESOLUTION}." + else + logger "openslx resolution utility: resolution file $SLXCONFIGFILE 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 "root.*X.* \-auth *[^ ]*" | awk '{print $NF}') + get_xauthfile + + # Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das + # erste 'connected' in der Ausgabe xrandrs Und warten evtl. ein Weilchen):: + for wartezeit in 1 1 1 2 0 ende; do + [ "$wartezeit" = "ende" ] && { logger "openslx resolution utility: Could not detect output device. Exiting." ; exit 1; } + AUSGABE=$(DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr -q|grep -m 1 " connected "|awk '{print $1}') + [ -n "$AUSGABE" ] && break + sleep $wartezeit + done + + # Pruefen, ob xrand eine passende modeline ausgibt: + if [ "$(DISPLAY=${DISPLAY} XAUTHORITY=${XAUTHORITY} xrandr | grep -c ${RESOLUTION}[[:space:]])" -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') + DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --newmode $(echo ${MODELINE}) + DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" 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: + DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" 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/includes/90_runscript.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/90_runscript.inc index e5a7971b..f5ef0223 100755 --- a/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/90_runscript.inc +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/90_runscript.inc @@ -1,20 +1,65 @@ function runscript() { - logger "openslx sharemapper: runscript: looking for a script to run..." - if [ -f "$DISKMOUNTDIR/openslx.ini" ]; then - EXTENSION=$(grep scriptExt "$DISKMOUNTDIR/openslx.ini" | cut -f 2 -d "=") - [ -z "$EXTENSION" -o "$EXTENSION" = "bat" ] && \ - logger "openslx sharemapper: runscript: Script extension empty or \'bat\', trying anyway." - if [ -f "$DISKMOUNTDIR/runscript${EXTENSION}" ]; then - su -c "$DISKMOUNTDIR/runscript${EXTENSION}" "$LOCALUSER" - ERR=$? - if [ $ERR -eq 0 ]; then - logger "openslx sharemapper: runscript: runscript${EXTENSION} ok, errorlevel ${ERR}." + logger "openslx: runscript: looking for a script to run..." + ERR=0 + if [ -f "$SLXCONFIGFILE" ]; then + [ -z "$SCRIPTEXT" -o "$SCRIPTEXT" = "bat" ] && \ + logger "openslx utility: runscript: Script extension empty or \'bat\', trying anyway." + if [ -f "$DISKMOUNTDIR/runscript${SCRIPTEXT}" ]; then + logger "openslx utility: runscript: found script $DISKMOUNTDIR/runscript${SCRIPTEXT}." + + case "$SCRIPTUSER" in + 0) USERPART="" + ;; + 1) USERPART=" su -c - $LOCALUSER " + ;; + *) logger "openslx utility: runscript: Unknown script user or script user not set. Running as root." + USERPART="" + ;; + esac + + case "$SCRIPTVISIBILITY" in + 0) # 0=hidden + logger "openslx utility: runscript: Starting script hidden." + echo "$USERPART $DISKMOUNTDIR/runscript${SCRIPTEXT}" + $USERPART "$DISKMOUNTDIR/runscript${SCRIPTEXT}" & + ;; + 1) # 1=normal + logger "openslx utility: runscript: Starting script maximised." + get_xauthfile + DISPLAY=:0.0 XAUTHORITY="${XAUTHORITY}" $USERPART xterm "$DISKMOUNTDIR/runscript${SCRIPTEXT}" & + ;; + 2) # 2=minimized (xterm -iconic) + logger "openslx utility: runscript: starting script minimised." + get_xauthfile + + # warte auf Window manager... + while [[ "$(DISPLAY=:0.0 XAUTHORITY=${XAUTHORITY} xprop -root _NET_SUPPORTING_WM_CHECK)" =~ "no such atom" ]]; do + sleep 2 + done + + # Truly not the best way to wait until the desktop environment is ready, but there's no common way to + # check for DE readyness. Until then, we'll sleep. + sleep 20 + + DISPLAY=:0.0 XAUTHORITY="${XAUTHORITY}" $USERPART xterm -iconic "$DISKMOUNTDIR/runscript${SCRIPTEXT}" & + ;; + *) # *=? + logger "openslx utility: runscript: unkown scriptVisibility $SCRIPTVISIBILITY." + ;; + esac + + if [ "$ERR" -eq 0 ]; then + logger "openslx utility: runscript: runscript${SCRIPTEXT} ok, errorlevel ${ERR}." else - logger "openslx sharemapper: runscript: Script error ${ERR}." + logger "openslx utility: runscript: Script error ${ERR}." fi + else + logger "openslx utility: runscript: script $DISKMOUNTDIR/runscript${SCRIPTEXT} not found." fi else - logger "openslx sharemapper: runscript: Could not find $DISKMOUNTDIR/openslx.ini for script extension." + logger "openslx utility: runscript: Could not find $SLXCONFIGFILE." + exit 1 fi } + -- cgit v1.2.3-55-g7522