Script de création de sauvegardes d’un site web via FTP
Nous disposons d’un site web et nous souhaitons créer un script Shell qui permettra de créer la sauvegarde locale de tous les fichiers qui se trouve sur le site web. Le script rapatriera tous les fichiers sur la machine locale et compressera ces derniers dans le but d’en faire une archive.
Installation de NcFTP Client
Le script pour fonctionner aura besoin d’utiliser la commande ncftpget, donc avant de commencer à programmer en shell, préalablement il est nécessaire d’installer le paquet ncftp.
Pour savoir si vous disposez ou non de la commande, taper directement ncftpget dans votre terminal. Si, la commande n’est pas présente, alors vous devez procéder à son l’installation.
Sur les systèmes dérivés de la distribution Debian, pour installer le paquet ncftp taper la commande suivante :
1 | aptget install ncftp |
Pour les distributions utilisant les paquets RPM, si vous ne trouvez pas le paquet ncftp dans vos dépots, vous pouvez éventuellement télécharger le paquet sur le site www.rpmfind.net.
Une autre solution plus ardue pour installer ncftp, consiste à aller sur le site www.ncftp.com afin de télécharger les sources du client NcFTP et de les compiler.
Notification à l’écran
Ceci n’est pas obligatoire, le script peut marcher sans, mais vous n’aurez pas les notifications à l’écran, ce qui est fortement dommage. Les notifications permettent de savoir quand ont lieux les sauvegardes, et permettent d’être au courant un éventuel problème d’archivage.
Nous sommes sous Gnome, et nous souhaitons envoyer des notifications à l’utilisateur concernant le processus de sauvegarde.
Pour cela nous avons besoin d’installer libnotify-bin. Sous les distributions issues de Debian, utilisez la commande suivante :
1 | apt-get install libnotify-bin |
Faites un test de notification :
1 | root@debian:~$ notify-send -u low "test" |
Création script
Nous appellerons le script save_auto.sh. Nous créons le fichier avec la commande touch :
1 | admin@debian:~$ touch save_auto.sh |
Ensuite nous rendons le fichier executable avec la commande chmod :
1 | admin@debian:~$ chmod +x save_auto.sh |
Ensuite éditer le fichier avec l’éditeur de texte de votre choix. Copier coller le script ci-dessous. Modifiez dans les variables d’initialisation, l’adresse FTP, mettez la votre. Modifier egalement le login, mot de passe et le répertoire local où sera fabriquée l’archive.
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 | #!/bin/bash # # Script qui telecharge via FTP tous les fichiers d'un site distant # et qui les compresse sous forme d'archive tar.gz. # # Le script crée des archives ayant un nom du type ArchiveN.tar.gz # où N est le jour de la semaine (e.g. 1 pour lundi, 2 pour mardi, etc...) # # Le script verifie si une sauvegarde existe deja pour aujourd'hui. Si # c'est le cas alors, rien n'est fait. # Mettez ici l'adresse de votre site web. adresseFTP="commandeslinux.fr" # Mettez ici le pseudo de connexion au site FTP. LoginFTP="LOGIN" # Mot de passe de connexion FTP. passFTP="PASSWORD" # Mettez ici le chemin complet du répertoire local dans # lequel l'archive sera enregistrée. Ce dernier # sera créé automatiquement si il n'existe pas. repertoireLocal="/home/admin/sauvegardeFTP" # Nom de l'archive. # On inclus le resultat de la commande 'date +%u' # cette derniere retourne le jour de la semaine. ArchiveName=Archive$(date +%u).tar.gz # Verification du repertoire local. # Creation si ce dernier n'existe pas. if [ ! -d $repertoireLocal ]; then mkdir $repertoireLocal; fi # # Verification si une archive possedant une date # de modification inferieur ou egale au dernieres # 24h est déja presente. # # Cherche dans le repertoire local, si un archive portant # le meme nom a une date de modification inferieur ou egale # a 24H ou si le repertoire tmp avec une date inferieur # a 24H (cela peut signifier que le script est en marche) # alors on sort du script. for i in $(find ${repertoireLocal} -name $ArchiveName -mtime 0) do # Sortir du script exit 0; done # verifie si une sauvegarde est deja en cours. # arrete le script si c'est le cas. for i in $(ps -edf|grep ${0}|sed -e "/grep/d" -e "/$$/d" -e "/$PPID/d") do #Une sauvegarde est en cours. notify-send -u low "Sauvegarde en cours..." exit 0; done # Creation du repertoire tmp, si ce dernier n'existe pas. if [ ! -d ${repertoireLocal}/tmp ]; then mkdir ${repertoireLocal}/tmp; else # Efface le repertoire /tmp si ce dernier est deja present. rm -rf ${repertoireLocal}/tmp; # creation d'un repertoire /tmp vide. mkdir ${repertoireLocal}/tmp; fi # Recuperation des fichiers avec ncftpget. # # Options utilisées : # # -R signifie lecture recursive des repertoires sur l'hote distant. # '*' signifie que nous sauvegardons tous les fichiers distants. ncftpget -u $LoginFTP -p $passFTP -RT $adresseFTP ${repertoireLocal}/tmp '*' #ncftpget -u $LoginFTP -p $passFTP -RT $adresseFTP ${repertoireLocal}/tmp '*css' RETVAL=$?; # Verification du code de retour de la commande ncftpget # SI (le code retour) est egale à 1 alors on stop le script, on sort # en erreur. if [ "$RETVAL" -ne "0" ] then echo "Erreur: retournée par ncftpget"; notify-send -u low "Erreur: retournée par ncftpget"; exit 1; fi # # Compression des fichiers dans archive # on va dans le repertoire où se trouve # les fichier telechargés. On excute tar # avec l'option --remove-files qui lui # indique de supprimer les fichiers après # en avoir fait une archive. # autres options : # -c signie fabriquer une archive # -z archive comrpessee du type .gz # -v signifie mode verbeux # -f signifie nom de l'archive # Si l'archive ArchiveName existe deja # cette derniere sera automatiquement ecrasée. cd ${repertoireLocal}/tmp tar --remove-files -czvf ../${ArchiveName}.tmp * RETVAL=$?; # # Verification du code de retour de la commande tar # SI (le code retour) est egale à 1 alors on stop le script, on sort # en erreur. # if [ "$RETVAL" -ne "0" ] then echo "Erreur: retournée par la commande tar"; notify-send -u low "Erreur: retournée par la commande tar"; exit 1; else mv --force ../${ArchiveName}.tmp ../${ArchiveName} notify-send -u low "Sauvegarde terminée" fi # # On efface le repertoire tmp # rm -rf ${repertoireLocal}/tmp |
Tester le script
Maintenant que vous avez copié ce script vous pouvez le lancer manuellement pour le tester de la manière suivante :
1 | ./save_auto.sh |
Récupération Xauthority depuis crontab
Pour pouvoir afficher les messages (notify-send) depuis un script lancé depuis crontab, il est nécessaire de fabriquer un script supplémentaire qu’on appelera make_dbus.sh.
C’est grâce à ce dernier qu’on pourra avoir les messages d’informatrions qui s’afficheront sur l’ecran (notify-send).
Voici les sources du script make-dbus.sh, vous n’avez pas besoin de modifier le modifier. Copiez le simplement:
1 2 3 4 5 6 7 | #!/bin/bash touch $HOME/.Xdbus chmod 600 $HOME/.Xdbus env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.Xdbus echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.Xdbus env | grep XAUTHORITY >> $HOME/.Xdbus echo 'export XAUTHORITY' >> $HOME/.Xdbus |
Ajouter le au démarrage de la session de l’utilisateur via le menu Gnome suivant Système -> préférences -> Applications au démarrage. Ce script se lancera au démarrage, et créera un fichier .Xdbus, ce dernier contiendra les variables d’environnements XAUTHORITY et DBUS_SESSION_BUS_ADRESS à jour. On pourra alors les récupérer facilement depuis crontab. Afin de créer une première fois le fichier .Xdbus, lancer le script que vous venez de copier :
1 | sh make_dbus.sh |
Édition du fichier crontab
Éditez le fichier crontab via la commande :
1 | crontab -e |
Ajoutez-y la ligne suivante (n’oubliez pas de modifier « nom_utilisateur » par votre nom d’utilisateur Linux) :
1 | 40 * * * * . /home/nom_utilisateur/.Xdbus; /home/nom_utilisateur/save_auto.sh |
Voila c’est fini !
Informations sur le fonctionnement du script
Le script se lancera toutes les 40 minutes, le téléchargement via FTP et la compression sous forme d’archive ne se fera que si aucune archive récente n’est présente. Une archive sera considérée récente si elle a moins de 24h. Vous n’aurez pas besoin de supprimer les anciennes archives. Le script écrasera automatiquement les anciennes archives existantes.
Une rotation sur 7 fichiers est faite.
Il peut existé au maximum jusqu’à 7 archives ayant chacune un suffixe différent correspondant au jour de la semaine.
Les archives ressembleront à cela :
archive-1.tar.gz pour lundi
archive-2.tar.gz pour mardi
archive-3.tar.gz pour mercredi