1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| #!/bin/sh
# Racine du site sur votre PC, à adapter
racine="/var/www/html/Troumad"
# License GPL bien sur ;)
# ce script attend en paramètre un nom de fichier qui peut être
# donné sous forme d'un chemin relatif ou absolu.
# Maniement de Chaîne par
# Christophe Gaubert http://perso.wanadoo.fr/christophe.gaubert
# Une fonction qui affiche le message d'usage et sort.
# j'utilise ce qui s'appelle un Here-document :
# http://abs.traduc.org/abs-3.6-fr/here-docs.html
# comme ce que tu donne à ftp
usage()
{
cat <<EOF
Utilisation :
"ftpsite --help" pour avoir ses informations
"ftpsite fichiers/répertoire [fichiers/répertoire] [fichiers/répertoire]..."
pour transférer les fichiers/répertoires sités
"ftpsite" pour transférer tout le répertoire courant et ses sous répertoires
EOF
exit 0
}
copieftp()
{
# On a repéré le cas où le chemin est /maison_1/bs/sites/Troumad pour donner ./
if [ -f "$1" ] ; then
fichier=$1
l=`echo $[ ${#fichier} - 1]`
if [ "${fichier:$l}" != "~" ] ; then
echo "put $1" >> ~/script/lock.sh
else
rm "$1"
fi
elif [ -r "$1" ] ; then
echo "lcd $1" >> ~/script/lock.sh
if [ "$PWD/$1" != "$racine" ] ; then
#echo "$PWD$1 != $racine"
echo "mkdir $1" >> ~/script/lock.sh
#echo "lcd $1" >> ~/script/lock.sh
echo "cd $1" >> ~/script/lock.sh
fi
cd $1
for fich in * ; do
# éviter le problème du répertoire sans droit de lecture
# autre méthode : for file in `ls 2>/dev/null`; do
[ "$fich" != "*" ] && copieftp "$fich"
done
echo "lcd .." >> ~/script/lock.sh
echo "cd .." >> ~/script/lock.sh
cd ..
fi
}
# on commence par vérifier qu'il a bien reçu un argument et que
# celui-ci correspond à un fichier, sinon on sort.
if [ $# == 0 ] ; then
a=$PWD
cd ..
~/script/ftpsite.sh "$a/"
exit $?
fi
# recherche du paramètre passé
case "$1" in
--help)
usage
;;
*)
a=0
# parcours des paramètres
while [ $# -gt 0 ]; do
# on sépare le nom du fichier de la partie correspondant au
# répertoire :
filename=$(echo `basename $1`)
dirname=$(echo `dirname $1`)
# maintenant :
# - filename est le nom ("strict") du fichier
# - dirname est le répertoire dans lequel se trouve ce fichier, ça
# peut être un chemin relatif (comme "../..) ou un chemin absolu
# (comme /usr/local/src)
# NB : on devrait pouvoir faire cette séparation par simple manipulation
# de la chaine $1, sans faire appel à basename et dirname.
# Optimisation laissée en exercice ;)
# Puis on transforme le chemin éventuellement relatif en chemin absolu
# en faisant appel à pwd :
old_pwd=$(pwd) # au cas où on voudrait y revenir
cd "$dirname"
dirname=$(pwd)
# maintenant : dirname est le chemin absolu du répertoire qui contient
# le fameux fichier
# et il ne reste plus qu'à l'analyser :
# - soit il commence par /maison_1/bs/sites/Troumad
# => on supprime /maison_1/bs/sites/Troumad pour ne garder que la suite
# du chemin
# - soit il ne commence pas par /maison_1/bs/sites/Troumad
# => on sort
# traiter le premier argument
case "$dirname/$filename" in
$racine*)
# répertoire à modifier selon votre configuration ligne du dessus et du dessous
chemin=${dirname#$racine}
if [ -z "$chemin" ] ; then
chemin="./"
else
chemin=${chemin#/}
fi
;;
*)
echo "error : répertoire non valide"; exit 1
;;
esac
if [ -e "~/script/lock.sh" ] ; then
echo "erreur dans la création de ~/script/lock.sh"
exit 1
fi
# unftp contient le début du fichier de commande pour le ftp,
cp ~/script/unftp.sh ~/script/lock.sh
# nous allons construire la suite dans lock.sh
chmod +x ~/script/lock.sh
echo "cd $chemin" >> ~/script/lock.sh
copieftp "$filename"
[ $? = 1 ] && exit 1
cd "$dirname"
echo "bye" >> ~/script/lock.sh
echo "**" >> ~/script/lock.sh # nouvelle ligne à cause de l'erreur !
for fich in ~/script/site/* ; do
# appel de lock.sh une fois par ftp trouvé dans le répertoire site
~/script/lock.sh $fich
done
#less ~/script/lock.sh
rm -f ~/script/lock.sh
cd "$old_pwd"
shift # décale les arguments d'un cran :
# $1 <- $2, $2 <- $3 ...
done
exit $a
;;
esac |