Follow me
RSS feed
My sources
My Viadeo

SyncFTP 0.0.1

Greg | 15 Apr 2010

Projets Depuis que j'ai passé ce blog sous Jekyll, je suis confronté à un petit problème. En effet, la seule solution que j'ai pour mettre à jour ce site est de passer par du FTP. Je génère le site sur ma machine et j'upload le tout à chaque nouvel article. C'est là où le bât blesse, car à chaque fois je dois envoyer près de 120Mo sur le réseau. Ce n'est rien me direz vous. Oui, mais en comparaison aux quelques kilos que pèse chaque page, c'est énorme. Il suffit d'uploader seulement les nouveaux fichiers, me direz-vous, cela sera plus rapide. Et je suis parfaitement d'accord, mais je suis flemmard1. Enfin, en fonction de l'article il peut y avoir de la vidéo, des images, ... Bref tout un tas de choses dont il faut se souvenir.

J'ai contourné ce problème en créant une petite librairie Ruby : SyncFTP. L'idée est très simple. Il s'agit de générer un catalogue contenant, pour chaque fichier, un hash MD5. A chaque nouvel upload, SyncFTP vérifie si le MD5 du fichier est différent. Si c'est le cas alors il l'envoie, sinon non.

Voici un petit exemple d'utilisation. Imaginons que je souhaite envoyer l'arborescence suivante :

rootdir
|-- README
|-- image.png
`-- subdir
    `-- README

Je vais utiliser ce script :

#!/bin/env ruby
require 'rubygems'
require 'syncftp'

ftp = SyncFTP.new( 'example.com', :username => "example", :password => "********", :loglevel => Logger::DEBUG )
ftp.sync( :local => "rootdir", :remote => "syncfs/test" )

Lors du premier upload, nous avons la trace suivante :

I, [2010-04-15T18:39:05.245658 #11599]  INFO -- : Copy [Binary] rootdir/image.png to ftp://example.com:21/temp/syncfs/test/image.png
I, [2010-04-15T18:39:05.246719 #11599]  INFO -- : Copy [Text] rootdir/README to ftp://example.com:21/temp/syncfs/test/README
I, [2010-04-15T18:39:05.251776 #11599]  INFO -- : Copy [Text] rootdir/subdir/README to ftp://example.com:21/temp/syncfs/test/subdir/README

Si nous regardons sur le serveur FTP, nous trouverons également le fichier ftp://example.com/temp/syncfs/test.syncftp :

--- 
temp/syncfs/test/subdir/README: bfa68377907ac16c428198b9557ac061
temp/syncfs/test/README: 77a3a162ff4e69734fd213609efab1ac
temp/syncfs/test/image.png: 6f964f674f376c86bd384a77fc6a32ed

Si maintenant nous relançons le même script, sans rien modifier, nous obtenons le log suivant :

I, [2010-04-15T18:42:30.048393 #11758]  INFO -- : rootdir/image.png don't need to be overwritten !
I, [2010-04-15T18:42:30.048498 #11758]  INFO -- : rootdir/README don't need to be overwritten !
I, [2010-04-15T18:42:30.052311 #11758]  INFO -- : rootdir/subdir/README don't need to be overwritten !

Si par contre nous modifions le fichier rootdir/README (par exemple) nous avons le log suivant :

I, [2010-04-15T18:44:12.423398 #11842]  INFO -- : rootdir/image.png don't need to be overwritten !
I, [2010-04-15T18:44:12.423524 #11842]  INFO -- : Copy [Text] rootdir/README to ftp://example.com:21/temp/syncfs/test/README
I, [2010-04-15T18:44:12.428046 #11842]  INFO -- : rootdir/subdir/README don't need to be overwritten !

Voilà ! Je pense que vous avons compris le principe.

J'ai donc ajouté dans le Rakefile de ce site une tache publish qui s'occupe de lancer la synchro FTP.

1 Dois-je vous le rappeler ?

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.