HSRSync ConnectVPN
Aus alt.comp.hsr
Screenshot des Auswahldialoges
Datei: hsr_sync.sh
#!/bin/bash ########################################################################################################## # # # Skript zum Synchronisieren von lokalen Verzeichnissen mit dem HSR Skriptserver # # Erstellt von U. Bruhin, 12.03.2013 # # # # "THE BEER-WARE LICENSE" (Revision 42): # # U. Bruhin wrote this file. As long as you retain this notice you # # can do whatever you want with this stuff. If we meet some day, and you think # # this stuff is worth it, you can buy me a beer. # # # ########################################################################################################## # # # Funktion des Skriptes: # # # # - Baut die VPN-Verbindung auf (falls noch nicht aufgebaut und nicht mit dem HSR WLAN verbunden) [vpnc] # # - Bindet die Freigaben "Skripte", "Scratch" und der Benutzerordner ins lokale Dateisystem ein [mount] # # - Synchronisiert die Skripte-Ordner einzelner Module mit lokalen Verzeichnissen [rsync] # # - Es werden KEINE lokalen Dateien gelöscht # # - Alte Dateien werden überschrieben wenn sie auf dem Server aktualisiert wurden # # - Zu jedem einzelnen Modul können Spezialparameter eingerichtet werden, # # z.B. um bestimmte Verzeichnisse von der Synchronisation auszuschliessen (--exclude) # # - Das Synchronisationsverhalten kann verändert werden, nähere Infos siehe "rsync" Dokumentation # # - Hängt die Freigaben wieder aus dem lokalen Dateisystem aus [umount] # # - Trennt die VPN Verbindung wieder [vpnc-disconnect] # # # ########################################################################################################## # # # Voraussetzungen (unter Linux über den Paketmanager/Softwarecenter installierbar): # # # # - "vpnc" (http://www.vpnc.org/) # # - "rsync" (http://rsync.samba.org/) # # - "dialog" (http://hightek.org/dialog/) # # - "iputils-ping" (für den Befehl "ping", ist normalerweise schon vorinstalliert) # # # ########################################################################################################## # # # Getestet unter: # # # # - Ubuntu 12.10 x64 # # - Ubuntu 13.04 x64 # # # # Ohne Dialog ist das Skript evtl. auch unter Mac OS X lauffähig. Rückmeldungen sind erwünscht! # # # ########################################################################################################## # # # Anleitung: # # # # - Einstellungen hier im Skript tätigen (HSR Zugangsdaten, Zielordner usw.) # # - In der Datei "hsr_sync_list.txt" die zu synchronisierenden Verzeichnisse eintragen # # Achtung: Keine Schreibfehler machen! 4-fach Doppelpunkte zur Trennung nicht vergessen! # # - Skript ausführbar machen: Rechtsklick, Eigenschaften, Zugriffsrechte, "Datei als Programm ausführen" # # - Skript ausführen mit Doppelklick, und dann "Im Terminal öffnen" (unter Ubuntu) # # - ...oder im Terminal mit "./hsr_sync.sh" # # - Das Skript fragt am Anfang nach dem Root-Passwort (nicht nach dem HSR Passwort!) # # # # Hinweis: Wenn nach dem Doppelklick auf die Datei direkt der Editor geöffnet wird, # # muss man beim Dateimanager ("Nautilus") die Abfrage aktivieren. # # Dazu einfach in einem Terminal den folgenden Befehl eingeben: # # gsettings set org.gnome.nautilus.preferences executable-text-activation ask # # # ########################################################################################################## # # # Einstellungen: # # # # USERNAME: # # Benutzername für HSR-Login # # # # PASSWORD: # # Passwort für HSR-Login # # Achtung: Das Passwort ist als Klartext in dieser Datei gespeichert, # # die Datei muss also vor den Blicken von "neugierigen Mitmenschen" gut geschützt werden! # # Man kann das Passwort auch leer lassen, dann wird bei jedem Aufruf des Skriptes danach gefragt. # # # # GROUP_NAME / GROUP_PASSWORD: # # Gruppenname und Gruppenpasswort der HSR (für alle Studenten identisch) # # Diese Angaben darf ich hier nicht veröffentlichen, ihr müsst es selber unter folgendem Ort holen: # # -> Unter HSR Intern einloggen (https://www.hsr.ch/HSR-intern.90.0.html) # # -> IT-Informatikdienste # # -> Persoenliches Notebook # # -> Zugang zum Netzwerk # # -> VPN-Verbindung HSR # # -> Informationen zur Einrichtung mobiler Clients # # -> Einstellungen für Mobile Clients bei WLAN, VPN und E-Mail # # -> Seite 2 im PDF ("Gruppenname" und "Gruppenpasswort") # # # # MOUNTDIR_SCRIPTS: # # Hierhin wird der Skripte-Ordner temporär eingehängt (ohne Slash am Ende!) # # Der Pfad ist eher unwichtig, unter Linux empfiehlt sich z.B. "/media/HSR-Skripte" # # Der Ordner kann, muss aber nicht existieren (wird angelegt), er muss aber auf jeden Fall leer sein! # # Unter Mac OS X empfiehlt sich der Ordner "/Volumes/HSR-Skripte" # # # # MOUNTDIR_SCRATCH: # # Hierhin wird der Scratch-Ordner temporär eingehängt (ohne Slash am Ende!) # # Der Pfad ist eher unwichtig, unter Linux empfiehlt sich z.B. "/media/HSR-Scratch" # # Der Ordner kann, muss aber nicht existieren (wird angelegt), er muss aber auf jeden Fall leer sein! # # Unter Mac OS X empfiehlt sich der Ordner "/Volumes/HSR-Scratch" # # # # MOUNTDIR_USER: # # Hierhin wird der HSR_Benutzerordner temporär eingehängt (ohne Slash am Ende!) # # Der Pfad ist eher unwichtig, unter Linux empfiehlt sich z.B. "/media/HSR-BENUTZERNAME" # # Der Ordner kann, muss aber nicht existieren (wird angelegt), er muss aber auf jeden Fall leer sein! # # Unter Mac OS X empfiehlt sich der Ordner "/Volumes/HSR-BENUTZERNAME" # # # # DESTINATION: # # Ziel-Ordner (mit Slash am Ende!) # # Hierhin werden die Verzeichnisse vom Skriptserver hinkopiert. # # Beispiel (Linux): "/home/benutzername/Dokumente/HSR/" # # # # SYNC_LIST_FILE: # # Den Pfad zur Textdatei mit den zu synchronisierenden Verzeichnissen # # Falls die Datei im gleichen Ordner wie dieses Skript liegt, # # dann kann man hier "./hsr_sync_list.txt" angeben. # # # # PRAEFIX: # # Ziel-Unterordner # # z.B. "/Skriptserver/" für ".../HSR/An2E/Skriptserver/..." (mit Slash am Anfang und Ende!) # # Falls keine Unterordner gewünscht sind: PRAEFIX="/" # # # # MAXSIZE: # # Dateien, die grösser sind als hier angegeben, werden nicht heruntergeladen (z.B. "200MB") # # # # MACOSX: # # Legt fest, ob Mac OS X verwendet wird # # # # NODIALOG: # # Legt fest, ob ein Dialog angezeigt werden soll, um abzufragen was der Benutzer tun möchte. # # Wenn "false", dann startet das Skript direkt nach dem öffnen die Synchronisation # # und beendet sich danach automatisch wieder. # # Unter Mac OS X ist "dialog" eventuell nicht verfügbar, dann muss hier "true" eingestellt werden. # # # ########################################################################################################## USERNAME="xyz" # <-- Wichtig! PASSWORD="xyz" # <-- Wichtig! GROUP_NAME="xyz" # <-- Wichtig! GROUP_PASSWORD="xyz" # <-- Wichtig! MOUNTDIR_SCRIPTS="/media/HSR-Skripte" MOUNTDIR_SCRATCH="/media/HSR-Scratch" MOUNTDIR_USER="/media/HSR-$USERNAME" DESTINATION="/home/benutzername/HSR/" # <-- Wichtig! SYNC_LIST_FILE="./hsr_sync_list.txt" PRAEFIX="/Skriptserver/" MAXSIZE="200MB" MACOSX=false NODIALOG=false ########################################################################################################## # # # Ab hier nichts mehr verändern! # # # ########################################################################################################## HSR_SCRIPTSERVER="c206.hsr.ch" HSR_SCRATCHSERVER="c206.hsr.ch" HSR_USERSERVER="c101.hsr.ch" # Verzeichnis wechseln locationOfScript=$(dirname "$(readlink -e "$0")") cd $locationOfScript ########################################################################################################## # # # Funktionen # # # ########################################################################################################## # Prüfen ob alle erforderlichen Pakete installiert sind check_dependencies() { command -v vpnc >/dev/null 2>&1 || { echo -e >&2 "Das Paket 'vpnc' ist nicht installiert!"; sleep 5; exit; } command -v rsync >/dev/null 2>&1 || { echo -e >&2 "Das Paket 'rsync' ist nicht installiert!"; sleep 5; exit; } if ! $NODIALOG; then command -v dialog >/dev/null 2>&1 || { echo -e >&2 "Das Paket 'dialog' ist nicht installiert!"; sleep 5; exit; } fi; } # Einstellungen auf Konsole rausschreiben print_settings() { echo -e "\nHSR Synchronisationsskript von U. Bruhin" echo -e "Das Skript befindet sich im Ordner $locationOfScript" echo -e "DESTINATION=$DESTINATION" echo -e "MAXSIZE=$MAXSIZE\n\n" } # Freigabe aushängen und VPN-Verbindung trennen, falls noch verbunden (z.B. nach einem Abbruch des Skriptes) reset_connection() { sudo umount -f $MOUNTDIR_SCRIPTS >/dev/null 2>/dev/null sudo umount -f $MOUNTDIR_SCRATCH >/dev/null 2>/dev/null sudo umount -f $MOUNTDIR_USER >/dev/null 2>/dev/null sudo vpnc-disconnect >/dev/null 2>/dev/null sleep 1 } # Prüfen ob nicht schon Ordner im Mountverzeichnis existieren check_for_empty_mountdirs() { if [ -d "$MOUNTDIR_SCRIPTS" ] && [ "$(ls -A $MOUNTDIR_SCRIPTS)" ]; then echo "Es sind bereits Ordner in $MOUNTDIR_SCRIPTS vorhanden!" sleep 5; exit; fi if [ -d "$MOUNTDIR_SCRATCH" ] && [ "$(ls -A $MOUNTDIR_SCRATCH)" ]; then echo "Es sind bereits Ordner in $MOUNTDIR_SCRATCH vorhanden!" sleep 5; exit; fi if [ -d "$MOUNTDIR_USER" ] && [ "$(ls -A $MOUNTDIR_USER)" ]; then echo "Es sind bereits Ordner in $MOUNTDIR_USER vorhanden!" sleep 5; exit; fi } # Zielordner erstellen make_moundirs() { sudo mkdir -p $MOUNTDIR_SCRIPTS sudo mkdir -p $MOUNTDIR_SCRATCH sudo mkdir -p $MOUNTDIR_USER } # VPN-Verbindung aufbauen connect_vpn() { # VPNC Konfigurationsdatei erstellen echo "IPSec gateway vpn.hsr.ch" > vpnc.pcf echo "IPSec ID $GROUP_NAME" >> vpnc.pcf echo "IPSec secret $GROUP_PASSWORD" >> vpnc.pcf echo "Xauth username $USERNAME" >> vpnc.pcf echo "Xauth password $PASSWORD" >> vpnc.pcf #echo "IKE Authmode psk" >> vpnc.pcf #echo "IKE DH Group dh2" >> vpnc.pcf sudo vpnc "./vpnc.pcf" sleep 1 # Prüfen ob die Verbindung erfolgreich aufgebaut wurde ping -c 1 -W 5 "$HSR_SCRIPTSERVER" > /dev/null 2>&1 if ! [ $? -eq 0 ]; then echo "Die VPN-Verbindung konnte nicht aufgebaut werden!" sleep 5; exit; fi } # VPN-Verbindung trennen disconnect_vpn() { sudo vpnc-disconnect rm "./vpnc.pcf" } # Freigaben mounten mount_shares() { if $MACOSX; then mount_smbfs "smb://$USERNAME:$PASSWORD@$HSR_SCRIPTSERVER/skripte" $MOUNTDIR_SCRIPTS mount_smbfs "smb://$USERNAME:$PASSWORD@$HSR_SCRATCHSERVER/scratch" $MOUNTDIR_SCRATCH mount_smbfs "smb://$USERNAME:$PASSWORD@$HSR_USERSERVER/$USERNAME" $MOUNTDIR_USER else sudo mount -t cifs "//$HSR_SCRIPTSERVER/skripte" $MOUNTDIR_SCRIPTS -o user="$USERNAME",password="$PASSWORD",iocharset=utf8 sudo mount -t cifs "//$HSR_SCRATCHSERVER/scratch" $MOUNTDIR_SCRATCH -o user="$USERNAME",password="$PASSWORD",iocharset=utf8,uid=1000,gid=1000 sudo mount -t cifs "//$HSR_USERSERVER/$USERNAME" $MOUNTDIR_USER -o user="$USERNAME",password="$PASSWORD",iocharset=utf8,uid=1000,gid=1000 fi # Prüfen ob Skripte erfolgreich eingehängt if ! [ "$(ls -A $MOUNTDIR_SCRIPTS)" ]; then echo "Die Freigabe ist nicht eingehängt / konnte nicht eingehängt werden!" reset_connection sleep 5; exit; fi } # Freigaben aushängen umount_shares() { sudo umount -f $MOUNTDIR_SCRIPTS sudo umount -f $MOUNTDIR_SCRATCH sudo umount -f $MOUNTDIR_USER } synchronisation() { while read LINE; do # Zeile aus "hsr_sync_list.txt" in Variablen laden und Leerzeichen am Anfang und am Ende entfernen FOLDER=$(echo "$LINE" | awk -F'::::' '{print $1}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') LINK=$(echo "$LINE" | awk -F'::::' '{print $2}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') OPTIONS=$(echo "$LINE" | awk -F'::::' '{print $3}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') # Zeile überspringen falls Ursprung oder Ziel leer sind, oder die Zeile mit einem # beginnt if [ -z "$FOLDER" ]; then continue; fi if [ -z "$LINK" ]; then continue; fi if [[ $FOLDER == \#* ]]; then continue; fi echo "Beginne mit $FOLDER..." # Zielordner erstellen falls noch nicht vorhanden mkdir -p "$DESTINATION$FOLDER$PRAEFIX" # Synchronisation rsync -av --progress --max-size=$MAXSIZE --modify-window=1 $OPTIONS "$MOUNTDIR_SCRIPTS/$LINK" "$DESTINATION$FOLDER$PRAEFIX" echo -e "\nFertig mit $FOLDER\n\n" done < $SYNC_LIST_FILE } # Grafisches Auswahlmenü anzeigen choose_action() { RESULT=`dialog --backtitle "HSR Synchronisations-Skript von U. Bruhin" \ --menu "Die Verbindung wurde erfolgreich hergestellt.\n\nOption wählen:" 0 0 0 \ 1 "Synchronisation starten" \ 2 "Verbindung trennen und Skript beenden" \ 3>&1 1>&2 2>&3` echo $RESULT; } ########################################################################################################## # # # Hauptprogramm # # # ########################################################################################################## check_dependencies print_settings reset_connection check_for_empty_mountdirs make_moundirs if [ -z "$PASSWORD" ]; then read -s -p "HSR-Benutzerpasswort für $USERNAME: " PASSWORD fi ping -c 1 -W 5 "$HSR_SCRIPTSERVER" > /dev/null 2>&1 if [ $? -eq 0 ]; then MUST_VPN_DISCONNECT=false else # VPN nur verbinden wenn die Verbindung noch nicht besteht, und der PC sich nicht im WLAN der HSR befindet connect_vpn MUST_VPN_DISCONNECT=true fi mount_shares if ! $NODIALOG; then while true; do action=$(choose_action); clear case $action in 1) # Synchronisation starten synchronisation sleep 3 ;; *) # Abbrechen / Beenden break; ;; esac done else synchronisation fi; umount_shares if $MUST_VPN_DISCONNECT; then disconnect_vpn fi; echo -e "\nFertig!\n" sleep 3
Datei: hsr_sync_list.txt (vorzugsweise im gleichen Ordner wie hsr_sync.sh)
# Hier sind die zu synchronisierenden Verzeichnisse aufgelistet. # # Zeilen, die mit # beginnen, werden nicht ausgewertet. # # Eine Zeile enthält immer drei Angaben (mit :::: getrennt), und zwar in folgender Reihenfolge: # Lokales Unterverzeichnis :::: Verzeichnis auf Skriptserver :::: Zusaetzliche Optionen für "rsync" (siehe rsync Dokumentation) # # Beispiele (natürlich ohne # am Anfang): # Semester_2/An2E :::: Mathematik_Naturwissenschaften/Analysis_2_fuer_Elektrotechnik/An2E/ :::: --exclude=FS12/Bronstein2008/ # Semester_2/ELT2 :::: Elektrotechnik/Fachbereich/Elektrotechnik_2/ELT2/ :::: # Sem4/CompT2 :::: Elektrotechnik/Fachbereich/Computertechnik_1/CompT1/ :::: Sem4/ElMasch :::: Elektrotechnik/Fachbereich/Elektrische_Maschinen/ElMasch/ :::: Sem4/Elo2 :::: Elektrotechnik/Fachbereich/Elektronik_2/Elo2/ :::: Sem4/ELT4 :::: Elektrotechnik/Fachbereich/Elektrotechnik_4/ELT4/ :::: Sem4/FuVar :::: Mathematik_Naturwissenschaften/Funktionen_mehrerer_Variablen/FuVar/13FS Bernhardsgrütter/ :::: Sem4/NAP :::: Mathematik_Naturwissenschaften/Naturwissenschaftliches_Praktikum/NAP/ :::: Sem4/NaT2 :::: Elektrotechnik/Fachbereich/Nachrichtentechnik_2/NaT2/ :::: Sem4/PMSwEng :::: Elektrotechnik/Fachbereich/Projektmanagement_und_Software_Engineering/PMSwEng/ :::: Sem4/RegT2E :::: Elektrotechnik/Fachbereich/Regelungstechnik_2/RegT2E/ :::: Sem4/RKI :::: Kommunikation_Wirtschaft_Recht/Rhetorische_Kommunikation_fuer_IngenieurInnen/RKI/ :::: Sem4/SigSys2 :::: Elektrotechnik/Fachbereich/Signale_und_Systeme_2/SigSys2/ :::: Sem4/ManagSim :::: Kommunikation_Wirtschaft_Recht/Business_und_Recht_2/ManagSim/ :::: Sem4/ReVertr :::: Kommunikation_Wirtschaft_Recht/Business_und_Recht_2/ReVertr/ ::::