ftpsync 1.85

Beschreibung: ftpsync ist ein von mir selbst geschriebenes kleines Konsolenprogramm für Linux in C/C++ zum synchronisieren des Webspaces per FTP unter Zuhilfenahme von curlftpfs.

VORAB EINE WARNUNG!: Ich habe beim schreiben des Programms ftpsync ein paar Eigenheiten den Zeitstempel betreffend festgestellt und habe keine Ahnung, ob diese vom FTP-Server oder vom Programm curlftpfs verursacht werden. Das Programm wurde mit
3 verschiedenen FTP-Servern von 2 Providern und mit 2 unterschiedlichen Client-PCs getestet und die Eigenheiten waren jedesmal identisch. Trotzdem übernehme ich keinerlei Gewähr, daß das Programm mit allen FTP-Servern in allen Linux Umgebungen das gewünschte Resultat (den Abgleich des FTP-Verzeichnisses mit einem lokalen Verzeichnis) erzielt. Die Verwendung des Programms erfolgt daher auf eigene Gefahr. Ich übernehme keinerlei Verantwortung für eventuell auftretenden Datenverlust!

Noch ein Hinweis: Es gibt eine andere Version von ftpsync, namens sshsync 2.1, welche für die Verwendung mittels sshfs konzipiert ist. Besteht die Möglichkeit ssh für den Webspace des Providers zu verwenden, empfehle ich diese Version, da die hier beschriebenen Einschränkungen wie unter FTP/curlftpfs nicht mehr gelten.

Syntax: ftpsync [--use-logs] lokalesVerzeichnis/ FTP-Verzeichnis/

Bei ftpsync handelt es sich um eine modifizierte Variante von timecmp, welche auf die in der Warnung angesprochenen Eigenarten abgestimmt wurde. Während timecmp zwei Verzeichnisse in beide Richtungen abgleichen kann und dabei den Zeitstempel auf Gleichheit überprüft, kann ftpsync nur in eine Richtung arbeiten und nur prüfen, ob die Zeitstempel neuer sind. Die Idee ist, daß man an einer lokalen Kopie seiner Homepage Offline arbeitet, nach erfolgter Änderung das Ergebnis in Ruhe auf dem heimischen Rechner betrachten kann und es anschließend per FTP auf dem Webspace bereit stellt. Arbeitet man an mehreren Seiten gleichzeitig, kann man unter Umständen den Überblick verlieren, welches html-Dokument wegen einer Änderung bereit gestellt werden muß. Dabei hilft ftpsync, weil es wie timecmp den Datumsstempel vergleicht und somit neuere Dateien auf der lokalen Festplatte erkennt. Damit ftpsync arbeiten kann, muß ein entferntes FTP-Verzeichnis mittels curlftpfs in den Verzeichnisbaum eingehängt werden, auf das dann ftpsync mit der zweiten Pfadangabe zugreift.

Nun zu den vorher beschriebenen Eigenheiten und wie ftpsync damit umgeht:

  1. Ich habe weder eine Möglichkeit gefunden mittels FTP den Zeitstempel der zu übertragenden Datei zu erhalten, noch ihn in irgendeiner Form zu manipulieren. Die Dateien bekommen als Zeitstempel beim Übertragen auf den FTP-Server die momentane Kopierzeit.
  2. Wird eine Datei um 15:20 Uhr in der Sommerzeit übertragen, ist der mit ls -l --full-time angezeigte Zeitstempel 16:20 Uhr.
  3. Die Genauigkeit des Zeitstempels ist auf Minuten begrenzt, da übertragene Dateien immer "00" als Sekunden haben.
  4. Der Zeitstempel von älteren Dateien wird vom FTP-Server entweder auf die Zeit 00:00 Uhr oder 01:00 Uhr gesetzt (in der Regel nach ca. 5,5 Monaten). Diese Dateien können daher nicht mehr vernünftig verglichen werden, da sie immer als älter erscheinen.

Zu Problem 1: Beim Bereitstellen einer Datei erhält der Zeitstempel immer das aktuelle Datum, daher gibt es keine Abfrage wie bei timecmp auf Gleichheit der Stempel, sondern lediglich ob besagter Stempel neuer ist. Dies stellt allerdings kein großes Problem dar, da es für einen Vergleich vollkommen ausreicht, wenn die Datei neuer ist.

Zu Problem 2: Erstelle ich um genau 15:20 Uhr in der Sommerzeit eine Datei im eingehängten FTP-Verzeichnis, zeigt diese nach einer Abfrage mittels ls -l --full-time die Zeit 16:20 Uhr, also um eine Stunde in der Zukunft. Beobachtungen haben gezeigt, daß Dateien die in der Winterzeit erstellt wurden den Zusatz +0100 erhalten und korrekt angezeigt werden, während Dateien in der Sommerzeit den Zusatz +0200 und um eine Stunde in der Zukunft angezeigt werden. Ich nehme daher mal stark an, bei besagtem Zusatz handelt es sich um die Zeitzone. Wir befinden uns in der Zeitzone UTC+1 im Winter und UTC+2 im Sommer, dabei bedeutet die Zahl plus eine oder zwei Stunden -je nach Sommer oder Winterzeit- von der UTC-Zeit (UTC=Universal Time Coordinated). Leider reichen meine Programmierkenntnisse nicht aus um zu verstehen, wie andere Programme es schaffen die korrekte Zeit anzuzeigen, aber ncftp, lftp und sogar FireFTP (AddOn von Firefox) zeigen die Zeit korrekt an. Meine Lösung des zweiten Problems besteht darin, daß ftpsync alle Datumsstempel mit dem Zusatz +0200 des FTP-Verzeichnisses bei der Abfrage um minus eine Stunde mit dem lokalen Verzeichnis vergleicht und somit den Unterschied der einen Stunde ausgleicht.

Zu Problem 3: Entweder können FTP-Server nur minutengenau arbeiten oder die Übertragung mittels curlftpfs hat nur diese Genauigkeit. Um dieses Manko zu umgehen, setzt ftpsync alle Sekunden der Datumsstempel des lokalen Verzeichnisses beim Vergleich auch auf 00 (natürlich nur intern in seinen Variablen). Ansonsten würde eine kleine Dateiänderung die innerhalb einer Minute ausgeführt wurde, nicht als Neuer erscheinen.

Zu Problem 4: Anscheinend löschen FTP-Server die Uhrzeit bei alten Dateien (entweder nach ca. 5,5 Monaten oder bei einer neuen Jahreszahl) und somit zeigt sie der FTP-Client entweder als 00:00 Uhr oder 01:00 Uhr an. In dem Sinne macht der FTP-Server aus einem Zeit-/Datumsstempel einen reinen Datumsstempel. Durch die fehlende Uhrzeit erscheinen die Dateien immer als älter als die lokalen Dateien. Um dieses Problem zu umgehen, vergleicht ftpsync den Datumsstempel der lokalen Datei mit dem aktuellen Datum (ohne Uhrzeit). Ist die Differenz mehr als 5,5 Monate wird die Uhrzeit der lokalen Dateien intern in den Variablen auf 00:00 gestellt und somit werden Dateien älter als 5,5 Monate umgangen.

Da es sich bei ftpsync -wie schon erwähnt- um eine modifzierte Variante von timecmp handelt, gelten alle Anforderungen (Programme ls, find, etc.) wie bei timecmp und werden daher hier nicht nochmal aufgeführt, sondern sind bei besagtem Programm nachzulesen. Die Beschränkung auf 99999 Dateien pro Verzeichnis besteht seit Vers.1.85 nicht mehr (wie bei timecmp ab Vers.2.0)!
Der Unterschied in der Arbeitsweise zu timecmp besteht darin, daß Standardmäßig ein vorhandenes Verzeichnis "logs", in welchem der Provider die Homepage-Zugriffe mitprotokolliert beim Vergleich nicht berücksichtigt wird. Es sei denn man ruft ftpsync mit dem Schalter --use-logs auf. Des weiteren wird nur überprüft, ob im lokalen Verzeichnis neuere Dateien vorhanden sind oder Dateien in einem der beiden Verzeichnisse fehlen. Lokal neuere Dateien oder auf dem FTP-Server fehlende Dateien werden nach der Bestätigung auf den FTP-Server kopiert. Fehlende lokale Dateien werden auf dem FTP-Server gelöscht. In diesem Sinne hat ftpsync die Funktion eines mirrors. Das entfernte FTP-Verzeichnis wird auf den Stand des lokalen Verzeichnisses gebracht.

Das Programm steht unter der GPL und darf daher von jedem frei verwendet werden. Geschrieben und getestet wurde es unter Debian GNU/Linux Codenamen lenny, squeeze und wheezy, könnte aber auch auf anderen Linux-Distributionen funktionieren. Für auftretende Fehler, Schäden oder Datenverlust die das Programm verursacht, übernehme ich keinerlei Haftung. Die Benutzung erfolgt auf eigene Gefahr, jedoch ist die Wahrscheinlichkeit, daß nach dem Gebrauch das System nicht mehr funktioniert sehr gering, da das Programm lediglich Dateien kopiert oder löscht und eventuell Ordner anlegt. Bis zu der Ja/Nein-Abfrage wird an den Verzeichnissen auch nichts verändert, somit kann man das Programm auch nur dazu benutzen, um eventuelle Unterschiede in den Verzeichnissen anzeigen zu lassen.

Wer selbst kompilieren will, braucht den Gnu-C++-Compiler (enthalten in dem Paket build-essential) und kann mittels folgendem Befehl eine ausführbare Datei erstellen:

# g++ ftpsync.cpp -o ftpsync


Download

  32-Bit (i386) 64-Bit (amd64)
Debian lenny ftpsync ftpsync
Debian squeeze ftpsync ftpsync
Debian wheezy ftpsync ftpsync
Quellcode
ftpsync.cpp