#!/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"