Jump to content

script de sauvegarde services debian


Recommended Posts

Bonjour les gens,

Après quelques galères, je mets à dispo un (mon) script de sauvegarde de serveur, il sauve les fichiers de config des services sous Debian GNU/Linux.

Je suis bien entendu ouvert à toutes améliorations, même plus que preneur.

Le script sauvegarde les fichiers de config sur un ftp, dans le répertoire qu'on lui a donné.

pour ajouter un service, il suffit de rajouter le nom du repertoire (dans le /etc ) dans la partie

for DaPouet in
et le script s'occupe du reste.

#!/bin/sh
# ce script va cloner l'installation de Debian ainsi que les fichiers de config
# on lui passe en parametre le serveur destinataire de la sauvegarde
# ainsi que le chemin du rep de sauvegarde

# Historique
# 1.0 - 25/12/2007 - Sauvegarde basique des fichiers de conf
# 2.0 - 01/01/2008 - Sauvegarde egalement des BDD avec utilisation d'un fichier SQL
# 3.0 - 03/01/2008 - Sauvegarde des BDD en incrémentale 1/Jour
# 4.0 - 08/02/2008 - La restauration du serveur est dorénavent possible
# 4.1 - 11/02/2008 - Ajout de MySQL dans la sauvegarde des fichiers de config
# 4.2 - 14/02/2008 - Sauvegarde egalement du resolv.conf
# 4.3 - 14/02/2008 - Sauvegarde du /etc/default
# 4.4 - 01/04/2008 - Sauvegarde de pam.d
# 4.5 - 04/04/2008 - Ajout de la suppression du rep backup avant la restauration
# 4.6 - 15/04/2008 - Ajout de la sauvegarde de /var/www s'il existe
# 4.7 - 27/04/2008 - Ajout de la sauvegarde de /home et de /root
#
if [ $# -eq 4 ]
then
# On fait une sauvegarde
Ip=$1
User=$2
Password=$3
Path=$4
RepWork=/root/backup
FileDpkg=$HOSTNAME.dpkg
rm -r $RepWork
mkdir -p $RepWork
cd $RepWork
# on sauvegarde les parametres IP
cp /etc/network/interfaces ParamIp
# on sauvegarde les parametres du resolv.conf
cp /etc/resolv.conf ResolvConf
# on sauvegarde le default
tar czf Default.tgz /etc/default >/dev/null 2>&1
	# on sauvegarde le pam.d
tar czf Pam.tgz /etc/pam.d >/dev/null 2>&1
# on sauvegarde les crontab
# celle de root
	crontab -l > CronTab 2>/dev/null
# les autres
tar czf $RepWork/cron.tgz /etc/cron.* > /dev/null 2>&1
# si le /root existe, on le sauve
	if [ -d /root ]
	then
	rsync -avb --delete --exclude=$RepWork /root /RootBak
	tar czf $RepWork/Root.tgz /RootBak > /dev/null 2>&1
	fi
	# on sauvegarde les BDD avec mysqldump
	# on regarde si on trouve un fichier de parametre
	if [ -f ../SqlPassword ]
	then
			TotLigne=`cat ../SqlPassword | wc -l`
			# on initialise le pass sql
			PassWordSql=""
			if [ $TotLigne -eq 2 ]
			then
					PassWordSql=`tail -1 ../SqlPassword`
			fi
			IdSql=`head -1 ../SqlPassword`
			mysqldump $IdSql $PassWordSql --opt --flush-logs --master-data=2 --all-databases --delete-master-logs > $HOSTNAME.sql
		tar czf $HOSTNAME.sql.tgz $HOSTNAME.sql >/dev/null 2>&1
		rm $HOSTNAME.sql
		# On sauvegarde le fichier de param des bases a sauver
		cp ../SqlPassword .
	# On telecharge l'applet de telechargement du script de sauvegarde incrementale des bases
	echo "CloneSql.sh $1 $2 $3 $4" >> /etc/cron.daily/savesql
	chmod +x /etc/cron.daily/savesql
	/etc/init.d/cron restart
	fi
	# on sauvegarde la liste des paquets
dpkg --get-selections > $FileDpkg
# on regarde la liste des paquets pour sauvegarder
# les fichiers de conf qui font bien
for DaPouet in apache2 bind postfix vsftpd courier amavis spamassassin freeradius nagios2 mysql openser
do
	cat $FileDpkg | grep -v "-" | grep $DaPouet > /dev/null 2>&1 && i=1 || i=2
	if [ $i -eq 1 ]
	then
		tar czf $RepWork/$DaPouet.tgz /etc/$DaPouet > /dev/null 2>&1
	fi
done
# vu que asterisk est compile, on test le repertoire /etc/asterisk
if [ -d /etc/asterisk ]
then
	tar czf $RepWork/asterisk.tgz /etc/asterisk > /dev/null 2>&1
fi

# on cree le script qui va copier ce petit monde sur le ftp
echo "open $Ip" > scriptFTP.param
echo "user $User $Password" >> scriptFTP.param
echo "lcd $RepWork" >> scriptFTP.param
echo "mdelete $Path$HOSTNAME/*" >> scriptFTP.param
echo "rmdir $Path$HOSTNAME" >> scriptFTP.param
echo "mkdir $Path$HOSTNAME" >> scriptFTP.param
echo "cd $Path$HOSTNAME" >> scriptFTP.param
for ListeSauv in `ls $RepWork | tr -s '\n ' ' '`
		do
			echo "put $ListeSauv" >> scriptFTP.param
		done
echo "bye" >> scriptFTP.param

# on fait la copie proprement dite
ftp -inv <scriptFTP.param > /dev/null 2>&1





elif [ $# -eq 5 ]
then
# On restaure la sauvegarde
	Ip=$1
	User=$2
	Password=$3
	Path=$4
	RepWork=/root/backup
	FileDpkg=$HOSTNAME.dpkg

	rm -r $RepWork
	mkdir -p $RepWork
	cd $RepWork
wget -nd -r ftp://$User:$Password@$Ip/$Path/$HOSTNAME
	rm scriptFTP.param
# On restaure les parametres IP
	mv ParamIp /etc/network/interfaces
	# On restaure le resolvconf
	cp ResolvConf /etc/resolv.conf
# On restaure le /etc/default
cd /
tar xzf $RepWork/Default.tgz
cd $RepWork
rm Default.tgz
# On restaure le pam.d
cd /
tar xzf $RepWork/Pam.tgz
cd $RepWork
rm Pam.tgz
	# On restaure les crontab
	# Celle de l'user
	cat CronTab >>/var/spool/cron/crontabs/root
	rm CronTab
# Les autres
	cd /
tar xzf $RepWork/cron.tgz
	cd $RepWork
rm cron.tgz
	# On restaure le /root
	cd /
tar xzf $RepWork/Root.tgz
	cd $RepWork
rm Root.tgz
# On restaure le /home
	cd /
tar xzf $RepWork/Home.tgz
	cd $RepWork
rm Home.tgz
# On rsetaure les sites web
	if [ -f $RepWork/varwww.tgz ]
	then
	cd /
	tar xzf $RepWork/varwww.tgz
		cd $RepWork
	rm varwww.tgz
fi
# On met a jour le systeme
	dpkg --set-selections < $FileDpkg
dselect install
rm $FileDpkg
	# on regarde si on trouve un fichier de parametre
	# la syntaxe est
	# -u NomUser
	# -pPassword
	if [ -f ../SqlPassword ]
	then
			PassWordSql=`cat ../SqlPassword | cut -d" " -f2`
			IdSql=`cat ../SqlPassword | cut -d" " -f1`
			# On restaure les bases de donnees
	/etc/init.d/mysql stop
	# On vire l'integralité des bdd
	rm -r /var/lib/mysql/*
	for ListeSql in $( ls *.sql.tgz )
	do
		tar xzf $ListeSql
		# On restaure les bdd
		Bdd=`ls *.sql`
		mysql $IdSql $PassWordSql -h localhost -D $Bdd < $Bdd
		rm $ListeSql
		rm $Bdd
	done
	fi
rm *.sql.tgz
chown -R mysql:mysql /var/lib/mysql
	# On arrete les services a mettre a jour, on met a jour, et on redemarre le service
for Listing in $( ls | cut -d"." -f1 )
do
	/etc/init.d/$Listing stop
	cd /
			tar xzf $RepWork/$Listing.tgz
	rm $RepWork/$Listing.tgz
			/etc/init.d/$Listing start
done
echo "Merci de redemarrer la machine"
echo "une fois vos fichiers enregistres"


elif [ $# -ne 4 ]
then
echo "merci de lancer le programme avec pour parametre :"
echo "CloneDeb.sh IP_ftp User Password Path"
echo "Pour une sauvegarde"
echo "Et avec :"
echo "CloneDeb.sh IP_ftp User Password Path restore"
echo "Pour une restauration"
exit 1
fi

et le script pour l'incrémental de mysql

#!/bin/sh
# ce script va sauvegarder mysql de maniere incrementale
# on sauve la difference depuis le dernier mysqldump
# on lui passe en parametre le serveur destinataire de la sauvegarde
# ainsi que le chemin du rep de sauvegarde

# Historique
# 1.0 - 25/12/2007 - Sauvegarde basique des fichiers /var/log/mysql/mysql-bin.*

if [ $# -eq 4 ]
then
# On fait une sauvegarde
Ip=$1
User=$2
Password=$3
Path=$4
RepWork=/root/backupsql
rm -r $RepWork
mkdir -p $RepWork
# on sauvegarde les fichiers bin de mysql
cd /var/log/mysql
tar czf $RepWork/MysqlIncr.tgz ./

# on cree le script qui va copier ce petit monde sur le ftp
echo "open $Ip" > scriptFTP.param
echo "user $User $Password" >> scriptFTP.param
echo "lcd $RepWork" >> scriptFTP.param
echo "cd $Path$HOSTNAME" >> scriptFTP.param
for ListeSauv in `ls $RepWork | tr -s '\n ' ' '`
		do
			echo "put $ListeSauv" >> scriptFTP.param
		done
echo "bye" >> scriptFTP.param

# on fait la copie proprement dite
ftp -inv <scriptFTP.param > /dev/null 2>&1
elif [ $# -ne 4 ]
then
echo "merci de lancer le programme avec pour parametre :"
echo "CloneSql.sh IP_ftp User Password Path"
exit 1
fi

Link to comment
Share on other sites

Tu devrais modifier l'entête de description du deuxième script, pour souligner que c'est juste pour la base de données :keskidit:

Par contre, ce n'est pas un peu brutal, de copier une database comme ça, en plein fonctionnement ? Qu'est-ce qui te dit que tu ne copies pas pendant une modification, et que ce que tu sauvegardes n'est pas une base corrompue, parce qu'il manque ou qu'il reste des trucs qui ne sont pas encore copiés ou effacés dans la base quand tu lances ton backup... ?

Perso, quand je dois backuper du mysql, j'arrête le service associé (c'est chez moi, donc, je m'en fous : je maîtrise la disponibilité et la demande :keskidit: ), et je copie... doit y avoir mieux, mais ta solution me paraît être l'extrême inverse...

Link to comment
Share on other sites

Tu devrais modifier l'entête de description du deuxième script, pour souligner que c'est juste pour la base de données :keskidit:

exact, corrigé (copié/collé, un faux ami)

Par contre, ce n'est pas un peu brutal, de copier une database comme ça, en plein fonctionnement ? Qu'est-ce qui te dit que tu ne copies pas pendant une modification, et que ce que tu sauvegardes n'est pas une base corrompue, parce qu'il manque ou qu'il reste des trucs qui ne sont pas encore copiés ou effacés dans la base quand tu lances ton backup...

nononon, je ne suis pas un bourrin ^^

je ne copie pas la base, mais uniquement le diff. la base se trouve dans /var/lib/mysql, et ce que je sauve est /var/log/mysql qui contient uniquement le différentiel entre le mysqldump et le moment où l'on tape la commande. Pour avoir tenté des gros (très) select, insert et tout le tralala pendant une copie, je peux restaurer sans souci. Bien entendu je ne restaure que ce qui a eu le temps de se sauvegarder.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...