Script de surveillance de répertoire + copie vers un FTP

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
J'ai écris un petit script (basé sur inotify) qui surveille un répertoire.
Si un nouveau fichier est écrit dans le répertoire le script monte un ftp avec curlftpfs puis copie le fichier sur le ftp.
#!/bin/bash
monitor_dir="/repertoire"
cd $monitor_dir
inotifywait -q -r -m -e close_write,moved_to . --format "%w %f" |
while read DIR FILE; do
curlftpfs utilisateur:motdepasse@serveur /repertoire/de/montage
if grep -qs '/repertoire/de/montage' /proc/mounts; then
cp $FILE /repertoire/de/montage/$FILE
else
echo "Problème de montage du ftp"
exit 0
fi
umount -l /repertoire/de/montage
files="$newfiles"
done


Je pense que ça roule, sauf si pour une raison ou une autre le ftp n'est pas monté...
else
echo "Problème de montage du ftp"
exit 0
fi


Est-ce que je peux remplacer le exit 0 par un done pour que la boucle ne soit pas cassée et que le script continue de tourner (ou est-ce qu'il vaut mieux un break) ?
Merci.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour lol

J'ai trouvé dommage de mounter/dé-mounter un système de fichiers pour chaque fichier à copier,
alors, j'ai utilisé curl juste pour uploader chaque fichier, en créant, si besoin, son chemin sur le serveur.

j'ai laissé dans la variable ftpNomSrv l'adresse du lien vers ftpperso.free.fr, juste histoire de retrouver la syntaxe,
(c'est d'ailleurs sur ce serveur que j'ai fait mes tests qui ont bien fonctionné).

J'ai aussi (pour une fois…) fait attention à utiliser les options longues,
car je les trouve plus parlantes quand on essaye de relire le script.

Code : Tout sélectionner

#!/bin/bash

# Début Variables #####

monitor_dir="/repertoire"

ftpUser="nomUserFtp"
ftpPass="motDePasseFpt"
ftpNomSrv="ftpperso.free.fr"

ftpOpts="--ftp-create-dirs"

inotifyOpts="--format %w%f --monitor --recursive --quiet"
inotifyEvts="close_write,moved_to"

# couleurs affichage
noirFondRouge="\033[7;31m"
noirFondBleu="\033[7;36m"
defaut="\033[0m"

# Fin Variables #####

cd "${monitor_dir}" 2>/dev/null || { printf "${noirFondBleu}%s${defaut}\n" "$0 : Le répertoire \"${monitor_dir}\" n'est pas accessible." >&2; exit 1; }

inotifywait ${inotifyOpts} --event ${inotifyEvts} . | \
while read nomFich; do 
    curl ${ftpOpts} --user "${ftpUser}:${ftpPass}" --upload-file "${nomFich}" ftp://"${ftpSrv}:${nomFich}" 2>/dev/null || \
    printf "${noirFondRouge}%s${defaut}\n" "$0 : \"${nomFich}\" n'a pas pu être uploadé vers \"${ftpNomSrv}\"" >&2
done
cd "${OLDPWD}"   # retour à l'ancien répertoire courant
On pourrait même donner en paramètre à ce script le nom du répertoire à surveiller
du coup, la variable monitor_dir pourrait être simplement $1

J'ai mis de la couleur dans les messages d'erreur, ce n'est peut-être pas très pro…mais ça peut s'enlever facilement si besoin.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut MicP,

Merci beaucoup pour les pistes.

J'ai déjà essayé avec ftp, lftp et curl... Et j'ai rencontré pas mal de problèmes, notamment la création de fichiers vides sur le serveur ftp et la commande d'envoi qui ne s'arrêtait jamais.
C'est pourquoi j'ai opté pour le montage (même si je sais que c'est un peu "lourd") qui fonctionne très bien.

Je vais quand même refaire des essais, au moins tu n'aura pas bossé dessus pour rien! :icon_wink:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour lol
…pas mal de problèmes, notamment la création de fichiers vides sur le serveur ftp …
S'il faut rajouter un test pour exclure les fichiers vides avant de les upoloader c'est pas difficile à faire.

J'ai testé mon script sur ftpperso avec différentes tailles de fichiers et différents sous-répertoires.
mais bien sûr, tout dépends aussi du serveur vers lequel ces fichiers seront uploadés

Si tu veux me transmettre (par MP ou autre) l'adresse du serveur avec un compte et son mot de passe, je pourrais faire des tests plus réalistes.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

MicP a écrit : 07 févr. 2017, 16:42 Bonjour lol
…pas mal de problèmes, notamment la création de fichiers vides sur le serveur ftp …
S'il faut rajouter un test pour exclure les fichiers vides avant de les upoloader c'est pas difficile à faire.
Non, ce sont les fichiers crées sur le ftp qui sont vides, pas les fichiers d'origine. Mais j'ai du m'y prendre comme un manche (en fait, comme je l'explique dans d'autres fils, l'Internet à Madagascar est depuis 15 jours plus que chaotique, c'est peut-être la raison.).
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Ahhh! les coupures de courant suivies du fait que le chateau d'eau se vide => plus d'eau + le câble sous marin qui reste coupé pendant des mois => plus de téléphone, j'ai connu ça en Afrique de l'Ouest,
en plus, j'étais en brousse…
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

MicP a écrit : 07 févr. 2017, 16:51 Ahhh! les coupures de courant suivies du fait que le chateau d'eau se vide => plus d'eau + le câble sous marin qui reste coupé pendant des mois => plus de téléphone, j'ai connu ça en Afrique de l'Ouest,
en plus, j'étais en brousse…
Oui, Electricité, Eau et Internet (et je parle même pas de la circulation...).
Dans la capitale et pour un pays qui n'est pas en guerre, c'est la médaille d'or! :003:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Ce que j'en ai vu (quelques reportages en tout genres) me rappelle certains quartiers d'Abidjan, Libreville et Ougadougou, mais apparemment, ce que j'ai vu en Afrique de l'ouest n'est rien du tout comparé à tana,

=======
J'espère que ce script va pouvoir fonctionner vers le serveur que tu utilise…
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

MicP a écrit : 07 févr. 2017, 19:03 Ce que j'en ai vu (quelques reportages en tout genres) me rappelle certains quartiers d'Abidjan, Libreville et Ougadougou, mais apparemment, ce que j'ai vu en Afrique de l'ouest n'est rien du tout comparé à tana,
Tana est incomparablement moins développée que les grandes capitales de l'Afrique. Aucun grands travaux sérieux depuis presque 50 ans, aucun plan d'urbanisme... La ville étouffe.
On est passé d'une population de 300.000 à 3.000.000 sans aucun plan de développement. Électricité, eau, circulation, ordures, égouts... Il n'y a pas le "tout à l'égout" d'ailleurs, même au centre ville... :017:
MicP a écrit : =======
J'espère que ce script va pouvoir fonctionner vers le serveur que tu utilise…
Pas encore eu le temps de tester. Mais Interent est revenu, je vais tester.
Merci.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Je viens juste de le modifier légèrement pour le rendre plus lisible
en mettant les séquences d'échappement ANSI dans des variables
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Rahhhh!!! j'avais mal spécifié le nom de la variable du serveur et de la variable ftpOpts dans la commande

Je viens de corriger ça.

Désolé
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
T'inquiète! Je te remercie beaucoup pour ton beau code.
Promis, dés que j'ai un moment je teste ça (je suis sur que ça fonctionne parfaitement évidemment...).
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Watael m'a beaucoup appris ces derniers temps en intervenant (en quelque lignes d'une efficacité pédagogique remarquable) au sujet d'un de mes scripts, alors j'essaie de tenir compte et d'appliquer ses conseils en espérant assimiler tout ça.
Il ya encore pas mal de choses à revoir sur ce script, et petit à petit, j'espère bien en faire quelque chose de plus propre, notamment pour ce changement de répertoire que je compte éviter, et sur la possibilité d'en faire un script qui accepterait en paramètre le répertoire à surveiller et au moins le mot de passe pour l'accès au serveur.
J'ai résolu le problème de changement de répertoire, mais il me faut encore faire des tests pour vérifier que tout ça fonctionne correctement.
Je posterais bientôt la deuxième version de ce script.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Celui-là est vachement plus mieux meilleur que le premier car il n'a pas besoin de changer de répertoire.

En paramètre du script, on donne le chemin du répertoire à "monitorer",

Code : Tout sélectionner

#!/bin/bash

# Donnez en paramètre un nom de répertoire dont l'arborescence sera "surveillée"
# Les fichiers créés ou/et modifiées dans l'arborescence du répertoire à surveiller 
#  seront copiés par FTP (avec leur chemin relatif) dans l'arborescence du système de fichiers cible.

# Début Variables #####
ftpUser="ftpLogin"
ftpPass="ftpPassword"
ftpSrvName="ftpperso.free.fr"
ftpOpts="--ftp-create-dirs"

inotifyEvts="close_write,moved_to"    # attrib close-write close-nowrite create delete delete-self modify move_self move_from move_to open
inotifyOpts="--format %w%f --monitor --recursive --quiet"

# couleurs affichage
blackOnGreen="\033[7;32m"
blackOnRed="\033[7;31m"
defaultText="\033[0m"

# Fin Variables #####

test  $# -eq  0 && { printf "\n\t${blackOnGreen}%s${defaultText}\n\n" "${0} : Donnez en paramètre un nom de répertoire." >&2; exit 0; }
test  -d "${1}" || { printf "\n\t${blackOnRed}%s${defaultText}\n\n"   "${0} : \"${1}\" n'est pas un nom de répertoire."  >&2; exit 1; }

monitor_dir="${1}"

inotifywait ${inotifyOpts} --event ${inotifyEvts} ${monitor_dir} | \
while read fileName; do 
    nameForSrv="${fileName#${monitor_dir}}"; nameForSrv="./${nameForSrv#/}";
    curl ${ftpOpts} --user "${ftpUser}:${ftpPass}" --upload-file "${fileName}" ftp://"${ftpSrvName}:${nameForSrv}" 2>/dev/null || \
    printf "${blackOnRed}%s${defaultText}\n" "$0 : \"${nameForSrv}\" n'a pas pu être créé sur \"${ftpSrvName}\"" >&2
done;
=======
Les variables de connexion FTP pourraient être extraites des variables d'environnement
ou/et données en paramètres sur la ligne de commande.

Histoire de ne pas faire de doublons, le script pourrait aussi créer un répertoire cible sur le serveur par exemple avec la variable $HOSTNAME de la machine source

On pourrait aussi prévoir un fichier log pour y enregistrer les échecs et réussites avec date/heure, source, cible, UID de l'utilisateur qui a lancé la commande, etc.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,

C'est vraiment gentil et ça me gêne que tu passes autant de temps dessus.

D'autant que... je n'arrive pas à le faire fonctionner.
J'ai bien une erreur si le répertoire n'existe pas (tout comme le ftp), mais il n'arrive pas à envoyer les fichiers sur mon ftp (j'ai activé le mode "insecure" au cas ou).

Mon script est en prod depuis 10 jours et fonctionne. J'ai juste le problème (qui n'est pas apparu) de sortie du script en cas de non montage du répertoire: break ou done à la place de exit 0 ?

Merci.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Je le fais pour le plaisir d'apprendre à le faire en plus du plaisir de partager.

Ne te casse pas la tête à essayer à tout prix de vouloir faire fonctionner le mien,
ce qui compte c'est que tu arrives à envoyer tes fichiers sur ton serveur,
alors que ce soit avec le mien ou le tien, ça n'a pas d'importance.

Avec ce qui suit, il tentera de mounter le système de fichiers ftp jusqu'à ce que ce système de fichiers apparaisse dans /proc/mounts
et à chaque fois que la commande de curlftps échouera dans sa tentative, le script enverra le message "Problème de montage du ftp" et attendra 2 secondes avant de relancer curlftp

Par contre, je n'ai pas compris d'où provenait la variable $newfiles ni l'utilité de la variable files alors je les ai laissées où elles étaient.
EDIT : Suppression de la ligne contenant files="$newfiles"

Code : Tout sélectionner

#!/bin/bash

monitor_dir="/repertoire"

cd $monitor_dir

inotifywait -q -r -m -e close_write,moved_to . --format "%w %f" |
while read DIR FILE; do
	until grep -qs '/repertoire/de/montage' /proc/mounts; do
		curlftpfs utilisateur:motdepasse@serveur /repertoire/de/montage || { echo "Problème de montage du ftp" >&2; sleep 2; }
	done
	cp $FILE /repertoire/de/montage/$FILE
	umount -l /repertoire/de/montage
done
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

C''est cool, merci.
Je testerais ça demain. :006:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Re,
Cool, c'est sympa cette boucle au montage du répertoire.
Il faut que je teste si inotofy garde en mémoire les fichiers au cas ou il y ait un problème de montage et que plus d'un fichier est déposé dans le répertoire surveillé.

Tu as une petite erreur ligne 10: 2>&1;

Ps: Effectivement le files="$newfiles" provient d'un ancien script.

Merci! :006:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonsoir
…Tu as une petite erreur ligne 10: 2>&1;…
en fait, avec

Code : Tout sélectionner

printf "${blackOnRed}%s${defaultText}\n" "$0 : \"${nameForSrv}\" n'a pas pu être créé sur \"${ftpSrvName}\"" >&2
Je souhaitais que les messages d'erreur soient retournés par le flux destiné aux erreurs (stderr)

alors que 2>&1; aurait retourné les messages d'erreur stderr vers stdout.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4974
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Oui, mais j'ai une erreur de syntaxe avec >2&;

Code : Tout sélectionner

bin/test_ftp.sh: ligne 10: erreur de syntaxe près du symbole inattendu « ; »
bin/test_ftp.sh: ligne 10: `		curlftpfs utilisateur:motdepasse@serveur /repertoire/de/montage || { echo "Problème de montage du ftp" >2&; sleep 2 }'
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Répondre