HSRSync ConnectVPN

Aus alt.comp.hsr
Wechseln zu: Navigation, Suche

Screenshot des Auswahldialoges

Hsrsync screenshot.png

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/ ::::