Outils personnels

Rdiff-backup : Différence entre versions

De wikiGite

(→‎rdbackup2.3.sh : lancé du serveur A SAUVEGARDER vers un répertoire local (ou un montage NFS/SMB local))
Ligne 71 : Ligne 71 :
 
-----------------
 
-----------------
  
−
== Exemple de script rdbackup.sh ==
+
== script rdbackup.sh ==
−
'''<span style="color:red">TODO</span> : fusionner les scripts v2.1 et v2.2 avec un choix du sens de sauvegarde'''
+
=== rdbackup.sh v2.3 ===
−
=== rdbackup.sh v2.1 : Lancé du serveur de backup ===
+
#!/bin/bash
−
Note : attention, il n'y a pas de dump MySQL. Voir dans la v2.2
+
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
−
#!/bin/bash
+
# FSo 06/2010
−
# Backup Script (RDIFF-BACKUP on SSH)
+
# V 2.2
−
# FSo 06/2010
+
# from sbackup.sh (RSYNC)
−
# V 2.1
+
# Changelog :
−
# from sbackup.sh (RSYNC)
+
# 2.2 - Reverse backup from client to backup server
−
# Changelog :
+
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
−
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
+
# 2.0 - Moving variables in a .conf file  
−
# 2.0 - Moving variables in a .conf file
+
# 2.3 - Added backup sens (local to local or local to remote)
−
 
−
# Fix variables
 
−
LOG_FILE=rdiff.log
 
−
STAT_FILE=rdiff.stats
 
−
PID_FILE=rdiff.pid
 
−
 
−
if [ $# -gt 0 ]
 
−
then
 
−
# let use the given full path .conf file
 
−
    . $1
 
−
else
 
−
# default .conf file must be placed in the same directory than .sh
 
−
    . $(dirname $0)/rdbackup.conf
 
−
fi
 
−
 
−
while read line
 
−
do
 
−
    REMOTE_DIR="$REMOTE_DIR $line"
 
−
    shift
 
−
done < $LIST
 
−
 
−
if [ ! -e $BCK_DIR/$PID_FILE ]
 
−
then
 
−
  # Script pre-backup
 
−
    if [ -f $PRESCRIPT ]
 
−
    then
 
−
      $PRESCRIPT
 
−
      if [ $? -ne 0 ]
 
−
      then
 
−
          exit 1
 
−
      fi
 
−
    fi
 
−
 
−
    if [ ! -d ${BCK_DIR} ]
 
−
    then
 
−
      mkdir -p ${BCK_DIR}
 
−
    fi
 
−
 
−
    echo $$ > $BCK_DIR/$PID_FILE
 
−
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
 
−
    if [ -e  $BCK_DIR/$LOG_FILE ]
 
−
    then
 
−
        mv $BCK_DIR/$LOG_FILE $BCK_DIR/$LOG_FILE.0
 
−
    fi
 
−
    if [ -e  $BCK_DIR/$STAT_FILE ]
 
−
    then
 
−
        mv $BCK_DIR/$STAT_FILE $BCK_DIR/$STAT_FILE.0
 
−
    fi
 
−
    echo "Sauvegarde rdiff $SERVERNAME" > $BCK_DIR/$LOG_FILE
 
−
    #Boucle de backup
 
−
    ERROR_FLAG=0
 
−
    ERROR=0
 
−
    ERRORS="ERREURS: "
 
−
    for rdir in $(echo $REMOTE_DIR)
 
−
    do
 
−
      if [ ! -d ${BCK_DIR}${rdir} ]
 
−
      then
 
−
          mkdir -p ${BCK_DIR}${rdir}
 
−
      fi
 
−
 
−
      if [ ! "x$EXCLUDE" == "x" ]
 
−
      then
 
−
          EXCLUDE_OPT=""
 
−
          while read line
 
−
          do
 
−
            if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
 
−
            then
 
−
                EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
 
−
            fi
 
−
            shift
 
−
          done < $EXCLUDE
 
−
      fi
 
−
      # rdiff
 
−
      date >> $BCK_DIR/$LOG_FILE
 
−
      echo >> $BCK_DIR/$LOG_FILE
 
−
      echo RDIFF-BACKUP OF $rdir >> $BCK_DIR/$LOG_FILE
 
−
      echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE
 
−
      rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
      ERROR=$?
 
−
      if [ $ERROR -ne 0 ]
 
−
      then
 
−
          ERRORS="$ERRORS $BASE=$ERROR:"
 
−
          ERROR_FLAG=1
 
−
      else
 
−
          echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
 
−
          echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
          rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
          ERROR=$?
 
−
          if [ $ERROR -ne 0 ]
 
−
          then
 
−
            ERRORS="$ERRORS $BASE=$ERROR:"
 
−
            ERROR_FLAG=1
 
−
          fi
 
−
      fi
 
−
      echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE
 
−
      cat ${BCK_DIR}${rdir}/rdiff-backup-data/session_statistics.$(date "+%Y-%m-%d")* >> $BCK_DIR/$STAT_FILE
 
−
      echo >> $BCK_DIR/$STAT_FILE
 
−
    done
 
−
    if [ $ERROR_FLAG -eq 1 ]
 
−
    then
 
−
      (echo $ERRORS
 
−
        date
 
−
        echo Voir $BCK_DIR/$LOG_FILE
 
−
        grep -i warning $BCK_DIR/$LOG_FILE
 
−
        grep -i error $BCK_DIR/$LOG_FILE
 
−
        cat $BCK_DIR/$STAT_FILE
 
−
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
 
−
    else
 
−
      (date
 
−
        ls -l $BCK_DIR/$LOG_FILE
 
−
        df -k $BCK_DIR
 
−
        cat $BCK_DIR/$STAT_FILE
 
−
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
 
−
    fi
 
−
    date >> $BCK_DIR/$LOG_FILE
 
−
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
−
    rm -f $BCK_DIR/$PID_FILE
 
−
else
 
−
    (echo "$HOSTNAME:$BCK_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
 
−
fi
 
  
−
-------------
+
# Fix variables
−
==== Fichier rdbackup.conf v2.1 ====
+
LOG_FILE=rdiff.log
−
# Configuration rdbackup
+
STAT_FILE=rdiff.stats
−
SERVERNAME=server.example.net
+
PID_FILE=rdiff.pid
−
SERVERIP=192.168.1.10
+
 
−
SERVERPORT=22
+
if [ $# -gt 0 ]
−
SERVERUSR=root
+
then
−
MAIL_ADMIN='''<Mail Admin>'''
+
# let use the given full path .conf file
−
RETENTION="--remove-older-than 1W"
+
  . $1
−
LIST=/opt/systools/backup/server.list
+
else
−
EXCLUDE=/opt/systools/backup/server.excl
+
# Application specific
−
PRESCRIPT=
+
  . $APPLICATION_DIR/rdbackup.conf
−
# ou : PRESCRIPT=./server_pre_backup.sh
+
fi
−
BCK_DIR=/home/backup/$SERVERNAME
+
 
−
RDIFF_OPTS="-v5 --force"
+
while read line
 +
do
 +
  REMOTE_DIR="$REMOTE_DIR $line"
 +
  shift
 +
done < $LIST
  
−
=== rdbackup2.2.sh : lancé '''du serveur A SAUVEGARDER''' vers le serveur de backup ===
+
if [ ! -e $APPLICATION_DIR/$PID_FILE ]
−
Comme on est sur le serveur de prod, le script inclut aussi un dump MySQL avant de lancer rdiff-backup<br>
+
then
−
Le dump peut-être désactivé s'il n'est pas utile.
+
# Script pre-backup
−
#!/bin/bash
+
  if [ -f $PRESCRIPT ]
−
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
+
  then
−
# FSo 06/2010
+
      $PRESCRIPT
−
# V 2.2
+
      if [ $? -ne 0 ]
−
# from sbackup.sh (RSYNC)
+
      then
−
# Changelog :
+
        exit 1
−
# 2.2 - Reverse backup from client to backup server
+
      fi
−
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
+
  fi
−
# 2.0 - Moving variables in a .conf file
+
  if [ $MYSQLDUMP -eq 1 ]
−
+
  then
−
# Fix variables
+
      mysqldump $MYDB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump.sql
−
LOG_FILE=rdiff.log
+
  fi
−
STAT_FILE=rdiff.stats
+
  echo $$ > $APPLICATION_DIR/$PID_FILE
−
PID_FILE=rdiff.pid
+
  /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
−
+
  if [ -e  $APPLICATION_DIR/$LOG_FILE ]
−
if [ $# -gt 0 ]
+
  then
−
then
+
        mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
−
# let use the given full path .conf file
+
  fi
−
    . $1
+
  if [ -e  $APPLICATION_DIR/$STAT_FILE ]
−
else
+
  then
−
# Application specific
+
        mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
−
    . $APPLICATION_DIR/rdbackup.conf
+
  fi
−
fi
+
  echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
−
+
  #Boucle de backup
−
while read line
+
  ERROR_FLAG=0
−
do
+
  ERROR=0
−
    REMOTE_DIR="$REMOTE_DIR $line"
+
  ERRORS="ERREURS: "
−
    shift
+
  for rdir in $(echo $REMOTE_DIR)
−
done < $LIST
+
  do
−
+
      if [ ! "x$EXCLUDE" == "x" ]
−
if [ ! -e $APPLICATION_DIR/$PID_FILE ]
+
      then
−
then
+
        EXCLUDE_OPT=""
−
  # Script pre-backup
+
        while read line
−
    if [ -f $PRESCRIPT ]
+
        do
−
    then
+
            if  [[ $line =~ ^$rdir ]]
−
      $PRESCRIPT
+
            then
−
      if [ $? -ne 0 ]
+
              EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
−
      then
+
            fi
−
          exit 1
+
            shift
−
      fi
+
        done < $EXCLUDE
−
    fi
+
      fi
−
    if [ $MYSQLDUMP -eq 1 ]
+
      # rdiff
−
    then
+
      date >> $APPLICATION_DIR/$LOG_FILE
−
      mysqldump $MYDB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump.sql
+
      echo >> $APPLICATION_DIR/$LOG_FILE
−
    fi
+
      echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
−
    echo $$ > $APPLICATION_DIR/$PID_FILE
+
      if [ $LOCAL -eq 1 ]
−
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
+
      then
−
    if [ -e  $APPLICATION_DIR/$LOG_FILE ]
+
        echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
−
    then
+
        rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
−
        mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
+
      else
−
    fi
+
        echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
−
    if [ -e  $APPLICATION_DIR/$STAT_FILE ]
+
        rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
−
    then
+
      fi
−
        mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
+
      ERROR=$?
−
    fi
+
      if [ $ERROR -ne 0 ]
−
    echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
+
      then
−
    #Boucle de backup
+
        ERRORS="$ERRORS $BASE=$ERROR:"
−
    ERROR_FLAG=0
+
        ERROR_FLAG=1
−
    ERROR=0
+
      else
−
    ERRORS="ERREURS: "
+
        echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
−
    for rdir in $(echo $REMOTE_DIR)
+
        if [ $LOCAL -eq 1 ]
−
    do
+
            echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
−
      if [ ! "x$EXCLUDE" == "x" ]
+
            rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
−
      then
+
        else
−
          EXCLUDE_OPT=""
+
            echo rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
−
          while read line
+
            rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
−
          do
+
        fi
−
            if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
+
        ERROR=$?
−
            then
+
        if [ $ERROR -ne 0 ]
−
                EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
+
        then
−
            fi
+
            ERRORS="$ERRORS $BASE=$ERROR:"
−
            shift
+
            ERROR_FLAG=1
−
          done < $EXCLUDE
+
        fi
−
      fi
+
      fi
−
      # rdiff
+
  done
−
      date >> $APPLICATION_DIR/$LOG_FILE
+
  if [ $ERROR_FLAG -eq 1 ]
−
      echo >> $APPLICATION_DIR/$LOG_FILE
+
  then
−
      echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
+
      (echo $ERRORS
−
      echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
+
      date
−
      rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
+
      echo Voir $APPLICATION_DIR/$LOG_FILE
−
      ERROR=$?
+
      grep -i warning $APPLICATION_DIR/$LOG_FILE
−
      if [ $ERROR -ne 0 ]
+
      grep -i error $APPLICATION_DIR/$LOG_FILE
−
      then
+
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
−
          ERRORS="$ERRORS $BASE=$ERROR:"
+
  else
−
          ERROR_FLAG=1
+
      (date
−
      else
+
      ls -l $APPLICATION_DIR/$LOG_FILE
−
          echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
+
      df -k $APPLICATION_DIR
−
          echo rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
+
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
−
          rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
+
  fi
−
          ERROR=$?
+
  date >> $APPLICATION_DIR/$LOG_FILE
−
          if [ $ERROR -ne 0 ]
+
  /usr/bin/logger "FIN rdiff $SERVERNAME"
−
          then
+
  rm -f $APPLICATION_DIR/$PID_FILE
−
            ERRORS="$ERRORS $BASE=$ERROR:"
+
else
−
            ERROR_FLAG=1
+
    (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
−
          fi
+
fi
−
      fi
 
−
    done
 
−
    if [ $ERROR_FLAG -eq 1 ]
 
−
    then
 
−
      (echo $ERRORS
 
−
        date
 
−
        echo Voir $APPLICATION_DIR/$LOG_FILE
 
−
        grep -i warning $APPLICATION_DIR/$LOG_FILE
 
−
        grep -i error $APPLICATION_DIR/$LOG_FILE
 
−
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
 
−
    else
 
−
      (date
 
−
        ls -l $APPLICATION_DIR/$LOG_FILE
 
−
        df -k $APPLICATION_DIR
 
−
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
 
−
    fi
 
−
    date >> $APPLICATION_DIR/$LOG_FILE
 
−
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
−
    rm -f $APPLICATION_DIR/$PID_FILE
 
−
else
 
−
    (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
 
−
fi
 
  
 
-----------------------
 
-----------------------
−
==== Fichier rdbackup.conf v2.2====
+
=== Fichier rdbackup.conf v2.3 ===
−
  # Configuration rdbackup
+
  # Rdbackup configuration file
 
  SERVERNAME=$(hostname)
 
  SERVERNAME=$(hostname)
−
  # IP DU SERVEUR DE SAUVEGARDE
+
# LOCAL = 1 : backup to local directory (or NFS mount or SMB mount)
 +
# LOCAL = 0 : backup to a remote server (via SSH)
 +
  # IP, port, user of backup server (if remote)
 
  SERVERIP=192.168.1.10
 
  SERVERIP=192.168.1.10
 
  SERVERPORT=22
 
  SERVERPORT=22
 
  SERVERUSR=root
 
  SERVERUSR=root
 +
# Path where are rdbackup.sh, .conf, .list and .excl
 
  APPLICATION_DIR=<'''/path/to/application'''>
 
  APPLICATION_DIR=<'''/path/to/application'''>
 +
LIST=$APPLICATION_DIR/rdbackup.list
 +
EXCLUDE=$APPLICATION_DIR/rdbackup.excl
 
  MAIL_ADMIN='''<Mail de l'admin>'''
 
  MAIL_ADMIN='''<Mail de l'admin>'''
 
  RETENTION="--remove-older-than 1W"
 
  RETENTION="--remove-older-than 1W"
−
  LIST=$APPLICATION_DIR/rdbackup.list
+
  RDIFF_OPTS="-v5 --force"
−
  EXCLUDE=$APPLICATION_DIR/rdbackup.excl
+
  # Script to launch BEFORE backup
 
  PRESCRIPT=
 
  PRESCRIPT=
−
  # REPERTOIRE DE DESTINATION
+
  # BACKUP DESTINATION DIRECTORY (local or on remote server)
 
  BCK_DIR=/home/backup
 
  BCK_DIR=/home/backup
−
  RDIFF_OPTS="-v5 --force"
+
  # DUMP MYSQL
−
  # Passer MYSQLDUMP à 0 pour désactiver le dump MySQL
+
  # Change to MYSQLDUMP=0 to disable
 
  MYSQLDUMP=1  
 
  MYSQLDUMP=1  
 
  MYDB=<'''mysql_db_name'''>
 
  MYDB=<'''mysql_db_name'''>
 
  MYSQLDUMP_OPTS="--routines"
 
  MYSQLDUMP_OPTS="--routines"
 
  MYSQL_PASSWORD='''<Mot de passe MySQL>'''
 
  MYSQL_PASSWORD='''<Mot de passe MySQL>'''
−
 
 
------------------------------
 
------------------------------
−
=== rdbackup2.3.sh : lancé '''du serveur A SAUVEGARDER''' vers un répertoire local (ou un montage NFS/SMB local) ===
 
−
Comme on est sur le serveur de prod, le script inclut aussi un dump MySQL avant de lancer rdiff-backup<br>
 
−
Le dump peut-être désactivé s'il n'est pas utile.
 
−
#!/bin/bash
 
−
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
 
−
# FSo 06/2010
 
−
# V 2.2
 
−
# from sbackup.sh (RSYNC)
 
−
# Changelog :
 
−
# 2.2 - Reverse backup from client to backup server
 
−
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
 
−
# 2.0 - Moving variables in a .conf file
 
−
 
−
# Fix variables
 
−
LOG_FILE=rdiff.log
 
−
STAT_FILE=rdiff.stats
 
−
PID_FILE=rdiff.pid
 
−
 
−
if [ $# -gt 0 ]
 
−
then
 
−
# let use the given full path .conf file
 
−
    . $1
 
−
else
 
−
# Application specific
 
−
    . $(dirname $0)/rdbackup.conf
 
−
fi
 
−
 
−
while read line
 
−
do
 
−
    REMOTE_DIR="$REMOTE_DIR $line"
 
−
    shift
 
−
done < $LIST
 
−
 
−
if [ ! -e $APPLICATION_DIR/$PID_FILE ]
 
−
then
 
−
  # Script pre-backup
 
−
    if [ -f $PRESCRIPT ]
 
−
    then
 
−
      $PRESCRIPT
 
−
      if [ $? -ne 0 ]
 
−
      then
 
−
          exit 1
 
−
      fi
 
−
    fi
 
−
    if [ $MYSQLDUMP -eq 1 ]
 
−
    then
 
−
      mysqldump $MYDB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump.sql
 
−
    fi
 
−
    echo $$ > $APPLICATION_DIR/$PID_FILE
 
−
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
 
−
    if [ -e  $APPLICATION_DIR/$LOG_FILE ]
 
−
    then
 
−
        mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
 
−
    fi
 
−
    if [ -e  $APPLICATION_DIR/$STAT_FILE ]
 
−
    then
 
−
        mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
 
−
    fi
 
−
    echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
 
−
    #Boucle de backup
 
−
    ERROR_FLAG=0
 
−
    ERROR=0
 
−
    ERRORS="ERREURS: "
 
−
    for rdir in $(echo $REMOTE_DIR)
 
−
    do
 
−
      if [ ! "x$EXCLUDE" == "x" ]
 
−
      then
 
−
          EXCLUDE_OPT=""
 
−
          while read line
 
−
          do
 
−
            if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
 
−
            then
 
−
                EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
 
−
            fi
 
−
            shift
 
−
          done < $EXCLUDE
 
−
      fi
 
−
      # rdiff
 
−
      date >> $APPLICATION_DIR/$LOG_FILE
 
−
      echo >> $APPLICATION_DIR/$LOG_FILE
 
−
      echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
−
      echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
 
−
      rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
 
−
      ERROR=$?
 
−
      if [ $ERROR -ne 0 ]
 
−
      then
 
−
          ERRORS="$ERRORS $BASE=$ERROR:"
 
−
          ERROR_FLAG=1
 
−
      else
 
−
          echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
−
          echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
−
          rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
−
          ERROR=$?
 
−
          if [ $ERROR -ne 0 ]
 
−
          then
 
−
            ERRORS="$ERRORS $BASE=$ERROR:"
 
−
            ERROR_FLAG=1
 
−
          fi
 
−
      fi
 
−
    done
 
−
    if [ $ERROR_FLAG -eq 1 ]
 
−
    then
 
−
      (echo $ERRORS
 
−
        date
 
−
        echo Voir $APPLICATION_DIR/$LOG_FILE
 
−
        grep -i warning $APPLICATION_DIR/$LOG_FILE
 
−
        grep -i error $APPLICATION_DIR/$LOG_FILE
 
−
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
 
−
    else
 
−
      (date
 
−
        ls -l $APPLICATION_DIR/$LOG_FILE
 
−
        df -k $APPLICATION_DIR
 
−
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
 
−
    fi
 
−
    date >> $APPLICATION_DIR/$LOG_FILE
 
−
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
−
    rm -f $APPLICATION_DIR/$PID_FILE
 
−
else
 
−
    (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
 
−
fi
 
−
 
−
-----------------------
 
−
==== Fichier rdbackup.conf v2.3====
 
−
# Configuration rdbackup
 
−
SERVERNAME=$(hostname)
 
−
# IP DU SERVEUR DE SAUVEGARDE
 
−
SERVERIP=192.168.1.10
 
−
SERVERPORT=22
 
−
SERVERUSR=root
 
−
APPLICATION_DIR=<'''/path/to/application'''>
 
−
MAIL_ADMIN='''<Mail de l'admin>'''
 
−
RETENTION="--remove-older-than 1W"
 
−
LIST=$APPLICATION_DIR/rdbackup.list
 
−
EXCLUDE=$APPLICATION_DIR/rdbackup.excl
 
−
PRESCRIPT=
 
−
# REPERTOIRE DE DESTINATION
 
−
BCK_DIR=/media/backup
 
−
RDIFF_OPTS="-v5 --force"
 
−
# Passer MYSQLDUMP a 0 pour desactiver le dump MySQL
 
−
MYSQLDUMP=1
 
−
MYDB=<'''mysql_db_name'''>
 
−
MYSQLDUMP_OPTS="--routines"
 
−
MYSQL_PASSWORD='''<Mot de passe MySQL>'''
 
−
 
−
-------------------------------
 
−
 
−
=== ''Pour mémoire, script v1 sans rdbackup.conf'' ===
 
−
#!/bin/bash
 
−
# Script de sauvegarde des serveurs (RDIFF sur SSH)
 
−
# FSo 06/2010
 
−
# v1.0 from sbackup.sh (RSYNC) v1.2
 
−
# Changelog :
 
−
#
 
−
# svg_server.sh <hostname> <ip> <port> <user valide pour ssh> <duree retention> <fichier liste backup> <fichier exclusions>
 
−
# exemple cron.d :
 
−
#00 02 * * *      root /backup/rdbackup.sh server.example.fr 123.123.12.123 22 root 1W /backup/server.list /backup/server.excl > /backup/log/svg_server.cron.err 2>&1
 
−
#
 
−
SERVERNAME=$1
 
−
SERVERIP=$2
 
−
SERVERPORT=$3
 
−
SERVERUSR=$4
 
−
RETENTION="--remove-older-than $5"
 
−
LIST=$6
 
−
EXCLUDE=$7
 
−
BCK_DEV=/home
 
−
BCK_DIR=$BCK_DEV/backup/$SERVERNAME
 
−
LOG_FILE=rdiff_$SERVERNAME.log
 
−
STAT_FILE=rdiff_$SERVERNAME.stats
 
−
PID_FILE=/var/run/rdiff_$SERVERNAME.pid
 
−
RDIFF_OPTS="-v5 --force"
 
−
 
−
if [ $# -lt 6 ]
 
−
then
 
−
    echo Usage : $0 serverFQDN serverIP serverSSHPORT SSHUSER RETENTION BACKUPLISTfile [EXCLUDEfile]
 
−
    exit 1
 
−
fi
 
−
 
−
shift; shift; shift
 
−
while read line
 
−
do
 
−
    REMOTE_DIR="$REMOTE_DIR $line"
 
−
    shift
 
−
done < $LIST
 
−
 
−
if [ ! -e $PID_FILE ]
 
−
then
 
−
    echo $$ > $PID_FILE
 
−
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
 
−
    if [ -e  $BCK_DIR/$LOG_FILE ]
 
−
    then
 
−
        mv $BCK_DIR/$LOG_FILE $BCK_DIR/$LOG_FILE.0
 
−
    fi
 
−
    if [ -e  $BCK_DIR/$STAT_FILE ]
 
−
    then
 
−
        mv $BCK_DIR/$STAT_FILE $BCK_DIR/$STAT_FILE.0
 
−
    fi
 
−
    echo "Sauvegarde rdiff $SERVERNAME" > $BCK_DIR/$LOG_FILE
 
−
    #Boucle de backup
 
−
    ERROR_FLAG=0
 
−
    ERROR=0
 
−
    ERRORS="ERREURS: "
 
−
    for rdir in $(echo $REMOTE_DIR)
 
−
    do
 
−
      if [ ! -d ${BCK_DIR}${rdir} ]
 
−
      then
 
−
          mkdir -p ${BCK_DIR}${rdir}
 
−
      fi
 
−
 
−
      if [ ! "x$EXCLUDE" == "x" ]
 
−
      then
 
−
          EXCLUDE_OPT=""
 
−
          while read line
 
−
          do
 
−
            if <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
 
−
            then
 
−
                EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
 
−
            fi
 
−
            shift
 
−
            done < $EXCLUDE
 
−
      fi
 
−
      # rdiff
 
−
      date >> $BCK_DIR/$LOG_FILE
 
−
      echo >> $BCK_DIR/$LOG_FILE
 
−
      echo RDIFF-BACKUP OF $rdir >> $BCK_DIR/$LOG_FILE
 
−
      echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE
 
−
      rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
      ERROR=$?
 
−
      if [ $ERROR -ne 0 ]
 
−
      then
 
−
          ERRORS="$ERRORS $BASE=$ERROR:"
 
−
          ERROR_FLAG=1
 
−
      fi
 
−
      echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
 
−
      echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
      rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
 
−
      ERROR=$?
 
−
      if [ $ERROR -ne 0 ]
 
−
      then
 
−
          ERRORS="$ERRORS $BASE=$ERROR:"
 
−
          ERROR_FLAG=1
 
−
      fi
 
−
      echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE
 
−
      cat ${BCK_DIR}${rdir}/rdiff-backup-data/session_statistics.$(date "+%Y-%m-%d")* >> $BCK_DIR/$STAT_FILE
 
−
      echo >> $BCK_DIR/$STAT_FILE
 
−
    done
 
−
    if [ $ERROR_FLAG -eq 1 ]
 
−
    then
 
−
      (echo $ERRORS
 
−
        date
 
−
        echo Voir $BCK_DIR/$LOG_FILE
 
−
        grep -i warning $BCK_DIR/$LOG_FILE
 
−
        grep -i error $BCK_DIR/$LOG_FILE
 
−
        cat $BCK_DIR/$STAT_FILE
 
−
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" mail_admin@example.net
 
−
    else
 
−
      (date
 
−
        ls -l $BCK_DIR/$LOG_FILE
 
−
        df -k $BCK_DIR
 
−
        cat $BCK_DIR/$STAT_FILE
 
−
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" mail_admin@example.net
 
−
    fi
 
−
    date >> $BCK_DIR/$LOG_FILE
 
−
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
−
    rm -f $PID_FILE
 
−
else
 
−
    (echo "$SERVERNAME:$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" mail_admin@example.net
 
−
fi
 
  
 
= Windows =
 
= Windows =

Version du 17 mai 2011 à 13:18

Linux

Installation

Sur Debian 5 --> v1.2.5 (la différence de version mineure (.5 pour .8) ne provoque qu'un avertissement)

apt-get install rdiff-backup

Si on veut une version plus récente, il faut compiler :

apt-get install librsync-dev python-dev
wget http://savannah.nongnu.org/download/rdiff-backup/rdiff-backup-1.2.8.tar.gz
tar -xvzf rdiff-backup-1.2.8.tar.gz
cd rdiff-backup-1.2.8
python setup.py install

Sur CentOS, si ça n'a pas déjà été fait (pour munin par exemple), installation repos RPMForge (http://wiki.centos.org/AdditionalResources/Repositories/RPMForge).
CentOS4 :

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el4.rf.i386.rpm

CentOS5 :

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm

Puis

rpm -i rpmforge-release-0.5.1-1.el*.rf.i386.rpm
cat /etc/yum.repos.d/rpmforge.repo | sed "s/enabled = 1/enabled = 0/" > /root/install/rpmforge.repo
cp /root/install/rpmforge.repo /etc/yum.repos.d/rpmforge.repo
yum --enablerepo=rpmforge install rdiff-backup

Echanger les clés DSA entre les serveurs

Afin que la connexion de Rdiff-backup via SSH ne demande pas de mot de passe, la clé ~/.ssh/id_dsa.pub de l'utilisateur qui se connecte à partir du "client" rdiff-backup doit être copiée "en une seule ligne" dans ~/.ssh/authorized_keys de l'utilisateur cible sur le serveur à sauvegarder. (se reporter à une procédure d'échange de clés pour SSH)


Test d'accès à un serveur

rdiff-backup --test-server root@192.168.1.21::/home

Sauvegardes

à partir d'un backup existant (cp ou rsync) : le répertoire destination existe mais n'est pas au format rdiff (manque les infos rdiff-data), il faut le forcer la première fois :

rdiff-backup --force -v5 root@192.168.1.2::/etc /backup/etc > rdiff_server1.log 2>&1

Ensuite on peut enlever le "--force".


Nettoyage

des incréments supérieurs à une fenêtre de rétention :

rdiff-backup -v5 --remove-older-than 4W /backup

Le "4W" signifie "4 weeks", soit 4 semaines à conserver. On peut donner un nombre de jours ("D") ou d'heures ("H"). Tous les incréments supérieurs à ce délai seront supprimés.

Informations sur les sauvegardes

Liste des incréments :
Sur le serveur de sauvegarde :

rdiff-backup  -l /home/backup/server1/home/

A partir du serveur sauvegardé (remote-schema n'est utile que si le port ssh n'est pas standard) :

rdiff-backup -l --remote-schema='ssh -p 225 -C %s rdiff-backup --server' root@192.168.1.250::/home/backup

On peut lister aussi les tailles des différents incréments

rdiff-backup --list-increment-sizes /home/backup/server1/home/

Restore - Exemples

NOTE : le restore NE FONCTIONNE PAS SUR LES LIENS. Il faut indiquer le "vrai" répertoire ou fichier physique à restorer.

# fichier /etc/hosts d'il y a 1 heure (--force si le fichier existe et qu'il faut l'écraser)
rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts
# répertoire /etc d'il y a 3 jours
rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc

NOTE : le "-r" est obligatoire, on peut mettre "-r now", ou mieux: " -r "1B" " pour remonter la dernière sauvegarde. D'autres solutions sont "1D" (comme pour le backup) pour remonter la veille, ou 5m3s, ou 2010-12-21.



DEPANNAGE
Si après un problème de sauvegarde (disque plein, coupure de session ssh, etc...), les backups suivants se terminent en erreur (erreurs checksum ou autres), il faut supprimer le répertoire rdiff-backup-data et relancer un backup avec --force pour repartir à zéro (on perd l'historique des incréments !).


script rdbackup.sh

rdbackup.sh v2.3

  1. !/bin/bash
  2. Backup Script (RDIFF-BACKUP over SSH and RSYNC)
  3. FSo 06/2010
  4. V 2.2
  5. from sbackup.sh (RSYNC)
  6. Changelog :
  7. 2.2 - Reverse backup from client to backup server
  8. 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
  9. 2.0 - Moving variables in a .conf file
  10. 2.3 - Added backup sens (local to local or local to remote)
  1. Fix variables

LOG_FILE=rdiff.log STAT_FILE=rdiff.stats PID_FILE=rdiff.pid

if [ $# -gt 0 ] then

  1. let use the given full path .conf file
  . $1

else

  1. Application specific
  . $APPLICATION_DIR/rdbackup.conf

fi

while read line do

  REMOTE_DIR="$REMOTE_DIR $line"
  shift

done < $LIST

if [ ! -e $APPLICATION_DIR/$PID_FILE ] then

# Script pre-backup
  if [ -f $PRESCRIPT ]
  then
     $PRESCRIPT
     if [ $? -ne 0 ]
     then
        exit 1
     fi
  fi
  if [ $MYSQLDUMP -eq 1 ]
  then
     mysqldump $MYDB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump.sql
  fi
  echo $$ > $APPLICATION_DIR/$PID_FILE
  /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
  if [ -e  $APPLICATION_DIR/$LOG_FILE ]
  then
       mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
  fi
  if [ -e  $APPLICATION_DIR/$STAT_FILE ]
  then
       mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
  fi
  echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
  #Boucle de backup
  ERROR_FLAG=0
  ERROR=0
  ERRORS="ERREURS: "
  for rdir in $(echo $REMOTE_DIR)
  do
     if [ ! "x$EXCLUDE" == "x" ]
     then
        EXCLUDE_OPT=""
        while read line
        do
           if  $line =~ ^$rdir 
           then
              EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
           fi
           shift
        done < $EXCLUDE
     fi
     # rdiff
     date >> $APPLICATION_DIR/$LOG_FILE
     echo >> $APPLICATION_DIR/$LOG_FILE
     echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
     if [ $LOCAL -eq 1 ]
     then
        echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
        rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
     else
        echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
        rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
     fi
     ERROR=$?
     if [ $ERROR -ne 0 ]
     then
        ERRORS="$ERRORS $BASE=$ERROR:"
        ERROR_FLAG=1
     else
        echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
        if [ $LOCAL -eq 1 ]
           echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
           rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
        else
           echo rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
           rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
        fi
        ERROR=$?
        if [ $ERROR -ne 0 ]
        then
           ERRORS="$ERRORS $BASE=$ERROR:"
           ERROR_FLAG=1
        fi
     fi
  done
  if [ $ERROR_FLAG -eq 1 ]
  then
     (echo $ERRORS
      date
      echo Voir $APPLICATION_DIR/$LOG_FILE
      grep -i warning $APPLICATION_DIR/$LOG_FILE
      grep -i error $APPLICATION_DIR/$LOG_FILE
     )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
  else
     (date
      ls -l $APPLICATION_DIR/$LOG_FILE
      df -k $APPLICATION_DIR
     )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
  fi
  date >> $APPLICATION_DIR/$LOG_FILE
  /usr/bin/logger "FIN rdiff $SERVERNAME"
  rm -f $APPLICATION_DIR/$PID_FILE

else

   (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN

fi


Fichier rdbackup.conf v2.3

# Rdbackup configuration file
SERVERNAME=$(hostname)
# LOCAL = 1 : backup to local directory (or NFS mount or SMB mount)
# LOCAL = 0 : backup to a remote server (via SSH)
# IP, port, user of backup server (if remote)
SERVERIP=192.168.1.10
SERVERPORT=22
SERVERUSR=root
# Path where are rdbackup.sh, .conf, .list and .excl
APPLICATION_DIR=</path/to/application>
LIST=$APPLICATION_DIR/rdbackup.list
EXCLUDE=$APPLICATION_DIR/rdbackup.excl
MAIL_ADMIN=<Mail de l'admin>
RETENTION="--remove-older-than 1W"
RDIFF_OPTS="-v5 --force"
# Script to launch BEFORE backup
PRESCRIPT=
# BACKUP DESTINATION DIRECTORY (local or on remote server)
BCK_DIR=/home/backup
# DUMP MYSQL
# Change to MYSQLDUMP=0 to disable
MYSQLDUMP=1 
MYDB=<mysql_db_name>
MYSQLDUMP_OPTS="--routines"
MYSQL_PASSWORD=<Mot de passe MySQL>

Windows

Installation

Télécharger :

  • Rdiff (rdiff-backup-1.2.8-win32.zip)
http://www.nongnu.org/rdiff-backup/
  • putty, plink et puttygen
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
  • Blat (blat262.full.sip)
http://sourceforge.net/projects/blat/files/

Préparation de la connexion SSH

Note : on considère ici que la sauvegarde est lancée d'un poste Windows vers un serveur linux

Lancer puttygen. Sélectionner "SSH-2 DSA" en bas, cliquer sur "Generate" et bouger la souris dans l'espace blanc au milieu de la fenêtre.

Copier la clé DSA qui s'affiche en haut de la fenêtre (sans oublier aucun caractère !), la passer telle, en une seule ligne, quelle vers le serveur linux (via un fichier par scp/ftp, ou mail, ou copier/coller dans une console putty) dans le fichier ~/.ssh/authorized_keys du serveur.

Sauvegarder les clés dans le répertoire Documents and Setting (Win XP/2003) ou Users (Win 7/2008) de l'utilisateur qui lancera rdiff-backup.

  • Clé publique :
en cliquant sur "save public key"
nommer le fichier privatekey.pub
  • Clé privée :
en cliquant sur "save private key"
nommer le fichier privatekey.ppk

Tests de connexion

Tester la connexion avec plink (ce qui permet d'enregistrer localement la clé du serveur à la première connexion) :

c:\backup\plink.exe -i C:\Users\<utilisateur windows>\privatekey.ppk utilisateur_cible@server.systea.net

la connexion doit se faire sans demande de mot de passe.

Tester rdiff-backup :

c:\backup\rdiff-backup -v5 --test-server --remote-schema "c:\backup\plink.exe -P 22 -i C:\Users\<utilisateur windows>\privatekey.ppk %s rdiff-backup --server" utilisateur_cible@server.systea.net::/tmp

Test de Blat

Tester un envoi (le nom de fichier qui constituera le corps du mail est obligatoire, sinon blat reste "en attente" et ne rend jamais la main).

blat c:\backup\fichier.txt -to destinataire@server.systea.net -server smtp.orange.fr -f expediteur@serveur.com -s "SUJET DU MAIL"

Script de sauvegarde

NOTE : le "%s" doit être transformé en "%%s" pour être reconnu par l'interpréteur DOS.

rem @echo off
set ERROR=0
set MAILOPTS=-server smtp.orange.fr -f expediteur@serveur.com

copy c:\backup\backup.log c:\backup\backup.log.0

c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" "c:/partage/" USER@SERVER.systea.net::/home/backup/partage > c:\backup\backup.log 2>&1
IF NOT "%ERRORLEVEL%"=="0" (
   set ERROR=1)
REM le LOG n'est pas relaché tout de suite, on doit simuler une pause de 5 secondes...
ping -n 5 127.0.0.1
c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" --remove-older-than 4W USER@SERVER.systea.net::/home/backup/partage >> c:\backup\backup.log 2>&1
IF NOT "%ERRORLEVEL%"=="0" (
   set ERROR=1)
ping -n 5 127.0.0.1

IF "%ERROR%"=="0" (
   c:\backup\blat\full\blat c:\backup\backup.log -to destinataire@systea.net %MAILOPTS% -s "Sauvegarde terminee" > c:\backup\blat.log 2>&1 )
IF NOT "%ERROR%"=="0" (
   c:\backup\blat\full\blat c:\backup\backup.log -to destinataire@systea.net %MAILOPTS% -s "Probleme sauvegarde" > c:\backup\blat.log 2>&1 )