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"
|