Script còpia de seguretat

Les entrades còpia de seguretat amb rsync i accés sense contrasenya amb el putty tenen com a finalitat fer una còpia de seguretat de un sistema Linux en un altre sistema ja bé sigui Linux o Windows. Com en tot backup hi ha d’haver una tasca que s’encarregui de prepara els fitxers dels que es farà backup i comprimir-los per a que ocupin poc espai a l’hora de fer la transferència per Internet. Doncs bé en aquesta entrada facil·lito l’script que faig servir jo mitjançant crontab. Es tracta d’un script que fa còpies de seguretat en el home d’un usuari de sistema afegint l’extensió que calgui depenent de si és una còpia diària, setmanal o mensual. El primer que es fa es  definir tota una sèrie de variables  d’entorn, com poden ser el dia, mes, any, número de dia dins de la setmana (de 1 a 6) i rutes de fitxers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /bin/bash

DD=`date +%d`

MM=`date +%m`

YYYY=`date +%Y`

WKD=`date +%u`

WN=`date +%V`

CRON_DIR="/<strong>ruta</strong>/scripts"

DEST_DIR="/home/<strong>usuari</strong>/backup"

LOG="backup.log"

Tot seguit establim el valor inicial de la variable fi de mes ja que el farem servir després, i obtenim els fitxers dels quals fem backup mitjançant TAR o zip i li posem l’extensió del dia de la setmana en que estem:

1
2
3
4
5
6
7
8
9
10
11
fi_mes=0

echo "${YYYY}${MM}${DD} `date +%H:%M:%S` INI LOG" &gt;&gt; $LOG

#Backup de dir www, fitxers de configuració de Apache i BBDD de mysql
echo -e "\tCreant còpia de seguretat" &gt;&gt; $LOG
tar -zcvf ${DEST_DIR}/www_backup.$WKD.tgz /var/www --exclude-from ${CRON_DIR}/exclude_dirs_www_backup.txt
tar -zcvf ${DEST_DIR}/config_apache.$WKD.tgz /etc/httpd/conf.d /etc/httpd/conf
tar -zcvf ${DEST_DIR}/www_logs.$WKD.tgz /var/log/httpd

mysqldump -u <strong>usuari</strong> -p<strong>contrasenya</strong> --all-databases &gt; ${DEST_DIR}/mysql_dump.$WKD.sql

En el cas que es mostra en l’exemple es fa backup dels directoris /var/www (les pàgines web que tenim al nostre servidor), /etc/httpd/conf.d (configuració de servidors virtuals de Apache), /var/log/httpd (logs de Apache) i la base de dades de MySQL. Cal remarcar que quan es fa el backup del directori /var/www s’exclouen alguns directoris ja que pot ser que tinguem algunes llibreries o imatges de les quals no volem que es faci backup. Això s’aconsegueix editat un fitxer com el que hi ha en l’script. També podríem agafar la còpia de seguretat de SVN que és on esta el codi del nostre projecte web. Cada fitxer té l’extensió del dia actual de la setmana o sigui que si avui és dimarts, el dia de la setmana serà 2.

 

Mirem si el dia de la setmana és 7 o el que és el mateix, si és l’últim dia de la setmana. Si no és l’últim dia de la setmana es deixa el número de dia de la setmana actual, tal i com s’ha explicat en el pas anterior. Si ho és li posem l’extensió de la setmana que acaba:

1
2
3
4
5
6
7
8
#Mirem si és l'ultim dia de la setmana i en cas que ho sigui creem la copia setmanal
if [ ${WKD} -eq 7 ]
then
mv ${DEST_DIR}/www_backup.${WKD}.tgz ${DEST_DIR}/www_backup.week${WN}.tgz
mv ${DEST_DIR}/config_apache.${WKD}.tgz ${DEST_DIR}/config_apache.week${WN}.tgz
mv ${DEST_DIR}/www_logs.${WKD}.tgz ${DEST_DIR}/www_logs.week${WN}.tgz
mv ${DEST_DIR}/mysql_dump.$WKD.sql ${DEST_DIR}/mysql_dump.week${WN}.sql
fi

 

Ara passem a comprovar si és l’ultim dia de mes. En cas que ho sigui activem la variable d’entorn que havíem comentat anteriorment, fi_mes:

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
#Comprovem si avui és l'últim dia del mes. en cas que ho sigui hem de crear la còpia de final de mes.
case "$MM" in
01|03|05|07|08|10|12)
if [ $DD -eq "31" ]
then
echo "\tEs un mes de 31 dies i avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
;;
02)
traspas=`expr $YYYY % 4`
if [ $traspas -eq 0 ]
then
if [ $DD -eq "29" ]
then
echo "\tEs l'ultim dia de FEBRER i estem en un any de traspas, avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
else
if [ $DD -eq "28" ]
then
echo -e "\tEs l'ultim dia de FEBRER i NO estem en un any de traspas, avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
fi
;;
04|06|09|11)
if [ $DD -eq "30" ]
then
fi_mes=1
echo -e "\tEs un mes de 30 dies i avui es dia $DD" &gt;&gt; $LOG
fi
;;
*)
echo -e "\tNo es un mes valid" &gt;&gt; $LOG
exit
;;
esac

Si es fi de mes, canviem l’extensió i posem el mes que acaba:

1
2
3
4
5
6
7
8
if [ ${fi_mes} -eq 1 ]
then
echo -e "\tEs final de mes. Avui es dia $DD del mes de $MM." &gt;&gt; $LOG
mv ${DEST_DIR}/www_backup.${WKD}.tgz ${DEST_DIR}/www_backup.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/config_apache.${WKD}.tgz ${DEST_DIR}/config_apache.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/www_logs.${WKD}.tgz ${DEST_DIR}/www_logs.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/mysql_dump.${WKD}.sql ${DEST_DIR}/mysql_dump.${YYYY}month${MM}.sql
fi

Finalment donem permisos per a l’usuari que es connectarà mitjançant rsync per a que pugui obtenir els fitxers.

1
2
chown <strong>usuari</strong>.<strong>usuari</strong> ${DEST_DIR}/*
echo "${YYYY}${MM}${DD} `date +%H:%M:%S` FI LOG" &gt;&gt; $LOG

Nota: s’ha de canviar usuari per l’usuari on volgueu que es desi el backup, posar una contrasenya vàlida per connectar-nos a MySQL i especificar la ruta al directori on es troba l’script.