Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
584532e2c7 | |||
97d1a14260 | |||
71a2b6d01e | |||
6649925ec9 | |||
871c8d6543 | |||
7035352cfd | |||
d31080e5e4 | |||
25954d5178 | |||
87f3bca955 | |||
a64219c321 | |||
7c3eb9ed24 | |||
a2c4e54c47 | |||
b15af7f22f | |||
4623d023b9 | |||
898ef3bcd9 |
12
README.md
12
README.md
@ -1,2 +1,10 @@
|
|||||||
# simple_backup
|
# simple-backup
|
||||||
A simple backup script using rsync
|
A simple backup script
|
||||||
|
|
||||||
|
## Description
|
||||||
|
simple-backup is just a bash script that allows you to backup your files.
|
||||||
|
It reads from a configuration file the files/directories that must be copied,
|
||||||
|
the destination directory for the backup and a few other options.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
rsync is used to perform the backup.
|
||||||
|
489
simple-backup
Executable file
489
simple-backup
Executable file
@ -0,0 +1,489 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#Copyright 2017 Daniele Fucini <dfucini@gmail.com>
|
||||||
|
|
||||||
|
#This program is free software: you can redistribute it and/or modify
|
||||||
|
#it under the terms of the GNU General Public License as published by
|
||||||
|
#the Free Software Foundation, either version 3 of the License, or
|
||||||
|
#(at your option) any later version.
|
||||||
|
|
||||||
|
#This program is distributed in the hope that it will be useful,
|
||||||
|
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
#GNU General Public License for more details.
|
||||||
|
|
||||||
|
#You should have received a copy of the GNU General Public License
|
||||||
|
#along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#Simple backup script. Reads options, sources and destination from a configuration file or standard input
|
||||||
|
|
||||||
|
#Help function
|
||||||
|
function help_function {
|
||||||
|
echo "simple_backup, version 1.4.1"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "-h, --help Print this help and exit."
|
||||||
|
echo "-c, --config CONFIG_FILE Use the specified configuration file"
|
||||||
|
echo " instead of the default one."
|
||||||
|
echo " All other options are ignored."
|
||||||
|
echo "-i, --input INPUT [INPUT...] Specify a file/dir to include in the backup."
|
||||||
|
echo "-d, --directory DIR Specify the output directory for the backup."
|
||||||
|
echo "-e, --exclude PATTERN [PATTERN...] Specify a file/dir/pattern to exclude from"
|
||||||
|
echo " the backup."
|
||||||
|
echo "-k, --keep NUMBER Specify the number of old backups to keep."
|
||||||
|
echo " Default: keep all."
|
||||||
|
echo "-u, --user USER User performing the backup."
|
||||||
|
echo " Default: current user."
|
||||||
|
echo "-s, --checksum Use the checksum rsync option to compare files"
|
||||||
|
echo " (MUCH slower)."
|
||||||
|
echo ""
|
||||||
|
echo "If no option is given, the program uses the default"
|
||||||
|
echo "configuration file: $HOMEDIR/.simple_backup/config."
|
||||||
|
echo ""
|
||||||
|
echo "Report bugs to dfucini@gmail.com"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
#Read configuration file
|
||||||
|
function read_conf {
|
||||||
|
if [[ "$#" -eq 0 ]]; then
|
||||||
|
CONFIG="$HOMEDIR/.simple_backup/config"
|
||||||
|
|
||||||
|
if [[ ! -f "$CONFIG" ]]; then
|
||||||
|
#If default config file doesn't exist, exit
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: Configuration file not found" | tee $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
CONFIG="$1"
|
||||||
|
|
||||||
|
if [[ ! -f "$CONFIG" ]]; then
|
||||||
|
#If the provided configuration file doesn't exist, exit
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: Configuration file not found" | tee -a $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Create temporary files
|
||||||
|
INPUTS=$(mktemp)
|
||||||
|
EXCLUDE=$(mktemp)
|
||||||
|
BACKUP=$(mktemp)
|
||||||
|
NKEEP=$(mktemp)
|
||||||
|
|
||||||
|
#Parse the configuration file
|
||||||
|
awk -v INPUTS="$INPUTS" -v EXCLUDE="$EXCLUDE" -v BACKUP="$BACKUP" \
|
||||||
|
-v NKEEP="$NKEEP" -v UHOME="$HOMEDIR/" -F '[=,]' \
|
||||||
|
'$1=="inputs" { for ( i=2; i<=NF; i++ ) { sub(/^~\//,UHOME,$i); print $i > INPUTS } }
|
||||||
|
$1=="backup_dir" { sub(/^~\//,UHOME,$2); print $2 > BACKUP }
|
||||||
|
$1=="exclude" { for ( i=2; i<=NF; i++ ) { sub(/^~\//,UHOME,$i); print $i > EXCLUDE } }
|
||||||
|
$1=="keep" { if ( $2 != NULL ) { print $2 > NKEEP } }' $CONFIG
|
||||||
|
|
||||||
|
BACKUP_DEV=$(cat $BACKUP)
|
||||||
|
KEEP=$(cat $NKEEP)
|
||||||
|
|
||||||
|
rm "$BACKUP"
|
||||||
|
rm "$NKEEP"
|
||||||
|
|
||||||
|
if [[ -z "$BACKUP_DEV" || ! -d "$BACKUP_DEV" ]]; then
|
||||||
|
#If the backup directory is not set or doesn't exist, exit
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: Output folder \"$BACKUP_DEV\" not found" | tee -a $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
rm "$INPUTS"
|
||||||
|
rm "$EXCLUDE"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_DIR=$BACKUP_DEV/simple_backup
|
||||||
|
DATE=$(date +%Y-%m-%d-%H:%M)
|
||||||
|
|
||||||
|
#Create the backup subdirectory using date
|
||||||
|
if [[ ! -d "$BACKUP_DIR" ]]; then
|
||||||
|
mkdir -p "$BACKUP_DIR/$DATE"
|
||||||
|
else
|
||||||
|
#If previous backups exist, save link to the last backup
|
||||||
|
LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup")
|
||||||
|
mkdir "$BACKUP_DIR/$DATE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Set the backup directory variable to the newly created subfolder
|
||||||
|
BACKUP_DIR="$BACKUP_DIR/$DATE"
|
||||||
|
|
||||||
|
n_in=$(cat $INPUTS | wc -l)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
#Parse options
|
||||||
|
function parse_options {
|
||||||
|
n_in=0
|
||||||
|
|
||||||
|
#Create a temporary file to store inputs
|
||||||
|
INPUTS=$(mktemp)
|
||||||
|
#Create temp file to store exclude patterns
|
||||||
|
EXCLUDE=$(mktemp)
|
||||||
|
|
||||||
|
while [[ "$#" -gt 0 ]]
|
||||||
|
do
|
||||||
|
var="$1"
|
||||||
|
|
||||||
|
case "$var" in
|
||||||
|
-h | --help)
|
||||||
|
help_function
|
||||||
|
|
||||||
|
rm $INPUTS
|
||||||
|
rm $EXCLUDE
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
-i | --input)
|
||||||
|
|
||||||
|
while [[ "$#" -gt 1 && ! "$2" =~ ^- ]]
|
||||||
|
do
|
||||||
|
input="$2"
|
||||||
|
|
||||||
|
if [[ ! -e "$input" ]]; then
|
||||||
|
echo "Warning: input \"$input\" not found. Skipping" | tee -a $WARN
|
||||||
|
else
|
||||||
|
n_in=$((n_in+1))
|
||||||
|
echo "$input" >> "$INPUTS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
-d | --directory)
|
||||||
|
BACKUP_DEV="$2"
|
||||||
|
|
||||||
|
if [[ -z "$BACKUP_DEV" || ! -d "$BACKUP_DEV" ]]; then
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: output folder \"$BACKUP_DEV\" not found" | tee -a $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
rm $INPUTS
|
||||||
|
rm $EXCLUDE
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_DIR="$BACKUP_DEV/simple_backup"
|
||||||
|
DATE=$(date +%Y-%m-%d-%H:%M)
|
||||||
|
|
||||||
|
#Create the backup subdirectory using date
|
||||||
|
if [[ ! -d "$BACKUP_DIR" ]]; then
|
||||||
|
mkdir -p "$BACKUP_DIR/$DATE"
|
||||||
|
else
|
||||||
|
#If previous backup(s) exist(s), save link to the last backup
|
||||||
|
LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup")
|
||||||
|
mkdir "$BACKUP_DIR/$DATE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Set the backup directory variable to the newly created subfolder
|
||||||
|
BACKUP_DIR="$BACKUP_DIR/$DATE"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-e | --exclude)
|
||||||
|
while [[ "$#" -gt 1 && ! "$2" =~ ^- ]]
|
||||||
|
do
|
||||||
|
echo "$2" >> "$EXCLUDE"
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
-k | --keep)
|
||||||
|
KEEP="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-c | --config)
|
||||||
|
rm "$EXCLUDE"
|
||||||
|
rm "$INPUTS"
|
||||||
|
|
||||||
|
read_conf "$2"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
|
||||||
|
-u | --user)
|
||||||
|
if [[ ! -d "/home/$2" ]]; then
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: user $2 doesn't exist" | tee -a $ERR
|
||||||
|
|
||||||
|
if [[ ! -d "$HOMEDIR/.simple_backup" ]]; then
|
||||||
|
mkdir "$HOMEDIR/.simple_backup"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d "/home/$2/.simple_backup" ]]; then
|
||||||
|
mkdir "/home/$2/.simple_backup"
|
||||||
|
|
||||||
|
echo "Created directory \"$HOMEDIR/.simple_backup\"."
|
||||||
|
fi
|
||||||
|
|
||||||
|
HOMEDIR="/home/$2"
|
||||||
|
USER="$2"
|
||||||
|
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-s | --checksum)
|
||||||
|
OPTIONS="-arcv -H -X -R"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: Option $1 not recognised. Use 'simple-backup -h' to see available options" | tee -a $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
#Create temporary log files
|
||||||
|
LOG=$(mktemp)
|
||||||
|
ERR=$(mktemp)
|
||||||
|
WARN=$(mktemp)
|
||||||
|
|
||||||
|
HOMEDIR="$HOME"
|
||||||
|
OPTIONS="-arvh -H -X -R"
|
||||||
|
|
||||||
|
#Check number of parameters
|
||||||
|
if [[ "$#" -eq 0 ]]; then
|
||||||
|
if [[ ! -d "$HOMEDIR/.simple_backup" ]]; then
|
||||||
|
mkdir "$HOMEDIR/.simple_backup"
|
||||||
|
|
||||||
|
echo "Created directory \"$HOMEDIR/.simple_backup\"."
|
||||||
|
echo "Copy there sample configuration and edit it"
|
||||||
|
echo "to your needs before running the backup,"
|
||||||
|
echo "or pass options on the command line."
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read_conf
|
||||||
|
else
|
||||||
|
parse_options "$@"
|
||||||
|
|
||||||
|
if [[ $n_in -gt 0 && ( -z $BACKUP_DIR || ! -d $BACKUP_DIR ) ]]; then
|
||||||
|
#If the backup directory is not set or doesn't exist, exit
|
||||||
|
echo "$(date): Backup failed (see errors.log)" >> $LOG
|
||||||
|
echo "Backup failed"
|
||||||
|
echo "Error: Output folder \"$BACKUP_DEV\" not found" | tee -a $ERR
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
elif [[ $n_in -eq 0 && -z $BACKUP_DIR ]]; then
|
||||||
|
if [[ ! -d "$HOMEDIR/.simple_backup" ]]; then
|
||||||
|
mkdir "$HOMEDIR/.simple_backup"
|
||||||
|
|
||||||
|
echo "Created directory \"$HOMEDIR/.simple_backup\"."
|
||||||
|
echo "Copy there sample configuration and edit it"
|
||||||
|
echo "to your needs before running the backup,"
|
||||||
|
echo "or pass options on the command line."
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read_conf $HOMEDIR/.simple_backup/config
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $n_in -eq 0 ]]; then
|
||||||
|
echo "$(date): Backup finished (no files copied)" >> $LOG
|
||||||
|
echo "Backup finished"
|
||||||
|
echo "Warning: no valid input selected. Nothing to do" | tee -a $WARN
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$(date): Starting backup" > $LOG
|
||||||
|
echo "Starting backup..."
|
||||||
|
|
||||||
|
#If specified, keep the last n backups and remove the others. Default: keep all
|
||||||
|
if [[ -n $KEEP ]]; then
|
||||||
|
N_BACKUP=$(ls -l $BACKUP_DEV/simple_backup | grep -c ^d)
|
||||||
|
N_BACKUP=$(($N_BACKUP-1))
|
||||||
|
|
||||||
|
if [[ $N_BACKUP -gt $KEEP ]]; then
|
||||||
|
echo "$(date): Removing old backups" >> $LOG
|
||||||
|
echo "Removing old backups..."
|
||||||
|
REMOVE=$(mktemp)
|
||||||
|
find $BACKUP_DEV/simple_backup/* -maxdepth 0 -type d | sort | head -n $(($N_BACKUP - $KEEP)) >> $REMOVE
|
||||||
|
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
rm -r $line
|
||||||
|
echo "Removed backup: $line" >> $LOG
|
||||||
|
done<$REMOVE
|
||||||
|
|
||||||
|
echo "Removed old backups"
|
||||||
|
|
||||||
|
rm $REMOVE
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sort input files for rsync efficiency
|
||||||
|
if [[ ! -z "$INPUTS" ]]; then
|
||||||
|
sort "$INPUTS" -o "$INPUTS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Copying files. This may take a long time..."
|
||||||
|
|
||||||
|
if [[ -z "$LAST_BACKUP" ]]; then
|
||||||
|
rsync $OPTIONS --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR
|
||||||
|
else
|
||||||
|
rsync $OPTIONS --link-dest="$LAST_BACKUP" --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Update the logs
|
||||||
|
if [[ $(cat $ERR | wc -l) -gt 0 ]]; then
|
||||||
|
echo "$(date): Backup finished with errors" >> $LOG
|
||||||
|
echo "Backup finished with errors"
|
||||||
|
elif [[ $(cat $WARN | wc -l) -gt 0 ]]; then
|
||||||
|
echo "$(date): Backup finished with warnings" >> $LOG
|
||||||
|
echo "Backup finished (warnings)"
|
||||||
|
else
|
||||||
|
echo "$(date): Backup finished" >> $LOG
|
||||||
|
echo "Backup finished"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Fix ownership and permissions of log files if needed
|
||||||
|
if [[ ! -z $USER ]]; then
|
||||||
|
chown $USER:$USER $LOG && chmod 644 $LOG
|
||||||
|
chown $USER:$USER $ERR && chmod 644 $ERR
|
||||||
|
chown $USER:$USER $WARN && chmod 644 $WARN
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Copy log files in home directory
|
||||||
|
mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
|
||||||
|
mv $ERR "$HOMEDIR/.simple_backup/errors.log"
|
||||||
|
mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
|
||||||
|
|
||||||
|
if [[ ! -z "$EXCLUDE" ]]; then
|
||||||
|
rm "$EXCLUDE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z "$INPUTS" ]]; then
|
||||||
|
rm "$INPUTS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -L "$BACKUP_DEV/simple_backup/last_backup" ]]; then
|
||||||
|
rm "$BACKUP_DEV/simple_backup/last_backup"
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_DIR_FULL=$(readlink -f "$BACKUP_DIR")
|
||||||
|
ln -sf "$BACKUP_DIR_FULL" "$BACKUP_DEV/simple_backup/last_backup"
|
||||||
|
|
||||||
|
exit 0
|
477
simple_backup
477
simple_backup
@ -1,477 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
#Copyright 2015 Daniele Fucini <dfucini@gmail.com>
|
|
||||||
|
|
||||||
#This program is free software: you can redistribute it and/or modify
|
|
||||||
#it under the terms of the GNU General Public License as published by
|
|
||||||
#the Free Software Foundation, either version 3 of the License, or
|
|
||||||
#(at your option) any later version.
|
|
||||||
|
|
||||||
#This program is distributed in the hope that it will be useful,
|
|
||||||
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
#GNU General Public License for more details.
|
|
||||||
|
|
||||||
#You should have received a copy of the GNU General Public License
|
|
||||||
#along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#Version 1.2.1
|
|
||||||
#Simple backup script. Reads options, sources and destination from a configuration file or standard input
|
|
||||||
|
|
||||||
#Help function
|
|
||||||
function help_function {
|
|
||||||
echo "simple_backup, version 1.0.0"
|
|
||||||
echo ""
|
|
||||||
echo "Usage: $0 [OPTIONS]"
|
|
||||||
echo ""
|
|
||||||
echo "Options:"
|
|
||||||
echo "-h, --help Print this help and exit."
|
|
||||||
echo "-c, --config CONFIG_FILE Use the specified configuration file"
|
|
||||||
echo " instead of the default one."
|
|
||||||
echo " All other options are ignored."
|
|
||||||
echo "-i, --input INPUT [INPUT...] Specify a file/dir to include in the backup."
|
|
||||||
echo "-d, --directory DIR Specify the output directory for the backup."
|
|
||||||
echo "-e, --exclude PATTERN [PATTERN...] Specify a file/dir/pattern to exclude from"
|
|
||||||
echo " the backup."
|
|
||||||
echo "-k, --keep NUMBER Specify the number of old backups to keep."
|
|
||||||
echo " Default: keep all."
|
|
||||||
echo "-u, --user USER User performing the backup."
|
|
||||||
echo " Default: current user."
|
|
||||||
echo ""
|
|
||||||
echo "If no option is given, the program uses the default"
|
|
||||||
echo "configuration file: $HOME/.simple_backup/config."
|
|
||||||
echo ""
|
|
||||||
echo "Report bugs to dfucini@gmail.com"
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
#Read configuration file
|
|
||||||
function read_conf {
|
|
||||||
if [[ "$#" -eq 0 ]]; then
|
|
||||||
CONFIG="$HOME/.simple_backup/config"
|
|
||||||
else
|
|
||||||
CONFIG="$1"
|
|
||||||
|
|
||||||
if [[ ! -f "$CONFIG" ]]; then
|
|
||||||
#If the provided configuration file doesn't exist, exit
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: Configuration file not found" | tee -a $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Create temporary files
|
|
||||||
INPUTS=$(mktemp)
|
|
||||||
EXCLUDE=$(mktemp)
|
|
||||||
BACKUP=$(mktemp)
|
|
||||||
NKEEP=$(mktemp)
|
|
||||||
|
|
||||||
#Parse the configuration file
|
|
||||||
awk -v INPUTS="$INPUTS" -v EXCLUDE="$EXCLUDE" -v BACKUP="$BACKUP" \
|
|
||||||
-v NKEEP="$NKEEP" -v UHOME="$HOME/" -F '[=,]' \
|
|
||||||
'$1=="inputs" { for ( i=2; i<=NF; i++ ) { sub(/^~\//,UHOME,$i); print $i > INPUTS } }
|
|
||||||
$1=="backup_dir" { sub(/^~\//,UHOME,$2); print $2 > BACKUP }
|
|
||||||
$1=="exclude" { for ( i=2; i<=NF; i++ ) { sub(/^~\//,UHOME,$i); print $i > EXCLUDE } }
|
|
||||||
$1=="keep" { if ( $2 != NULL ) { print $2 > NKEEP } }' $CONFIG
|
|
||||||
|
|
||||||
BACKUP_DEV=$(cat $BACKUP)
|
|
||||||
KEEP=$(cat $NKEEP)
|
|
||||||
|
|
||||||
rm "$BACKUP"
|
|
||||||
rm "$NKEEP"
|
|
||||||
|
|
||||||
if [[ -z "$BACKUP_DEV" || ! -d "$BACKUP_DEV" ]]; then
|
|
||||||
#If the backup directory is not set or doesn't exist, exit
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: Output folder \"$BACKUP_DEV\" not found" | tee -a $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm "$INPUTS"
|
|
||||||
rm "$EXCLUDE"
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
BACKUP_DIR=$BACKUP_DEV/simple_backup
|
|
||||||
DATE=$(date +%Y-%m-%d-%H:%M)
|
|
||||||
|
|
||||||
#Create the backup subdirectory using date
|
|
||||||
if [[ ! -d "$BACKUP_DIR" ]]; then
|
|
||||||
mkdir -p "$BACKUP_DIR/$DATE"
|
|
||||||
else
|
|
||||||
#If previous backup(s) exist(s), save link to the last backup
|
|
||||||
LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup")
|
|
||||||
mkdir "$BACKUP_DIR/$DATE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Set the backup directory variable to the newly created subfolder
|
|
||||||
BACKUP_DIR="$BACKUP_DIR/$DATE"
|
|
||||||
|
|
||||||
n_in=$(cat $INPUTS | wc -l)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
#Parse options
|
|
||||||
function parse_options {
|
|
||||||
i=1
|
|
||||||
n_in=0
|
|
||||||
|
|
||||||
#Create a temporary file to store inputs
|
|
||||||
INPUTS=$(mktemp)
|
|
||||||
#Create temp file to store exclude patterns
|
|
||||||
EXCLUDE=$(mktemp)
|
|
||||||
|
|
||||||
while [[ "$#" -gt 0 ]]
|
|
||||||
do
|
|
||||||
var="$1"
|
|
||||||
|
|
||||||
case "$var" in
|
|
||||||
-h | --help)
|
|
||||||
help_function
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/simple_backup.log.old $HOME/.simple_backup/simple_backup.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/errors.log.old $HOME/.simple_backup/errors.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/warnings.log.old $HOME/.simple_backup/warnings.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm $INPUTS
|
|
||||||
rm $EXCLUDE
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
-i | --input)
|
|
||||||
|
|
||||||
while [[ "$#" -gt 1 && ! "$2" =~ ^- ]]
|
|
||||||
do
|
|
||||||
input="$2"
|
|
||||||
|
|
||||||
if [[ -z "$input" ]]; then
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: bad options format" | tee -a $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -e "$input" ]]; then
|
|
||||||
echo "Warning: input \"${INPUTS[$i]}\" not found. Skipping" | tee -a $HOME/.simple_backup/warnings.log
|
|
||||||
else
|
|
||||||
i=$((i+1))
|
|
||||||
n_in=$((n_in+1))
|
|
||||||
echo "$input" >> "$INPUTS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
;;
|
|
||||||
|
|
||||||
-d | --directory)
|
|
||||||
BACKUP_DEV="$2"
|
|
||||||
|
|
||||||
if [[ -z "$BACKUP_DEV" || ! -d "$BACKUP_DEV" ]]; then
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: output folder \"$BACKUP_DEV\" not found" | tee -a $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
BACKUP_DIR="$BACKUP_DEV/simple_backup"
|
|
||||||
DATE=$(date +%Y-%m-%d-%H:%M)
|
|
||||||
|
|
||||||
#Create the backup subdirectory using date
|
|
||||||
if [[ ! -d "$BACKUP_DIR" ]]; then
|
|
||||||
mkdir -p "$BACKUP_DIR/$DATE"
|
|
||||||
else
|
|
||||||
#If previous backup(s) exist(s), save link to the last backup
|
|
||||||
LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup")
|
|
||||||
mkdir "$BACKUP_DIR/$DATE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Set the backup directory variable to the newly created subfolder
|
|
||||||
BACKUP_DIR="$BACKUP_DIR/$DATE"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
-e | --exclude)
|
|
||||||
while [[ "$#" -gt 1 && ! "$2" =~ ^- ]]
|
|
||||||
do
|
|
||||||
echo "$2" >> "$EXCLUDE"
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
|
|
||||||
-k | --keep)
|
|
||||||
KEEP="$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
-c | --config)
|
|
||||||
rm "$EXCLUDE"
|
|
||||||
rm "$INPUTS"
|
|
||||||
|
|
||||||
read_conf "$2"
|
|
||||||
return
|
|
||||||
;;
|
|
||||||
|
|
||||||
-u | --user)
|
|
||||||
rm "$EXCLUDE"
|
|
||||||
rm "$INPUTS"
|
|
||||||
config="/home/$2/.simple_backup/config"
|
|
||||||
read_conf "$config"
|
|
||||||
return
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: Option $1 not recognised. Use 'simple-backup -h' to see available options" | tee -a $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
#Create HOME/.simple_backup if it doesn't exist
|
|
||||||
if [[ ! -d "$HOME/.simple_backup" ]]; then
|
|
||||||
mkdir "$HOME/.simple_backup"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Check number of parameters
|
|
||||||
if [[ "$#" -lt 1 ]]; then
|
|
||||||
#Read parameters from configuration file
|
|
||||||
default_config=1
|
|
||||||
else
|
|
||||||
default_config=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Backup old log files
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/simple_backup.log $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/errors.log $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log ]]; then
|
|
||||||
mv -f $HOME/.simple_backup/warnings.log $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
#If no input parameter is given, check existence of config file
|
|
||||||
if [[ $default_config -eq 1 && ! -f $HOME/.simple_backup/config ]]; then
|
|
||||||
#If no config file and input parameter is given, exit
|
|
||||||
echo "$(date): Backup failed (see errors.log)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Error: Configuration file not found" | tee $HOME/.simple_backup/errors.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup failed
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup failed"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
elif [[ $default_config -eq 1 && -f $HOME/.simple_backup/config ]]; then
|
|
||||||
#Read configuration file
|
|
||||||
read_conf
|
|
||||||
else
|
|
||||||
#Parse command line arguments
|
|
||||||
parse_options "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z $n_in || $n_in -eq 0 ]]; then
|
|
||||||
echo "$(date): Backup finished (no files copied)" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
echo "Warning: no valid input selected. Nothing to do" | tee -a $HOME/.simple_backup/warnings.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup finished
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup finished (warnings)"
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$(date): Starting backup" > $HOME/.simple_backup/simple_backup.log
|
|
||||||
#If libnotify is installed, show desktop notification that backup is starting
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Starting backup"
|
|
||||||
|
|
||||||
#If specified, keep the last n backups and remove the others. Default: keep all
|
|
||||||
if [[ -n $KEEP ]]; then
|
|
||||||
N_BACKUP=$(ls -l $BACKUP_DEV/simple_backup | grep -c ^d)
|
|
||||||
N_BACKUP=$(($N_BACKUP-1))
|
|
||||||
|
|
||||||
if [[ $N_BACKUP -gt $KEEP ]]; then
|
|
||||||
echo "$(date): Removing old backups..." >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
REMOVE=$(mktemp)
|
|
||||||
find $BACKUP_DEV/simple_backup/* -maxdepth 0 -type d | sort | head -n $(($N_BACKUP - $KEEP)) >> $REMOVE
|
|
||||||
|
|
||||||
while read line
|
|
||||||
do
|
|
||||||
rm -r $line
|
|
||||||
echo "Removed backup: $line" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
done<$REMOVE
|
|
||||||
|
|
||||||
rm $REMOVE
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sort input files for rsync efficiency
|
|
||||||
if [[ ! -z "$INPUTS" ]]; then
|
|
||||||
sort "$INPUTS" -o "$INPUTS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$LAST_BACKUP" ]]; then
|
|
||||||
rsync -acrv -H -X -R --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> "$HOME/.simple_backup/simple_backup.log" 2>> "$HOME/.simple_backup/errors.log"
|
|
||||||
else
|
|
||||||
rsync -acrv -H -X -R --link-dest="$LAST_BACKUP" --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> "$HOME/.simple_backup/simple_backup.log" 2>> "$HOME/.simple_backup/errors.log"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Update the logs
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log && $(cat $HOME/.simple_backup/errors.log | wc -l) -gt 0 ]]; then
|
|
||||||
echo "$(date): Backup finished with errors" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
error_flag=1
|
|
||||||
elif [[ -f $HOME/.simple_backup/warnings.log && $(cat $HOME/.simple_backup/warnings.log | wc -l) -gt 0 ]]; then
|
|
||||||
echo "$(date): Backup finished with warnings" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
error_flag=2
|
|
||||||
else
|
|
||||||
echo "$(date): Backup finished" >> $HOME/.simple_backup/simple_backup.log
|
|
||||||
error_flag=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -z "$EXCLUDE" ]]; then
|
|
||||||
rm "$EXCLUDE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -z "$INPUTS" ]]; then
|
|
||||||
rm "$INPUTS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -L "$BACKUP_DEV/simple_backup/last_backup" ]]; then
|
|
||||||
rm "$BACKUP_DEV/simple_backup/last_backup"
|
|
||||||
fi
|
|
||||||
|
|
||||||
BACKUP_DIR_FULL=$(readlink -f "$BACKUP_DIR")
|
|
||||||
ln -sf "$BACKUP_DIR_FULL" "$BACKUP_DEV/simple_backup/last_backup"
|
|
||||||
|
|
||||||
if [[ $error_flag -eq 0 ]]; then
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup finished"
|
|
||||||
elif [[ $error_flag -eq 1 ]]; then
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup finished (errors)"
|
|
||||||
else
|
|
||||||
! command -v notify-send > /dev/null 2>&1 || DISPLAY=:0.0 notify-send -u low -t 10000 "Backup finished (warnings)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/simple_backup.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/simple_backup.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/errors.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/errors.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f $HOME/.simple_backup/warnings.log.old ]]; then
|
|
||||||
rm -f $HOME/.simple_backup/warnings.log.old
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
Reference in New Issue
Block a user