summaryrefslogblamecommitdiffstats
path: root/core/modules/run-virt-docker/data/opt/openslx/vmchooser/plugins/docker/includes/gio_mount_netshare.inc
blob: 50e28fc022a6b99e3d34270118db177366af1079 (plain) (tree)












































































































































































                                                                                                                                                                                 
#!/bin/bash

# This script will be exectutet in docker lectures
# and provide the functonallity to mount netshares in the bwlp maxilinux system for the logged in user.
#

# VARS
#
NETSHAREFILE="$CONFDIR/netshares"
CONFIGFILE="$TMPDIR/configfile"

MOUNTS=()
DIRECTORY_LINKS=()

GVFS_MOUNTDIR="/run/user/$( id -u "$USER" )/gvfs"

declare -a ROHSHARES

function cleanup_gio_mount()
{
	for i in "${MOUNTS[@]}"; do
		gio mount -u "$i"
	done

	for i in "${DIRECTORY_LINKS[@]}"; do
		unlink "$i"
	done
}

function do_mount()
{
gio mount "$MOUNT_PREFIX$SHAREPATH" <<HEREDOC
$MOUNT_USER

$MOUNT_PASS
HEREDOC
	DO_MOUNT_RETVAL=$?
}


function provide_directory_links()
{
	# split sharepath into server address and share
	# expected: //server.name.de/share
	IFS='/' read -ra SHAREINFO <<< "$SHAREPATH" # str is read into an array as tokens separated by IFS

	# index 0 and 1 are zero 2 is SHARESERVER 3 is SHARENAME
	if [[ -z "${SHAREINFO[2]}" && -z "${SHAREINFO[3]}" ]]; then
		writelog "+ shareinfo not as expected, can not create dir links"
		return 1
	fi

	local SHARESERVER="${SHAREINFO[2]}"
	local SHARE="${SHAREINFO[3]}"

	local SHARE_MOUNT_POINT="$GVFS_MOUNTDIR/smb-share:server=${SHARESERVER},share=${SHARE}"
	
	if [[ ! -e "$SHARE_MOUNT_POINT" ]]; then
		writelog "+ mount directory for $SHAREPATH not found, can not create links!"
		return 1
	fi

	NETSHARE_DIR["$SHARELETTER"]="$SHARE_MOUNT_POINT"

	# create link do desktop and user home
	ln -sf "${SHARE_MOUNT_POINT}" "${HOME}/${SHARENAME}"
	mkdir -p "${HOME}/Desktop"
	ln -sf "${SHARE_MOUNT_POINT}" "${HOME}/Desktop/${SHARENAME}"

	# register cleanup function
	DIRECTORY_LINKS+=("${HOME}/${SHARENAME}")
	DIRECTORY_LINKS+=("${HOME}/Desktop/${SHARENAME}")
}


function mount_shares()
{
	for (( CONFIGROW = 1; CONFIGROW < ${#ROHSHARES[@]}; CONFIGROW++ )); do
		SHAREPATH=$(echo "${ROHSHARES[CONFIGROW]}" | cut -f 1 -d$'\t' | \
					sed 's:\\:/:g')
		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


		MOUNT_PREFIX="smb:"
		
		if [[ -z "$SHAREUSER" || -z "$SHAREPASS" ]]; then
			MOUNT_USER="$USER"
			MOUNT_PASS="$PW"
		else
			MOUNT_USER="$SHAREUSER"
			MOUNT_PASS="$SHAREPASS"
		fi

		writelog "+ mount netshare $MOUNT_PREFIX$SHAREPATH"
		do_mount > /dev/null

		if [[ "$DO_MOUNT_RETVAL" -eq 0 ]]; then
			writelog "+ ... mount was successfull"
			sleep 1
			provide_directory_links
			MOUNTS+=("$MOUNT_PREFIX$SHAREPATH")
		else
			writelog "+ ... mount faild"
		fi
	done

	unset MOUNT_USER MOUNT_PASS
}


function gio_mount()
{
	# CLEANUP
	rm -f -- "$CONFIGFILE"
	touch "$CONFIGFILE"
	# TODO existing gio mounts shouldn´t exist at this points
	# remove them anyway
	for location in "$GVFS_MOUNTDIR"/*; do
		[ -d "$location" ] && gio mount -u "$location"
	done
	sleep 1

	# Fill CONFIGFILE with pwdaemon info, how it is done in /opt/openslx/vmchooser/run-virt.d/setup_virtual_floppy.inc
	# TODO some checks if everthing run fine.
	pwdaemon --query "$HOME/.pwsocket" > "$CONFIGFILE"
	sed -i 's/^/192.168.101.1\t/' "$CONFIGFILE"

	# Attach netshares to CONFIGFILE
	cat "$NETSHAREFILE" >> "$CONFIGFILE"

	# With this preparetion of CONFIGFILE functions from /opt/openslx/vmchooser/data/linux/includes/
	# can be uesed. NATADDR, PORT, KEYTEMP, RAWKEYTEMP and BYTES  required in get_creds
	NATADDR=$( head -n 1 "$CONFIGFILE" | cut -f 1 -d$'\t' )
	PORT=$( head -n 1 "$CONFIGFILE" | cut -f 2 -d$'\t' )
	KEYTEMP="$( mktemp -t XXXXXXXXXX.dat )"
	RAWKEYTEMP="$( mktemp -t XXXXXXXXXX.dat )"
	BYTES=256 

	source /opt/openslx/vmchooser/data/linux/includes/10_functions.inc
	source /opt/openslx/vmchooser/data/linux/includes/20_get_creds.inc
	source /opt/openslx/vmchooser/data/linux/includes/30_get_shares.inc

	# getting user credentials
	get_creds

	# load shares from CONFIGFILE (../metadata/netshares) into ROHSHARES variable
	get_shares

	# check if required VARS for mounting are non zero
	if [[ -n "$ROHSHARES" && -n "$PW" && -n "$USER" ]]; then
		# mount each mountpoint
		writelog "+ initialize complete ... mount shares"
		mount_shares
	else
		writelog "+ initialize failed"
	fi
}

# check if size of NETSHAREFILE > 0
if [[ -s "$NETSHAREFILE" ]]; then
	writelog "+ NETSHAREFILE: ${NETSHAREFILE} contains informations for network drives... initialize gio mount"
	gio_mount
	add_cleanup cleanup_gio_mount
else
	writelog "+ NETSHAREFILE: ${NETSHAREFILE} empty ... nothing to mount"
fi

unset PW
rm -f -- "$KEYTEMP" "$RAWKEYTEMP" "$CONFIGFILE"