176 lines
5.3 KiB
Bash
176 lines
5.3 KiB
Bash
|
#!/bin/bash
|
||
|
# Copyright (c) 2021 Janic Voser Mettmenstetten, Zurich, Switzerland. All rights reserved.
|
||
|
# TUBS - The Ultimate Backup Script
|
||
|
#
|
||
|
# Command:
|
||
|
#rsync -av /SRC/ --backup-dir=/FULL-1/ /FULL/ --delete
|
||
|
|
||
|
|
||
|
|
||
|
# Config
|
||
|
CONFIG_FILE=/etc/tubs/config # Any Config File
|
||
|
# Defaults
|
||
|
DATE_FORMAT="+%Y-%m-%d_%H-%M"
|
||
|
TIME_FORMAT="+%H-%M-%S"
|
||
|
BACKUP_SRC_ARRAY=("/etc" "/home/janic/Documents/Reverse Engeenering/OSS-Editing/Tests/SRC") # All SRC-Directorys, separated with a space & in double quotes
|
||
|
BACKUP_DEST="/home/janic/Documents/Reverse Engeenering/OSS-Editing/Tests/DEST"
|
||
|
PID_FILE_NAME="pid" # Set diffrent, if multiple instances should run at once
|
||
|
LAST_BACKUP_FILE_NAME="LAST_BACKUP"
|
||
|
DISKSPACE_WARNING_SOFT=80 #Warn if the Diskspace is running out
|
||
|
DISKSPACE_WARNING_HARD=95 #Stop the Backup from execution
|
||
|
BACKUP_DAYS="1234567" # 1 = Monday, Example (Saturday no backup: "123457"- Used for excluding certain days
|
||
|
BACKUP_TODAY="no" # Use this config to overwrite (Only use if manual executed)
|
||
|
BACKUP_RSYNC_ARG=("-av" "--delete") # Save Rsync-Options as a array, else it will parse all options as one String
|
||
|
|
||
|
# Information Gathering
|
||
|
if [ -f $CONFIG_FILE ]
|
||
|
then
|
||
|
source "$CONFIG_FILE"
|
||
|
fi
|
||
|
|
||
|
## Variable Generation
|
||
|
DATE=$(date $DATE_FORMAT)
|
||
|
BACKUP_DEST_CONFIG=$BACKUP_DEST/Config
|
||
|
PID_FILE="$BACKUP_DEST_CONFIG/$PID_FILE_NAME"
|
||
|
BACKUP_DEST_LOG="$BACKUP_DEST/Logs"
|
||
|
LOG_FILE_NAME="Logfile_$DATE"
|
||
|
LOG_FILE=$BACKUP_DEST_LOG/$LOG_FILE_NAME
|
||
|
BACKUP_DEST_DATA=$BACKUP_DEST/Data
|
||
|
BACKUP_DEST_FULL=$BACKUP_DEST_DATA/Full
|
||
|
BACKUP_LAST_SUCCESSFUL=$BACKUP_DEST_CONFIG/$LAST_BACKUP_FILE_NAME
|
||
|
if [ -f "$BACKUP_LAST_SUCCESSFUL" ]
|
||
|
then
|
||
|
BACKUP_INCREMENTAL_NAME="$BACKUP_NAME""_""$(cat "$BACKUP_LAST_SUCCESSFUL")"
|
||
|
BACKUP_DEST_INCREMENTAL=$BACKUP_DEST_DATA/$BACKUP_INCREMENTAL_NAME
|
||
|
fi
|
||
|
SCRIPT_SUCCESSFUL=false
|
||
|
|
||
|
# Functions
|
||
|
## LOG / Console-Output
|
||
|
function Log() { # Usage: Log Message ?Soudlevel?[silent, noisy, exit] ?State?[info, notice, warn, err]
|
||
|
Timestamp
|
||
|
if [ -z "$3" ]
|
||
|
then
|
||
|
case "$3" in
|
||
|
info)
|
||
|
tput setaf 4 setab 0 # Blue
|
||
|
;;
|
||
|
notice)
|
||
|
tput setaf 2 setab 0 bold # Green Bold
|
||
|
;;
|
||
|
warn)
|
||
|
tput setaf 3 setab 0 bold # Yellow Bold
|
||
|
;;
|
||
|
err)
|
||
|
tput setaf 1 setab 0 bold # Red Bold
|
||
|
;;
|
||
|
*)
|
||
|
tput sgr0 # Reset tput profile
|
||
|
;;
|
||
|
esac
|
||
|
fi
|
||
|
case "$2" in
|
||
|
silent)
|
||
|
echo "$TIME : $1" | tee "$LOG_FILE"
|
||
|
;;
|
||
|
noisy)
|
||
|
echo "$TIME : $1" | tee "$LOG_FILE"
|
||
|
;;
|
||
|
exit)
|
||
|
echo "$TIME : Exiting cause: $1" | tee "$LOG_FILE"
|
||
|
End
|
||
|
;;
|
||
|
*)
|
||
|
echo "$TIME : Internal error - False use of Log-Function"
|
||
|
echo "$TIME : Additional Information: $1"
|
||
|
;;
|
||
|
esac
|
||
|
if [ -z "$3" ]
|
||
|
then
|
||
|
tput sgr0 # Reset tput profile
|
||
|
fi
|
||
|
}
|
||
|
## Timestamp
|
||
|
function Timestamp() {
|
||
|
TIME=$(date $TIME_FORMAT)
|
||
|
}
|
||
|
## Ending Function
|
||
|
function End() {
|
||
|
if [ $SCRIPT_SUCCESSFUL = true ]
|
||
|
then
|
||
|
echo "Backup Successful" > "$LOG_FILE"
|
||
|
echo "$DATE" > "$BACKUP_LAST_SUCCESSFUL"
|
||
|
rm "$PID_FILE"
|
||
|
else
|
||
|
echo "Backup not Successful" > "$LOG_FILE"
|
||
|
fi
|
||
|
}
|
||
|
## Diskspace Check
|
||
|
function check_diskspace() {
|
||
|
USED_DISKSPACE=$(df "$BACKUP_DEST" | tail -n1 | cut -d"%" -f 1 | rev | cut -d " " -f 1 | rev)
|
||
|
if [[ $USED_DISKSPACE -ge $DISKSPACE_WARNING_HARD ]]
|
||
|
then
|
||
|
Log "Diskspace running out, Stoping Backup" "exit" "err"
|
||
|
Log "Diskspace used: $USED_DISKSPACE%" "exit" "err"
|
||
|
elif [[ $USED_DISKSPACE -ge $DISKSPACE_WARNING_SOFT ]]
|
||
|
then
|
||
|
Log "Diskspace running out!" "noisy" "warn"
|
||
|
Log "Diskspace used: $USED_DISKSPACE%" "noisy" "warn"
|
||
|
else
|
||
|
Log "Diskspace used: $USED_DISKSPACE%" "noisy" "info"
|
||
|
fi
|
||
|
}
|
||
|
function check_FileStructure() {
|
||
|
$BACKUP_DEST
|
||
|
}
|
||
|
# Script
|
||
|
## Check if Configfile exists
|
||
|
if [ ! -f $CONFIG_FILE ]
|
||
|
then
|
||
|
Log "Missing Configfile" "noisy" "warn"
|
||
|
fi
|
||
|
## Check if TUBS is still running
|
||
|
if [ -e "$PID_FILE" ]
|
||
|
then
|
||
|
Log "Another TUBS is running with PID $(cat "$PID_FILE" )" "exit" "err"
|
||
|
else
|
||
|
Log "Starting Backup"
|
||
|
echo $$ > "$PID_FILE"
|
||
|
fi
|
||
|
## Check day of Week
|
||
|
if [ $BACKUP_TODAY == "yes" ]
|
||
|
then
|
||
|
Log "Forcing Backup Today" "noisy" "warn"
|
||
|
else
|
||
|
DAY_OF_WEEK=$(date +%u)
|
||
|
if [[ $BACKUP_DAYS == *"$DAY_OF_WEEK"* ]];
|
||
|
then
|
||
|
Log "Today is a happy Backup Day" "noisy" "notice"
|
||
|
else
|
||
|
Log "Set Variable \$BACKUP_TODAY to yes, so the backup will be forced" "noisy" "notice"
|
||
|
Log "Today is sadly no Backup Day" "exit" "warn"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
## Check diskspace
|
||
|
check_diskspace
|
||
|
|
||
|
## Check Filestructure and create Missing
|
||
|
if [ ! -d "$BACKUP_DEST" ]
|
||
|
then
|
||
|
Log "First Backup? No problem. Creating Backup Folder" "noisy" "notice"
|
||
|
fi
|
||
|
mkdir -p "$BACKUP_DEST"
|
||
|
mkdir -p "$BACKUP_DEST_CONFIG"
|
||
|
mkdir -p "$BACKUP_DEST_FULL"
|
||
|
mkdir -p "$BACKUP_DEST_LOG"
|
||
|
for BACKUP_SRC_DIR in "${BACKUP_SRC_ARRAY[@]}"
|
||
|
do
|
||
|
mkdir -p "$BACKUP_DEST_FULL/$BACKUP_SRC_DIR"
|
||
|
## Create Backups with Rsync
|
||
|
BACKUP_SRC_DIR_NAME=$(echo "$BACKUP_SRC_DIR" | rev | cut -d "/" -f1 | rev)
|
||
|
rsync "${BACKUP_RSYNC_ARG[@]}" "$BACKUP_SRC_DIR" --backup-dir="$BACKUP_DEST_INCREMENTAL" "$BACKUP_DEST_FULL/$BACKUP_SRC_DIR_NAME"
|
||
|
done
|
||
|
|
||
|
SCRIPT_SUCCESSFUL=true
|
||
|
Log "Backup Finished" "exit" "notice"
|