home-harmening:sicherheit:backup:rsync:grafischer_rsync_client

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
home-harmening:sicherheit:backup:rsync:grafischer_rsync_client [2024/10/29 09:44] charmeninghome-harmening:sicherheit:backup:rsync:grafischer_rsync_client [2024/11/12 14:08] (aktuell) charmening
Zeile 1: Zeile 1:
 ==== Rsync Client ==== ==== Rsync Client ====
 {{ :home-harmening:sicherheit:backup:rsync:rsync_client.png?300|}} {{ :home-harmening:sicherheit:backup:rsync:rsync_client.png?300|}}
-Ich brauchte für ein kleine Projekt einen Rsyncclient, der eine Software von einem Server runterlädt. Nach Abschluss sollte diese Software gestartet werden. Der Benutzer sollte über den Fortschritt informiert werden. \\+Ich brauchte für ein kleines Projekt einen Rsyncclient, der eine Software von einem Server runterlädt. Nach Abschluss sollte diese Software gestartet werden. Der Benutzer sollte über den Fortschritt informiert werden. \\
 Wenn das Skript aus einer GUI gestartet wurde wird mit yad ein Fortschrittsbalken erzeugt. \\ Wenn das Skript aus einer GUI gestartet wurde wird mit yad ein Fortschrittsbalken erzeugt. \\
 Falls ohne GUI gestartet wird kommt eine Prozent Angabe auf der Konsole. Falls ohne GUI gestartet wird kommt eine Prozent Angabe auf der Konsole.
-\\ \\ \\+Das Skript besitzt eine Konfigurationsdatei **sync.conf** in der einige Variablen konfiguriert werden können. Alternativ kann jede Variabe\\ 
 +mittels Schalter übergeben werden. 
 +|**Option**|| 
 +|-s|Angabe des Servers| 
 +|-q|Wo liegt der Client auf dem Server| 
 +|-d|Wo sollen die Dateien lokal gespeichert werden| 
 +|-i|Wo ist der SSH Schlüssel| 
 +|-x|Welche Datei soll am Ende ausgeführt werden| 
 +\\ 
 +==== Ordnerstruktur ===== 
 +<code> 
 +/opt/sync_client/ 
 +                 sync_client.sh 
 +                 sync.conf 
 +</code> 
 +\\ \\ 
 +==== sync.conf ====
 <code Bash> <code Bash>
 #!/bin/bash #!/bin/bash
-# Skript verbindet sich zuerst mit dem Server um die aktuelle Client Version zu laden. 
-# 
-# Benötigt wird hierzu: 
-# - ein Benutzer auf dem Server der Leserechte auf die Client Dateien hat 
-# - ein SSH Schlüssel um sich ohne Passwort auf dem Server einzuloggen 
-# - rsync auf Server und Client 
-# - yad 
-# - ein Ping auf den Server muss möglich sein 
  
 +str_server=SERVER                                       # Server Adresse
 +str_source=/share/client/                               # Ordner auf dem Server
 +str_dest=/opt/client/client/                            # Ordner auf dem lokalen System
 +str_user=rsyncuser                                      # Benutzer auf dem Server
 +str_key=/opt/client/id_ecdsa_rsyncuser                  # SSH Key File
 +str_icon=/usr/share/icons/client.png                    # Icon für die yad Anzeige
 +str_title="Sync Client"                                 # Titel des Clients
 +str_infoTxt="Prüfe Version ..."                         # Info Text des Clients
 +str_start=/opt/client/client/client                     # Datei welche nach dem beenden gestartet werden soll
 +</code>
 +\\
 +==== sync-client.sh ====
 +<code Bash>
 +#!/bin/bash
 +# Skript verbindet sich zuerst mit dem Server um die aktuelle Client Version zu laden.
 +# Christoph Harmening
  
 # Variablen # Variablen
-str_server=SERVER +str_sourceBin=$(dirname "$(readlink -"$0")") 
-str_source=/var/www/client/client/+if [ -f ${str_sourceBin}/sync.conf ]; then source ${str_sourceBin}/sync.conf; fi
-str_dest=/home/USER/client/ +
-str_user=rsyncuser +
-str_key=/home/USER/.ssh/id_rsyncuser_ecdsa +
-str_icon=/usr/share/icons/client/client-day.ico +
-str_title="Client+
-str_infoTxt="Prüfe Version ..." +
-str_start=$1+
  
 # Feste Variablen # Feste Variablen
Zeile 33: Zeile 50:
 YELLOW='\033[1;33m' YELLOW='\033[1;33m'
 NC='\033[0m' NC='\033[0m'
 + 
 +show_help() {
 +  echo
 +  echo "Skript dient dazu eine Clientsoftware herunter zu laden"
 +  echo "Es können feste Variablen unter \# Variablenin dem Skript selbst festgelegt werden. Alternativ können"
 +  echo "auch Schalter übergeben werden um das Skript zu steuern."
 +  echo
 +  printf "${YELLOW}Vorraussetzungen die erfüllt sein müssen:${NC}\n"
 +  echo " - ein Benutzer auf dem Server der Leserechte auf die Client Dateien hat"
 +  echo " - ein SSH Schlüssel um sich ohne Passwort auf dem Server einzuloggen"
 +  echo " - rsync auf Client uns Server muss installiert sein"
 +  echo " - yad muss auf dem Client installiert sein"
 +  echo " - Es muss möglich sein einen Ping vom Client zum Server zu senden"
 +  echo
 +  printf "${YELLOW}Skript ohne Schalter:${NC}\n"
 +  echo "./start-client.sh"
 +  echo
 +  printf "${YELLOW}Skript mit Schalter:${NC}\n"
 +  echo "./start-client -s 192.168.1.1 -q /var/www/client/* -d /home/user/client/ -x start-client.sh"
 +  echo
 +  printf "${YELLOW}Schalter:${NC}\n"
 +  printf "${YELLOW}--------------------------------------------------------------------------------------${NC}\n"
 +  echo "-s | Angabe des Servers von dem die Dateien geladen werden"
 +  echo "-q | Quellordner auf dem Server. Bitte mit einem * am Ende"
 +  echo "-d | Zielorder auf dem lokalen System. Bitte abschließen mit /"
 +  echo "-u | Benutzer der auf den Server zugreifen Darf"
 +  echo "-i | Pfad zum Identity File bzw. SSH Key für den Benutzer"
 +  echo "-x | Welche Datei soll nach Skript Ende ausgeführt werden"
 +  echo
 +  echo "Christoph Harmening"
 +  exit 1
 +}
 +
 +# Schalter
 +while getopts s:q:d:u:i:x:h: opt ; do
 +  case $opt in
 +    s) if [ ! -z $OPTARG ]; then str_server=$OPTARG ; fi ;; # Welcher Server
 +    q) if [ ! -z $OPTARG ]; then str_source=$OPTARG ; fi ;; # Ordner auf dem Server
 +    d) if [ ! -z $OPTARG ]; then str_dest=$OPTARG ; fi ;;   # Lokales Ziel
 +    u) if [ ! -z $OPTARG ]; then str_user=$OPTARG ; fi ;;   # Benutzer
 +    i) if [ ! -z $OPTARG ]; then str_key=$OPTARG ; fi ;;    # Keyfile
 +    x) if [ ! -z $OPTARG ]; then str_start=$OPTARG ; fi ;;  # Welches Programm wird gestartet
 +    h) show_help ;;
 +    *) show_help ;;
 +  esac
 +done
  
 # Serververbindung prüfen # Serververbindung prüfen
Zeile 43: Zeile 106:
 fi fi
  
-# Wieviele Dateien müssen übertragen werden werden? +# Wieviele Dateien müssen übertragen und gelöscht werden? 
-int_numberOfFiles=$(rsync -auv --delete --dry-run --stats -e "ssh -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | grep "Number of regular files transferred" | awk '{print $6}')+int_numberOfFiles=$(rsync -auv --delete --dry-run --stats -e "ssh -o StrictHostKeyChecking=no -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | grep "Number of regular files transferred" | awk '{print $6}') 
 +int_numberOfFilesDelete=$(rsync -auv --delete --dry-run --stats -e "ssh -o StrictHostKeyChecking=no -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | grep "Number of deleted files" | awk '{print $5}')
  
-# Prüfe over der Zielordner existiert+# Prüfe ob der Zielordner existiert
 if [ ! -d ${str_dest} ]; then mkdir -p ${str_dest}; fi if [ ! -d ${str_dest} ]; then mkdir -p ${str_dest}; fi
  
 sync_files() { sync_files() {
     # Übertrage Dateien     # Übertrage Dateien
-    rsync -auv --delete --info=name -e "ssh -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | while read -r line ; do+    rsync -auvh --chown=root:root --chmod=u+rwx,g+rwx,o+rwx --delete --info=name -e "ssh -o StrictHostKeyChecking=no -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | while read -r line ; do
         ((count++))         ((count++))
         #echo "Datei ${count} von ${int_numberOfFiles}: $line"         #echo "Datei ${count} von ${int_numberOfFiles}: $line"
         # Berechne den Prozentwert         # Berechne den Prozentwert
-        int_progress=$(( (count * 100) / ${int_numberOfFiles} ))+        # Fehlerunterdrückung falls es keine Dateien zum Kopieren gibt 
 +        if (( ${int_numberOfFiles} == 0 )); then int_numberOfFiles=1 ; fi 
 + int_progress=$(( (count * 100) / ${int_numberOfFiles} ))
         # Lass über 100 dan bleibe bei 100         # Lass über 100 dan bleibe bei 100
-        if (( ${int_progress} >= 100 )) then int_progress=100; fi+        if (( ${int_progress} >= 100 ))then int_progress=100; fi
         if [ -z $DISPLAY ]; then         if [ -z $DISPLAY ]; then
           printf "\r${GREEN}${int_progress}${NC} percent"           printf "\r${GREEN}${int_progress}${NC} percent"
Zeile 66: Zeile 132:
 } }
  
-# Wenn keine Dateien übertragen werden müssen, dann starte direkt Client +# Wenn keine Dateien übertragen oder gelöscht werden müssen, dann starte direkt den Client 
-if (( ${int_numberOfFiles} > 0 )) ; then+if (( ${int_numberOfFiles} > 0 )) || (( ${int_numberOfFilesDelete} > 0 )) ; then
   count=0   count=0
   if [ -z $DISPLAY ]; then   if [ -z $DISPLAY ]; then
-    printf "${YELLOW}${str_title}${NC}\n${str_infoTxt}\n" ; sync_files ; echo+    printf "${YELLOW}${str_title}${NC}\n${str_infoTxt}\n\n" ; sync_files ; echo
   else   else
     sync_files | yad --progress --title="${str_title}" --text="${str_infoTxt}" --percantage=0 --auto-close --width=400 --height=100 --no-cancel --window-icon="${str_icon}"     sync_files | yad --progress --title="${str_title}" --text="${str_infoTxt}" --percantage=0 --auto-close --width=400 --height=100 --no-cancel --window-icon="${str_icon}"
Zeile 77: Zeile 143:
  
 # Client Start # Client Start
-if [ ! -z ${str_start} ]; then +if [ ! -z $DISPLAY ]; then 
-  ${str_dest}${str_start}+  if [ ! -z ${str_start} ]; then 
 +    echo "Starte ${str_start}..." 
 +    ${str_start} 
 +  fi
 fi fi
 </code> </code>
 \\ \\
 Den passenden Rsync Server findet man [[home-harmening:sicherheit:backup:rsync:syncen_von_verzeichnissen|hier]] Den passenden Rsync Server findet man [[home-harmening:sicherheit:backup:rsync:syncen_von_verzeichnissen|hier]]