Intelligent argument parsing added and possibility to specify the config file on the command line re-added.
This commit is contained in:
parent
f2f2a49a56
commit
a6921f391d
3 changed files with 105 additions and 31 deletions
|
|
@ -1,3 +1,9 @@
|
||||||
|
0.8 (05 August 2012)
|
||||||
|
===================
|
||||||
|
* Improved argument parsing. Now the script is insensitive to the order of appearance of the options and handles correctly optional options parameters
|
||||||
|
* Re-added possibility to specify the config file on the command line, which is now th recommanded way to do (facilitating script updates)
|
||||||
|
* Fix "unary operator expected warning" in some rare cases
|
||||||
|
|
||||||
0.7.1 (9 July 2012)
|
0.7.1 (9 July 2012)
|
||||||
===================
|
===================
|
||||||
* Adding 'duplicity-backup.conf' to .gitignore
|
* Adding 'duplicity-backup.conf' to .gitignore
|
||||||
|
|
|
||||||
33
README
33
README
|
|
@ -57,9 +57,16 @@ CONFIGURATION
|
||||||
|
|
||||||
The configuration takes place in a separate config file and is documented there.
|
The configuration takes place in a separate config file and is documented there.
|
||||||
|
|
||||||
The script looks for its configuration by reading the config file specified in
|
The script looks for its configuration by reading the config file specified by
|
||||||
the CONFIG parameter at the beggining of the script. Be sure to edit it to match
|
the command line option -c and fallback on the CONFIG parameter at the beggining
|
||||||
the actual location of your config file.
|
of the script otherwise.
|
||||||
|
|
||||||
|
Be sure to specify it on the command line or to edit the CONFIG parameter in the
|
||||||
|
script to match the actual location of your config file.
|
||||||
|
|
||||||
|
NOTE: to ease future updates of the script, you may want not to edit the script
|
||||||
|
at all and to specify systematically the path to your config file on the
|
||||||
|
command line with the -c option.
|
||||||
|
|
||||||
COMMON USAGE EXAMPLES
|
COMMON USAGE EXAMPLES
|
||||||
=====================
|
=====================
|
||||||
|
|
@ -68,36 +75,36 @@ COMMON USAGE EXAMPLES
|
||||||
$ duplicity-backup.sh
|
$ duplicity-backup.sh
|
||||||
|
|
||||||
* Run an incremental backup:
|
* Run an incremental backup:
|
||||||
$ duplicity-backup.sh --backup
|
$ duplicity-backup.sh [-c config_file] --backup
|
||||||
|
|
||||||
* Force a one-off full backup:
|
* Force a one-off full backup:
|
||||||
$ duplicity-backup.sh --full
|
$ duplicity-backup.sh [-c config_file] --full
|
||||||
|
|
||||||
* Restore your entire backup:
|
* Restore your entire backup:
|
||||||
$ duplicity-backup.sh --restore
|
$ duplicity-backup.sh [-c config_file] --restore
|
||||||
You will be prompted for a restore directory
|
You will be prompted for a restore directory
|
||||||
|
|
||||||
$ duplicity-backup.sh --restore /home/user/restore-folder
|
$ duplicity-backup.sh [-c config_file] --restore /home/user/restore-folder
|
||||||
You can also provide a restore folder on the command line.
|
You can also provide a restore folder on the command line.
|
||||||
|
|
||||||
* Restore a specific file in the backup:
|
* Restore a specific file in the backup:
|
||||||
$ duplicity-backup.sh --restore-file
|
$ duplicity-backup.sh [-c config_file] --restore-file
|
||||||
You will be prompted for a file to restore to the current directory
|
You will be prompted for a file to restore to the current directory
|
||||||
|
|
||||||
$ duplicity-backup.sh --restore-file img/mom.jpg
|
$ duplicity-backup.sh [-c config_file] --restore-file img/mom.jpg
|
||||||
Restores the file img/mom.jpg to the current directory
|
Restores the file img/mom.jpg to the current directory
|
||||||
|
|
||||||
$ duplicity-backup.sh --restore-file img/mom.jpg /home/user/i-love-mom.jpg
|
$ duplicity-backup.sh [-c config_file] --restore-file img/mom.jpg /home/user/i-love-mom.jpg
|
||||||
Restores the file img/mom.jpg to /home/user/i-love-mom.jpg
|
Restores the file img/mom.jpg to /home/user/i-love-mom.jpg
|
||||||
|
|
||||||
* List files in the remote archive
|
* List files in the remote archive
|
||||||
$ duplicity-backup.sh --list-current-files
|
$ duplicity-backup.sh [-c config_file] --list-current-files
|
||||||
|
|
||||||
* Verify the backup
|
* Verify the backup
|
||||||
$ duplicity-backup.sh --verify
|
$ duplicity-backup.sh [-c config_file] --verify
|
||||||
|
|
||||||
* Backup the script and gpg key (for safekeeping)
|
* Backup the script and gpg key (for safekeeping)
|
||||||
$ duplicity-backup.sh --backup-script
|
$ duplicity-backup.sh [-c config_file] --backup-script
|
||||||
|
|
||||||
TROUBLESHOOTING
|
TROUBLESHOOTING
|
||||||
===============
|
===============
|
||||||
|
|
|
||||||
|
|
@ -27,14 +27,75 @@
|
||||||
#
|
#
|
||||||
# ---------------------------------------------------------------------------- #
|
# ---------------------------------------------------------------------------- #
|
||||||
|
|
||||||
# Set config file (don't forget to copy duplicity-backup.conf.example to
|
# Default config file (don't forget to copy duplicity-backup.conf.example to
|
||||||
# match that path)
|
# match that path)
|
||||||
|
# NOTE: It can be useful not to edit this script at all to ease future updates
|
||||||
|
# so the config file can be specified directly on the command line too
|
||||||
|
# with the -c option.
|
||||||
CONFIG="duplicity-backup.conf"
|
CONFIG="duplicity-backup.conf"
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
# Script Happens Below This Line - Shouldn't Require Editing #
|
# Script Happens Below This Line - Shouldn't Require Editing #
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
|
# Some expensive argument parsing that allows the script to
|
||||||
|
# be insensitive to the order of appearance of the options
|
||||||
|
# and to handle correctly option parameters that are optional
|
||||||
|
while getopts ":c:-:" opt; do
|
||||||
|
case $opt in
|
||||||
|
# parse long options (a bit tricky because builtin getopts does not
|
||||||
|
# manage long options and i don't want to impose GNU getopt dependancy)
|
||||||
|
-)
|
||||||
|
case "$OPTARG" in
|
||||||
|
backup | full | verify | list-current-files | collection-status | help)
|
||||||
|
COMMAND=$OPTARG
|
||||||
|
;;
|
||||||
|
# --restore [restore dest]
|
||||||
|
restore)
|
||||||
|
COMMAND=$OPTARG
|
||||||
|
# We try to find the optional value [restore dest]
|
||||||
|
if [ ! -z "${!OPTIND:0:1}" -a ! "${!OPTIND:0:1}" = "-" ]; then
|
||||||
|
RESTORE_DEST=${!OPTIND}
|
||||||
|
OPTIND=$(( $OPTIND + 1 )) # we found it, move forward in arg parsing
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
# --restore-file [file to restore] [restore dest]
|
||||||
|
restore-file)
|
||||||
|
COMMAND=$OPTARG
|
||||||
|
# We try to find the first optional value [file to restore]
|
||||||
|
if [ ! -z "${!OPTIND:0:1}" -a ! "${!OPTIND:0:1}" = "-" ]; then
|
||||||
|
FILE_TO_RESTORE=${!OPTIND}
|
||||||
|
OPTIND=$(( $OPTIND + 1 )) # we found it, move forward in arg parsing
|
||||||
|
else
|
||||||
|
continue # no value for the restore-file option, skip the rest
|
||||||
|
fi
|
||||||
|
# We try to find the second optional value [restore dest]
|
||||||
|
if [ ! -z "${!OPTIND:0:1}" -a ! "${!OPTIND:0:1}" = "-" ]; then
|
||||||
|
RESTORE_DEST=${!OPTIND}
|
||||||
|
OPTIND=$(( $OPTIND + 1 )) # we found it, move forward in arg parsing
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option: --$OPTARG" >&2
|
||||||
|
COMMAND=$OPTARG
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
# here are parsed the short options
|
||||||
|
c) # set the config file from the command line
|
||||||
|
CONFIG=$OPTARG
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
echo "Option -$OPTARG requires an argument." >&2
|
||||||
|
COMMAND=""
|
||||||
|
;;
|
||||||
|
\?)
|
||||||
|
echo "Invalid option: -$OPTARG" >&2
|
||||||
|
COMMAND=""
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Read config file if specified
|
# Read config file if specified
|
||||||
if [ ! -z "$CONFIG" -a -f "$CONFIG" ];
|
if [ ! -z "$CONFIG" -a -f "$CONFIG" ];
|
||||||
then
|
then
|
||||||
|
|
@ -322,13 +383,13 @@ echo -e "-------- START DUPLICITY-BACKUP SCRIPT --------\n" >> ${LOGFILE}
|
||||||
|
|
||||||
get_lock
|
get_lock
|
||||||
|
|
||||||
case "$1" in
|
case "$COMMAND" in
|
||||||
"--backup-script")
|
"backup-script")
|
||||||
backup_this_script
|
backup_this_script
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--full")
|
"full")
|
||||||
OPTION="full"
|
OPTION="full"
|
||||||
include_exclude
|
include_exclude
|
||||||
duplicity_backup
|
duplicity_backup
|
||||||
|
|
@ -336,7 +397,7 @@ case "$1" in
|
||||||
get_file_sizes
|
get_file_sizes
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--verify")
|
"verify")
|
||||||
OLDROOT=${ROOT}
|
OLDROOT=${ROOT}
|
||||||
ROOT=${DEST}
|
ROOT=${DEST}
|
||||||
DEST=${OLDROOT}
|
DEST=${OLDROOT}
|
||||||
|
|
@ -355,11 +416,11 @@ case "$1" in
|
||||||
echo -e "Verify complete. Check the log file for results:\n>> ${LOGFILE}"
|
echo -e "Verify complete. Check the log file for results:\n>> ${LOGFILE}"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--restore")
|
"restore")
|
||||||
ROOT=$DEST
|
ROOT=$DEST
|
||||||
OPTION="restore"
|
OPTION="restore"
|
||||||
|
|
||||||
if [[ ! "$2" ]]; then
|
if [[ ! "$RESTORE_DEST" ]]; then
|
||||||
echo "Please provide a destination path (eg, /home/user/dir):"
|
echo "Please provide a destination path (eg, /home/user/dir):"
|
||||||
read -e NEWDESTINATION
|
read -e NEWDESTINATION
|
||||||
DEST=$NEWDESTINATION
|
DEST=$NEWDESTINATION
|
||||||
|
|
@ -372,30 +433,28 @@ case "$1" in
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
DEST=$2
|
DEST=$RESTORE_DEST
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Attempting to restore now ..."
|
echo "Attempting to restore now ..."
|
||||||
duplicity_backup
|
duplicity_backup
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--restore-file")
|
"restore-file")
|
||||||
ROOT=$DEST
|
ROOT=$DEST
|
||||||
INCLUDE=
|
INCLUDE=
|
||||||
EXCLUDE=
|
EXCLUDE=
|
||||||
EXLUDEROOT=
|
EXLUDEROOT=
|
||||||
OPTION=
|
OPTION=
|
||||||
|
|
||||||
if [[ ! "$2" ]]; then
|
if [[ ! "$FILE_TO_RESTORE" ]]; then
|
||||||
echo "Which file do you want to restore (eg, mail/letter.txt):"
|
echo "Which file do you want to restore (eg, mail/letter.txt):"
|
||||||
read -e FILE_TO_RESTORE
|
read -e FILE_TO_RESTORE
|
||||||
echo
|
echo
|
||||||
else
|
|
||||||
FILE_TO_RESTORE=$2
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$3" ]]; then
|
if [[ "$RESTORE_DEST" ]]; then
|
||||||
DEST=$3
|
DEST=$RESTORE_DEST
|
||||||
else
|
else
|
||||||
DEST=$(basename $FILE_TO_RESTORE)
|
DEST=$(basename $FILE_TO_RESTORE)
|
||||||
fi
|
fi
|
||||||
|
|
@ -420,7 +479,7 @@ case "$1" in
|
||||||
duplicity_backup
|
duplicity_backup
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--list-current-files")
|
"list-current-files")
|
||||||
OPTION="list-current-files"
|
OPTION="list-current-files"
|
||||||
${DUPLICITY} ${OPTION} ${VERBOSITY} ${STATIC_OPTIONS} \
|
${DUPLICITY} ${OPTION} ${VERBOSITY} ${STATIC_OPTIONS} \
|
||||||
$ENCRYPT \
|
$ENCRYPT \
|
||||||
|
|
@ -428,7 +487,7 @@ case "$1" in
|
||||||
echo -e "-------- END --------\n" >> ${LOGFILE}
|
echo -e "-------- END --------\n" >> ${LOGFILE}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--collection-status")
|
"collection-status")
|
||||||
OPTION="collection-status"
|
OPTION="collection-status"
|
||||||
${DUPLICITY} ${OPTION} ${VERBOSITY} ${STATIC_OPTIONS} \
|
${DUPLICITY} ${OPTION} ${VERBOSITY} ${STATIC_OPTIONS} \
|
||||||
$ENCRYPT \
|
$ENCRYPT \
|
||||||
|
|
@ -436,7 +495,7 @@ case "$1" in
|
||||||
echo -e "-------- END --------\n" >> ${LOGFILE}
|
echo -e "-------- END --------\n" >> ${LOGFILE}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"--backup")
|
"backup")
|
||||||
include_exclude
|
include_exclude
|
||||||
duplicity_backup
|
duplicity_backup
|
||||||
duplicity_cleanup
|
duplicity_cleanup
|
||||||
|
|
@ -449,6 +508,8 @@ case "$1" in
|
||||||
`basename $0` [options]
|
`basename $0` [options]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
-c config_file : specify the config file to use
|
||||||
|
|
||||||
--backup: runs an incremental backup
|
--backup: runs an incremental backup
|
||||||
--full: forces a full backup
|
--full: forces a full backup
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue