home-harmening:sicherheit:backup:rsync:grafischer_rsync_client

Dies ist eine alte Version des Dokuments!


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.
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.



#!/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
 
 
# Variablen
str_server=SERVER
str_source=/var/www/client/client/*
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
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
 
# 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 werden 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}')
 
# Prüfe over der Zielordner existiert
if [ ! -d ${str_dest} ]; then mkdir -p ${str_dest}; fi
 
sync_files() {
    # Ü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
        ((count++))
        #echo "Datei ${count} von ${int_numberOfFiles}: $line"
        # Berechne den Prozentwert
        int_progress=$(( (count * 100) / ${int_numberOfFiles} ))
        # Lass über 100 dan bleibe bei 100
        if (( ${int_progress} >= 100 )) then int_progress=100; fi
        if [ -z $DISPLAY ]; then
          printf "\r${GREEN}${int_progress}${NC} percent"
        else
          echo ${int_progress}
        fi
    done
}
 
# Wenn keine Dateien übertragen werden müssen, dann starte direkt Client
if (( ${int_numberOfFiles} > 0 )) ; then
  count=0
  if [ -z $DISPLAY ]; then
    printf "${YELLOW}${str_title}${NC}\n${str_infoTxt}\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
 
# Client Start
if [ ! -z ${str_start} ]; then
  ${str_dest}${str_start}
fi


Den passenden Rsync Server findet man hier