Ein Bash-Script, das die Aufgaben und Vorlesungsscripte sowie den eigenen Home-Ordner in der Hochschule automatisch mit einem lokalen Ordner synchronisiert. Und gegebenenfalls neue Dateien automatisch in die jeweiligen Fächerordner legt.

Alles neu…

Auf Grund vieler Änderungen in der Serverinfrastruktur im Fachbereich Telematik musste ich einige Passagen im Script erneuern.

Die wichtigsten Probleme:

  1. Da wir keinen Linux-Server mehr haben, auf dem die Aufgaben liegen, musste die komplette Public-Key-Authentification für den rsync-Synchronisierungsrozess abgeschafft und umgangen werden. Somit änderte sich auch der Zugriff auf den Aufgaben-Ordner.
  2. Der neue Server ist ausschließlich aus dem Hochschulnetz zu erreichen, daher musste der Login zum HS-Netz auch weitestgehend automatisiert werden.

Lösungen:

  1. Die Authentifikation wird jetzt umgangen, indem das Aufgabenverzeichnis einfach als SMB-Share auf dem lokalen System gemounted wird um von dort aus via rsync mit dem lokalen Ordner zu synchronisieren. Dies erfordert aber eine Passworteingabe.
  2. Zur Verbindung mit dem Hochschulnetz wird der Kommandozeilen-Client vom AnyConnect benutzt, der generell mit dem AnyConnect mit installiert wird, hier gibt es also nichts runterzuladen, wir nutzen die Ressourcen, die wir eh schon zur Verfügung haben.

Es werden also folgende Dinge benötigt:

  • Cisco VPN AnyConnect Client - CLI (Command line Tool)
  • Zugang zum Hochschulnetz (Account)
  • rsync
  • cifs-utils (Nur Linux-User! In den meisten Distros als Paket vorhanden, oder hier)

Erklärungen der zu verändernden Variablen:

Das Script ist (hoffentlich) weitestgehend so kommentiert, dass man die Veränderungen selbst vornehmen kann, ich werde hier dennoch alles einmal erklären:

  • TMUSER - Hier wird dein Anmeldename eingegeben (Der von deinem Hochschulaccount)

  • STUDIENGANG - Hier wird das Kürzel deines Studiengangs eingetragen (= der Ordnername in den jeweiligen Dozenten-Ordnern)

  • SEMESTER - Der Ordner, der bei dir lokal das jeweilige Semester angibt

  • LOCALPATH - Der absolute Pfad der zu deinem Telematikordner führt (unter OSX z.B.: /Users/[UserName]/Documents/Telematik ; unter Linux z.B.: /home/[UserName]/Telematik)

  • MOUNTPATH - Der absolute Pfad zu dem Ordner, in dem das SMB-Share gemountet (eingehangen) werden soll. Dein normaler User sollte Schreibrechte in diesem Verzeichnus haben! (unter OSX z.B.: /Volumes/Aufgabe ; unter Linux z.B.: /home/[UserName]/Aufgabe)

  • SYNCHOME - Angabe, ob das Script auch deinen Home-Ordner Synchronisieren soll. Hier ist unter Umständen eine weitere Passworteingabe nötig. Wie du dir die Passworteinngabe sparen kannst, kannst du hier oder hier nachlesen. (Bei dem Server, auf den der Key geschoben werden muss, handelt es sich um “home.tfh-wildau.de”)

  • LOCALHOME - Pfadangabe, mit welchem Ordner auf deiner Festplatte der Home-Ordner vom Telematikserver synchronisiert werden soll (nicht nötig, falls du bei SYCHOME=’Nein’ angegeben hast)

  • Danach werden der Reihe nach die Namen der Dozenten eingegeben - Exakt so, wie sie auch auf dem TM-Server heißen (Achtung: Case Sensitive). Die Anzahl variiert natürlich je nach Semester..

  • Als nächstes müssen deine lokalen Ordnernamen bei den Variablen mit der Endung _LOCAL eingegeben werden. Die Fächer müssen in genau der Reihenfolge wie die Dozenten eingeben werden!! - Sprich: “Da wo der Dozent #0 steht, muss hier auch das Fach dieses Dozenten bei #0 stehen!”

danach ggf. noch ein

chmod +x tmUpdate um die Datei ausführbar zu machen und dann kann das Script kann mit `./tmUpdate` gestartet werden.

Es ist empfehlenswert, einen Symlink zur Datei nach /user/local/bin zu legen, damit man das Script von überall ausführen kann. Das geht so:

sudo ln -s /PFAD/ZU/DEINEM/tmUpdate /usr/local/bin/tmUpdate Dann kannst du alle neueren Versionen mit dem File in `/PFAD/ZU/DEINEM/tmUpdate` ersetzen und stets den selben Befehl zum aufrufen benutzen.

EDIT: Unter Linux gibt es momentan noch Probleme, da das Mounten root-Rechte braucht! Also abwarten….


Das Script kann per Git von Github installiert werden:

git clone https://github.com/deg0nz/tmupdate.git

Hier der Code, der auf GitHub liegt: Für die ganz aktuelle version, bitte auf Github nachschauen!

tmUpdateDownload zip from GitHub
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
#!/bin/bash
#####################################################################
## Bashscript um automatisch neue Dateien vom Telematikserver 
## der TH-Wildau (Aufgaben & Scripte) zu holen.
##
## Das Script ist auf OSX geschrieben, die Funktionalität auf Linux und BSD 
## muss noch gestestet werden, ich habe mich aber bemüht, 
## Funktionalität auf Linux zu gewährleisten.
##
## Das Script erzeugt folgende Ordnerstruktur (sofern noch nicht vorhanden):
## /PATH/TO/HOMEDIR/SEMESTER/FACH1
##					.../FACH2
##					.../FACHXY/...
##
## In anderen Semestern müssen dann ggf. die Dozenten, Ordner und Arrays angepasst werden
## 	
##  	
##
##	
##	Copyright 2013-2014 (MIT) by Benjamin Gericke (See Readme)
##	Twitter: @deg0nz
##	ADN: @deg0nz
##  GitHub: https://github.com/deg0nz
##
## version 0.8.3b // Configurable second version, Stand: Sommersemester 14 
#####################################################################


#####################################################################
##																	#
## 			Nachfolgend ggf. Änderungen vornehmen					#
##																	#
#####################################################################

#
# Username eingeben (Der Selbe, den man zur Anmeldung im Hochschulnetz benötigt)
#
TMUSER='<TELEMATIKUSER>'

#
# Studiengang
#
STUDIENGANG='T13'

#
# Welches Semester? (= Ordner für Semester (!!Keine Slashes!!))
#
SEMESTER='Sommersemester 14'

#
# Hier den absoluten lokalen Pfad zu den Telematik-Dateien eintragen
# z.B.: /home/[UserName]/Telematik  <-- Linux
#		/Users/[USERNAME]/Documents/Telematik <-- OSX
#
LOCALPATH='/PATH/TO/YOUR/TELEMATIK/FOLDER'

#
# Lokaler Ordner zum Mounten des Samba-Shares (Du solltest Schreibrechte in dem Ordner haben!)
#
MOUNTPATH='/home/<USER>/Aufgabe'


#
# Hier Ja oder Nein eintragen, falls dein Home-Ordner auch synchronisiert werden soll.
# Der Syncing-Ordner bei dir Lokal muss ebenfalls angepasst werden
#
# ACHTUNG: Der Sync für den Home-Ordner Braucht nochmals eine Passworteingabe, oder Public-Key-Authentification.
#
SYNCHOME='Ja'
LOCALHOME='/Users/<USER>/Telematik/Home-Ordner'

#
# Deine Dozenten auf dem Telematikserver mit
# folgender Semantik eintragen (=Ordnernamen auf Server)
# (Reihenfolge muss mit den Ordnern in LOCALs identisch sein.)
#

#0 Eletrotechnik für Telematiker
ET_TM='Fabig'
#1 BWL
BWL='Laschke'
#2 Betriebssysteme
BETRIEBSSYTEME='Richartz'
#3 Algorithmen und Datenstrukturen
AUD='Mohnke'
#4 Mathematik
MATHE='Weissbach'
#5 ETfT Laborübungen
ET_TM_LABOR='Hoppe'
#6 Kommunikationstechnik
KOMMTECH='Richartz'
#7 PSA - Praktikum
PRAKTIKUM='Weissbach'

#
# Ordnernamen für Fächer lokal (Reihenfolge muss identisch mit Dozenten sein!!)
#

#0 Eletrotechnik für Telematiker
ET_TM_LOCAL='Elektrotechnik für Telematiker'
#1 BWL
BWL_LOCAL='Betriebswirtschaftslehre'
#2 Betriebssysteme
BETRIEBSSYTEME_LOCAL='Betriebssysteme'
#3 Algorithmen und Datenstrukturen
AUD_LOCAL='Algorithmen und Datenstrukturen'
#4 Mathematik
MATHE_LOCAL='Mathematik II'
#5 ET Laborübungen
ET_TM_LABOR_LOCAL='Eletrotechnik für Telematiker Laborübungen'
#6 Kommunikationstechnik
KOMMTECH_LOCAL='Kommunikationstechnik'
#7 Praktikum
PRAKTIKUM_LOCAL='PSA - Praktikum'

#
# Create array for local Folders  (Muss nur für neues Semester verändert werden)
#

LOCALDIRS[0]=$ET_TM_LOCAL
LOCALDIRS[1]=$BWL_LOCAL
LOCALDIRS[2]=$BETRIEBSSYTEME_LOCAL
LOCALDIRS[3]=$AUD_LOCAL
LOCALDIRS[4]=$MATHE_LOCAL
LOCALDIRS[5]=$ET_TM_LABOR_LOCAL
LOCALDIRS[6]=$KOMMTECH_LOCAL
LOCALDIRS[7]=$PRAKTIKUM_LOCAL

#
# Create array for remote folders (Muss nur für neues Semester verändert werden)
#

REMOTEDIRS[0]=$ET_TM/$STUDIENGANG/ELT/
REMOTEDIRS[1]=$BWL/$STUDIENGANG/
REMOTEDIRS[2]=$BETRIEBSSYTEME/$STUDIENGANG/Betriebssysteme/
REMOTEDIRS[3]=$AUD/$STUDIENGANG/
#Freizeichen für Mathe umgehen:
MAZWEI='Ma II'
REMOTEDIRS[4]=$MATHE/$STUDIENGANG/$MAZWEI/
REMOTEDIRS[5]=$ET_TM_LABOR/$STUDIENGANG/
REMOTEDIRS[6]=$KOMMTECH/$STUDIENGANG/Kommunikationstechnik/
REMOTEDIRS[7]=$PRAKTIKUM/$STUDIENGANG/PSA/


######################################################################################
##																				     #
##  Do not change anything beneath this line! (Unless you know what you are doing ;) #
##																					 #
######################################################################################

# Adresse zum Server - Das muss normalerweise nicht verändert werden
HOST='tmserv2.inw.ad.th-wildau.de'
HOMEHOST='home.tfh-wildau.de'

# Check and save OS in variable
UNAMESTR=`uname`

#
# Pfad zum Cisco-AnyConnect CLI (für Kommandozeilen-Login ins Hochschulnetz)
# Meist ist das der selbe Pfad auf Linux und OSX
#
# OSX: /opt/cisco/anyconnect/bin/vpn
# Linux (Mint): /opt/cisco/anyconnect/bin/vpn
#
ANYCONNECT_LOCAL='/opt/cisco/anyconnect/bin/vpn'

## Farbspezifikationen für die Übersicht der Outputs
lred='\e[1;31m'	# light red 
lgreen='\e[1;32m' # light green
lblue='\e[1;34m' # light blue
lpurple='\e[1;35m' # light purple
nc='\e[0m' # No Color


#
#
#		Check connection to the TH-Wildau-VPN and receive user's decision what to do after the Sync
#
#

echo " "
echo " "
echo "Check, ob du mit dem Hochschulnetz verbunden bist..."

## Pinging $HOST to verify connection..
ping -c1 -W3 $HOST > /dev/null 2>&1
	if [[ $? -eq 0 ]] ; then

		printf "${lgreen}Verbunden.${nc} \n \n"

		## If connected, ask the user if he wants to unmount share after sync
		echo "Möchtest du das Share nach dem Sync wieder aushängen?"

		select yn in "Ja" "Nein"; do
    		case $yn in
        		"Ja" ) DOATEND='3'; break;;
				"Nein" ) DOATEND='0'; break;;
				* ) echo "Bitte 1 oder 2 eingeben!";
    		esac
		done

	else
		
		printf "${lred}Nicht verbunden.${nc} \n"

		## If not connected, ask the user if he wants to umount and disconnect, only umount or stay connected and mounted
		## save the state and use in switch case at the end of the script
		echo "Was möchtest du nach dem Sync machen?"
	
		select yn in "Disconnect und Unmount" "Verbunden bleiben und share eingehängt lassen" "Nur Unmount und verbunden bleiben"; do
    		case $yn in
        		"Disconnect und Unmount" ) DOATEND='1'; break;;
				"Verbunden bleiben und share eingehängt lassen" ) DOATEND='0'; break;;
				"Nur Unmount und verbunden bleiben" ) DOATEND='3'; break;;
				* ) echo "Bitte 1, 2, oder 3 eingeben!";
    		esac
		done

		printf "\n \n${lpurple}Rufe CiscoAnyConnect auf.${nc} \n"

		$ANYCONNECT_LOCAL connect vpn.th-wildau.de

		printf "${lgreen}Verbunden.${nc} \n \n \n"
	fi

#
#
#		Samba-Share Connection
#
#

## Check if Samba Share is already mounted by checking if Weissbach - folder in MOUNTPATH exists.
MOUNTPATHCHECK=$MOUNTPATH/Weissbach/
if [[ -d "$MOUNTPATHCHECK" ]]; then

	printf "\n${lpurple}SMB-share ist verbunden. ${nc} \n \n"

else

	# will wait for 2 seconds
	printf "Warte"
		for (( i=1; i <= 5; i++ ))
		do
			sleep 0.2
			printf "."
		done

	printf "\n\n${lpurple}Mounte SMB-share...${nc} \n \n"

	## Mounting Samba share.
	mkdir $MOUNTPATH > /dev/null 2>&1

	## Due to Problems with wrong login-data later in the script, we repeat to mount until login is successful
	## If the Login Count reaches the Number in $SMBLOGINCNT, we will exit
	

	## Check which OS we're running to call proper mount command
	

	if [[ "$UNAMESTR" = 'Linux' ]]; then
		 
		SMBLOGINCNT='5'
			until sudo mount -t cifs //tmserv2.inw.ad.th-wildau.de/Aufgabe $MOUNTPATH -o username=$TMUSER,domain=ad; do

				SMBLOGINCNT=$((SMBLOGINCNT-1))
				if [[ "${SMBLOGINCNT}" = "0" ]]; then

					echo "Du hast dein Passwort 5x falsch eingegeben :( Exit."
					exit $?
					break
				fi

			done

	elif [[ "$UNAMESTR" = 'Darwin' ]]; then

		SMBLOGINCNT='5'
			until mount -t smbfs "//ad;${TMUSER}@tmserv2.inw.ad.th-wildau.de/Aufgabe" $MOUNTPATH;
			do

				SMBLOGINCNT=$((SMBLOGINCNT-1))
				if [[ "${SMBLOGINCNT}" = "0" ]]; then

					echo "Du hast dein Passwort 5x falsch eingegeben :( Exit."
					exit $?
					break
				fi

			done

	fi

fi


#							
#
#		Perform Sync
#
#							

# echo begin sync
printf "${lblue}********************************  Starte sync...  ********************************${nc} \n"


# for-loop to check all items in remote-folder-Arrays and local-folder-Arrays and
# execute rsync for each folder
for (( i=0; i < ${#REMOTEDIRS[@]}; i++ ))
do
	echo "--------------------------------------------------------------------------------------------------------------------"
	printf "  ${lblue}Syncing from remote folder ${lgreen}${REMOTEDIRS[$i]}${nc} ${lblue}to local folder${nc} ${lgreen}${LOCALDIRS[$i]}${nc} ${nc} \n"
	echo "--------------------------------------------------------------------------------------------------------------------"
	echo "New Files:"
	
	rsync -av $MOUNTPATH/"${REMOTEDIRS[$i]}" $LOCALPATH/"$SEMESTER"/"${LOCALDIRS[$i]}" -h --human-readable
	
done

# If selected, sync Home-Folder
if [[ "$SYNCHOME" = 'Ja' ]]; then
	
# rsync -ave ssh $USER@$HOST:$REMOTEPATH/"${REMOTEDIRS[$i]}"/ $LOCALPATH/"$SEMESTER"/"${LOCALDIRS[$i]}" -h --human-readable

	echo "--------------------------------------------------------------------------------------------------------------------"
	printf "  ${lblue}Syncing ${lgreen}Home-Folder@${HOMEHOST}${nc} ${lblue}to local folder${nc} ${lgreen}${LOCALHOME}${nc} ${nc} \n"
	echo "--------------------------------------------------------------------------------------------------------------------"
	echo "New Files:"

	rsync -ave ssh $TMUSER@$HOMEHOST:~/ $LOCALHOME -h --human-readable -F --exclude='.*'

fi

#echo end of sync
printf "\n${lblue}********************************  Sync beendet. ******************************** ${nc} \n"

#
#
#		What to do after the Sync
#
#

# Functions for Disconnecting and Unmount Procedure
function disconnect_now(){

  	echo " "

	$ANYCONNECT_LOCAL disconnect > /dev/null 2>&1
	printf "${lred}Verbindung zum VPN beendet.${nc} \n"

}

function umount_now(){

	echo " "
	printf "${lpurple}Hänge SMB-share aus...${nc} \n"

	# Check, wich System we are running to call proper umount command

	if [[ "$UNAMESTR" = 'Darwin' ]]; then

		diskutil umount force $MOUNTPATH

	elif [[ "$UNAMESTR" = 'Linux' ]]; then

		sudo umount $MOUNTPATH

	fi

}

# Case for performing umount and disconnect actions
case $DOATEND in

	0 )
		printf "${lgreen}Bleibe verbunden und SMB-share bleibt eingehängt.${nc} \n";;

	1 )
		umount_now
		disconnect_now;;

	2 )
		disconnect_now;;

	3 )
		umount_now;;

esac


exit 0