{{tag>debian serveur téléchargement téléversement ftp synchro}}
== 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 [[http://www.transmissionbt.com/|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.
root@muffin:~# ps aux | grep "lftp" | wc -l
1
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 :
root@muffin:~# lftp
lftp :~> open ftp.totos.fr
lftp :~> user
lftp :~> mirror -v -c --use-pget-n=10 --parallel=2 / /mnt/dossier/local"
lftp :~> exit
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é [[http://www.bouthors.fr/wiki/doku.php?id=linux:synchro_lftp|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 :
open ftp.totos.fr
user
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 :
#!/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'' :
root@muffin:~# vi /etc/crontab
22 22 * * * root /mnt/muffin/scripts/lftpdaemon.sh start
07 07 * * * root /mnt/muffin/scripts/lftpdaemon.sh stop