Script bash et rsnapshot

Tout d’abord désolé pour ce post qui est un peu complexe…
Je ne sais pas où je dois mettre ce topic qui est à cheval entre programmation et support debian… Merci à un admin de le changer si ça ne va pas.

Je souhaite réaliser des sauvegardes de différentes machine sur un serveur ssh avec rsnapshot.

D’abord je tombe sur ceci dans le howto français de rsnapshot :

la source :
http://rsnapshot.org/howto/1.1/rsnapshot-HOWTO.fr.html#link_dest

Ce n’est pas sans faire peur alors je veux réaliser un script vérifiant la présence de la machine à sauvegarder sur le réseau local avant de lancer rsnapshot, ainsi que deux ou trois autres commandes. Voici le début de mon script :

[code]#!/bin/bash

personnaliser rsnapshot.conf

créer les script hourly, dayly, weekly, mounthly (seule la commande rsnapshot lancée diffère)

editer la crontab pour lancer script rsnapshot hourly

script rsnapshot dayly

script rsnapshot weekly

script rsnapshot mounthly

Contenu du script :

Tester rsnapshot.conf si ok > suite sinon > message d’erreur

Vérifier la présence de la machine à sauvegarder

Ouvrir le périphérique luks contenant la sauvegarde si erreur > message d’erreur

Monter le périphérique chiffré ouvert

Lister les sauvegardes présentes avant la nouvelle sauvegarde

Lancer la sauvegarde hourly ou dayly ou weekly ou mounthly suivant le script si erreur > message d’erreur

Lister les sauvegardes présentes après la sauvegarde

Démontage du périphérique chiffré

Fermeture du périphérique luks

Tester le fichier conf de rsnapshot

result=rsnapshot configtest
if [ “$result” = “Syntax OK” ]
then
# ouverture du périphérique chiffré
cryptsetup luksOpen /dev/disk/by-uuid/ba9e76b3-2f65-4f7f-aa69-285223dbced6 rsnapshot < /home/rsnapshot/input.txt

# montage périphérique chiffré contenant la sauvegarde
mount -t ext3 /dev/mapper/rsnapshot /mnt/rsnapshot/ 

# vérifier la présence de la machine # ping -c 1 <IP> ? si erreur > message d'erreur
if [ présence de la machine  ]
then
# lister les sauvegardes présentes sur le périphérique
ls -l /.snapshots/ > /.snapshots/snapshot.txt

# lancer la sauvegarde (horaire par exemple)
rsnapshot hourly

# lister les sauvegardes présentes sur le périphérique
ls -l /.snapshots/ > /.snapshots/snapshot.txt

else
echo "La machine à sauvegarder n'est pas connectée"
fi

# démontage du périphérique chiffré
umount /mnt/rsnapshot

# fermeture du volume chiffré
cryptsetup luksClose rsnapshot

else
echo "Le fichier de configuration de rsnapshot contient des erreurs"
fi
[/code]

le premier problème est de savoir si la machine à sauvegarder est connectée, est ce que le test d’un ping est suffisant ? Exemple :

Ensuite je vais devoir créer un script par commande rsnapshot avec chacun comme argument hourly, daily, weekly et mounthly.
Y a t il un moyen de tout centraliser ?

Dernier problème : je vais avoir 3 machine à sauvegarder sur le serveur (sûrement plus à long terme…), or les machine à sauvegarder sont indiquées dans rsnapshot.conf. Si je met les trois machines, il faudra que les trois soient connectées en même temps lors des backup (ce qui ne sera sans doute pas le cas), ou alors est ce que je peux utiliser l’option :

-c path to alternate config file, et créer dans ce cas un fichier conf par machine + les scripts hourly, daily, weekly et mounthly s’y rapportant ?
Dans ce cas ça devient très vite lourd :frowning: ou y a t il une solution plus simple de régler mon problème ?

C’est amusant car moi je traiterais le problème différemment en mettant la commande de backup sur les machines elle même et en utilisant rsync (largement plus souple).

0 5 * * * root rsync -P -av --del --exclude-from=/etc/NOSYNC / serveurbackup:/var/backup/machine > /dev/null

Tu peux éventuellement mettre un cron sur la machine client qui lance un rsnapshot sur la machine de backup.

Sinon

if /bin/ping -c 1 machine > /dev/null 2> /dev/null; then [OK] else [PAS de machine] fi marche effectivement bien

J’utilise déjà un mix de rdiff-backup et du T&A de Ricardo sur rsync pour les sauvegardes de mon portable
http://www.debian-fr.org/script-bash-et-test-de-fichier-t31225.html
Visiblement rsnapshot offre un avantage de fiabilité, de configuration simple (peut être pas dans mon cas :116 ) et de pouvoir passer simplement par ssh.
En effet il serait par contre plus simple qu’il s’exécute sur la machine à sauvegarder et non sur le serveur…
Est ce possible de faire passer par ssh la méthode de ricardo ?

Avec l’option -D de ssh et éventuellement tsocks tu peut faire passer tout et n’importe quoi par ssh.
(et je crois que l’option -C permet de compresser les données transmises)

Autant pour moi fran.b, j’ai lu ton post un peu trop vite tout à l’heure (vraiment trop…), mettre un cron sur la machine client qui exécute rsnapshot avec son fichier de conf personnalisé est une très bonne solution, je vais expérimenter de ce côté là…

@MisterFreez je savais que l’on pouvait créer un “tunnel” ssh entre deux machine pour faire à peu près n’importe quoi mais c’est plus que la mise en oeuvre soit à mon niveau qui m’inquiète dans ce genre d’opérations :mrgreen:

Merci à vous !

Bon alors finalement je comptais procéder de la manière suivante :

  • 1 rsnapshot.conf spécifique à chaque machine à suvegarder sur le serveur
  • 1 script par machine à sauvegarder sur le serveur exécutant ceci :
    - test de rsnapshot.conf
    - ouverture du périphérique luks
    - montage du périphérique chiffré ouvert
    - liste des sauvegardes présentes avant la sauvegarde
    - lancer la sauvegarde rsnapshot au travers de ssh (autentification par clé)
    - lister les sauvegardes présentes
    - démonter le périphérique chiffré
    - fermer le périphérique luks
  • le script est lancé (suivant les conseils de fran.b) par ssh depuis la crontab de la machine client (donc plus de problème de connexion ou non du client)

C’était trop beau :

[quote]En plus des chemins complet vers le système de fichier local, vous pouvez aussi sauvegarder dse systèmes distant en utilisant rsync dans ssh. Si vous avez installé et activé ssh (via le paramètre cmd_ssh), vous pouvez specifier un chemin comme ceci :

backup root@example.com:/etc/ example.com/etc/

Le comportement est fondamentalement le même mais vous devez prends quelques choses en plus en compte.

*

  Le serveur ssh doit tourner sur example.com[/quote] 

source howto de rsnapshot
Le problème est que si sur le réseau local je connais l’ip (locale) de chacune de mes machines seule celle du serveur est configurée en fixe, et j’ai besoins d’indiquer l’ip du client et non celle du serveur ds le rsnapshot.conf, ce qui n’est pas impossible mais peu pratique.
De plus si je veux faire des sauvegardes de mon portable à distance (ce qui est le but) alors ça devient ingérable, même si je connais l’ip publique de mon serveur il me sera impossible de connaitre comment accéder au client :frowning: on m’a conseiller de configurer un VPN mais ça dépasse mon domaine de compétence…
Si vous avez une solution… sinon je modifie mon script avec rdiff backup pour qu’il passe par ssh et je n’ai plus besoins de connaitre les “coordonnées” de ma machine client.

Merci à vous ! :smiley:

Si tu veux mettre rsnapshot sur chaque machine à sauvegarder, tu peux monter le répertoire de sauvegarde du serveur via sshfs (fuse). Du coup ça te permet de tester facilement la connexion :

if sshfs root@serveur:/backups/machine1 /.snapshots ; then
    rsnapshot daily
else
    # le système d'alerte que tu veux (mailx, xmessage, log, alarme sonore,...)
fi

Celà dit, personnellement, si c’est pour configurer une sauvegarde sur chaque machine, j’utiliserais rsync directement. rsnapshot permettant surtout de centraliser la configuration des sauvegardes en un point…

Finalement j’ai repris le script que j’avais fait pour une sauvegarde sur un HDD externe chiffré (moitié rdiffbackup et moitié tuto de ricardo :wink: ) et je l’ai adapté à une utilisation par ssh, la sauvegarde se faisant ds un dossier chiffré sur le serveur (comme ça chaque machine à sauvegarder a sa propre backup chiffrée sur le serveur donc non accessible par quelqu’un d’autre n’ayant pas la passphrase).
Le problème (si s’en est un) est que je dois ouvrir plusieurs sessions ssh dans mon script :

  • une pour associer mon dossier à un périphérique loop, le déchiffrer avec luksOpen, le monter, faire ma liste des backup présentes
  • une pour faire la liste des backup présentes après la dernière et démonté et rechiffrer mon dossier

Voici ce que donne mon script (je n’ai pas encore testé :

[code]#!/bin/bash

ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh mon_user@192.168.1.3:/home

association du fichier à un périphérique boucle :

losetup /dev/loop0 bcpanolis.img

ouverture du périphérique chiffré (saisie manuelle du mot de passe)

cryptsetup luksOpen /dev/loop0 bcpanolis

montage du périphérique chiffré ouvert

mount -t ext3 /dev/mapper/bcpanolis /mnt/bcpanolis

faire une liste des sauvegarde présentes avant la nouvelle sauvegarde et en écrivant les erreurs sur le serveur

rdiff-backup -l /mnt/bcpanolis/backup > /mnt/bcpanolis/oldbackup.txt 2>&1

clore la session ssh

exit

faire une nouvelle sauvegarde, via ssh autentification par clé, sortie avec erreurs ds un nouveau fichier (sur le client)

rdiff-backup --exclude-globbing-filelist /home/rdiff-backup/exclude.txt --exclude-sockets /home/mon_user/ mon_user@192.168.1.3:/mnt/bcpanolis/backup > /home/rdiff-backup/rdiffbackup.txt 2>&1

effacer les sauvegardes vieilles de plus d’un mois, sortie avec erreurs completant le fichier existant

rdiff-backup --remove-older-than 1M --force mon_user@192.168.1.3:/mnt/bcpanolis/backup >> /home/rdiff-backup/rdiffbackup.txt 2>&1

ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh mon_usere@192.168.1.3:/home

faire une liste des sauvegarde présentes après la nouvelle sauvegarde et en écrivant les erreurs

rdiff-backup -l /mnt/bcpanolis/backup > /mnt/bcpanolis/backup.txt 2>&1

vérification de la présence du dossier /media/r-diff/backuproot (pour la sauvegarde système)

    if [ ! -e /mnt/bcpanolis/backuproot ]; then
    mkdir /mnt/bcpanolisf/backuproot
    fi

clore la session ssh

exit

sauvegarde du système :

vérification de la présence du dossier /home/controle/ (sur la machine client)

    if [ ! -e /home/controle ]
    then
    mkdir /home/controle
    fi

    # vérification de la présence du dossier /root/exclure 
    if [ ! -e /root/exclure ]
    then
    echo "Erreur : le fichier /root/exclure n'existe pas, impossible de déterminer les fichiers à exclure de la sauvegarde"
    fi

vidange du contenu du dossier temporaire /home/controle/

rm -r /home/controle/* /home/controle/.*

sauvegarde du système par ssh autentification par clé

rsync -av --del --backup --backup-dir=/home/controle/ --exclude-from=/root/exclure / mon_user@192.168.1.3:/mnt/bcpanolisf/backuproot > /home/rdiff-backup/backuproot.txt 2>&1

ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh mon_user@192.168.1.3:/home

démontage du périphérique chiffré ouvert

umount /mnt/bcpanolis

fermeture du périphérique chiffré

cryptsetup luksClose bcpanolis

détachement de bcpanolis.img du périphérique boucle

losetup -d /dev/loop0

clore la session ssh

exit
[/code]
Je pense que je vais devoir écrire ce script avec mon IP locale ds une première version et avec mon nom de domaine dyndns.org (j’ai une ip dynamique) ds une deuxième : je ne pense pas pouvoir utiliser mon nom de domaine dyndns.org en local…

Je suis preneur de vos avis sur tout ça :smiley:
Merci à vous !