sophisticated Backups mit Rsync Part II
Version 3.1
Features:
- Logs werden nun gzip komprimiert
- wöchentliche Backups aus der vorherigen Woche werden tar.gz komprimiert
#!/bin/sh # Philipp's backup-scripte version 3.1 ROOT=`pwd` BACKDIR=$ROOT/backup D=`eval date +%Y-%m-%d` W=`eval date +%Y-%W` w=`eval date +%w` LATEST="latest" EXCLUDE=$ROOT/exclude.txt SOURCES=$ROOT/sources.txt LOG=$ROOT/log/$D.log # Array mit allen ben‚‚tigten Verzeichnissen und Ordnern folders=( $ROOT/log ) files=( $EXCLUDE $SOURCES $LOG) for folder in ${folders[@]}; do if [ ! -d $folder ] ; then mkdir -p $folder; fi done for file in ${files[@]}; do if [ ! -f $file ] ; then touch $file; fi done log () { if [ -z "$1" ] ; then echo "" > $LOG ; fi echo $1 echo $1 >> $LOG } # needs Hostname gzipLastWeekly (){ log "==================================================================" log "compress..."; echo $1 ROOT=`pwd` L_BACKDIR="$ROOT/backup/$1/weekly"; if [ -d $L_BACKDIR ] ; then NUM=${#L_BACKDIR}+1; L_LATEST=`ls -al $L_BACKDIR/latest` L_FOLDER="${L_LATEST#*-> }"; L_FILE="${L_LATEST#*-> }"; L_FILENAME="${L_FILE:$NUM:7}"; log "L_BACKDIR $L_BACKDIR"; #log "L_LATEST $L_LATEST"; log "L_FOLDER $L_FOLDER"; log "L_FILE $L_FILE"; log "L_FILENAME $L_FILENAME"; log "==================================================================" if [ -d $L_FOLDER ] ; then if [ $L_FILENAME != "$W" ]; then log "compress $L_FOLDER"; cd $L_BACKDIR tar -cvf - $L_FILENAME/ | gzip > $L_FILENAME.tar.gz | tee -a $LOG cd $ROOT rm -R $L_FOLDER log "MD5: " log "==================================================================" md5 $L_BACKDIR/$L_FILENAME.gz -out $LOG; log "==================================================================" fi fi fi log "...done"; log "==================================================================" } # Ab hier gehts dann richtig los :-) log log "STARTING BACKUP..." log "date: $D" #stopping start time #TIME0= expr `date +%s`; # backup following sources for SOURCE in `cat $SOURCES`; do log "" log "==================================================================" log "====== backup: $SOURCE " if [ ! -d $BACKDIR/$SOURCE/daily/$D ] ; then mkdir -p $BACKDIR/$SOURCE/daily/$D; fi if [ ! -f $BACKDIR/$SOURCE/src-root.txt ] ; then touch $BACKDIR/$SOURCE/src-root.txt; fi if [ ! -f $BACKDIR/$SOURCE/src-folders.txt ] ; then touch $BACKDIR/$SOURCE/src-folders.txt; fi #Logindaten lesen LOGINDATA=`cat $BACKDIR/$SOURCE/src-root.txt` if [ ! "$LOGINDATA" = "" ]; then log "====== benutze $LOGINDATA" log "==================================================================" log "" for FOLDER in `cat $BACKDIR/$SOURCE/src-folders.txt`; do log "backup up... $FOLDER" mkdir -p $BACKDIR/$SOURCE/daily/$D/$FOLDER ### wenn schon latest-day vorhanden, dann sichere nur ‚nderungen if [ -d $BACKDIR/$SOURCE/daily/$LATEST ] ; then log "using latest: $BACKDIR/$SOURCE/daily/$LATEST" rsync -zrva $OLD --exclude-from=$EXCLUDE --link-dest=$BACKDIR/$SOURCE/daily/$LATEST/$FOLDER $LOGINDATA/$FOLDER/ $BACKDIR/$SOURCE/daily/$D/$FOLDER | tee -a $LOG else rsync -zrva $OLD --exclude-from=$EXCLUDE $LOGINDATA/$FOLDER/ $BACKDIR/$SOURCE/daily/$D/$FOLDER | tee -a $LOG fi done ### setze latest von altem Stand auf aktuelles Backup if [ -d $BACKDIR/$SOURCE/daily/$D ] ; then log "Daily: deleting ln last daily latest: $BACKDIR/$SOURCE/daily/$LATEST" if [ -d $BACKDIR/$SOURCE/daily/$LATEST ] ; then rm $BACKDIR/$SOURCE/daily/$LATEST; fi log "Daily: updating ln daily latest: $BACKDIR/$SOURCE/daily/$LATEST" ln -s $BACKDIR/$SOURCE/daily/$D $BACKDIR/$SOURCE/daily/$LATEST | tee -a $LOG log "Daily: deleting ln last daily latest: $BACKDIR/$SOURCE/$LATEST" if [ -d $BACKDIR/$SOURCE/$LATEST ] ; then rm $BACKDIR/$SOURCE/$LATEST; fi log "Daily: updating ln daily latest: $BACKDIR/$SOURCE//$LATEST" ln -s $BACKDIR/$SOURCE/daily/$D $BACKDIR/$SOURCE/$LATEST | tee -a $LOG fi ### setze latest-global von altem Stand auf aktuelles Backup log "Daily: deleting ln last global latest: $BACKDIR/$SOURCE/$LATEST" if [ -d $BACKDIR/$SOURCE/$LATEST ] ; then rm $BACKDIR/$SOURCE/$LATEST; fi log "Daily: updating ln global latest" ln -s $BACKDIR/$SOURCE/daily/$D $BACKDIR/$SOURCE/$LATEST | tee -a $LOG ## wenn ende der Woche, dann erstelle Snapshot der Woche if [ "$w" = "0" ]; then log "Weekly: create week-backup for $W" for FOLDER in `cat $BACKDIR/$SOURCE/src-folders.txt`; do mkdir -p $BACKDIR/$SOURCE/weekly/$W/$FOLDER rsync -zrva $OLD --exclude-from=$EXCLUDE $BACKDIR/$SOURCE/daily/$D/$FOLDER/ $BACKDIR/$SOURCE/weekly/$W/$FOLDER | tee -a $LOG done ### komprimiere letztes week Backup log "==================================================================" log "Weekly: compressing last weekly latest" gzipLastWeekly $SOURCE ### setze latest-day von altem Stand auf aktuelles Backup log "Weekly: deleting ln last daily latest: $BACKDIR/$SOURCE/daily/$LATEST" if [ -d $BACKDIR/$SOURCE/daily/$LATEST ] ; then rm $BACKDIR/$SOURCE/daily/$LATEST; fi ### loesche alte Backups log "Weekly: delete all daily folders" rm -R $BACKDIR/$SOURCE/daily/* log "Weekly: updating ln daily latest: $BACKDIR/$SOURCE/daily/$LATEST" ln -s $BACKDIR/$SOURCE/weekly/$W $BACKDIR/$SOURCE/daily/$LATEST | tee -a $LOG ### setze latest-week von altem Stand auf aktuelles Backup log "Weekly: deleting ln last weekly latest: $BACKDIR/$SOURCE/weekly/$LATEST" if [ -d $BACKDIR/$SOURCE/weekly/$LATEST ] ; then rm $BACKDIR/$SOURCE/weekly/$LATEST; fi log "Weekly: updating ln weekly latest" ln -s $BACKDIR/$SOURCE/weekly/$W $BACKDIR/$SOURCE/weekly/$LATEST | tee -a $LOG ### setze latest-global von altem Stand auf aktuelles Backup log "Weekly: deleting ln last global latest: $BACKDIR/$SOURCE/$LATEST" if [ -d $BACKDIR/$SOURCE/$LATEST ] ; then rm $BACKDIR/$SOURCE/$LATEST; fi log "Weekly: updating ln global latest" ln -s $BACKDIR/$SOURCE/weekly/$W $BACKDIR/$SOURCE/$LATEST | tee -a $LOG fi fi done #stopping end time #TIME1= expr `date +%s`; #ERG = expr `$TIME1 - $TIME0`; log "==================================================================" log "DONE" #log "using $ERG seconds" log "==================================================================" gzip $LOG -f