====== Synchronisieren von Dateien über FTP ======
Viele Admins, die einen Root-Server besitzen, möchten gerne ihre Maps oder SourceTV-Demos mit einem Webserver über FTP abgleichen. Der FTP-Client ''lftp'' bietet eine Vielzahl von Möglichkeiten. Das Synchronisieren ist eine der gewünschten Funktion.
===== Installation von lftp =====
Da das Programm ''lftp'' standardmäßig nicht installiert ist, muss es über den Paketmanager der jeweiligen Distribution installiert werden.
* Debian: apt-get update; apt-get install lftp
* Suse-Linux: zypper install lftp
===== Kurze Einführung in lftp =====
Da das Programm später über ein Script als Cronjob ausgeführt werden soll, ist es wichtig zu wissen, wie der FTP-Client funktioniert. Wenn man nur lftp ohne Parameter aufruft, kommt man in die Kommandozeile des FTP-Clients((mit dem Befehl quit beendet man den FTP-Client)).\\ \\
**Hilfe:**
> Benutzung: lftp [OPTS]
> »lftp« ist der erste Befehl, der von lftp nach den rc-Dateien ausgeführt wird.
> -f Befehle aus diesem File ausführen und beenden
> -c Befehle ausführen und beenden
> Die anderen Optionen sind die selben wie beim »open« Befehl
> -e den Befehl direkt nach der Auswahl ausführen
> -u [] Benutze user und passwort zur Authentifikation
> -p Benutze den angegebenen Port zur Verbindung
> Name des Hosts, URL oder Name eines Lesezeichen
\\
**Der Befehl mirror:**
> Benutzung: mirror [OPTS] [nichtlokal [lokal]]
>
> Das angegebene nichtlokale Verzeichnis in ein lokales Verzeichnis spiegeln
>
> -c, --continue mit dem Spiegeln fortfahren, wenn möglich
> -e, --delete Dateien die nicht auf dem entfernten Verzeichnis
> liegen löschen
> --delete-first alte Dateien vor der Übertragung neuer Dateien löschen
> -s, --allow-suid SUID/SGID Berechtigungen setzen wie auf dem
> Server
> --allow-chown wenn möglich Benutzer und Gruppe setzen
> -n, --only-newer nur neuere Dateien herunterladen (schließt -c aus)
> -r, --no-recursion Unterverzeichnisse nicht mit einschließen
> -p, --no-perms keine Dateiberechtigungen setzen
> --no-umask umask nicht auf Dateiattribute anwenden
> -R, --reverse umgedrehter Spiegel (Dateien schicken)
> -L, --dereference symbolische Links als Files herunterladen
> -N, --newer-than DATEI nur Dateien die neuer sind als DATEI herunterladen
> -P, --parallel[=N] N Dateien gleichzeitig herunterladen
> -i RA, --include RA zum regulären Ausdruck passende Dateien einschließen
> -x RA, --exclude RA zum regulären Ausdruck passende Dateien
> ausschließen
> RA sind erweiterte reguläre Ausdrücke (Joker)
> -v, --verbose[=N] mehr Informationen ausgeben
> --log=DATEI ausgeführte lftp Befehle in DATEI protokollieren
> --script=DATEI lftp Befehle in DATEI protkollieren, aber nicht
> ausführen
> --jusz.print, --dry-run entspricht »--script=-«
>
> Gibt man -R an, so ist das erste Verzeichnis lokal und das andere auf dem
> Gegenstelle.
> Wird das zweite Verzeichnis nicht angegeben, wird die Namenswurzel(basename)
> des ersten Verzeichnisses verwendet.
> Werden beide Verzeichnisse weggelassen, so werden das aktuelle lokale und
> nichtlokale Verzeichnis verwendet.
==== Quell- und Zielverzeichnisse ====
Das Quellverzeichnis sollte immer mit einem Schrägstrich enden, damit alle Dateien innerhalb des Verzeichnisses erfasst werden. Wird der Schrägstrich am Ende vergessen, wird das letzte Verzeichnis mit erstellt. Im Gegensatz zum Quellverzeichnis, sollte beim Zielverzeichnis der letzte Schrägstrich nicht verwendet werden.
==== Beispiel ====
=== SourceTV-Demos Synchronisieren ===
Um SourceTV-Demos mit einem Webserver über FTP zu synchronisieren, werden nur die Dateien *.dem benötigt. Alles andere zu synchronisieren wäre ein Sicherheitsrisiko.
lftp -e "mirror -ceRr -i .*\.dem$ /home/gameserver/server1/cstrike/ /httpdocs/sourcetv_demos;quit" -u ftp_user:ftp_password ftp_host
In diesem Beispiel wird der Befehl mirror -ceRr -i .*\.dem$ /home/gameserver/server1/cstrike/ /httpdocs/sourcetv_demos/
an lftp übergeben. Der Parameter ''-e'' übergibt dem Programm ''lftp'' den Befehl((Wenn das Script länger wird, kann stattdessen kann auch eine Datei verwendet werden)).\\
Die Optionsschalter -ceRr des Befehls ''mirror'' bewirken folgendes:
* ''c'' > mit dem Spiegeln fortfahren, wenn möglich((Da SourceTV-Demos, die aufgenommen werden, auch größer werden.\\ So kann der Upload fortgesetzt werden. Das spart Zeit.))
* ''e'' > Dateien die nicht auf dem entfernten Verzeichnis liegen löschen
* ''R'' > umgedrehter Spiegel (Dateien schicken)
* ''r'' > Unterverzeichnisse nicht mit einschließen
* ''-i .*\.dem$'' > selektiert alle Dateien mit der Endung *.dem
=== Mappool abgleichen ===
Um den Mappool abzugleichen, kann man selektierte Verzeichnisse auf den Webserver hochladen. Da die Befehlskette länger wird, ist es sinnvoll die Befehle mit einer Datei an ''lftp'' zu übergeben.
lftp -f mappool_sync.txt
Hier wird die Datei mappool_sync.txt an lftp übergeben und ''lftp'' führt diese dann aus.\\ \\
== Alle Dateien aus bestimmten Verzeichnissen hochladen ==
mappool_sync.txt:
lftp -u ftp_user:ftp_password ftp_host
mirror -eR /home/gameserver/server1/cstrike/maps/ /httpdocs/cstrike/maps
mirror -eR /home/gameserver/server1/cstrike/materials/ /httpdocs/cstrike/materials
mirror -eR /home/gameserver/server1/cstrike/models/ /httpdocs/cstrike/models
mirror -eR /home/gameserver/server1/cstrike/sound/ /httpdocs/cstrike/sound
quit
== Nur bzip2-Dateien hochladen ==
Wenn schon ein vorgefertigtes Script vorhanden ist, welches bz2-Dateien anfertigt aber noch andere unkomprimierte Dateien sich im Verzeichnis befinden, können mithilfe ''-i .*\.bz2$'' die *.bz2-Dateien selektiert werden.\\
mappool_sync.txt:
lftp -u ftp_user:ftp_password ftp_host
mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/maps/ /httpdocs/cstrike/maps
mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/materials/ /httpdocs/cstrike/materials
mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/models/ /httpdocs/cstrike/models
mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/sound/ /httpdocs/cstrike/sound
quit
===== Shell-Script für SourceTV-Demos =====
Mit diesem Shell-Script kann automatisiert der Upload aller Demo-Dateien von SourceTV gestartet werden. Es arbeitet mit einer externen Konfigurationsdatei, die mit dem Befehl ''source'' geladen wird.\\ \\
Shell-Script [{{:tutorial:root:demo.sh|Download}}]:
#!/bin/bash
if [ ! -f demo.cfg ]; then echo "Die Konfigurationsdatei demo.cfg wurde nicht gefunden"; exit; fi
source demo.cfg
if [ -z "$ftp_host" ]; then echo "FTP-Host fehlt in der Konfigdatei"; exit; fi
if [ -z "$ftp_user" ]; then echo "FTP-Benutzer fehlt in der Konfigdatei"; exit; fi
if [ -z "$ftp_password" ]; then echo "FTP-Passwort fehlt in der Konfigdatei"; exit; fi
if [ -z "$dir_local" ]; then echo "Lokales Verzeichnis fehlt in der Konfigdatei"; exit; fi
if [ -z "$dir_remote" ]; then echo "Verzeichnis auf dem Webserver fehlt in der Konfigdatei"; exit; fi
echo -e "Beginne mit dem Spiegeln\n"
echo "Host: $ftp_host"
echo "User: $ftp_user"
echo "Passwort: ****"
echo
echo "Lokales Verzeichnis: $dir_local"
echo "Verzeichnis auf dem Webserver: $dir_remote"
echo
lftp -e "mirror -ceRr -i $extension $dir_local $dir_remote" -u $ftp_user:$ftp_password $ftp_host
\\ \\
Konfigurationsdatei [{{:tutorial:root:demo.cfg|Download}}]:
# Beispiel:
#
#ftp_host=sourceserver.info
#ftp_user=user123
#ftp_password=passwort123
#dir_local=/home/gs/server/war1_css/srcds/cstrike/
#dir_remote=/subdomains/maps/httpdocs/xyz/demos
#extension=".*\.dem$" (regular expression. In diesem Beispiel alle Dateien mit der Endung .dem)
#
#Alle Angaben sind noetig, damit daas Script die Dateien und Verzeichnisse Spiegeln kann.
ftp_host=
ftp_user=
ftp_password=
dir_local=
dir_remote=
extension=".*\.dem$"