From d319d52c0d8c28dc3b5631c1911604667ab61e7b Mon Sep 17 00:00:00 2001 From: Stefan Sterz Date: Fri, 21 Jul 2017 20:53:13 +0200 Subject: [PATCH] create initial script --- backup.sh | 216 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 127 insertions(+), 89 deletions(-) mode change 100755 => 100644 backup.sh diff --git a/backup.sh b/backup.sh old mode 100755 new mode 100644 index 213dc7b..f607aec --- a/backup.sh +++ b/backup.sh @@ -1,106 +1,144 @@ #!/bin/bash -# Simple backup with rsync -# local-mode, tossh-mode, fromssh-mode -SOURCES=(/root /etc /home /boot ) -TARGET="/home/sterzy/backup" +## General Settings +SOURCES=(/root /etc /home /boot) # What folder should be saved? +TARGET="/home/sterzy/backup" # Where should they be saved? (absolute path!) +EXCLUDEFROM="" # What files are supposed to be excluded? +MAILADRESS="" # To which email adress should the logs be sent? +LISTPACKAGES="" # Change to non empty string to save a list of + # installed packages! +LOG=$0.log # Log file name & location +RSYNCCONF=(--delete) # Additional rsync flags -# edit or comment with "#" -#LISTPACKAGES=listdebianpackages # local-mode and tossh-mode -MONTHROTATE=monthrotate # use DD instead of YYMMDD - -RSYNCCONF=(--delete) -#MOUNTPOINT="/media/daten" # check local mountpoint -MAILREC="hi@sterzy.com" - -SSHUSER="sterzy" -#FROMSSH="fromssh-server" -TOSSH="backup-pi" -SSHPORT=22 - -### do not edit ### +## SSH Settings +TOSSH="" # What ssh server stores the backups? +FROMSSH="" # From what ssh server should the files be + # backuped? + # For several reasons TOSSH and FROMSSH cannot + # be used at the same time! +TOSSHUSER="" # The ssh user +TOSSHPORT=22 # The ssh port +FROMSSHUSER="" # The ssh user +FROMSSHPORT=22 # The ssh port + +## Command variables, +# These should be fine, but if something doesn't work these can be adjusted MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh" -LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm" +LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; MKDIR="/bin/mkdir" DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail" CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync" + +## Helpers LAST="last"; INC="--link-dest=$TARGET/$LAST" -LOG=$0.log -$DATE > $LOG +function backup () +{ + $DATE > $LOG + + if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then + $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '" >> $LOG + $DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' ' >> $LOG 2>&1 + fi + + # Create folders that don't exist + if [ -n "$S" ] && [ -n "$TOSSH" ] && [ -z "$FROMSSH" ]; then + $ECHO "$S $TOSSH $MKDIR -p $TARGET$1" >> $LOG + $S $TOSSH "$MKDIR -p \"$TARGET\"$1" >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + elif ( [ -n "$S" ] && [ -n "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] ); then + $ECHO "$MKDIR -p $TARGET$1" >> $LOG + $MKDIR -p "$TARGET"$1 >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + fi + + # Backup files + for SOURCE in "${SOURCES[@]}" + do + if [ -n $"S" ] && [ -n "$TOSSH" ] && [ -z "$FROMSSH" ]; then + $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$1\" $INC " >> $LOG + $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$1" $INC >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + elif [ -n $"S" ] && [ -z "$TOSSH" ] && [ -n "$FROMSSH" ]; then + $ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$SOURCE\" ${RSYNCCONF[@]} $TARGET$1 $INC" >> $LOG + $RSYNC -e "$S" -avR "$FROMSSH:\"$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$1 $INC >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + elif [-z "$S"] && [ -z "$TOSSH" ] && [ -z "$FROMSSh" ]; then + $ECHO "$RSYNC -avR \"$SOURCE\" ${RSYNCCONF[@]} $TARGET$1 $INC" >> $LOG + $RSYNC -avR "$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$1 $INC >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + fi + done + + # Create a link to the latest backup + if [ -n "$S" ] && [ -n "$TOSSH" ] && [ -z "$FROMSSH" ]; then + $ECHO "$S $TOSSH $LN -nsf $TARGET$1 $TARGET$LAST" >> $LOG + $S $TOSSH "$LN -nsf \"$TARGET\"$1 \"$TARGET\"$LAST" >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + elif ( [ -n "$S" ] && [ -n "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] ); then + $ECHO "$LN -nsf $TARGET$1 $TARGET$LAST" >> $LOG + $LN -nsf "$TARGET"$1 "$TARGET"$LAST >> $LOG 2>&1 + if [ $? -ne 0 ]; then + ERROR=1 + fi + fi + + $DATE >> $LOG + + if [ -n MAILADRESS ]; then + if [ -n $ERROR ]; then + $MAIL -s "[Backup] error occured during backup - $LOG" $MAILADRESS < $LOG + else + $MAIL -s "[Backup] backup created successfully - $LOG" $MAILADRESS < $LOG + fi + fi +} if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then TARGET=$TARGET/ fi -if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then - $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '" >> $LOG - $DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' ' >> $LOG 2>&1 -fi - -if [ "$MOUNTPOINT" ]; then - MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT"); -fi - -if [ -z "$MOUNTPOINT" ] || [ "$MOUNTED" ]; then - if [ -z "$MONTHROTATE" ]; then - TODAY=$($DATE +%y%m%d) - else - TODAY=$($DATE +%d) - fi - - if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then - S="$SSH -p $SSHPORT -l $SSHUSER"; - fi - - for SOURCE in "${SOURCES[@]}" - do - if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then - $ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC" >> $LOG - $RSYNC -e "$S" -avR "$FROMSSH:\"$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC >> $LOG 2>&1 - if [ $? -ne 0 ]; then - ERROR=1 - fi - fi - if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then - $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$TODAY\" $INC " >> $LOG - $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$TODAY" $INC >> $LOG 2>&1 - if [ $? -ne 0 ]; then - ERROR=1 - fi - fi - if [ -z "$S" ]; then - $ECHO "$RSYNC -avR \"$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC" >> $LOG - $RSYNC -avR "$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC >> $LOG 2>&1 - if [ $? -ne 0 ]; then - ERROR=1 - fi - fi - done - - if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then - $ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG - $SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf \"$TARGET\"$TODAY \"$TARGET\"$LAST" >> $LOG 2>&1 - if [ $? -ne 0 ]; then - ERROR=1 - fi - fi - if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] ); then - $ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG - $LN -nsf "$TARGET"$TODAY "$TARGET"$LAST >> $LOG 2>&1 - if [ $? -ne 0 ]; then - ERROR=1 - fi - fi -else - $ECHO "$MOUNTPOINT not mounted" >> $LOG +if [ -n "$TOSSH" ] && [ -z "$FROMSSH" ]; then + S="$SSH -p $TOSSHPORT -l $TOSSHUSER" +elif [ -z "$TOSSH" ] && [ -n "$FROMSSH" ]; then + S="$SSH -p $FROMSSHPORT -l $FROMSSHUSER" +elif [ -n "$TOSSH" ] && [ -n "$FROMSSH" ]; then ERROR=1 + $ECHO "Plese don't provide to and from ssh information!" >> $LOG + $ECHO "No backup performed!" >> $LOG fi -$DATE >> $LOG -if [ -n "$MAILREC" ]; then - if [ $ERROR ];then - $MAIL -s "Error Backup $LOG" $MAILREC < $LOG - else - $MAIL -s "Backup $LOG" $MAILREC < $LOG - fi + +# Get date etc. +WEEKDAY=$($DATE +"%u") # %a = weekday as number +DAY=$($DATE +"%d") # %d = day in month as number +MONTH=$($DATE +%m) # %m = month as number +HOUR=$($DATE +"%H") # %H = hour as number + +# Create a backup every first day in a month +if [[ $DAY = 1 ]]; then + backup "monthly/$MONTH" fi + +# Create a special backup approx every week +if [[ $WEEKDAY = 7 ]]; then + let WEEK=($DAY+6)/7 + backup "weekly/$WEEK" +fi + +# Create daily backups +backup "daily/$DAY-$HOUR" + + +