Compare commits
8 Commits
9fa7860e36
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 5677580138 | |||
| 13793d770d | |||
| 8730667cea | |||
| ab812ee0ba | |||
| 3bdd83fc1d | |||
| a621142148 | |||
|
|
d00af41ec4 | ||
|
|
5bc36720fc |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
OSS-Editing/Tests/*/*
|
OSS-Editing/Tests/*/*
|
||||||
|
TEST/*/*
|
||||||
2
LICENSE
2
LICENSE
@@ -58,7 +58,7 @@ APPENDIX: How to apply the Apache License to your work.
|
|||||||
|
|
||||||
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
Copyright 2022 Janic Voser
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,176 +0,0 @@
|
|||||||
#!/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"
|
|
||||||
@@ -1,302 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Copyright (c) 2012 Peter Varkoly Nürnberg, Germany. All rights reserved.
|
|
||||||
# oss-backup
|
|
||||||
#
|
|
||||||
# $Id: oss-backup,v 1.10 2007/07/18 16:43:22 pv Exp $
|
|
||||||
#
|
|
||||||
|
|
||||||
LOGFILE=/var/log/oss-backup.log
|
|
||||||
DATE=$(date +%Y-%m-%d-%H-%M)
|
|
||||||
#TODO Make all variables configurable.
|
|
||||||
MYSQLDUMP_OPTIONS="--lock-tables --add-drop-database --add-locks --quote-names --opt --create-options"
|
|
||||||
MAILADDR="admin"
|
|
||||||
FORCE="no"
|
|
||||||
VERBOSE="yes"
|
|
||||||
CONFIG=/etc/sysconfig/schoolserver
|
|
||||||
RSYNCPARS=" -aA --delete --size-only "
|
|
||||||
LIMIT=80
|
|
||||||
DAY_OF_WEEK=$( date +%u )
|
|
||||||
|
|
||||||
if [ -e /var/adm/oss/BackupRunning ]
|
|
||||||
then
|
|
||||||
BPID=$( cat /var/adm/oss/BackupRunning )
|
|
||||||
if [ -d /proc/$BPID ]; then
|
|
||||||
echo "An other backup process is running with PID: $BPID"
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $$ > /var/adm/oss/BackupRunning
|
|
||||||
|
|
||||||
function TheEnd(){
|
|
||||||
rm /var/adm/oss/BackupRunning
|
|
||||||
echo $DATE > /var/adm/backup/LAST_BACKUP
|
|
||||||
if [ "$2" ]; then
|
|
||||||
LOG "$2 $1";
|
|
||||||
fi
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
function usage (){
|
|
||||||
echo
|
|
||||||
echo "Usage: $(basename $0) [OPTION] "
|
|
||||||
echo " -h|--help : help (this message)"
|
|
||||||
echo " -f : force backup (even if it's disabled in config)"
|
|
||||||
echo " -v : be verbose"
|
|
||||||
echo
|
|
||||||
echo " Use this script to immediately create a backup of your OSS."
|
|
||||||
echo " You can find the configuration in $CONFIG."
|
|
||||||
echo " Feel free to read the administration handbook for further details."
|
|
||||||
echo
|
|
||||||
TheEnd $1
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_discspace() {
|
|
||||||
if [ "$SCHOOL_BACKUP_WARNING_LIMIT" ]; then
|
|
||||||
LIMIT=$SCHOOL_BACKUP_WARNING_LIMIT
|
|
||||||
fi
|
|
||||||
|
|
||||||
USED=$(df $1 | tail -n1 | awk '{ print $(NF-1) }' | sed s/%//)
|
|
||||||
if [ $USED -gt $LIMIT ]; then
|
|
||||||
{
|
|
||||||
AVAIL=$(df -h $1 | tail -n1 | awk '{ print $(NF-2) }')
|
|
||||||
echo "WARNING: only $AVAIL space available on $1." | tee -a $LOGFILE
|
|
||||||
} | mail -s "BACKUP WARNING from $0" $MAILADDR
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function LOG() {
|
|
||||||
LOG_DATE=`date "+%b %d %H:%M:%S"`
|
|
||||||
HOST=`hostname`
|
|
||||||
echo "$LOG_DATE $HOST oss-backup: $1" >> $LOGFILE
|
|
||||||
if [ "$VERBOSE" = "yes" ]; then
|
|
||||||
echo "$1"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
while getopts 'fhv --long help --' OPTION ; do
|
|
||||||
case $OPTION in
|
|
||||||
h|H|help) usage 0
|
|
||||||
;;
|
|
||||||
f) FORCE="yes"
|
|
||||||
;;
|
|
||||||
v) VERBOSE="yes"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
shift $(( OPTIND - 1 ))
|
|
||||||
|
|
||||||
if [ ! -f $CONFIG ]; then
|
|
||||||
echo -e "\033[0;31;1mThis script is for Open School Server only!\033[\0m"
|
|
||||||
echo -e "\033[0;31;1m********* exiting *********\033[\0m"
|
|
||||||
TheEnd 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Read the configuration
|
|
||||||
. $CONFIG
|
|
||||||
if [ -z "$SCHOOL_BACKUP_DAYS" ]; then
|
|
||||||
SCHOOL_BACKUP_DAYS="1234567"
|
|
||||||
fi
|
|
||||||
if [ "$SCHOOL_BACKUP_CAN_NOT_SAVE_ACL" = "yes" ]; then
|
|
||||||
RSYNCPARS=" -a --delete "
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_CAN_NOT_SAVE_OWNER" = "yes" ]; then
|
|
||||||
RSYNCPARS=" -r --delete "
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${SCHOOL_BACKUP_DAYS/$DAY_OF_WEEK/}" = $SCHOOL_BACKUP_DAYS -a "$FORCE" != "yes" ]; then
|
|
||||||
LOG "********** No backup needed today **********"
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
MAILADDR="admin@$SCHOOL_DOMAIN"
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP" = "yes" ] || [ "$FORCE" = "yes" ] ; then
|
|
||||||
LOG "********** Starting Backup **********"
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_START_CMD" ]; then
|
|
||||||
eval $SCHOOL_BACKUP_START_CMD
|
|
||||||
fi
|
|
||||||
if [ -e /var/adm/backup/LAST_BACKUP ]; then
|
|
||||||
LAST_BACKUP=`cat /var/adm/backup/LAST_BACKUP`
|
|
||||||
else
|
|
||||||
LAST_BACKUP=$DATE
|
|
||||||
fi
|
|
||||||
# check needed configs
|
|
||||||
if [ -z $SCHOOL_BACKUP_FULL_DIR ]; then
|
|
||||||
VERBOSE="yes"
|
|
||||||
LOG "No SCHOOL_BACKUP_FULL_DIR defined - exiting"
|
|
||||||
TheEnd 1
|
|
||||||
fi
|
|
||||||
check_discspace $SCHOOL_BACKUP_FULL_DIR
|
|
||||||
if [ -z $SCHOOL_BACKUP_INC_DIR ]; then
|
|
||||||
VERBOSE="yes"
|
|
||||||
LOG "No SCHOOL_BACKUP_INC_DIR defined - using $SCHOOL_BACKUP_FULL_DIR instead"
|
|
||||||
SCHOOL_BACKUP_INC_DIR=$SCHOOL_BACKUP_FULL_DIR
|
|
||||||
else
|
|
||||||
check_discspace $SCHOOL_BACKUP_INC_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
#create the backup direcktory
|
|
||||||
BACKUP_DIR="$SCHOOL_BACKUP_INC_DIR/$LAST_BACKUP"
|
|
||||||
mkdir -p $BACKUP_DIR
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
touch $SCHOOL_BACKUP_FULL_DIR/DO_BACKUP
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export BACKUP_DIR
|
|
||||||
export SCHOOL_BACKUP_FULL_DIR
|
|
||||||
if [ "$SCHOOL_BACKUP_CHECK_MOUNT" = "yes" ]; then
|
|
||||||
mount | grep -q "$SCHOOL_BACKUP_FULL_DIR" || {
|
|
||||||
LOG "Unable to mount $SCHOOL_BACKUP_FULL_DIR"
|
|
||||||
TheEnd 5
|
|
||||||
}
|
|
||||||
mount | grep -q "$SCHOOL_BACKUP_INC_DIR" || {
|
|
||||||
LOG "Unable to mount $SCHOOL_BACKUP_INC_DIR"
|
|
||||||
TheEnd 5
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# copy sysconfig file schoolconf to the base for simple recovery
|
|
||||||
cp /etc/sysconfig/schoolserver $SCHOOL_BACKUP_FULL_DIR/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# save custom squidGuard database
|
|
||||||
LOG "Syncing custom squidGuard database"
|
|
||||||
mkdir -p $SCHOOL_BACKUP_FULL_DIR/var/lib/squidGuard/db/custom/
|
|
||||||
mkdir -p $BACKUP_DIR/var/lib/squidGuard/db/custom/
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/var/lib/squidGuard/db/custom/ \
|
|
||||||
/var/lib/squidGuard/db/custom/ \
|
|
||||||
$SCHOOL_BACKUP_FULL_DIR/var/lib/squidGuard/db/custom/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
LOG "Syncing samba"
|
|
||||||
if [ "$SCHOOL_BACKUP_CAN_NOT_SAVE_ACL" = "yes" ]; then
|
|
||||||
test -e $SCHOOL_BACKUP_FULL_DIR/samba_facls.gz && mv $SCHOOL_BACKUP_FULL_DIR/samba_facls.gz $BACKUP_DIR
|
|
||||||
getfacl --absolute-names -R /var/lib/samba/ | gzip > $SCHOOL_BACKUP_FULL_DIR/samba_facls.gz
|
|
||||||
fi
|
|
||||||
mkdir -p $BACKUP_DIR/var/lib/samba/
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/var/lib/samba/ /var/lib/samba/ $SCHOOL_BACKUP_FULL_DIR/var/lib/samba/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# save /etc - must run after samba-backup otherwise secrets.tdb.bak is not saved
|
|
||||||
if [ "$SCHOOL_BACKUP_CAN_NOT_SAVE_ACL" = "yes" ]; then
|
|
||||||
LOG "Saving acls on /etc/"
|
|
||||||
if [ -e $SCHOOL_BACKUP_FULL_DIR/etc_facls.gz ]; then
|
|
||||||
mv $SCHOOL_BACKUP_FULL_DIR/etc_facls.gz $BACKUP_DIR/etc_facls.gz
|
|
||||||
fi
|
|
||||||
getfacl --skip-base --absolute-names -R /etc/ | gzip > $SCHOOL_BACKUP_FULL_DIR/etc_facls.gz
|
|
||||||
fi
|
|
||||||
LOG "Syncing /etc/"
|
|
||||||
mkdir -p $BACKUP_DIR/etc/
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/etc/ /etc/ $SCHOOL_BACKUP_FULL_DIR/etc/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# save /root (needed already for ssh-key files)
|
|
||||||
LOG "Syncing /root/"
|
|
||||||
mkdir -p $BACKUP_DIR/root/
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/root/ /root/ $SCHOOL_BACKUP_FULL_DIR/root/
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_HOME" = "yes" ]; then
|
|
||||||
if [ "$SCHOOL_BACKUP_CAN_NOT_SAVE_ACL" = "yes" ]; then
|
|
||||||
LOG "Saving acls on /home/"
|
|
||||||
if [ -e $SCHOOL_BACKUP_FULL_DIR/home_facls.gz ]; then
|
|
||||||
mv $SCHOOL_BACKUP_FULL_DIR/home_facls.gz $BACKUP_DIR/home_facls.gz
|
|
||||||
fi
|
|
||||||
getfacl --skip-base --absolute-names -R /home/ | gzip > $SCHOOL_BACKUP_FULL_DIR/home_facls.gz
|
|
||||||
fi
|
|
||||||
LOG "Syncing /home/"
|
|
||||||
test -e /usr/share/oss/templates/exclude-from-home-backup || touch /usr/share/oss/templates/exclude-from-home-backup
|
|
||||||
# If $SCHOOL_BACKUP_FULL_DIR equal $SCHOOL_BACKUP_INC_DIR we make hartlinks
|
|
||||||
if [ $SCHOOL_BACKUP_FULL_DIR = $SCHOOL_BACKUP_INC_DIR -a "$SCHOOL_BACKUP_WITH_HARDLINK" = "yes" ]; then
|
|
||||||
if [ -d $SCHOOL_BACKUP_FULL_DIR/home/ ]; then
|
|
||||||
mv $SCHOOL_BACKUP_FULL_DIR/home/ $BACKUP_DIR/home/
|
|
||||||
else
|
|
||||||
mkdir -p $BACKUP_DIR/home/
|
|
||||||
fi
|
|
||||||
rsync $RSYNCPARS --exclude-from=/usr/share/oss/templates/exclude-from-home-backup --link-dest=$BACKUP_DIR/home/ /home/ $SCHOOL_BACKUP_FULL_DIR/home/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
mkdir -p $BACKUP_DIR/home/
|
|
||||||
rsync $RSYNCPARS --exclude-from=/usr/share/oss/templates/exclude-from-home-backup -b --backup-dir=$BACKUP_DIR/home/ /home/ $SCHOOL_BACKUP_FULL_DIR/home/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_CTOOL" = "yes" ]; then
|
|
||||||
LOG "Syncing itool"
|
|
||||||
mkdir -p $SCHOOL_BACKUP_FULL_DIR/srv/itool
|
|
||||||
mkdir -p $BACKUP_DIR/srv/itool
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/srv/itool/ /srv/itool/ $SCHOOL_BACKUP_FULL_DIR/srv/itool/
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
TheEnd 6 "CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_DB" = "yes" ]; then
|
|
||||||
LOG "Syncing OSS Database"
|
|
||||||
mysqldump $MYSQLDUMP_OPTIONS --all-databases | gzip > $BACKUP_DIR/MYSQL.sql.gz
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
LOG " CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SCHOOL_BACKUP_MAIL" = "yes" ]; then
|
|
||||||
LOG "Syncing Mail Data"
|
|
||||||
for i in var/spool/imap/ var/lib/imap/; do
|
|
||||||
mkdir -p $SCHOOL_BACKUP_FULL_DIR/$i
|
|
||||||
mkdir -p $BACKUP_DIR/$i
|
|
||||||
rsync $RSYNCPARS -b --backup-dir=$BACKUP_DIR/$i /$i $SCHOOL_BACKUP_FULL_DIR/$i
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
LOG " CAN_NOT_MAKE_BACKUP"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Now we make recovery easy
|
|
||||||
if [ -f /usr/share/oss/tools/oss_recover.sh ]; then
|
|
||||||
cp -f /usr/share/oss/tools/oss_recover.sh $SCHOOL_BACKUP_FULL_DIR/
|
|
||||||
chmod 750 $SCHOOL_BACKUP_FULL_DIR/oss_recover.sh
|
|
||||||
chown root:root $SCHOOL_BACKUP_FULL_DIR/oss_recover.sh
|
|
||||||
fi
|
|
||||||
if [ -f /usr/share/doc/packages/openschool-base/oss_recover.readme ]; then
|
|
||||||
cp -f /usr/share/doc/packages/openschool-base/oss_recover.readme $SCHOOL_BACKUP_FULL_DIR/
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Execute custom scripts
|
|
||||||
if [ "$SCHOOL_BACKUP_CUSTOM_SCRIPTS" ]; then
|
|
||||||
for i in $SCHOOL_BACKUP_CUSTOM_SCRIPTS
|
|
||||||
do
|
|
||||||
LOG "Starting $i"
|
|
||||||
$i $BACKUP_DIR $SCHOOL_BACKUP_FULL_DIR
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# create mark for last backup
|
|
||||||
DATE=`date +%Y-%m-%d-%H-%M`
|
|
||||||
LOG "********** Backup finished **********"
|
|
||||||
echo $DATE > /var/adm/backup/LAST_BACKUP
|
|
||||||
if [ "$SCHOOL_BACKUP_STOP_CMD" ]; then
|
|
||||||
eval $SCHOOL_BACKUP_STOP_CMD
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
TheEnd
|
|
||||||
67
README.md
67
README.md
@@ -1,3 +1,70 @@
|
|||||||
# TUBS
|
# TUBS
|
||||||
|
|
||||||
The Ultimate Backup Script
|
The Ultimate Backup Script
|
||||||
|
|
||||||
|
# Features
|
||||||
|
| ID | NAME | STATE | Version |
|
||||||
|
|:---: |:---: |:---: |:---: |
|
||||||
|
| 1 | Backup Directory | Working | 1.0 |
|
||||||
|
| 2 | Incremental Backup | Working | 1.1 |
|
||||||
|
| 3 | Initialisation | Working | 2.0 |
|
||||||
|
| 4 | Quick Help | Working | 2.0 |
|
||||||
|
| 5 | Remote Backup Location (SSH) | Working | 3.0 |
|
||||||
|
| 7 | Multiple Configuration files | Planned | 4.0 |
|
||||||
|
| 8 | MYSQL Backup | Planned | 5.0 |
|
||||||
|
# Repository Structure
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── .git - Git stuff can be ignored
|
||||||
|
├── .gitignore - File to ignore when pushing
|
||||||
|
├── .ignoreme - Inspirational Files OSS(Cranix) Server
|
||||||
|
│ └── Bash-OSS-Backup - Original file
|
||||||
|
├── LICENSE - Apache 2.0 License
|
||||||
|
├── README.md - The file you are currenly reading
|
||||||
|
├── TEST - Tests can be ignored
|
||||||
|
├── tubs.config - The configuration file
|
||||||
|
└── tubs.sh - The accual backup script
|
||||||
|
```
|
||||||
|
# Usage
|
||||||
|
## File Structure on your system
|
||||||
|
```
|
||||||
|
/ - Root of your filesystem
|
||||||
|
├── var - stuff to backup (example)
|
||||||
|
└── etc - configuration directory
|
||||||
|
├── tubs.sh - Backup Script
|
||||||
|
└── tubs.config - Example configuration
|
||||||
|
```
|
||||||
|
1. Create a folder in /etc with the name "tubs"
|
||||||
|
2. In there(/etc/tubs/) you have to copy the [scirpt](./tubs.sh)
|
||||||
|
3. Now create an [configuration file named "tubs.config"](./tubs.config) in this directory you can see an example in this repo. If the path of this file is not exactly /etc/tubs/tubs.config, then you need to adjust this in the [script](./tubs.sh) on Line 16 (CONFIG_FILE="path/to/file")
|
||||||
|
|
||||||
|
## Execution
|
||||||
|
1. Run the script with the "init" argument to create the directory structure in the destination
|
||||||
|
```
|
||||||
|
/etc/tubs/tubs.sh init
|
||||||
|
```
|
||||||
|
2. Run the script with the "backup" argument to run the backup job
|
||||||
|
```
|
||||||
|
/etc/tubs/tubs.sh backup
|
||||||
|
```
|
||||||
|
You will get colorful output if something does not work.
|
||||||
|
|
||||||
|
## Cron Job
|
||||||
|
|
||||||
|
Create an cron job to run this script every day (or whenever you want)
|
||||||
|
```
|
||||||
|
crontab -e # to edit (then 'i': insert, ':wq!': save and quit)
|
||||||
|
10 * * * * /etc/tubs/tubs.sh backup # every hour at 10"
|
||||||
|
0 */4 * * * /etc/tubs/tubs.sh backup # every 4 hours at 0"
|
||||||
|
0 9-17 * * * /etc/tubs/tubs.sh backup # every hour at 0" between 9 and 17
|
||||||
|
0 2 * * * /etc/tubs/tubs.sh backup # daily at 2am
|
||||||
|
0 0 * * MON /etc/tubs/tubs.sh backup # every Monday at 0am
|
||||||
|
0 0 * * 1-5 /etc/tubs/tubs.sh backup # daily from Monday to Friday at 0am
|
||||||
|
0 0 * * 0 /etc/tubs/tubs.sh backup # weekly on Sunday
|
||||||
|
0 0 1 * * /etc/tubs/tubs.sh backup # monthly (1rst day at 0am)
|
||||||
|
0 0 1 */3 * /etc/tubs/tubs.sh backup # every quarter (1rst day at 0am)
|
||||||
|
0 0 1 1 * /etc/tubs/tubs.sh backup # yearly (01/01)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Issues
|
||||||
|
If you find an Issue, feel free to create an Issue or contact [me](mailto:janic@voser.cloud), maby I see your message and if you have even more luck there could be the slight possibility that I know a solution to your Issue.
|
||||||
24
tubs.config
Normal file
24
tubs.config
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Date Formating
|
||||||
|
DATE_FORMAT="+%Y-%m-%d_%H-%M"
|
||||||
|
|
||||||
|
# Backup Directorys
|
||||||
|
BACKUP_SRC_ARRAY=("/home/janic/workspace/TUBS/TEST/SRC1" "/home/janic/workspace/TUBS/TEST/SRC2" "/home/janic/workspace/TUBS/TEST/SRC3" "/home/janic/workspace/TUBS/TEST/SRC4")
|
||||||
|
BACKUP_DST="/home/janic/workspace/TUBS/TEST/DST"
|
||||||
|
|
||||||
|
# Prefixes
|
||||||
|
BACKUP_PREFIX="backup_"
|
||||||
|
RESTORE_PRFIX="restore_"
|
||||||
|
|
||||||
|
# RSYNC Arguments
|
||||||
|
RSYNC_ARGS="-azP"
|
||||||
|
|
||||||
|
# Scripts to execute before & after
|
||||||
|
PRE_BACKUP_SCRIPT=""
|
||||||
|
POST_BACKUP_SCRIPT=""
|
||||||
|
|
||||||
|
# SSH Remote Destination
|
||||||
|
SSH_REMOTE_DST="YES"
|
||||||
|
SSH_REMOTE_HOST_DST=""
|
||||||
|
SSH_REMOTE_USER_DST=""
|
||||||
|
SSH_REMOTE_PORT_DST=""
|
||||||
|
SSH_REMOTE_KEY_DST=""
|
||||||
314
tubs.sh
Executable file
314
tubs.sh
Executable file
@@ -0,0 +1,314 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#============================================================================
|
||||||
|
#title : TUBS
|
||||||
|
#description : The Ultimate Backup Script (Linux) Version 3
|
||||||
|
#author : Janic Voser
|
||||||
|
#date : 2022-04-08
|
||||||
|
#updated : 2022-07-04
|
||||||
|
#version : 3.0
|
||||||
|
#usage : chmod +x tubs.sh && ./tubs.sh
|
||||||
|
#notes :
|
||||||
|
#bash_version :
|
||||||
|
#============================================================================
|
||||||
|
|
||||||
|
# Config
|
||||||
|
## Configfile
|
||||||
|
CONFIG_FILE="/etc/tubs/tubs.config" # Any Config File
|
||||||
|
#CONFIG_FILE="$PWD/tubs.config"
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
## Colorful Information
|
||||||
|
function blue(){ # The blue color is used for inforation
|
||||||
|
echo -e '\e[34m'"$1"'\e[0m'
|
||||||
|
}
|
||||||
|
function cyan(){ # The cyan color is only used for help
|
||||||
|
echo -e '\e[0;36m'"$1"'\e[0m'
|
||||||
|
}
|
||||||
|
function green(){ # The green color is used for successful steps
|
||||||
|
echo -e '\e[32m'"$1"'\e[0m'
|
||||||
|
}
|
||||||
|
function magenta(){ # The magenta color is used for warnings & important Information
|
||||||
|
echo -e '\e[35m'"$1"'\e[0m'
|
||||||
|
}
|
||||||
|
function red(){ # The red color is used for failed steps
|
||||||
|
echo -e '\e[31m'"$1"'\e[0m' && exit 1
|
||||||
|
}
|
||||||
|
## Critical Error
|
||||||
|
function critical_error {
|
||||||
|
red "Critical error during: $1"
|
||||||
|
}
|
||||||
|
## Load Config
|
||||||
|
function load_config {
|
||||||
|
if [ -e "$CONFIG_FILE" ]
|
||||||
|
then
|
||||||
|
blue "Loading Config"
|
||||||
|
source "$CONFIG_FILE" || critical_error "Reading Configfile"
|
||||||
|
else
|
||||||
|
red "Configfile not Found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Create destination Structure
|
||||||
|
function create_dst {
|
||||||
|
if [ "$SSH_REMOTE_DST" == "YES" ]
|
||||||
|
then
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" mkdir -p "$BACKUP_DST_FULL" || critical_error "Creating Remote Directory BACKUP_DST_FULL"
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" mkdir -p "$BACKUP_DST_INC" || critical_error "Creating Remote Directory BACKUP_DST_INC"
|
||||||
|
else
|
||||||
|
mkdir -p "$BACKUP_DST_FULL" || critical_error "Creating Directory BACKUP_DST_FULL"
|
||||||
|
mkdir -p "$BACKUP_DST_INC" || critical_error "Creating Directory BACKUP_DST_INC"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Check destination
|
||||||
|
function check_dst {
|
||||||
|
if [ "$SSH_REMOTE_DST" == "YES" ]
|
||||||
|
then
|
||||||
|
magenta "This script is currently not able to check if remote Destinations exist"
|
||||||
|
if ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" [ -e "$BACKUP_DST" ]
|
||||||
|
then
|
||||||
|
blue "Remote Backup destinantion existing"
|
||||||
|
else
|
||||||
|
red "Remote Backup destination not existing"
|
||||||
|
fi
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" mkdir -p "$BACKUP_DST_INC_PATH" || critical_error "Error while creating remote incremental backup-directory ($BACKUP_DST_INC_PATH)"
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" mkdir -p "$BACKUP_DST_FULL_LOGS" || critical_error "Error while creating remote log directory ($BACKUP_DST_FULL_LOGS)"
|
||||||
|
else
|
||||||
|
if [ -e "$BACKUP_DST" ]
|
||||||
|
then
|
||||||
|
blue "Backup destinantion existing"
|
||||||
|
else
|
||||||
|
red "Backup destination not existing"
|
||||||
|
fi
|
||||||
|
mkdir -p "$BACKUP_DST_INC_PATH" || critical_error "Error while creating incremental backup-directory ($BACKUP_DST_INC_PATH)"
|
||||||
|
mkdir -p "$BACKUP_DST_FULL_LOGS" || critical_error "Error while creating log directory ($BACKUP_DST_FULL_LOGS)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
## Check sources local
|
||||||
|
function check_src {
|
||||||
|
for src_dir in "${BACKUP_SRC_ARRAY[@]}"
|
||||||
|
do
|
||||||
|
if [[ "$src_dir" =~ ^*[/] ]]
|
||||||
|
then
|
||||||
|
critical_error "$src_dir is ending with slash please remove it"
|
||||||
|
fi
|
||||||
|
if ! [ -d "$src_dir" ]
|
||||||
|
then
|
||||||
|
critical_error "$src_dir is not a directory"
|
||||||
|
fi
|
||||||
|
green "Source $src_dir is valid"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
## Check Incremental Date
|
||||||
|
function check_inc {
|
||||||
|
if [ "$SSH_REMOTE_DST" == "YES" ]
|
||||||
|
then
|
||||||
|
check_inc_remote
|
||||||
|
else
|
||||||
|
check_inc_local
|
||||||
|
fi
|
||||||
|
BACKUP_DST_INC_PATH="$BACKUP_DST_INC/$BACKUP_PREFIX$LAST_BACKUP"
|
||||||
|
}
|
||||||
|
## Check Incremental Date
|
||||||
|
function check_inc_local {
|
||||||
|
if ! [ -e "$BACKUP_LAST_FILE" ]
|
||||||
|
then
|
||||||
|
magenta "Missing last successfull backup file, just using the day before"
|
||||||
|
LAST_BACKUP="$(date --date="yesterday" "$DATE_FORMAT")"
|
||||||
|
else
|
||||||
|
LAST_BACKUP="$(cat "$BACKUP_LAST_FILE")"
|
||||||
|
if ! [[ $LAST_BACKUP =~ ^[0-9]{4}(-[0-9]{2}){2}_[0-9]{2}-[0-9]{2} ]]
|
||||||
|
then
|
||||||
|
magenta "Content of last successfull backup file was not valid"
|
||||||
|
LAST_BACKUP="$(date --date="yesterday" "$DATE_FORMAT")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Check Incremental Date
|
||||||
|
function check_inc_remote {
|
||||||
|
if ! ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" [ -e "$BACKUP_LAST_FILE" ]
|
||||||
|
then
|
||||||
|
magenta "Missing last successfull backup file, just using the day before"
|
||||||
|
LAST_BACKUP="$(date --date="yesterday" "$DATE_FORMAT")"
|
||||||
|
else
|
||||||
|
LAST_BACKUP="$(ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" cat "$BACKUP_LAST_FILE")"
|
||||||
|
if ! [[ $LAST_BACKUP =~ ^[0-9]{4}(-[0-9]{2}){2}_[0-9]{2}-[0-9]{2} ]]
|
||||||
|
then
|
||||||
|
magenta "Content of last successfull backup file was not valid"
|
||||||
|
LAST_BACKUP="$(date --date="yesterday" "$DATE_FORMAT")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Check Prerequirements
|
||||||
|
function check_prereq {
|
||||||
|
command -v rsync &> /dev/null || critical_error "Missing rsync"
|
||||||
|
green "All requirements are saturated"
|
||||||
|
}
|
||||||
|
## Last successful backup
|
||||||
|
function last_backup {
|
||||||
|
if [ "$SSH_REMOTE_DST" == "YES" ]
|
||||||
|
then
|
||||||
|
last_backup_remote
|
||||||
|
else
|
||||||
|
last_backup_local
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
### Last successful backup
|
||||||
|
function last_backup_local {
|
||||||
|
if touch "$BACKUP_LAST_FILE" &> /dev/null
|
||||||
|
then
|
||||||
|
echo "$BACKUP_DATE" > "$BACKUP_LAST_FILE"
|
||||||
|
else
|
||||||
|
critical_error "Can not write Last successful backup file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
### Last successful backup
|
||||||
|
function last_backup_remote {
|
||||||
|
if ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" touch "$BACKUP_LAST_FILE" &> /dev/null
|
||||||
|
then
|
||||||
|
echo "$BACKUP_DATE" | ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" -T "cat > $BACKUP_LAST_FILE"
|
||||||
|
else
|
||||||
|
critical_error "Can not write Last successful backup file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Backup all
|
||||||
|
function backup_all {
|
||||||
|
if [ "$SSH_REMOTE_DST" == "YES" ]
|
||||||
|
then
|
||||||
|
backup_all_remote
|
||||||
|
else
|
||||||
|
backup_all_local
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Backup all local
|
||||||
|
function backup_all_local {
|
||||||
|
blue "Starting Backup Processes"
|
||||||
|
for src_dir in "${BACKUP_SRC_ARRAY[@]}"
|
||||||
|
do
|
||||||
|
src_dir_name="$(echo "$src_dir" | rev | cut -d / -f 1 | rev)"
|
||||||
|
cat << EOF >> "$BACKUP_DST_FULL_LOGS/$src_dir_name.log"
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#############################TUBS $BACKUP_DATE##############################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
EOF
|
||||||
|
rsync "$RSYNC_ARGS" --backup --delete --backup-dir="$BACKUP_DST_INC_PATH/" "$src_dir" "$BACKUP_DST_FULL" >> "$BACKUP_DST_FULL_LOGS/$src_dir_name.log" &
|
||||||
|
done
|
||||||
|
green "All backup processes started successfull"
|
||||||
|
blue "Waiting for processes to finish"
|
||||||
|
# wait for all pids
|
||||||
|
jobs=$(jobs -p)
|
||||||
|
for process in $jobs
|
||||||
|
do
|
||||||
|
wait "$process" || critical_error "Process: $process failed"
|
||||||
|
done
|
||||||
|
green "All Processes finished"
|
||||||
|
}
|
||||||
|
## Backup all remote
|
||||||
|
function backup_all_remote {
|
||||||
|
blue "Starting Backup Processes"
|
||||||
|
for src_dir in "${BACKUP_SRC_ARRAY[@]}"
|
||||||
|
do
|
||||||
|
src_dir_name="$(echo "$src_dir" | rev | cut -d / -f 1 | rev)"
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" -T "cat << EOF >> \"$BACKUP_DST_FULL_LOGS/$src_dir_name.log\"
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#############################TUBS $BACKUP_DATE##############################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
EOF
|
||||||
|
"
|
||||||
|
rsync "$RSYNC_ARGS" -e "ssh -p $SSH_REMOTE_PORT_DST -i $SSH_REMOTE_KEY_DST" --backup --delete --backup-dir="$BACKUP_DST_INC_PATH/" "$src_dir" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST:$BACKUP_DST_FULL" | ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" -T "cat >> \"$BACKUP_DST_FULL_LOGS/$src_dir_name.log\"" &
|
||||||
|
done
|
||||||
|
green "All backup processes started successfull"
|
||||||
|
blue "Waiting for processes to finish"
|
||||||
|
# wait for all pids
|
||||||
|
jobs=$(ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" jobs -p)
|
||||||
|
for process in $jobs
|
||||||
|
do
|
||||||
|
ssh -i "$SSH_REMOTE_KEY_DST" -p "$SSH_REMOTE_PORT_DST" "$SSH_REMOTE_USER_DST@$SSH_REMOTE_HOST_DST" wait "$process" || critical_error "Process: $process failed"
|
||||||
|
done
|
||||||
|
green "All Processes finished"
|
||||||
|
}
|
||||||
|
## Pre Backup Script
|
||||||
|
function pre_backup_script {
|
||||||
|
if [ -e "$PRE_BACKUP_SCRIPT" ]
|
||||||
|
then
|
||||||
|
if [ -x "$PRE_BACKUP_SCRIPT" ]
|
||||||
|
then
|
||||||
|
blue "Executing Pre-Backup-Script"
|
||||||
|
$PRE_BACKUP_SCRIPT
|
||||||
|
green "Pre-Backup-Script finished"
|
||||||
|
else
|
||||||
|
magenta "Pre-Backup-Script is not executable"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
blue "No Pre-Backup-Script found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Post Backup Script
|
||||||
|
function post_backup_script {
|
||||||
|
if [ -e "$POST_BACKUP_SCRIPT" ]
|
||||||
|
then
|
||||||
|
if [ -x "$POST_BACKUP_SCRIPT" ]
|
||||||
|
then
|
||||||
|
blue "Executing Post-Backup-Script"
|
||||||
|
$POST_BACKUP_SCRIPT
|
||||||
|
green "Post-Backup-Script finished"
|
||||||
|
else
|
||||||
|
magenta "Post-Backup-Script is not executable"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
blue "No Pre-Backup-Script found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
## Generate Variables
|
||||||
|
load_config # Load config first (Variables are dependent on it)
|
||||||
|
BACKUP_DATE="$(date "$DATE_FORMAT")"
|
||||||
|
BACKUP_DST_FULL="$BACKUP_DST/FULL"
|
||||||
|
BACKUP_DST_FULL_LOGS="$BACKUP_DST_FULL/logs"
|
||||||
|
BACKUP_DST_INC="$BACKUP_DST/INCREMENTAL"
|
||||||
|
BACKUP_LAST_FILE="$BACKUP_DST/LAST_SUCCESSFULL_BACKUP"
|
||||||
|
|
||||||
|
# Main Script
|
||||||
|
## Load config
|
||||||
|
if [ -n "$1" ]
|
||||||
|
then
|
||||||
|
case "$1" in
|
||||||
|
help)
|
||||||
|
cyan "Execute this script with one of the following arguments"
|
||||||
|
cyan " - help --> Display help (your reading it right now)"
|
||||||
|
cyan " - init --> Initialize the backup Structure"
|
||||||
|
cyan " - backup --> Do the accual backup"
|
||||||
|
cyan " - restore --> Restore all the data from a certain day"
|
||||||
|
;;
|
||||||
|
init)
|
||||||
|
blue "Starting initialisation"
|
||||||
|
create_dst
|
||||||
|
blue "Initialisation was successfull"
|
||||||
|
;;
|
||||||
|
backup)
|
||||||
|
green "TUBS started"
|
||||||
|
check_inc
|
||||||
|
check_dst
|
||||||
|
check_src
|
||||||
|
check_prereq
|
||||||
|
last_backup
|
||||||
|
pre_backup_script
|
||||||
|
backup_all
|
||||||
|
post_backup_script
|
||||||
|
green "TUBS finished"
|
||||||
|
;;
|
||||||
|
restore)
|
||||||
|
magenta "I am kinda sorry this is not implemented yet"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
red "Your supplied argument was not valid use help if you don't know what you are doing"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
cyan "Please supply a valid argument or execute with help flag"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user