==== Rsync Client ====
{{ :home-harmening:sicherheit:backup:rsync:rsync_client.png?300|}}
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. \\
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 =====
/opt/sync_client/
sync_client.sh
sync.conf
\\ \\
==== sync.conf ====
#!/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
\\
==== sync-client.sh ====
#!/bin/bash
# Skript verbindet sich zuerst mit dem Server um die aktuelle Client Version zu laden.
# Christoph Harmening
# Variablen
str_sourceBin=$(dirname "$(readlink -f "$0")")
if [ -f ${str_sourceBin}/sync.conf ]; then source ${str_sourceBin}/sync.conf; fi
# Feste Variablen
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
}
# 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
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
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++))
#echo "Datei ${count} von ${int_numberOfFiles}: $line"
# Berechne den Prozentwert
# 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
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 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
# Client Start
if [ ! -z $DISPLAY ]; then
if [ ! -z ${str_start} ]; then
echo "Starte ${str_start}..."
${str_start}
fi
fi
\\
Den passenden Rsync Server findet man [[home-harmening:sicherheit:backup:rsync:syncen_von_verzeichnissen|hier]]