diff --git a/usr/share/rear/backup/NETFS/default/500_make_backup.sh b/usr/share/rear/backup/NETFS/default/500_make_backup.sh index 02c204c5..60c80b5f 100644 --- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh +++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh @@ -16,6 +16,8 @@ function set_tar_features () { FEATURE_TAR_IS_SET=1 } +local backup_prog_rc + local scheme=$( url_scheme $BACKUP_URL ) local path=$( url_path $BACKUP_URL ) local opath=$( backup_path $scheme $path ) diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh index c560ec94..1692ba4c 100644 --- a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh +++ b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh @@ -1,5 +1,7 @@ # Start SELinux if it was stopped - check presence of $TMP_DIR/selinux.mode +local backup_prog_rc + [ -f $TMP_DIR/selinux.mode ] && { touch "${TMP_DIR}/selinux.autorelabel" cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE @@ -13,19 +15,19 @@ ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \ "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null - _rc=$? - if [ $_rc -ne 0 ]; then - LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]" + backup_prog_rc=$? + if [ $backup_prog_rc -ne 0 ]; then + LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]" #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" fi ;; (rsync) - $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \ + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \ "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" - _rc=$? - if [ $_rc -ne 0 ]; then - LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]" + backup_prog_rc=$? + if [ $backup_prog_rc -ne 0 ]; then + LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]" #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" fi ;; diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh index cae12e38..9a17d6bb 100644 --- a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh +++ b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh @@ -1,3 +1,5 @@ +local backup_prog_rc + [ -f $TMP_DIR/force.autorelabel ] && { > "${TMP_DIR}/selinux.autorelabel" @@ -11,19 +13,19 @@ ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \ "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null - _rc=$? - if [ $_rc -ne 0 ]; then - LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]" + backup_prog_rc=$? + if [ $backup_prog_rc -ne 0 ]; then + LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]" #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" fi ;; (rsync) - $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \ + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \ "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" - _rc=$? - if [ $_rc -ne 0 ]; then - LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]" + backup_prog_rc=$? + if [ $backup_prog_rc -ne 0 ]; then + LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]" #StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" fi ;; @@ -35,8 +37,7 @@ # probably using the BACKUP=NETFS workflow instead if [ -d "${opath}" ]; then if [ ! -f "${opath}/selinux.autorelabel" ]; then - > "${opath}/selinux.autorelabel" - StopIfError "Failed to create selinux.autorelabel on ${opath}" + > "${opath}/selinux.autorelabel" || Error "Failed to create selinux.autorelabel on ${opath}" fi fi ;; diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh index 60330007..cedee9ce 100644 --- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh +++ b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh @@ -4,7 +4,7 @@ # check for the --relative option in BACKUP_RSYNC_OPTIONS array # for the default values see the standard definition in conf/default.conf file -if ! grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then +if ! grep -q relative <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then BACKUP_RSYNC_OPTIONS+=( --relative ) Log "Added option '--relative' to the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow" fi diff --git a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh index 0d67d362..750a04ca 100644 --- a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh +++ b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh @@ -2,6 +2,9 @@ # This file is part of Relax-and-Recover, licensed under the GNU General # Public License. Refer to the included COPYING for full text of license. +local backup_prog_rc +local backup_log_message + Log "Include list:" while read -r ; do Log " $REPLY" @@ -11,9 +14,9 @@ while read -r ; do Log " $REPLY" done < $TMP_DIR/backup-exclude.txt -LogPrint "Creating $BACKUP_PROG archive on '${RSYNC_HOST}:${RSYNC_PATH}'" +LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'" -ProgressStart "Running archive operation" +ProgressStart "Running backup operation" ( case "$(basename $BACKUP_PROG)" in @@ -37,7 +40,7 @@ ProgressStart "Running archive operation" ;; (*) - # no other backup programs foreseen then rsync so far + # no other backup programs foreseen than rsync so far : ;; @@ -96,7 +99,7 @@ case "$(basename $BACKUP_PROG)" in ;; esac - ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]" + ProgressInfo "Backed up $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]" done ;; @@ -113,24 +116,23 @@ ProgressStop wait $BackupPID transfertime="$((SECONDS-starttime))" -_rc="$(cat $TMP_DIR/retval)" +backup_prog_rc="$(cat $TMP_DIR/retval)" sleep 1 # everyone should see this warning, even if not verbose -test "$_rc" -gt 0 && VERBOSE=1 LogPrint "WARNING ! -There was an error (${rsync_err_msg[$_rc]}) during archive creation. -Please check the archive and see '$RUNTIME_LOGFILE' for more information. +test "$backup_prog_rc" -gt 0 && Error " +There was an error (${rsync_err_msg[$backup_prog_rc]}) during backup creation. +Please check the destination and see '$RUNTIME_LOGFILE' for more information. -Since errors are often related to files that cannot be saved by -$BACKUP_PROG, we will continue the $WORKFLOW process. However, you MUST -verify the backup yourself before trusting it ! +If the error is related to files that cannot and should not be saved by +$BACKUP_PROG, they should be excluded from the backup. " -_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)" -if [ $_rc -eq 0 -a "$_message" ] ; then - LogPrint "$_message in $transfertime seconds." +backup_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)" +if [ $backup_prog_rc -eq 0 -a "$backup_log_message" ] ; then + LogPrint "$backup_log_message in $transfertime seconds." elif [ "$size" ]; then - LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]" + LogPrint "Backed up $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]" fi diff --git a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh index 01801a4e..b90d459b 100644 --- a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh +++ b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh @@ -1,6 +1,8 @@ # copy the backup.log & rear.log file to remote destination with timestamp added -Timestamp=$( date +%Y%m%d.%H%M ) +local timestamp + +timestamp=$( date +%Y%m%d.%H%M ) # compress the log file first gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'" @@ -10,15 +12,15 @@ case $RSYNC_PROTO in # FIXME: Add an explanatory comment why "2>/dev/null" is useful here # or remove it according to https://github.com/rear/rear/issues/1395 $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" \ - "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz" 2>/dev/null + "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null - $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${Timestamp}.log" 2>/dev/null + $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${timestamp}.log" 2>/dev/null ;; (rsync) - $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" ${BACKUP_RSYNC_OPTIONS[@]} \ - "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz" + $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" "${BACKUP_RSYNC_OPTIONS[@]}" \ + "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" - $BACKUP_PROG -a "$RUNTIME_LOGFILE" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${Timestamp}.log" + $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${timestamp}.log" ;; esac diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf index 455aa3ce..0c230f38 100644 --- a/usr/share/rear/conf/default.conf +++ b/usr/share/rear/conf/default.conf @@ -1106,7 +1106,8 @@ BACKUP_ONLY_EXCLUDE="no" MANUAL_INCLUDE=NO # Disable SELinux policy during backup with NETFS or RSYNC (default yes) BACKUP_SELINUX_DISABLE=1 -# Enable integrity check of the backup archive (only with BACKUP=NETFS and BACKUP_PROG=tar) +# Enable integrity check of the backup archive (full check only with BACKUP=NETFS and BACKUP_PROG=tar, +# with BACKUP=rsync or BACKUP_PROG=rsync it only checks whether rsync completed the restore successfully) BACKUP_INTEGRITY_CHECK= # Define BACKUP_TYPE. # By default BACKUP_TYPE is empty which means "rear mkbackup" will create a full backup. diff --git a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh index 32ac391d..519febf5 100644 --- a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh +++ b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh @@ -2,21 +2,19 @@ # RSYNC_PREFIX=$HOSTNAME as set in default.conf # create temporary local work-spaces to collect files (we already make the remote backup dir with the correct mode!!) -mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 -StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'" -mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 -StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'" +mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'" +mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'" case $RSYNC_PROTO in (ssh) - $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 - StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}" + $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 \ + || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}" ;; (rsync) - $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null - StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}" + $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null \ + || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}" ;; esac diff --git a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh index c7b430d8..96b62da1 100644 --- a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh +++ b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh @@ -5,19 +5,19 @@ LogPrint "Copying resulting files to $OUTPUT_URL location" # if called as mkbackuponly then we just don't have any result files. if test "$RESULT_FILES" ; then - Log "Copying files '${RESULT_FILES[@]}' to $OUTPUT_URL location" - cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" - StopIfError "Could not copy files to local rsync location" + Log "Copying files '${RESULT_FILES[*]}' to $OUTPUT_URL location" + cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \ + || Error "Could not copy files to local rsync location" fi -echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION" -StopIfError "Could not create VERSION file on local rsync location" +echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION" \ + || Error "Could not create VERSION file on local rsync location" -cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README" -StopIfError "Could not copy usage file to local rsync location" +cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README" \ + || Error "Could not copy usage file to local rsync location" -cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" -StopIfError "Could not copy $RUNTIME_LOGFILE to local rsync location" +cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \ + || Error "Could not copy $RUNTIME_LOGFILE to local rsync location" case $RSYNC_PROTO in @@ -25,20 +25,20 @@ case $RSYNC_PROTO in Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" # FIXME: Add an explanatory comment why "2>/dev/null" is useful here # or remove it according to https://github.com/rear/rear/issues/1395 - $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null - StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location" + $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \ + || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location" ;; (rsync) - Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" + Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" # FIXME: Add an explanatory comment why "2>/dev/null" is useful here # or remove it according to https://github.com/rear/rear/issues/1395 - $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null - StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location" + $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \ + || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location" ;; esac # cleanup the temporary space (need it for the log file during backup) -rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" -LogIfError "Could not cleanup temoprary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/" +rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \ + || Log "Could not cleanup temporary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/" diff --git a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh index fadf9d72..3c719c44 100644 --- a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh +++ b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh @@ -31,7 +31,7 @@ case $scheme in backup_directory_mountpoint=$( df -P "$backup_directory" | tail -1 | awk '{print $6}' ) test "/" = "$backup_directory_mountpoint" && Error "URL '$BACKUP_URL' has the backup directory '$backup_directory' in the '/' filesystem which is forbidden." # When the mountpoint of the backup directory is not yet excluded add its mountpoint to the EXCLUDE_RECREATE array: - if ! grep -q "$backup_directory_mountpoint" <<< $( echo ${EXCLUDE_RECREATE[@]} ) ; then + if ! grep -q "$backup_directory_mountpoint" <<< "${EXCLUDE_RECREATE[*]}" ; then EXCLUDE_RECREATE+=( "fs:$backup_directory_mountpoint" ) fi ;; diff --git a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh index ac26edfa..eb7df29e 100644 --- a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh +++ b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh @@ -33,7 +33,7 @@ case $(basename $BACKUP_PROG) in touch $TMP_DIR/force.autorelabel # after reboot the restored system do a forced SELinux relabeling else # if --xattrs is already set; no need to do it again - if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then + if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then BACKUP_RSYNC_OPTIONS+=( --xattrs ) fi RSYNC_SELINUX=1 # variable used in recover mode (means using xattr and not disable SELinux) diff --git a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh index b8535352..c964a148 100644 --- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh +++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh @@ -33,22 +33,20 @@ RSYNC_PORT=873 # default port (of rsync server) RSYNC_PATH= -echo $BACKUP_URL | egrep -q '(::)' # new style '::' means rsync protocol -if [[ $? -eq 0 ]]; then +if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol RSYNC_PROTO=rsync else RSYNC_PROTO=ssh fi -echo $host | grep -q '@' -if [[ $? -eq 0 ]]; then +if grep -q '@' <<< $host ; then RSYNC_USER="${host%%@*}" # grab user name else RSYNC_USER=root fi # remove USER@ if present (we don't need it anymore) -tmp2="${host#*@}" +local tmp2="${host#*@}" case "$RSYNC_PROTO" in @@ -56,8 +54,7 @@ case "$RSYNC_PROTO" in # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02:: RSYNC_HOST="${tmp2%%::*}" # path=/gdhaese1@witsbebelnx02::backup or path=/backup - echo $path | grep -q '::' - if [[ $? -eq 0 ]]; then + if grep -q '::' <<< $path ; then RSYNC_PATH="${path##*::}" else RSYNC_PATH="${path##*/}" @@ -79,8 +76,7 @@ esac # check if host is reachable if test "$PING" ; then - ping -c 2 "$RSYNC_HOST" >/dev/null - StopIfError "Backup host [$RSYNC_HOST] not reachable." + ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable." else Log "Skipping ping test" fi @@ -89,15 +85,15 @@ fi case "$RSYNC_PROTO" in (rsync) - Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/" - $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null - StopIfError "Rsync daemon not running on $RSYNC_HOST" + Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/" + $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null \ + || Error "Rsync daemon not running on $RSYNC_HOST" ;; (ssh) Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true" - ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 - StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" + ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \ + || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" ;; esac diff --git a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh index 446dd736..e9103531 100644 --- a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh +++ b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh @@ -2,15 +2,17 @@ # This file is part of Relax-and-Recover, licensed under the GNU General # Public License. Refer to the included COPYING for full text of license. # try to grab the rsync protocol version of rsync on the remote server + +local remote_mountpoint + if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then case $RSYNC_PROTO in (ssh) - ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 - StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" - grep -q "protocol version" "$TMP_DIR/rsync_protocol" - if [ $? -eq 0 ]; then + ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \ + || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" + if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}') else RSYNC_PROTOCOL_VERSION=29 # being conservative (old rsync version < 3.0) @@ -30,25 +32,21 @@ else fi -if [ "${RSYNC_USER}" != "root" ]; then +if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then if [ $RSYNC_PROTOCOL_VERSION -gt 29 ]; then if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then # no xattrs available in remote rsync, so --fake-super is not possible Error "rsync --fake-super not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)" else # when using --fake-super we must have user_xattr mount options on the remote mntpt - _mntpt=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}') - ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" - StopIfError "Remote file system $_mntpt does not have user_xattr mount option set!" - #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="""rsync --fake-super""" ) + remote_mountpoint=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}') + ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \ + || Error "Remote file system $remote_mountpoint does not have user_xattr mount option set!" + #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="rsync --fake-super" ) # see issue #366 for explanation of removing --xattrs - BACKUP_RSYNC_OPTIONS+=( --rsync-path="""rsync --fake-super""" ) + BACKUP_RSYNC_OPTIONS+=( --rsync-path="rsync --fake-super" ) fi else - if [ ${BACKUP_RSYNC_OPTIONS[@]/--fake-super/} != ${BACKUP_RSUNC_OPTIONS[@]} ]; then - Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)" - else - Log "Warning: rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)" - fi + Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)" fi fi diff --git a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh index 0a9c9648..220ccc57 100644 --- a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh +++ b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh @@ -5,6 +5,8 @@ # Restore from remote backup via DUPLICIY over rsync if [ "$BACKUP_PROG" = "duplicity" ]; then + local backup_prog_rc + local restore_log_message LogPrint "========================================================================" LogPrint "Restoring backup with $BACKUP_PROG from '$BACKUP_DUPLICITY_URL'" @@ -49,7 +51,8 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then LogPrint "with CMD: $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir=$DUPLICITY_TEMPDIR $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT" $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir="$DUPLICITY_TEMPDIR" $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT 0<&6 | tee $TMP_DIR/duplicity-restore.log fi - _rc=$? + # FIXME: this collects the exit code from "tee", not from $DUPLICITY_PROG + backup_prog_rc=$? transfertime="$((SECONDS-$starttime))" sleep 1 @@ -65,20 +68,20 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then LogPrint "========================================================================" - if [ "$_rc" -gt 0 ]; then + if [ "$backup_prog_rc" -gt 0 ]; then LogPrint "WARNING ! There was an error while restoring the archive. Please check '$RUNTIME_LOGFILE' and $TMP_DIR/duplicity-restore.log for more information. You should also manually check the restored system to see whether it is complete. " - _message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)" + restore_log_message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)" LogPrint "Last 14 Lines of ${TMP_DIR}/duplicity-restore.log:" - LogPrint "$_message" + LogPrint "$restore_log_message" fi - if [ $_rc -eq 0 ] ; then + if [ $backup_prog_rc -eq 0 ] ; then LogPrint "Restore completed in $transfertime seconds." fi diff --git a/usr/share/rear/restore/RBME/default/400_restore_backup.sh b/usr/share/rear/restore/RBME/default/400_restore_backup.sh index 28a3c354..3e97e16b 100644 --- a/usr/share/rear/restore/RBME/default/400_restore_backup.sh +++ b/usr/share/rear/restore/RBME/default/400_restore_backup.sh @@ -2,6 +2,8 @@ if [[ -z "$RBME_BACKUP" ]] ; then Error "No RBME backup selected (BACKUP_URL?). Aborting." fi +local backup_prog_rc + scheme=$(url_scheme "$BACKUP_URL") LogPrint "Restoring from backup $RBME_BACKUP." @@ -43,11 +45,11 @@ transfertime="$((SECONDS-starttime))" # harvest return code from background job. The kill -0 $BackupPID loop above should # have made sure that this wait won't do any real "waiting" :-) wait $BackupPID -_rc=$? +backup_prog_rc=$? sleep 1 -test "$_rc" -gt 0 && LogPrint "WARNING ! -There was an error (${rsync_err_msg[$_rc]}) while restoring the archive. +test "$backup_prog_rc" -gt 0 && LogPrint "WARNING ! +There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the archive. Please check '$RUNTIME_LOGFILE' for more information. You should also manually check the restored system to see whether it is complete. " diff --git a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh index 53915322..a792f195 100644 --- a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh +++ b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh @@ -4,11 +4,11 @@ # without the --relative option ; my feeling says it is better to remove it from array BACKUP_RSYNC_OPTIONS # If I'm wrong please let us know (use issue mentioned above to comment) -if grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then +if grep -q -- "--relative" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then BACKUP_RSYNC_OPTIONS=( $( RmInArray "--relative" "${BACKUP_RSYNC_OPTIONS[@]}" ) ) Log "Removed option '--relative' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow" fi -if grep -q "-R" <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then +if grep -q -- "-R" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then BACKUP_RSYNC_OPTIONS=( $( RmInArray "-R" "${BACKUP_RSYNC_OPTIONS[@]}" ) ) Log "Removed option '-R' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow" fi diff --git a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh index 2a0bf15e..993088be 100644 --- a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh +++ b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh @@ -4,10 +4,10 @@ get_size() { echo $( stat --format '%s' "$TARGET_FS_ROOT/$1" ) } -mkdir -p "${TMP_DIR}/rsync/${NETFS_PREFIX}" -StopIfError "Could not mkdir '$TMP_DIR/rsync/${NETFS_PREFIX}'" +local backup_prog_rc +local restore_log_message -LogPrint "Restoring $BACKUP_PROG archive from '${RSYNC_HOST}:${RSYNC_PATH}'" +LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'" ProgressStart "Restore operation" ( @@ -33,9 +33,10 @@ ProgressStart "Restore operation" ;; (*) - # no other backup programs foreseen then rsync so far + # no other backup programs foreseen than rsync so far : ;; + esac echo $? >$TMP_DIR/retval ) >"${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log" & @@ -65,6 +66,7 @@ case "$(basename $BACKUP_PROG)" in ProgressStep done ;; + esac ProgressStop @@ -72,20 +74,28 @@ transfertime="$((SECONDS-starttime))" # harvest return code from background job. The kill -0 $BackupPID loop above should # have made sure that this wait won't do any real "waiting" :-) -wait $BackupPID -_rc=$? +wait $BackupPID || LogPrintError "Restore job returned a nonzero exit code $?" +# harvest the actual return code of rsync. Finishing the pipeline with an error code above is actually unlikely, +# because rsync is not the last command in it. But error returns from rsync are common and must be handled. +backup_prog_rc="$(cat $TMP_DIR/retval)" sleep 1 -test "$_rc" -gt 0 && LogPrint "WARNING ! -There was an error (${rsync_err_msg[$_rc]}) while restoring the archive. +if test "$backup_prog_rc" -gt 0 ; then + # TODO: Shouldn't we tell the user to check ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log as well? + LogPrintError "WARNING ! +There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the backup. Please check '$RUNTIME_LOGFILE' for more information. You should also manually check the restored system to see whether it is complete. " + is_true "$BACKUP_INTEGRITY_CHECK" && Error "Integrity check failed, restore aborted because BACKUP_INTEGRITY_CHECK is enabled" +fi -_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)" +restore_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)" -if [ $_rc -eq 0 -a "$_message" ] ; then - LogPrint "$_message in $transfertime seconds." +if [ $backup_prog_rc -eq 0 -a "$restore_log_message" ] ; then + LogPrint "$restore_log_message in $transfertime seconds." elif [ "$size" ]; then LogPrint "Restored $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]" fi + +return $backup_prog_rc diff --git a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh index 3622884a..890161f1 100644 --- a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh +++ b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh @@ -3,8 +3,8 @@ [[ $RSYNC_SELINUX ]] && { # if --xattrs is already set; no need to do it again - if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then - RSYNC_OPTIONS=( "${BACKUP_RSYNC_OPTIONS[@]}" --xattrs ) + if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then + BACKUP_RSYNC_OPTIONS+=( --xattrs ) fi } diff --git a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh index 47ed9e02..b2fb72f5 100644 --- a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh +++ b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh @@ -3,12 +3,12 @@ case $RSYNC_PROTO in (ssh) - ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 - StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]" + ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \ + || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]" ;; (rsync) - $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 - StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]" + $BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \ + || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]" ;; esac