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