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 08:23] 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 brachte für ein kleine Projekt einnen Rsyncclient der eine Clientsoftware von einem Server runterlädt. Danach sollte diese Clientsoftware gestartet werden. Der Benutzer sollte über den Fortschritt informiert werden. Hierzu erzeugte ich mit yad einen Fortschrittbalken+Ich brauchte für ein kleines Projekt einen Rsyncclientder 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\\ 
 +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> 
 +#!/bin/bash 
 + 
 +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> <code Bash>
 #!/bin/bash #!/bin/bash
 # Skript verbindet sich zuerst mit dem Server um die aktuelle Client Version zu laden. # Skript verbindet sich zuerst mit dem Server um die aktuelle Client Version zu laden.
-# +Christoph Harmening
-# 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 Client und Server +
-# - yad +
-#+
  
 # Variablen # Variablen
-str_server=SERVER +str_sourceBin=$(dirname "$(readlink -f "$0")") 
-str_source=/var/www/software-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/software/software.ico +
-str_title="Client" +
-str_infoTxt="\nPrüfe Version ... \n" +
-str_start=$1+
  
-Wieviele Dateien müssen übertragen werden werden? +Feste Variablen 
-int_numberOfFiles=$(rsync -auv --delete --dry-run --stats -"ssh -i ${str_key}" ${str_user}@${str_server}:${str_source} ${str_dest} | grep "Number of regular files transferred" | awk '{print $6}')+RED='\033[0;31m' 
 +GREEN='\033[0;32m' 
 +YELLOW='\033[1;33m' 
 +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 
 +}
  
-Wenn keine Dateien übertragen werden müssen, dann starte direkt die Software +Schalter 
-if (( ${int_numberOfFiles> 0 )) ; then +while getopts s:q:d:u:i:x:h: opt ; do 
-  count=0 +  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 
 +if ! ping -4 -c3 ${str_server} &> /dev/null ; then 
 +  if [ -z $DISPLAY ]; then 
 +    printf "${RED}Keine Verbindung mit dem Server ${str_server}${NC}\n"; exit 1 
 +  else 
 +    yad --info --title="${str_title}" --text="Keine Verbindung mit dem Server ${str_server}" --window-icon="${str_icon}" ; exit 1 
 +  fi 
 +fi 
 + 
 +# Wieviele Dateien müssen übertragen und gelöscht werden? 
 +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 ob der Zielordner existiert 
 +if [ ! -d ${str_dest} ]; then mkdir -p ${str_dest}; fi 
 + 
 +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 
-        echo ${int_progress}+        if [ -z $DISPLAY ]; then 
 +          printf "\r${GREEN}${int_progress}${NC} percent" 
 +        else 
 +          echo ${int_progress} 
 +        fi
     done     done
-  } | yad --progress --title="${str_title}" --text="${str_txt}" --percantage=0 --auto-close --width=400 --height=100 --no-cancel --window-icon="${str_icon}"+} 
 + 
 +# Wenn keine Dateien übertragen oder gelöscht werden müssen, dann starte direkt den Client 
 +if (( ${int_numberOfFiles} > 0 )) || (( ${int_numberOfFilesDelete} > 0 )) ; then 
 +  count=0 
 +  if [ -z $DISPLAY ]; then 
 +    printf "${YELLOW}${str_title}${NC}\n${str_infoTxt}\n\n" ; sync_files ; echo 
 +  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}" 
 +  fi
 fi fi
  
-Software Start +Client Start 
-${str_dest}/${str_start}+if [ ! -z $DISPLAY ]; then 
 +  if [ ! -z ${str_start]; then 
 +    echo "Starte ${str_start}..." 
 +    ${str_start} 
 +  fi 
 +fi
 </code> </code>
 +\\
 +Den passenden Rsync Server findet man [[home-harmening:sicherheit:backup:rsync:syncen_von_verzeichnissen|hier]]