Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/02/2013, à 00:33

alexpr78

Demande d'aide Script Test Restauration backup

Bonsoir à tous,
Pas très fort niveau dev, je suis aujourd'hui obliger de développer un script qui test la restauration d'un backup de plusieurs fichiers dans plusieurs dossiers ... pour ensuite dire que si la restauration se passe bien, alors la sauvegarde est réussie ... Sauf que le test doit être effectuer par exemple un fichier dans chaque dossier du dossier principale.

Je vais mieux m'expliquer, j'utilise ce script  (Cron tout les soirs) nommer daily.backup.sh:

#UNIX / Linux shell script to backup dirs to tape device like /dev/st0 (linux)
# This script make both full and incremental backups.
# You need at two sets of five  tapes. Label each tape as Mon, Tue, Wed, Thu and Fri.
# You can run script at midnight or early morning each day using cronjons.
# The operator or sys admin can replace the tape every day after the script has done.
# Script must run as root or configure permission via sudo.
# -------------------------------------------------------------------------
# Copyright (c) 1999 Vivek Gite <vivek@nixcraft.com>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit [url]http://bash.cyberciti.biz/[/url] for more information.
# -------------------------------------------------------------------------
# Last updated on : March-2003 - Added log file support.
# Last updated on : Feb-2007 - Added support for excluding files / dirs.
# -------------------------------------------------------------------------
LOGBASE=/root/backup/log
 
# Backup dirs; do not prefix /
BACKUP_ROOT_DIR="mnt/Backup"
 
# Get todays day like Mon, Tue and so on
NOW=$(date +"%A")
 
# Tape devie name
TAPE="/dev/st0"
 
# Exclude file
TAR_ARGS=""
EXCLUDE_CONF=/root/.backup.exclude.conf
 
# Backup Log file
LOGFILE=$LOGBASE/$NOW.backup.log
TEST_DIR=$LOGBASE/$NOW.verif.backup.log 
# Path to binaries
TAR=/bin/tar
MT=/bin/mt
# ------------------------------------------------------------------------
# Excluding files when using tar
# Create a file called $EXCLUDE_CONF using a text editor
# Add files matching patterns such as follows (regex allowed):
# home/vivek/iso
# home/vivek/*.cpp~
# ------------------------------------------------------------------------
[ -f $EXCLUDE_CONF ] && TAR_ARGS="-X $EXCLUDE_CONF"
 
#### Custom functions #####
# Make a full backup
full_backup(){
	local old=$(pwd)
	cd /
	date
	mt -f /dev/st0 setblk 0
#	mt -f /dev/st0 compression
	$TAR $TAR_ARGS -cvpf $TAPE $BACKUP_ROOT_DIR
	date
	$MT -f $TAPE rewind
	cd $old
}

# Make sure all dirs exits
verify_backup_dirs(){
	local s=0
	for d in $BACKUP_ROOT_DIR
	do
		if [ ! -d /$d ];
		then
			echo "Error : /$d directory does not exits!"
			s=1
		fi
	done
	# if not; just die
	[ $s -eq 1 ] && exit 1
}
#### Main logic ####
 
# Make sure log dir exits
# Verify dirs

full_backup > $LOGFILE
#Listing des fichiers se trouvant dans la cassette :
tar tf /dev/st0 > /tmp/tapefiles.log
/root/backup/log/tapefiles.sh > /tmp/tmp2.log
mail -s "Vérification fichier cassette ecriture" test@test.fr < /tmp/tmp2.log
/root/backup/log/backup_test_verif.sh > /tmp/tmp.log
mail -s "Verifications Des Sauvegardes" admin@admin.fr < /tmp/tmp.log

Le script tape-files.sh

#!/bin/bash
cd /root/backup/log
mt -f /dev/st0 rewind
clear
cd /tmp/
tapefiles="testtape.log"
#Affichage de la derniere ligne du log du jour
date1=$(date +%A)
jour=$(date +%Y%m%d%H%M)
clear
echo "=                                                                 ="
echo "====						        ========="
echo "====                                                      ========="
echo "====                                                      ========="
#derniereligne=$(tail -n 1 /root/backup/log/$fichierdate)
tail -n 10 $tapefiles
echo "====                                                      ========="
echo "====                                                      ========="
echo "====                                                      ========="
echo "====                                                      ========="
echo "==================================================================="
echo "====       Verification du Dossier DOSSIERX                ======="
echo "==================================================================="
 
if [ `grep "DOSSIERX/$" $tapefiles` ]; then
echo "Le dossier DOSSIERX a bien ete sauvegarder sur la Bande ! "
else
         echo "La sauvegarde du dossier DOSSIERX a echouer !!"
fi
echo "====                                                      ========="
echo "====                                                      ========="
echo "====                                                      ========="
echo "====                                                      ========="

echo "==================================================================="
echo "====       Verification du Dossier DOSSIER1            ========"
echo "==================================================================="
 
if [ `egrep "DOSSIER1/$" $tapefiles` ]; then
echo "Le dossier DOSSIER1 a bien ete sauvegarder sur la Bande ! "
else
         echo "La sauvegarde du dossier DOSSIER1 a echouer !!"

Il test juste les caractères, s'ils sont présent alors on affiche ça ... puis l'envoi auto par mail.

Maintenant il faudrait créer un nouveau script qui serai exécuter par le fichier principale (dailybackup.sh) à la fin de la sauvegarde qui permettrai de restaurer un fichier aléatoirement dans chaque dossier, j'ai penser à ça :
Le dossier /tmp/TEST-RESTORE est pour le dossier de destination pour les tests.

#/bin/bash
TRESTORE="/tmp/TEST-RESTORE"
cd $TRESTORE
clear
if tar -xzf /dev/st0 [#On pourrait utiliser le fichier tmp2.log qui détient les chemins des fichiers dans la cassette ?] -eq 0 ; then
    variable1=OK

Enfin je sais pas mais je pense a quelque chose comme ça ou utiliser du awk ?!

Pouvez vous m'aider ^^ ?

merci d'utiliser les balises code et non pas quote qui servent à citer

Dernière modification par ljere (Le 28/02/2013, à 10:07)

Hors ligne

#2 Le 05/03/2013, à 23:52

Didier-T

Re : Demande d'aide Script Test Restauration backup

bonsoir alexpr78,

je ne suis pas certain d'avoir tout compris à ce que tu souhaite faire, mais il me semble qu'une partie du problème consiste à comparer le contenu de deux fichiers, pour ce faire tu peut utiliser la commande cmp, voici un exemple pour une comparaison simple et utilisable par un script.

#!/bin/bash
fichier="nom du fichier a comparer"
rep_source="mnt/Backup"
rep_temp="/tmp/TEST-RESTORE"
# insérer ici commande tar pour extraire le fichier à comparer
`cmp -s $rep_source/$fichier $rep_temp/$fichier`
if [ $? -eq 1 ]; then
  echo "les fichiers sont différents"
else
  echo "les fichiers sont identiques"
fi

je n'utilise pas tar en ligne de commande, il te faudra donc chercher pour l'extraction du fichier.

Hors ligne

#3 Le 06/03/2013, à 07:44

pingouinux

Re : Demande d'aide Script Test Restauration backup

Bonjour,

Didier-T #2 a écrit :
`cmp -s $rep_source/$fichier $rep_temp/$fichier`
if [ $? -eq 1 ]; then
  echo "les fichiers sont différents"
else
  echo "les fichiers sont identiques"
fi

Pour info, les ` ` qui encadrent la commande cmp ne servent à rien, et il est préférable de mettre des " " autour des variables (au cas où les noms contiendraient des espaces). Tu peux aussi faire ceci :

if cmp -s "$rep_source/$fichier" "$rep_temp/$fichier"; then
  echo "les fichiers sont identiques"
else
  echo "les fichiers sont différents"
fi

Édité : Correction

Dernière modification par pingouinux (Le 06/03/2013, à 08:47)

Hors ligne

#4 Le 06/03/2013, à 08:34

Didier-T

Re : Demande d'aide Script Test Restauration backup

pingouinux a écrit :

Bonjour,

Didier-T #2 a écrit :
`cmp -s $rep_source/$fichier $rep_temp/$fichier`
if [ $? -eq 1 ]; then
  echo "les fichiers sont différents"
else
  echo "les fichiers sont identiques"
fi

Pour info, les ` ` qui encadrent la commande cmp ne servent à rien, et il est préférable de mettre des " " autour des variables (au cas où les noms contiendraient des espaces). Tu peux aussi faire ceci :

if cmp -s "$rep_source/$fichier" "$rep_temp/$fichier"
  echo "les fichiers sont identiques"
else
  echo "les fichiers sont différents"
fi

Bonjour pingouinux,
Merci pour la correction, par contre deux questions, je vois que tu n'a pas mis de then dans ta commande if (certainement un oubli smile )
et que se passe t'il si le retour de la commande cmp n'est ni 0 ni 1 ?
étant un complet autodidacte j’apprends un peut tout les jours, et parfois j’oublie des infos.

Hors ligne

#5 Le 06/03/2013, à 08:44

pingouinux

Re : Demande d'aide Script Test Restauration backup

Didier-T #4 a écrit :

je vois que tu n'a pas mis de then dans ta commande if

Effectivement. Je corrige tout de suite.

que se passe t'il si le retour de la commande cmp n'est ni 0 ni 1

$?==0 => commande terminée normalement
$?!=0  => autres cas

Hors ligne

#6 Le 06/03/2013, à 08:48

Didier-T

Re : Demande d'aide Script Test Restauration backup

pingouinux a écrit :

...

que se passe t'il si le retour de la commande cmp n'est ni 0 ni 1

$?==0 => commande terminée normalement
$?!=0  => autres cas

en effet, c'est évidant.

Merci

Hors ligne

#7 Le 06/03/2013, à 18:26

alexpr78

Re : Demande d'aide Script Test Restauration backup

Merci pour vos réponses, c'est exactement ça, juste il manque un petit truc, c'est que le choix du fichier de restauration, je veux qu'il se fasse aléatoirement (en gros qu'il se base sur un nom de fichier se trouvant dans les logs de la cassette -> tar tf /dev/st0 > /tmp/tapefiles.log.
Merci pour tout.

Hors ligne

#8 Le 06/03/2013, à 18:55

Didier-T

Re : Demande d'aide Script Test Restauration backup

il te faut deux petites choses

  1. rentrer les noms (et chemin) de tes fichiers dans un tableau

  2. générer un nombre aléatoire compris entre 0 et nombre de données dans la tableau

pour remplir le tableau

i=1
while read ligne ;do
myarray[$i]=$ligne
i=$(($i+1))
done  < brol

pour générer un nombre aléatoire, il y a cette solution (trouvée ici)

min=100
max=$i
number=$[($RANDOM % ($[$max - $min] + 1)) + $min]
echo $number

pour plus d'info sur les tableaux tu peut regarder ceci

Hors ligne