#!/bin/sh -x
# Script-Name : rsyncBackupRotate
# Version : 1.10
# Autor : Michael Madej
# Erstellt : 25.05.2015
# Datum : 09.08.2015
# Beschreibung:
# Rotierende Datensicherung auf Synology Diskstations durch BananaPi
# Die Vorhaltezeit der Daten betraegt 4 Wochen
# Datensicherung bis zu 12 Monate
logDatum=$(date +%Y-%m-%d)
logZeit=$(date +%H-%M-%S)
exec 2>>"/usr/local/log/${logDatum} ${logZeit} rsyncBackupRotate Debug-Output.txt"
###############################################################################
#### Dokumentation ####
###############################################################################
# rsyncBackupRotate110 benötigt 3 Argumente
# rsyncBackupRotate110 [Daten-Quelle] [Daten-Ziel] [zuSicherndesVerzeichnis]
# Netzlaufwerke auf BananaPi mit Testdaten
# mount.cifs //xxx.xxx.xxx.xxx/Daten-Quelle /root/Bibliothek -o user=xxx,password=xxx
# mount.cifs //xxx.xxx.xxx.xxx/Daten-Ziel /root/NetBackup -o user=xxx,password=xxx
# Beispiel:
# rsyncBackupRotate110.sh Bibliothek NetBackup Comics
###############################################################################
#### Funktionen ####
###############################################################################
tagesverzeichnisseLoeschen()
{
# loeschen der Tagesverzeichnisse
echo "\nDie Tagesverzeichnisse von Montag bis Sonntag von ${backupVerzeichnis} werden geloescht: `date`" >> $logfileName
rm -r "${backupZiel}/$datenQuelle/1_Tage/T1_Montag/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T2_Dienstag/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T3_Mittwoch/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T4_Donnerstag/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T5_Freitag/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T6_Samstag/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/1_Tage/T7_Sonntag/${backupVerzeichnis}"
echo "Die Tagesverzeichnisse von ${backupVerzeichnis} sind geloescht :`date`" >> $logfileName
}
wochenverzeichnisseLoeschen() {
# Loeschen der Wochenverzeichnisse
echo "\nDie Wochenverzeichnisse Woche 1 bis Woche 4 von ${backupVerzeichnis} werden geloescht : `date`" >> $logfileName
rm -r "${backupZiel}/$datenQuelle/2_Wochen/W1_Woche/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/2_Wochen/W2_Woche/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/2_Wochen/W3_Woche/${backupVerzeichnis}"
rm -r "${backupZiel}/$datenQuelle/2_Wochen/W4_Woche/${backupVerzeichnis}"
echo "Die Wochenverzeichnisse von ${backupVerzeichnis} sind geloescht : `date`" >> $logfileName
}
###############################################################################
#### Konfiguration ####
###############################################################################
# Argumente des Shell-Scriptes
[ -z "$1" "$2" "$3" ] && exit 1
# Daten-Quelle URL
datenQuelle=$1
# datenQuelle="Bibliothek"
# Backup-Ziel URL
backupZiel=$2
# backupZiel="NetBackup"
# Zu sicherndes Verzeichnis
backupVerzeichnis=$3
# backupVerzeichnis="Buecher"
# Datum Formatiert speichern (YYYY-MM-DD)
datum=$(date +%Y-%m-%d)
#datum=03-08-2015 #1
#datum=04-08-2015 #2
#datum=05-08-2015 #3
#datum=06-08-2015 #4
#datum=07-08-2015 #5
#datum=08-08-2015 #6
#datum=09-08-2015 #7
# Tag in der Woche (1 - 7)
tagNum=`date +%u`
#tagNum=1
#tagNum=2
#tagNum=3
#tagNum=4
#tagNum=5
#tagNum=6
#tagNum=7
# Wochentag des Datums ermitteln (Monatag - Sonntag)
tagName=$(date +%A)
#tagName=Montag #1
#tagName=Dienstag #2
#tagName=Mittwoch #3
#tagName=Donnerstag #4
#tagName=Freitag #5
#tagName=Samstag #6
#tagName=Sonntag #7
# Monat des Datums ermitteln (1 - 12)
monatNum=`date +%m`
# Monat des Datums ermitteln (Januar - Dezember)
monatName=`date +%B`
# Woche des Backups ermitteln
if [ ! -d "${backupZiel}/$datenQuelle/2_Wochen/W1_Woche/${backupVerzeichnis}" ]
then
wocheNum=1
elif [ ! -d "${backupZiel}/$datenQuelle/2_Wochen/W2_Woche/${backupVerzeichnis}" ]
then
wocheNum=2
elif [ ! -d "${backupZiel}/$datenQuelle/2_Wochen/W3_Woche/${backupVerzeichnis}" ]
then
wocheNum=3
elif [ ! -d "${backupZiel}/$datenQuelle/2_Wochen/W4_Woche/${backupVerzeichnis}" ]
then
wocheNum=4
fi
# Schalter fuer Wochenbackup
wochenBackup="n"
# Schalter fuer Monatsbackup
monatBackup="n"
###############################################################################
#### Programm-Start ####
###############################################################################
# Name des Datensicherungs-Log
logfileName="/usr/local/log/${logDatum} ${logZeit} Datensicherung ${backupVerzeichnis} ${tagName}.log"
# Logging der Datensicherungswerte
echo "Start der Datensicherung fuer ${backupVerzeichnis} `date` \n" > $logfileName
echo "Die Daten-Quelle ist : $datenQuelle" >> $logfileName
echo "Das Backup-Ziel ist : $backupZiel" >> $logfileName
echo "Das Backup-Verzeichnis ist : $backupVerzeichnis" >> $logfileName
echo "Das Datum der Datensicherung ist : $datum" >> $logfileName
echo "Wochentag Nummer der Datensicherung : $tagNum" >> $logfileName
echo "Wochentag Name der Datensicherung : $tagName" >> $logfileName
echo "Nummer des Monats der Datensicherung : $monatNum" >> $logfileName
echo "Name des Monats der Datensicherung : $monatName" >> $logfileName
echo "Die Woche des Backups ist : $wocheNum" >> $logfileName
# Backupverzeichnis-Namen fuer Tage
# (T1_Montag, T2_Dienstag, T3_Mittwoch, T4_Donnerstag, T5_Freitag, T6_Samstag, T7 Sonntag)
# Wochentage prüfen und ermitteln (Montag - Sonntag)
backupTageVerzeichnis="${backupZiel}/${datenQuelle}/1_Tage/T${tagNum}_${tagName}/${backupVerzeichnis}"
echo "Das Backup-Ziel-Verzeichnis der Tage ist : $backupTageVerzeichnis" >> $logfileName
backupTage="${backupZiel}/${datenQuelle}/1_Tage/T${tagNum}_${tagName}"
echo "Das Backup-Tage der Tage ist : $backupTage" >> $logfileName
if [ ! -d "${backupZiel}/${datenQuelle}/1_Tage/T${tagNum}_${tagName}/${backupVerzeichnis}" ]
then
echo "Das Verzeichnis ${backupVerzeichnis} fuer ${tagName} existiert nicht" >> $logfileName
# Prüft ob ein TMP-Backups vorhanden ist?
backupTageTmpVerzeichnis="${backupZiel}/${datenQuelle}/1_Tage/T0_TMP/${backupVerzeichnis}"
echo "Pfade für Tage-TMP-Verzeichnis : $backupTageTmpVerzeichnis" >> $logfileName
backupTageTmp="${backupZiel}/${datenQuelle}/1_Tage/T0_TMP"
echo "Pfade für Tage-TMP : $backupTageTmp" >> $logfileName
if [ -d $backupTageTmpVerzeichnis ]
then
echo "Es besteht ein TMP-Backup und wird verschoben : `date`" >> $logfileName
mkdir -p $backupTage
mv $backupTageTmpVerzeichnis "${backupTage}/"
echo "Ende des Verschiebevorgangs : `date`" >> $logfileName
else
echo "Ein TMP-Backup ist nicht vorhanden" >> $logfileName
fi
# Prüfungen der einzelnen Tage
case $tagName in
Montag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
echo "Daten werden fuer ${backupVerzeichnis} kopiert : `date`" >> $logfileName
mkdir -p $backupTage
cp -a -R "${datenQuelle}/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi;;
Dienstag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Montags-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T1_Montag/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Montag wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T1_Montag/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
fi;;
Mittwoch) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Dienstags-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T2_Dienstag/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Dienstag wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T2_Dienstag/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
fi;;
Donnerstag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Mittwoch-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T3_Mittwoch/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Mittwoch wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T3_Mittwoch/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
fi;;
Freitag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Donnerstag-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T4_Donnerstag/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Donnerstag wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T4_Donnerstag/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
fi;;
Samstag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Freitag-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T5_Freitag/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Freitag wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T5_Freitag/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
fi;;
Sonntag) echo "Der ${tagName} wird geprüft" >> $logfileName
if [ ! -d $backupTageVerzeichnis ]
then
mkdir -p $backupTage
echo "Das Verzeichnis ${tagName} ist nicht vorhanden" >> $logfileName
# prüft ob es eine Samstag-Sicherung gibt
if [ -d "${backupZiel}/${datenQuelle}/1_Tage/T6_Samstag/${backupVerzeichnis}" ]
then
echo "Eine Sicherung von Samstag wird kopiert : `date`" >> $logfileName
cp -al -R "${backupZiel}/${datenQuelle}/1_Tage/T6_Samstag/${backupVerzeichnis}" $backupTage >> $logfileName
echo "Ende des Kopiervorgangs"
fi
else
echo "Das Verzeichnis ${tagName} besteht bereits" >> $logfileName
fi
wochenBackup="j"
echo "\nFreigabe des Wochenbackups : $wochenBackup" >> $logfileName
;;
esac
# Synchronisiert die Quelle mit dem Ziel
echo "\nDie Synchronisation der Daten beginnt : `date`" >> $logfileName
rsync -a "${datenQuelle}/${backupVerzeichnis}/" $backupTageVerzeichnis
echo "Die Synchronisation der Daten ist abgeschlossen : `date`" >> $logfileName
fi
# Backupverzeichnis-Namen fuer Wochen
# (W1_Woche, W2_Woche, W3_Woche, W4_Woche)
backupWochenVerzeichnis="${backupZiel}/${datenQuelle}/2_Wochen/W${wocheNum}_Woche/${backupVerzeichnis}"
echo "Das Backup-Wochen-Verzeichnis ist : ${backupWochenVerzeichnis} " >> $logfileName
backupWochen="${backupZiel}/${datenQuelle}/2_Wochen/W${wocheNum}_Woche"
echo "Die Backup-Wochen sind : ${backupWochen} " >> $logfileName
case $wochenBackup in
j) if [ ! -d $backupWochenVerzeichnis ]
then
echo "\nStart der Wochensicherung : $wocheNum" >> $logfileName
echo "Das Verzeichnis fuer Backup Woche $wocheNum existiert nicht" >> $logfileName
echo "Das ^Verzeichnis fuer Backup Woche $wocheNum wird erstellt" >> $logfileName
mkdir -p $backupWochenVerzeichnis
echo "Der Kopiervorgang der Wochendaten beginnt : `date`" >> $logfileName
cp -al -R $backupTageVerzeichnis $backupWochen
echo "Der Kopiervorgang der Wochendaten wurde abgeschlossen : `date`" >> $logfileName
echo "Die Synchronisation beginnt : `date`" >> $logfileName
rsync -a "${datenQuelle}/${backupVerzeichnis}/" $backupWochenVerzeichnis
echo "Die Synchronisation wurde abgeschlossen : `date` \n" >> $logfileName
if [ $wocheNum -lt 4 ]
then
# Neue Tagesvorlage aus dem Wochen-Backup kopieren
echo "Eine TMP-Basisicherung fuer Tagesvorlagen wird kopiert : `date`" >> $logfileName
if [ ! -d "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP/${backupVerzeichnis}" ]
then
mkdir -p "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP/${backupVerzeichnis}"
fi
cp -al -R "${backupZiel}/${datenQuelle}/2_Wochen/W${wocheNum}_Woche/${backupVerzeichnis}" "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP"
echo "Der Kopiervorgang der TMP-Sicherung ist abgeschlossen : `date`" >> $logfileName
else
# Monats-Backup freigeben
monatBackup="j"
echo "Das Monats-Backup wurde freigegeben : $monatBackup" >> $logfileName
fi
# Loeschen der Tagesverzeichisse
tagesverzeichnisseLoeschen
fi;;
n) echo "Es ist kein Wochen-Backup nötig" >> $logfileName
echo "Das Monats-Backup wurde freigegeben : $monatBackup" >> $logfileName
;;
esac
#Backupverzeicnis-Namen fuer Monate
# (M01_Januar, M02_Februar, M03_Maerz, M04_April, M05_Mai, M06_Juni,
# M07_Juli, M08_August, M09_September, M10_Oktober, M11_November, M12_Dezember)
backupMonateVerzeichnis="${backupZiel}/${datenQuelle}/3_Monate/M${monatNum}_${monatName}/${backupVerzeichnis}"
echo "Das Backup-Monate-Verzeichnis ist : ${backupMonateVerzeichnis} " >> $logfileName
backupMonate="${backupZiel}/${datenQuelle}/3_Monate/M${monatNum}_${monatName}"
echo "Die Backup-Monate sind : $backupMonate" >> $logfileName
case $monatBackup in
j) if [ ! -d "${backupZiel}/${datenQuelle}/3_Monate/M${monatNum}_${monatName}" ]
then
echo "Das Verzeichnis fuer Backup $monatName existiert nicht" >> $logfileName
echo "Das Verzeichnis wird erstellt und Daten werden kopiert : `date`" >> $logfileName
mkdir -p $backupMonateVerzeichnis
cp -al -R $backupWochenVerzeichnis $backupMonate
echo "Beginn der Synchronisation mit dem Zielverzeichnis (--delete) : `date`" >> $logfileName
# rsync -a --delete "$datenQuelle/" "$backupMonateVerzeichnis/$verzeichnis"
rsync -a --delete "${datenQuelle}/${backupVerzeichnis}/" $backupMonateVerzeichnis
echo "Ende der Synchronisation mit dem Zielverzeichnis (--delete) : `date`" >> $logfileName
# Neue Tagesvorlage aus dem Monats-Backup kopieren
echo "Eine TMP-Basisicherung fuer Monatsvorlagen ist nicht vorhanden und wird kopiert : `date`" >> $logfileName
if [ ! -d "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP/${backupVerzeichnis}" ]
then
mkdir -p "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP/${backupVerzeichnis}"
cp -al -R $backupMonateVerzeichnis "${backupZiel}/${datenQuelle}/1_Tage/T0_TMP"
echo "Der Kopiervorgang der TMP-Sicherung ist abgeschlossen : `date`" >> $logfileName
fi
# Loeschen der Wochenverzeichnisse
wochenverzeichnisseLoeschen
fi
;;
n) echo "Es ist kein Monats-Backup noetig" >> $logfileName
echo "Das Monats-Backup wurde freigegeben : $monatBackup" >> $logfileName
;;
esac
echo "\nEnde der Datensicherung fuer `date`" >> $logfileName