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) --- .../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 ++++ 10 files changed, 270 insertions(+) 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 (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 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 +} -- cgit v1.2.3-55-g7522