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