176 lines
5.3 KiB
Bash
Executable File
176 lines
5.3 KiB
Bash
Executable File
#!/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" |