domachine
Anmeldungsdatum: 16. Mai 2007
Beiträge: Zähle...
|
Hallo ubuntuusers, Ich möchte euch gerne hier mein kleines Projekt vorstellen, das ich hauptsächlich geschrieben habe um meine Arbeit als Sysadmin zu vereinfachen. Ich arbeite neben meinem Studium bei einem mittelständischen Betrieb. Dort betreue ich vor allen Dingen die Homepage sowie diverse (selbst entwickelte) Kalkulationsprogramme. Während ich an der Homepage arbeite, habe ich einen Server-PC der nur im lokalen Netzwerk fungiert. Dieser sollte stets die aktuellen Änderungen der Homepage wiederspiegeln, die ich lokal auf meinem Desktop-PC bearbeite. Somit ermögliche ich meinem Chef (und anderen Angestellten) jederzeit ohne Probleme Einblick in die aktuelle Arbeit, ohne meinen Desktop-PC mit einem Web- und MySQL Server zu belasten. So weit so gut. Back to topic. Nun hab ich mir ein kleines Programm geschrieben, das genau diese Arbeit verrichtet. Es belauscht (per inotify interface) ein Verzeichnis auf Änderungen und wendet diese (per rsync) an einem anderen Ort an. Dabei werden diverse Gimmicks angeboten, wie zum Beispiel die Verwendung von Profilen (In lua geschrieben) um nicht jedesmal ellenlange Parameterlisten abtippen zu müssen.
Geschrieben ist das ganze in C. Ein Beispiel-Aufruf des Programms könnte so aussehen:
| filesync -H 192.168.2.110 -u remote-user src-dir target-dir
|
Hierbei wird das Quell-Verzeichnis relativ betrachtet, sprich eine solche Quellpfad angabe: /home/user/src , führt dazu, dass im Zielverzeichnis ebenfalls diese Verzeichnisstruktur angelegt wird. Quasi in diesem Fall: target/home/user/src/<files> . Will man das nicht, muss man vorher ins Quellverzeichnis wechseln und den Pfad relativ angeben. Um sich solche Arbeit nicht jedes mal zu machen, kann man nun auch in lua geschriebene Profile erstellen, die dann mit der Option -f aufgerufen werden. Ein beispiel könnte etwa so aussehen (Das Profil für meinen Fall in der Firma): 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | -- Change to src directory
chdir("/home/dominik/Workspace/thehardwoodcentral")
host = "192.168.2.110"
user = "dominik"
source = "."
target = "/var/www/django/thehardwoodcentral/"
-- File regexes to exclude
exclude = {
".*#.*", -- Backup files of emacs
".*settings.*", -- Settings files
".*urls.*" -- Url files
}
-- Create one big regex of exclude list
exclude = table.concat(exclude, "|")
|
Der Aufruf sähe dann folgendermaßen aus:
| filesync -f <profil-datei>
|
Das ist mal das gröbste zur Nutzung. Weitere Optionen sind im Hilfe-text aufgelistet. Wie gewohnt durch den Aufruf
oder
Die Quellen können von github bezogen werden und werden mit dem üblichen autoconf-Dreisatz gebaut. Um übrigens das Profil feature zu nutzen, benötigt man logischerweise die lua Entwicklungspakete. Benötigt wird 5.1 oder höher. Dieser feature kann per ./configure --without-lua deaktiviert werden, dann wird lua auch nicht benötigt. Quellen Aktueller Entwicklungssnapshot Feedback ist wie immer willkommen! Have fun!
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Hi. Das hört sich echt gut an, ich hatte etwas ähnliches vor kurzem mit nem Bashscript versucht, bin allerdings daran gescheitert, dass Rsync 5 bis 10 Sekunden braucht (über 6000er DSL), obwohl nur eine kleine Datei verändert wurde. Wie sieht bei dir die Infrastruktur aus? Wie viele Dateien sind in dem Ordner? Bei mir sind es knapp über 30000. Hast du auch solche Verzögerungen? Edit: achso hast du ne Entwicklungsumgebung? Da kann man meist Upload on Save einstellen (klappt bei mir nur leider nicht).
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
stfischr schrieb: Hi. Das hört sich echt gut an, ich hatte etwas ähnliches vor kurzem mit nem Bashscript versucht, bin allerdings daran gescheitert, dass Rsync 5 bis 10 Sekunden braucht (über 6000er DSL), obwohl nur eine kleine Datei verändert wurde. Wie sieht bei dir die Infrastruktur aus? Wie viele Dateien sind in dem Ordner? Bei mir sind es knapp über 30000. Hast du auch solche Verzögerungen? Edit: achso hast du ne Entwicklungsumgebung? Da kann man meist Upload on Save einstellen (klappt bei mir nur leider nicht).
Das mit dem Upload-on-save würde nicht funktionieren. Wär mit emacs bestimmt machbar, allerdings kommts auch häufig vor, dass ich Bilder einfach ins Projekt kopiere (Ich will eben eine Deckungsgleiche Kopie der Website auf meinem Rechner haben). Zu den Verzögerungen: Auf 30000 Dateien komm ich wahrscheinlich nicht, aber 10000 könnten etwa hinkommen. Hab da mit solchen Verzögerungen ehrlich gesagt noch nie Probleme gehabt. Dürfte aber auch eigentlich keine Probleme geben, wenn man das Programm nicht abbricht, denn dank inotify werden ja auch Änderungen aufgezeichnet, die während einem Upload passieren (Diese Events werden einfach hinten angestellt). Damit sollte eigentlich sichergestellt sein, dass alle Dateien hochgeladen werden. Ansonsten könnte man noch überlegen, das ganze multithreading-fähig zu machen. Gruß Domi
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
domachine schrieb: Das mit dem Upload-on-save würde nicht funktionieren. Wär mit emacs bestimmt machbar, allerdings kommts auch häufig vor, dass ich Bilder einfach ins Projekt kopiere (Ich will eben eine Deckungsgleiche Kopie der Website auf meinem Rechner haben).
Naja da ich Eclipse nutze, muss ich die Bilder einfach per D&D in den File-Tree ziehen und schon gehören sie zum Projekt und würden hochgeladen werden. Zu den Verzögerungen: Auf 30000 Dateien komm ich wahrscheinlich nicht, aber 10000 könnten etwa hinkommen. Hab da mit solchen Verzögerungen ehrlich gesagt noch nie Probleme gehabt. Dürfte aber auch eigentlich keine Probleme geben, wenn man das Programm nicht abbricht, denn dank inotify werden ja auch Änderungen aufgezeichnet, die während einem Upload passieren (Diese Events werden einfach hinten angestellt). Damit sollte eigentlich sichergestellt sein, dass alle Dateien hochgeladen werden.
Das Problem ist nicht, dass etwas nicht hoch geladen wird, sondern, dass ein rsync-Durchlauf so lange dauert. Mir waren 10 sec Verzögerung zu langsam um darauf zu warten. Am liebsten hätte ich es, das es in dem Moment auf dem Server landet, in dem ich es speichere (naja 1 Sekunde brauche ich sowieso zum umschalten und aktualisieren). Das schafft dein Programm bei 10000 Dateien? Dann wäre es für mich nen Versuch wert. Mal sehen, wann ich wieder Zeit hab, das auszuprobieren.
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
stfischr schrieb: domachine schrieb: Das mit dem Upload-on-save würde nicht funktionieren. Wär mit emacs bestimmt machbar, allerdings kommts auch häufig vor, dass ich Bilder einfach ins Projekt kopiere (Ich will eben eine Deckungsgleiche Kopie der Website auf meinem Rechner haben).
Naja da ich Eclipse nutze, muss ich die Bilder einfach per D&D in den File-Tree ziehen und schon gehören sie zum Projekt und würden hochgeladen werden. Zu den Verzögerungen: Auf 30000 Dateien komm ich wahrscheinlich nicht, aber 10000 könnten etwa hinkommen. Hab da mit solchen Verzögerungen ehrlich gesagt noch nie Probleme gehabt. Dürfte aber auch eigentlich keine Probleme geben, wenn man das Programm nicht abbricht, denn dank inotify werden ja auch Änderungen aufgezeichnet, die während einem Upload passieren (Diese Events werden einfach hinten angestellt). Damit sollte eigentlich sichergestellt sein, dass alle Dateien hochgeladen werden.
Das Problem ist nicht, dass etwas nicht hoch geladen wird, sondern, dass ein rsync-Durchlauf so lange dauert. Mir waren 10 sec Verzögerung zu langsam um darauf zu warten. Am liebsten hätte ich es, das es in dem Moment auf dem Server landet, in dem ich es speichere (naja 1 Sekunde brauche ich sowieso zum umschalten und aktualisieren). Das schafft dein Programm bei 10000 Dateien? Dann wäre es für mich nen Versuch wert. Mal sehen, wann ich wieder Zeit hab, das auszuprobieren.
Da könnte filesync tatsächlich ne lösung sein. Ich denke die Verzögerung tritt ein, weil du das gesamte Verzeichnis synchronisierst. Filesync synched jedoch nur die Dateien, die verändert wurden. Es ruft rsync auch nur mit diesen Dateien, statt dem gesamten Verzeichnis.
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
domachine schrieb: Da könnte filesync tatsächlich ne lösung sein. Ich denke die Verzögerung tritt ein, weil du das gesamte Verzeichnis synchronisierst. Filesync synched jedoch nur die Dateien, die verändert wurden. Es ruft rsync auch nur mit diesen Dateien, statt dem gesamten Verzeichnis.
Super ... genau das könnte die Lösung für mich sein.
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
stfischr schrieb: domachine schrieb: Da könnte filesync tatsächlich ne lösung sein. Ich denke die Verzögerung tritt ein, weil du das gesamte Verzeichnis synchronisierst. Filesync synched jedoch nur die Dateien, die verändert wurden. Es ruft rsync auch nur mit diesen Dateien, statt dem gesamten Verzeichnis.
Super ... genau das könnte die Lösung für mich sein.
Ich würde mich sehr freuen, wenn es eine Lösung für dich darstellt. Vielen dank für das tolle Feedback. Gruß Domi
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
Neue Major Version 0.2.3 mit ein paar mehr oder weniger bewegenden Änderungen. Rsync fehler werden nun über das logging-system geschleust. Sprich der daemon-mode wird stabiler und loggt jetzt auch solche Fehler. Außerdem kann man den Pfad zum Pid-file selbst wählen. Kleiner Bugfix beim fehlerhaften Beenden des Programms nach einer fehlgeschlagenen Kompilation des Exclude Regexes. Dabei wurde der Fehlerpuffer nicht mehr freigegeben (Was eigentlich kein Problem ist, da er nach dem Beenden sowieso freigegeben wird. Sauber ist das jedoch nicht) Beim loggen über stderr wird nun keine Uhrzeit mehr ausgegeben (Fand ich persönlich sehr unschön, wo es eigentlich nur bei log-files Sinn macht.)
Quellen wie üblich bei github.com erhältlich. Gruß Domi
|
vollkorn
Anmeldungsdatum: 23. Oktober 2006
Beiträge: Zähle...
|
Hmmm, das klingt sehr interessant. Ich habe über ein ähnliches Programm nachgedacht um mein Backup zu machen. Momentan mache ich ein Backup mit Back In Time, welches rsync nutzt, aber immer das gesamte Verzeichnis (bei mir /home/user) überprüft und dementsprechend lange läuft.
Ich denke mit ein wenig Zeit und Basteln sollte man dein Programm umbauen können um das Backup der gewünschten Datei per Back In Time zu starten.
Danke für dein Projekt.
|
handykap
Anmeldungsdatum: 11. September 2010
Beiträge: 39
|
Hi @all, Kann dein Programm eigentlich auch erkennen wenn eine Datei verschoben wird, so dass diese nicht einmal gelöscht und hochgeladen wird sondern wirklich verschoben? Es wäre auch ganz toll wenn jemand von euch einen Tipp hat wie z.B. nach einer längeren Netzwerkpause - z.B. wegen Urlaub mit Laptop - man rsync, filesync oder Back in Time das mit den verschobenen Dateien beibringt ( da ja dieselben Dateien je einmal fehlen und einmal vorhanden sind. ) Denn über Netzwerk oder eine externe USB-Festplatte hat man ja nur 10MB/s... Wäre darüber richtig gücklich ☺
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
handykap schrieb: Hi @all, Kann dein Programm eigentlich auch erkennen wenn eine Datei verschoben wird, so dass diese nicht einmal gelöscht und hochgeladen wird sondern wirklich verschoben? Es wäre auch ganz toll wenn jemand von euch einen Tipp hat wie z.B. nach einer längeren Netzwerkpause - z.B. wegen Urlaub mit Laptop - man rsync, filesync oder Back in Time das mit den verschobenen Dateien beibringt ( da ja dieselben Dateien je einmal fehlen und einmal vorhanden sind. ) Denn über Netzwerk oder eine externe USB-Festplatte hat man ja nur 10MB/s... Wäre darüber richtig gücklich ☺
Mmh... ehrlich gesagt fällt mir da gerade auf Anhieb keine Methode ein um so etwas umzusetzen. Ich habe außerdem gerade relativ wenig Zeit um mich um solch ein Feature zu kümmern. Es steht aber natürlich jedem frei das Projekt zu forken bzw. den Code zu patchen. Sollte jemand eine Lösung finden, kann er mich gerne kontaktieren, dann werde ich den Patch einpflegen. Gruß Domi
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
Update Seit dem letzten Release, das nur so von Bugs durchzogen war, habe ich nun nahezu die gesamte Codebase umgekrempelt und einigen Balast vor die Tür gesetzt und setze nun auf bewährte Lösungen des Boost-Frameworks http://boost.org. Außerdem wurden sämtliche inotify-aktionen unter einer objektorientierten Schnittstelle versteckt. Und die Event-Behandlung wird jetzt durch tatsächliche Signale aus Boost.Signal gelöst. Die Analyse der Kommandozeilenoptionen und die Auswertungen eines Profils wurden nun zusammengelegt und werden ebenfalls durch Boost unter eine einheitliche Schnittstelle gebracht, was Änderungen um einiges erleichtert. Das hat leider eine Änderung des Formats für Profile zur Folge, dazu aber später mehr. Außerdem wurde die Fehlerbehandlung auf echte Ausnahmen umgestellt, die das Debugging erheblich erleichtern. Die Verwaltung des Pakets wird nun von CMake statt den Autotools übernommen, welches das Ganze auch vereinfachen. Profil-Format Änderungen Wie oben erwähnt hat sich das Format für Profile geändert. Diese werden nicht mehr wie vorher in lua geschrieben sondern im ini-Format akzeptiert. Das Beispiel ganz am Anfang würde nun so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12 | # Change to src directory
[rsync]
workdir = /home/dominik/Workspace/thehardwoodcentral
[source]
path = .
exclude = .*#.*|.*settings.*|.*urls.*
[target]
path = /var/www/django/thehardwoodcentral/
host = 192.168.2.110
host.user = dominik
|
Die entsprechenden Kommandozeilen-Optionen sind die gleichen nur mit "–" am Anfang (z.B. --target.host.user). Die Sections werden dabei durch die Punkt-Notation ausgedrückt.
|
stegy
Anmeldungsdatum: 14. Februar 2007
Beiträge: Zähle...
|
Interessantes Projekt! Wäre es möglich eine CMD-before-sync Option einzubauen? Also die Möglichkeit einen Befehl vor dem Synchronisieren abzusetzen? So könnte man auf dem Zielsystem schnell das Zielverzeichnis per "cp -al" kopieren und hätte dann so sogar eine relativ einfache Versionierung.
|
domachine
(Themenstarter)
Anmeldungsdatum: 16. Mai 2007
Beiträge: 562
|
stegy schrieb: Interessantes Projekt! Wäre es möglich eine CMD-before-sync Option einzubauen? Also die Möglichkeit einen Befehl vor dem Synchronisieren abzusetzen? So könnte man auf dem Zielsystem schnell das Zielverzeichnis per "cp -al" kopieren und hätte dann so sogar eine relativ einfache Versionierung.
Das ist leider nicht ganz so einfach wie es scheint. Filesync verwendet rsync als "Forwarder" um Dateien auf das Zielsystem zu transferieren. Rsync bietet eine von dir gewünschte Funktion leider nicht so ohne weiteres. Ein Workaround während möglicherweise die Umgebungsvariable "RSYNC_CONNECT_PROG". Diese ist eigentlich dazu da um einen Proxy anzustoßen über den man sich dann mit dem Zielsystem verbindet. Es wäre wahrscheinlich nicht die eleganteste Möglichkeit, das einfach für einen Remote-Befehl zu "missbrauchen", ist aber auf jeden Fall eine Überlegung wert. Die andere Möglichkeit wäre, sich von rsync loszumachen und einen eigenen Synchronisierungsmechanismus zu entwerfen. Diese Möglichkeit halte ich aber eher als nicht all zu angebracht, da die Macher von rsync auf diesem Gebiet auf jeden Fall mehr Erfahrung haben als und es ein zu großer Aufwand währe ähnliche Algorithmen zu entwickeln. Außerdem bin ich nicht scharf drauf, dieses Rad neu zu erfinden. Ich denke es wird auf die RSYNC_CONNECT_PROG Umgebungsvariable herauslaufen. Mal sehen wann ich dazu komme, das zu implementieren. Ich bitte um etwas Geduld, da ich gerade mitten in der Prüfungsphase stecke und das gerne zuerst hinter mich bringen würde. Deine Idee bleibt allerdings wie gesagt auf jeden Fall auf meiner Liste. Bis dann. Gruß Domi
|