summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt-docker/data/opt/openslx/vmchooser/plugins/docker/includes/gio_mount_netshare.inc
blob: 50e28fc022a6b99e3d34270118db177366af1079 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/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"