TUBS/OSS-Editing/backup.sh

176 lines
5.3 KiB
Bash
Raw Normal View History

2022-03-24 22:51:32 +01:00
#!/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"