Client FTP

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

 Voici un script FTP que j'ai écris lorsque j'ai commencé à faire un site web.


La particularité de ce client est qu'il effectue une sorte de synchronisation entre un répertoire du disque dur et un répertoire FTP. Cela permet de ne pas passer son temps à rechercher quels fichiers vous avez modifié pour les envoyer sur le serveur.

Afin de sélectionner le répertoire local, le serveur ftp, votre login et votre mot de passe il faut modifier le script lui même.

/!\ attention cela signifie que votre mot de passe est inscrit en clair dans le script /!\

Ce script est sous licence CECILL, c'est donc un logiciel libre.
#!/usr/bin/perl

# -*- coding: utf-8 -*-
# Envoi de données par ftp
# Version 0.5

#Copyright Michel Barret, 4 avril 2009
#michel.barret@gmail.com
#Ce logiciel est un programme informatique servant à envoyer une arborescence
#complète d'un répertoire sur FTP.
#Ce logiciel est régi par la licence CeCILL soumise au droit français et
#respectant les principes de diffusion des logiciels libres. Vous pouvez
#utiliser, modifier et/ou redistribuer ce programme sous les conditions
#de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
#sur le site "http://www.cecill.info".
#En contrepartie de l'accessibilité au code source et des droits de copie,
#de modification et de redistribution accordés par cette licence, il n'est
#offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
#seule une responsabilité restreinte pèse sur l'auteur du programme,  le
#titulaire des droits patrimoniaux et les concédants successifs.

#A cet égard  l'attention de l'utilisateur est attirée sur les risques
#associés au chargement,  à l'utilisation,  à la modification et/ou au
#développement et à la reproduction du logiciel par l'utilisateur étant
#donné sa spécificité de logiciel libre, qui peut le rendre complexe à
#manipuler et qui le réserve donc à des développeurs et des professionnels
#avertis possédant  des  connaissances  informatiques approfondies.  Les
#utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
#logiciel à leurs besoins dans des conditions permettant d'assurer la
#sécurité de leurs systèmes et ou de leurs données et, plus généralement,
#à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.

#Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
#pris connaissance de la licence CeCILL, et que vous en avez accepté les
#termes.

use strict;
use warnings;
use Time::Local;
use Net::FTP;
use Term::ANSIColor;

sub printblue {
    print color 'bold blue';
    print @_;
    print color 'reset';
}

sub printgreen {
    print color 'green';
    print @_;
    print color 'reset';
}

my $localdir = $ENV{HOME}.'/public_html/blog';
my $distdir = '/blog';
my $host = 'ftpperso.free.fr';
my $login = 'michel.barret5';
my $mdp = '*****';

my $fileref = $ENV{HOME}.'/.ftpperl';
my $dateref;

if (-f $fileref){
    $dateref = (stat ($fileref))[9];
}

my $ftp = Net::FTP->new($host, Debug => 0)
    or die "Echec de la connexion à $host: $@";

$ftp->login($login, $mdp)
    or die "Echec du", $ftp->message;

$ftp->cwd($distdir)
    or die "Echec du changement de répertoire ", $ftp->message;
$ftp->binary();

sub parcours {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    printblue " On entre dans le répertoire $path\n";
    my @files = readdir(DIR);

    closedir(DIR);

    foreach my $file (@files) {
        next if $file =~ /^\.\.?$/;

        if (-d $path.'/'.$file) {
            # Le fichier est un répertoire
            $ftp->mkdir($file);
            # On ne vérifie pas l'erreur au
            # cas où le répertoire existe déjà
            $ftp->cwd($file)
                or die "cwd failed ", $ftp->message;
            &parcours($path.'/'.$file);
        }
        elsif (-f $path.'/'.$file) {
            if (grep(/^$file$/, $ftp->ls())){
                # Le fichier existe déjà sur le serveur
                my $localdate = (stat ($path.'/'.$file))[9];
                if(! -f $fileref){
                    $dateref = $ftp->mdtm($file);
                }
                next if($dateref > $localdate);
                # Sinon on le supprime pour le remplacer
                $ftp->delete($file);
            }
            $ftp->put($path.'/'.$file)
                or die "put failed ", $ftp->message;
            printgreen $file." envoyé\n";
        }
    }
    # On remonte d'un cran
    $ftp->cdup()
        or die "cdup failed ", $ftp->message;
    print $path." traité\n";
}

parcours $localdir;

$ftp->quit;

utime(time, time, $fileref) or ( open(F, ">$fileref") && close F );