2017-07-21 17:08:44 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
## 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
|
2017-07-21 17:08:44 +02:00
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
## 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
|
|
|
|
|
2017-07-21 17:08:44 +02:00
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
## Command variables,
|
|
|
|
# These should be fine, but if something doesn't work these can be adjusted
|
2017-07-21 17:08:44 +02:00
|
|
|
MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
|
2017-07-21 20:53:13 +02:00
|
|
|
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; MKDIR="/bin/mkdir"
|
2017-07-21 17:08:44 +02:00
|
|
|
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
|
|
|
|
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
|
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
## Helpers
|
|
|
|
LAST="last"; INC="--link-dest=$TARGET/$LAST"
|
2017-07-21 17:08:44 +02:00
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
function backup ()
|
|
|
|
{
|
|
|
|
$DATE > $LOG
|
2017-07-21 17:08:44 +02:00
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
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
|
2017-07-21 17:08:44 +02:00
|
|
|
fi
|
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
# 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
|
2017-07-21 17:08:44 +02:00
|
|
|
fi
|
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
# Backup files
|
|
|
|
for SOURCE in "${SOURCES[@]}"
|
2017-07-21 17:08:44 +02:00
|
|
|
do
|
2017-07-21 20:53:13 +02:00
|
|
|
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
|
2017-07-21 17:08:44 +02:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
ERROR=1
|
2017-07-21 20:53:13 +02:00
|
|
|
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
|
2017-07-21 17:08:44 +02:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
ERROR=1
|
2017-07-21 20:53:13 +02:00
|
|
|
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
|
2017-07-21 17:08:44 +02:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
ERROR=1
|
2017-07-21 20:53:13 +02:00
|
|
|
fi
|
2017-07-21 17:08:44 +02:00
|
|
|
fi
|
2017-07-21 20:53:13 +02:00
|
|
|
done
|
2017-07-21 17:08:44 +02:00
|
|
|
|
2017-07-21 20:53:13 +02:00
|
|
|
# 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
|
2017-07-21 17:08:44 +02:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
ERROR=1
|
2017-07-21 20:53:13 +02:00
|
|
|
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
|
2017-07-21 17:08:44 +02:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
ERROR=1
|
|
|
|
fi
|
|
|
|
fi
|
2017-07-21 20:53:13 +02:00
|
|
|
|
|
|
|
$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 [ -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
|
2017-07-21 17:08:44 +02:00
|
|
|
ERROR=1
|
2017-07-21 20:53:13 +02:00
|
|
|
$ECHO "Plese don't provide to and from ssh information!" >> $LOG
|
|
|
|
$ECHO "No backup performed!" >> $LOG
|
2017-07-21 17:08:44 +02:00
|
|
|
fi
|
2017-07-21 20:53:13 +02:00
|
|
|
|
|
|
|
# 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"
|
2017-07-21 17:08:44 +02:00
|
|
|
fi
|
2017-07-21 20:53:13 +02:00
|
|
|
|
|
|
|
# Create daily backups
|
2017-07-22 08:36:58 +02:00
|
|
|
backup "daily/$($DATE +"%A")/$HOUR"
|
2017-07-21 20:53:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
|