8 Commits
1.3.2 ... 1.4.2

Author SHA1 Message Date
133a6b1a48 Fix minor bug
When using the '-s/--checksum' option, rsync output numbers were
not in human readable format. This commit fix this minor issue.
2017-06-24 23:29:39 +02:00
584532e2c7 Fix minor bug
Now the program is able to get as input arguments or output
directory files/directories containing spaces.
2017-06-23 13:47:44 +02:00
97d1a14260 Fix merge problem 2017-06-23 12:21:09 +02:00
71a2b6d01e Merge branch 'development' 2017-06-23 12:17:39 +02:00
6649925ec9 Add checksum option 2017-06-23 12:09:36 +02:00
871c8d6543 Now rsync outputs numbers in human-readable format 2017-06-20 19:26:22 +02:00
7035352cfd Fix minor bugs and options 2017-06-18 12:21:31 +02:00
d31080e5e4 Fix minor bugs 2017-06-17 15:11:55 +02:00

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
#Copyright 2015 Daniele Fucini <dfucini@gmail.com> #Copyright 2017 Daniele Fucini <dfucini@gmail.com>
#This program is free software: you can redistribute it and/or modify #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 #it under the terms of the GNU General Public License as published by
@ -19,7 +19,7 @@
#Help function #Help function
function help_function { function help_function {
echo "simple_backup, version 1.3" echo "simple_backup, version 1.4.1"
echo "" echo ""
echo "Usage: $0 [OPTIONS]" echo "Usage: $0 [OPTIONS]"
echo "" echo ""
@ -36,8 +36,8 @@ function help_function {
echo " Default: keep all." echo " Default: keep all."
echo "-u, --user USER User performing the backup." echo "-u, --user USER User performing the backup."
echo " Default: current user." echo " Default: current user."
echo " WARNING: This currently doesn't work with" echo "-s, --checksum Use the checksum rsync option to compare files"
echo " other options!" echo " (MUCH slower)."
echo "" echo ""
echo "If no option is given, the program uses the default" echo "If no option is given, the program uses the default"
echo "configuration file: $HOMEDIR/.simple_backup/config." echo "configuration file: $HOMEDIR/.simple_backup/config."
@ -56,6 +56,13 @@ function read_conf {
echo "$(date): Backup failed (see errors.log)" >> $LOG echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed" echo "Backup failed"
echo "Error: Configuration file not found" | tee $ERR 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
@ -72,6 +79,14 @@ function read_conf {
echo "$(date): Backup failed (see errors.log)" >> $LOG echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed" echo "Backup failed"
echo "Error: Configuration file not found" | tee -a $ERR 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
mv $WARN "$HOMEDIR/.simple_backup/warnings.log" mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
@ -107,6 +122,13 @@ function read_conf {
echo "Backup failed" echo "Backup failed"
echo "Error: Output folder \"$BACKUP_DEV\" not found" | tee -a $ERR 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
mv $WARN "$HOMEDIR/.simple_backup/warnings.log" mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
@ -124,7 +146,7 @@ function read_conf {
if [[ ! -d "$BACKUP_DIR" ]]; then if [[ ! -d "$BACKUP_DIR" ]]; then
mkdir -p "$BACKUP_DIR/$DATE" mkdir -p "$BACKUP_DIR/$DATE"
else else
#If previous backup(s) exist(s), save link to the last backup #If previous backups exist, save link to the last backup
LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup") LAST_BACKUP=$(readlink -f "$BACKUP_DIR/last_backup")
mkdir "$BACKUP_DIR/$DATE" mkdir "$BACKUP_DIR/$DATE"
fi fi
@ -139,7 +161,6 @@ function read_conf {
#Parse options #Parse options
function parse_options { function parse_options {
i=1
n_in=0 n_in=0
#Create a temporary file to store inputs #Create a temporary file to store inputs
@ -167,25 +188,9 @@ function parse_options {
do do
input="$2" input="$2"
if [[ -z "$input" ]]; then
echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed"
echo "Error: bad options format" | tee -a $ERR
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
if [[ ! -e "$input" ]]; then if [[ ! -e "$input" ]]; then
echo "Warning: input \"${INPUTS[$i]}\" not found. Skipping" | tee -a $WARN echo "Warning: input \"$input\" not found. Skipping" | tee -a $WARN
else else
i=$((i+1))
n_in=$((n_in+1)) n_in=$((n_in+1))
echo "$input" >> "$INPUTS" echo "$input" >> "$INPUTS"
fi fi
@ -203,12 +208,19 @@ function parse_options {
echo "Backup failed" echo "Backup failed"
echo "Error: output folder \"$BACKUP_DEV\" not found" | tee -a $ERR 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
mv $WARN "$HOMEDIR/.simple_backup/warnings.log" mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
rm $INPUTS rm $INPUTS
rm $EXCLUDES rm $EXCLUDE
exit 1 exit 1
fi fi
@ -252,45 +264,57 @@ function parse_options {
;; ;;
-u | --user) -u | --user)
rm "$EXCLUDE" if [[ ! -d "/home/$2" ]]; then
rm "$INPUTS" echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed"
if [[ ! -d "/home/$2" ]]; then echo "Error: user $2 doesn't exist" | tee -a $ERR
echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed" if [[ ! -d "$HOMEDIR/.simple_backup" ]]; then
echo "Error: user $2 doesn't exist" | tee -a $ERR mkdir "$HOMEDIR/.simple_backup"
mv $LOG "HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "HOMEDIR/.simple_bakup/errors.log"
mv $WARN "HOMEDIR/.simple_backup/warnings.log"
exit 1
fi fi
if [[ ! -d "/home/$2/.simple_backup" ]]; then #Fix ownership and permissions of log files if needed
mkdir "/home/$2/.simple_backup" if [[ ! -z $USER ]]; then
chown $USER:$USER $LOG && chmod 644 $LOG
echo "Created directory \"$HOMEDIR/.simple_backup\"." chown $USER:$USER $ERR && chmod 644 $ERR
echo "Copy there sample configuration and edit it" chown $USER:$USER $WARN && chmod 644 $WARN
echo "to your needs before running the backup."
exit 1
fi fi
HOMEDIR="/home/$2" mv $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
config="/home/$2/.simple_backup/config" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
USER="$2" 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"
read_conf "$config" shift
return
;; ;;
-s | --checksum)
OPTIONS="-arcvh -H -X -R"
;;
*) *)
echo "$(date): Backup failed (see errors.log)" >> $LOG echo "$(date): Backup failed (see errors.log)" >> $LOG
echo "Backup failed" echo "Backup failed"
echo "Error: Option $1 not recognised. Use 'simple-backup -h' to see available options" | tee -a $ERR 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
mv $WARN "$HOMEDIR/.simple_backup/warnings.log" mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
@ -311,6 +335,7 @@ ERR=$(mktemp)
WARN=$(mktemp) WARN=$(mktemp)
HOMEDIR="$HOME" HOMEDIR="$HOME"
OPTIONS="-arvh -H -X -R"
#Check number of parameters #Check number of parameters
if [[ "$#" -eq 0 ]]; then if [[ "$#" -eq 0 ]]; then
@ -319,21 +344,62 @@ if [[ "$#" -eq 0 ]]; then
echo "Created directory \"$HOMEDIR/.simple_backup\"." echo "Created directory \"$HOMEDIR/.simple_backup\"."
echo "Copy there sample configuration and edit it" echo "Copy there sample configuration and edit it"
echo "to your needs before running the backup." echo "to your needs before running the backup,"
echo "or pass options on the command line."
exit 1 exit 1
fi fi
read_conf read_conf
else else
parse_options $@ 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 fi
if [[ -z $n_in || $n_in -eq 0 ]]; then if [[ $n_in -eq 0 ]]; then
echo "$(date): Backup finished (no files copied)" >> $LOG echo "$(date): Backup finished (no files copied)" >> $LOG
echo "Backup finished" echo "Backup finished"
echo "Warning: no valid input selected. Nothing to do" | tee -a $WARN 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 $LOG "$HOMEDIR/.simple_backup/simple_backup.log"
mv $ERR "$HOMEDIR/.simple_backup/errors.log" mv $ERR "$HOMEDIR/.simple_backup/errors.log"
mv $WARN "$HOMEDIR/.simple_backup/warnings.log" mv $WARN "$HOMEDIR/.simple_backup/warnings.log"
@ -350,7 +416,7 @@ if [[ -n $KEEP ]]; then
N_BACKUP=$(($N_BACKUP-1)) N_BACKUP=$(($N_BACKUP-1))
if [[ $N_BACKUP -gt $KEEP ]]; then if [[ $N_BACKUP -gt $KEEP ]]; then
echo "$(date): Removing old backups" >> $LOG echo "$(date): Removing old backups" >> $LOG
echo "Removing old backups..." echo "Removing old backups..."
REMOVE=$(mktemp) REMOVE=$(mktemp)
find $BACKUP_DEV/simple_backup/* -maxdepth 0 -type d | sort | head -n $(($N_BACKUP - $KEEP)) >> $REMOVE find $BACKUP_DEV/simple_backup/* -maxdepth 0 -type d | sort | head -n $(($N_BACKUP - $KEEP)) >> $REMOVE
@ -376,9 +442,9 @@ fi
echo "Copying files. This may take a long time..." echo "Copying files. This may take a long time..."
if [[ -z "$LAST_BACKUP" ]]; then if [[ -z "$LAST_BACKUP" ]]; then
rsync -acrv -H -X -R --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR rsync $OPTIONS --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR
else else
rsync -acrv -H -X -R --link-dest="$LAST_BACKUP" --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR rsync $OPTIONS --link-dest="$LAST_BACKUP" --exclude-from="$EXCLUDE" --files-from="$INPUTS" / "$BACKUP_DIR" --ignore-missing-args >> $LOG 2>> $ERR
fi fi
#Update the logs #Update the logs