From 99a38f25910522b4c04deb6595a0a41e4df62890 Mon Sep 17 00:00:00 2001 From: Christian Rößler Date: Tue, 11 Apr 2017 16:35:08 +0200 Subject: [run-virt] Floppy (fd1)-scripts: No more display manager conf. patching, now via systemd service files started. To be tested! --- .../data/opt/openslx/vmchooser/data/linux/LIESMICH | 38 +++++++++------ .../data/opt/openslx/vmchooser/data/linux/README | 26 +++++----- .../opt/openslx/vmchooser/data/linux/resolution | 34 +++++++------ .../opt/openslx/vmchooser/data/linux/vm_installer | 57 ++++++++++++++++++---- 4 files changed, 100 insertions(+), 55 deletions(-) diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH index 326af2a4..7b526a9a 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/LIESMICH @@ -2,23 +2,29 @@ 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. + Es schreibt eine drei systemd-Servicedateien und verlinkt diese, + um beim Systemstart foglende Skripte zu starten: + +resolution: (after display-manager.service): Dieses Skript wartet eine + gewisse Zeit, ob ein X-Server gestartet wurde, ändert + anschließend die Auflösung entsprechend der vom Basissystem + übergebenen Angabe in openslx.ini und überwacht diese eine + gewisse Zeit lang. + +mnt_shares: (after basic.target): Wertet die Einträge remapMode (sowie + createMissingRemap, noch zu implementieren) der Datei + openslx.ini aus, und hängt anhand des per remapMode gegebenen + Wertes die in shares.dat angegebenen Netzlaufwerke ein. Die + (evtl. nötige) Authentizizierung wird verschlüsselt vom + Grundsystem übergeben. + +umnt_shares: (Before shutdown.target): Hängt gegebene Laufwerke beim + Herunterfahren der VM wieder aus. + 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. + Für geeignete Einbindung innerhalb der VM (Xsetup/Xreset) + muss daher selbst gesorgt werden. + diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README index 12777c67..2476126b 100644 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/README @@ -2,20 +2,20 @@ 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 + writes three systemd service files and links them, so the + scripts will be started at system startup resp. shutdown: + +resolution: (after display-manager.service): Sets resolution within the + virtual machine according to base system resolution given via + config file openslx.ini, and re-checks it for some time.. + +mnt_shares: (after basic.target): Reads entries remapMode (and + createMissingRemap, todo) from the file openslx.ini, and + mounts the shares given by shares.dat according to remapMode. 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. + One has to embed/start it via adequate means by hand + (Xsetup/Xreset). + diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution index 35fb42e3..a8942b9f 100755 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution @@ -9,14 +9,14 @@ MOUNTDIR=/mnt/diskmount RESFILE="${MOUNTDIR}"/openslx.ini -export DISPLAY=:0.0 +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 " ") + 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." - xrandr --output ${AUSGABE} --mode ${RESOLUTION} + DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --output ${AUSGABE} --mode ${RESOLUTION} else logger "openslx resolution utility: resolution unchanged." fi @@ -41,36 +41,38 @@ 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." - export XAUTHORITY="${XAUTHDATEI}" -else - logger "openslx resolution utility: XAUTHFILE not found. Exiting." - exit 1 -fi +# XAUTHDATEI=$(ps aux | grep -o "root.*X.* \-auth *[^ ]*" | awk '{print $NF}') + +for wartezeit in 0 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." # 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}') +AUSGABE=$(DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" 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 +if [ "$(DISPLAY=${DISPLAY} XAUTHORITY=${XAUTHORITY} 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) + 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: -xrandr --output ${AUSGABE} --mode ${RESOLUTION} +DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --output ${AUSGABE} --mode ${RESOLUTION} ERR=$? if [ $ERR -ne 0 ]; then logger "openslx resolution utility: xrandr error code ${ERR}." diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer index 978cee20..323ed0a4 100755 --- a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer +++ b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/linux/vm_installer @@ -6,7 +6,9 @@ LOGGER=$(which logger) MKDIR=$(which mkdir) MOUNT=$(which mount) MOUNTDIR=/mnt/diskmount/ -SERVICEFILE=openslx-scriptinstall.service +SERVICEMOUNT=openslx-mount.service +SERVICEUMOUNT=openslx-umount.service +SERVICERESOLUTION=openslx-resolution.service # systemd erkennen case $(${PS} --pid 1 -o comm h) in @@ -16,32 +18,67 @@ case $(${PS} --pid 1 -o comm h) in else SERVICEDIR=/usr/lib/systemd/system/ fi - echo "openslx praeinstaller: installing systemd service file to ${SERVICEDIR}/${SERVICEFILE}." + echo "openslx praeinstaller: installing systemd service (mounter) to ${SERVICEDIR}/${SERVICEMOUNT}." + cat <<-HEREDOC > "$SERVICEDIR"/"$SERVICEMOUNT" + [Unit] + Description=openSLX share mounter + After=basic.target + + [Service] + Type=oneshot + ExecStartPre=${MKDIR} -p /mnt/diskmount + ExecStartPre=-${MOUNT} /dev/fd1 /mnt/diskmount + ExecStart=${LOGGER} "openslx service file: mounter started." + ExecStart=${MOUNTDIR}/linux/mnt_shares + ExecStart=${LOGGER} "openslx service file: done." + RemainAfterExit=yes + HEREDOC - cat <<-HEREDOC > "$SERVICEDIR"/"$SERVICEFILE" + echo "openslx praeinstaller: installing systemd service (umounter) to ${SERVICEDIR}/${SERVICEUMOUNT}." + cat <<-THEREDOC > "$SERVICEDIR"/"${SERVICEUMOUNT}" [Unit] - Description=openSLX script installer - Before=display-manager.service graphical.target + Description=openSLX resolution utility + Before=shutdown.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: umounter started." + ExecStart=${MOUNTDIR}/linux/umount ExecStart=${LOGGER} "openslx service file: done." RemainAfterExit=no - HEREDOC + THEREDOC + + echo "openslx praeinstaller: installing systemd service (resolution utility) to ${SERVICEDIR}/${SERVICERESOLUTION}." + cat <<-THEREDOC > "$SERVICEDIR"/"${SERVICERESOLUTION}" + [Unit] + Description=openSLX resolution utility + After=display-manager.service + + [Service] + Type=oneshot + ExecStartPre=${MKDIR} -p /mnt/diskmount + ExecStartPre=-${MOUNT} /dev/fd1 /mnt/diskmount + ExecStart=${LOGGER} "openslx service file: resolution utility started." + ExecStart=${MOUNTDIR}/linux/resolution + ExecStart=${LOGGER} "openslx service file: done." + RemainAfterExit=yes + THEREDOC + [ ! -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 + [ ! -d /etc/systemd/system/shutdown.target.wants ] && mkdir /etc/systemd/system/shutdown.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}" + ln -s "${SERVICEDIR}"/"${SERVICEMOUNT}" /etc/systemd/system/graphical.target.wants/"${SERVICEMOUNT}" + ln -s "${SERVICEDIR}"/"${SERVICEUMOUNT}" /etc/systemd/system/shutdown.target.wants/"${SERVICEUMOUNT}" + ln -s "${SERVICEDIR}"/"${SERVICERESOLUTION}" /etc/systemd/system/basic.target.wants/"${SERVICERESOLUTION}" 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; } -- cgit v1.2.3-55-g7522