tmupdate Aktualisierung SoSe 2014

Mar 25, 2014 00:00 · 1737 words · 9 minute read

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!


#!/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