Table des matières

, , , , ,
LFTP : client ftp

LFTP est réputé comme LE client ftp “simple” de Linux. Mais “simple” est ici à prendre au sens linuxien du terme : robuste, fiable et sans fioriture (comprenez “sans interface”). N'en déplaise aux puristes, je trouve qu'une interface web façon Transmission ne lui ferait pas de mal :-D.

Assez râlé, c'est parti :

# aptitude install lftp

Jusque là, tout va bien.

Le principe de base

LFTP est un démon : dès l'installation, on peut s'apercevoir qu'un processus “tourne” en mémoire. <cli>root@muffin:~# ps aux | grep “lftp” | wc -l 1</cli>

Si l'on souhaite simplement récupérer un fichier sur un serveur ftp ou au contraire envoyer un fichier, on ajoute l'opération à la file d'attente du démon. Je n'ai pas encore essayé mais cela semble assez simple de revenir par la suite dans LFTP vérifier où en est la file d'attente, mettre en pause, etc.

Là où ça devient “velu”, c'est pour synchroniser toute une arborescence (dans un sens ou dans l'autre), surtout si on veut faire les choses bien et ne lancer cette synchro que de nuit (une fois encore, les développeurs devraient aller voir ce qui se fait ailleurs)…

Pour faire une synchronisation, on se connecte là encore au démon (avec la commande éponyme), on lance l'opération puis on quitte : <cli> root@muffin:~# lftp lftp :~> open ftp.totos.fr lftp :~> user <toto> <password_de_toto> lftp :~> mirror -v -c –use-pget-n=10 –parallel=2 / /mnt/dossier/local“ lftp :~> exit </cli>

On s'est donc connecté au serveur ftp.totos.fr avec le login toto et son super mot de passe pour synchroniser tout le serveur distant (”/“) vers un chemin local en téléchargeant simultanément 2 fichiers chacun fractionné en 10 pour optimiser la bande passante.

Le problème c'est de retrouver l'opération en cours, de savoir où elle en est ou de l'arrêter (voire, avec certains scripts vus sur la toile, le risque de la lancer plusieurs fois simultanément et de saturer la connexion Internet).

Garder le contrôle

Heureusement, il est tout de même possible de faire un script efficace, en voici un excellent trouvé sur ce site, mais sa mise en place est présentée d'une façon que j'ai eu du mal à appréhender.

Le fichier de commande

Il faut commencer par préparer un fichier dans lequel on place l'ensemble des commandes LFTP nécessaires à l'opération (vous pouvez choisir l'extension que vous voulez), pour reprendre l'exemple précédent :

ftptoto.txt
open ftp.totos.fr
user <toto> <password_de_toto>
mirror -v -c --use-pget-n=10 --parallel=2 / /mnt/dossier/local"

Le script

Viens ensuite le script qui se charge de lancer l'opération, de surveiller son état ou de l'arrêter :

ftpsync.sh
#!/bin/sh
 
# lftp synchronization script by Matthieu Bouthors
# http://www.bouthors.fr
 
set -e
 
# NAME can be anything you like as long as it is a valid filename
NAME=lftpsync
PIDFILE=/var/run/$NAME.pid
#Path to lftp daemon command
DAEMON=/usr/bin/lftp
#This is the command to be run, give the full pathname
DAEMON_OPTS="-f /chemin/vers/ftptoto.txt"
 
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
 
# check if lftp is running
 
RUNNING=false
if [ -e $PIDFILE ]
then
        currentpid=`cat $PIDFILE`
        if `ps -p $currentpid > /dev/null`
        then
                RUNNING=true
        else
                rm -f $PIDFILE
        fi
fi
 
case "$1" in
  start)
        date
        if $RUNNING
        then
                started=`date -r $PIDFILE`
                echo "daemon $NAME already started since $started, you need to stop it first"
        else
                echo -n "Starting daemon: "$NAME
                start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON -- $DAEMON_OPTS
                echo "."
        fi
        ;;
  stop)
        date
        echo -n "Stopping daemon: "$NAME
        start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
        rm -f $PIDFILE
        echo "."
        ;;
  restart)
        date
                echo -n "Restarting daemon: "$NAME
        if $RUNNING
        then
                start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
                rm -f $PIDFILE
        fi
        start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON -- $DAEMON_OPTS
        echo "."
        ;;
  check)
        if $RUNNING
        then
                echo "$NAME is running"
        else
                echo "$NAME is not running"
        fi
        ;;
 
  *)
        echo "Usage: "$1" {start|stop|restart|check}"
        exit 1
esac
 
exit 0

Quand je disais que maîtriser LFTP n'est pas si simple, hein ? 8-O

Une fois ce script rendu exécutable, il ne reste qu'à le lancer avec l'un des paramètres possibles (start, stop, restart ou check).

Automatisation

Pour lancer automatiquement l'opération dans la soirée et la couper le matin, il faut évidement ajouter 2 lignes au fichier /etc/crontab : <cli>root@muffin:~# vi /etc/crontab 22 22 * * * root /mnt/muffin/scripts/lftpdaemon.sh start 07 07 * * * root /mnt/muffin/scripts/lftpdaemon.sh stop </cli>