Synchronize patches from RHEL 8
Up to rear-2.6-2 Resolves: rhbz1973448
This commit is contained in:
parent
b9d2dc60e5
commit
9e9df692e4
693
rear-bz1930662.patch
Normal file
693
rear-bz1930662.patch
Normal file
@ -0,0 +1,693 @@
|
|||||||
|
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
|
274
rear-bz1945869.patch
Normal file
274
rear-bz1945869.patch
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
diff --git a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||||
|
old mode 100644
|
||||||
|
new mode 100755
|
||||||
|
index cc646359..33d87767
|
||||||
|
--- a/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||||
|
+++ b/usr/share/rear/finalize/Linux-i386/670_run_efibootmgr.sh
|
||||||
|
@@ -8,6 +8,10 @@ is_true $USING_UEFI_BOOTLOADER || return 0
|
||||||
|
# (cf. finalize/Linux-i386/610_EFISTUB_run_efibootmgr.sh):
|
||||||
|
is_true $EFI_STUB && return
|
||||||
|
|
||||||
|
+LogPrint "Creating EFI Boot Manager entries..."
|
||||||
|
+
|
||||||
|
+local esp_mountpoint esp_mountpoint_inside boot_efi_parts boot_efi_dev
|
||||||
|
+
|
||||||
|
# When UEFI_BOOTLOADER is not a regular file in the restored target system
|
||||||
|
# (cf. how esp_mountpoint is set below) it means BIOS is used
|
||||||
|
# (cf. rescue/default/850_save_sysfs_uefi_vars.sh)
|
||||||
|
@@ -15,64 +19,80 @@ is_true $EFI_STUB && return
|
||||||
|
# because when UEFI_BOOTLOADER is empty the test below evaluates to
|
||||||
|
# test -f /mnt/local/
|
||||||
|
# which also returns false because /mnt/local/ is a directory
|
||||||
|
-# (cf. https://github.com/rear/rear/pull/2051/files#r258826856):
|
||||||
|
-test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" || return 0
|
||||||
|
+# (cf. https://github.com/rear/rear/pull/2051/files#r258826856)
|
||||||
|
+# but using BIOS conflicts with USING_UEFI_BOOTLOADER is true
|
||||||
|
+# i.e. we should create EFI Boot Manager entries but we cannot:
|
||||||
|
+if ! test -f "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" ; then
|
||||||
|
+ LogPrintError "Failed to create EFI Boot Manager entries (UEFI bootloader '$UEFI_BOOTLOADER' not found under target $TARGET_FS_ROOT)"
|
||||||
|
+ return 1
|
||||||
|
+fi
|
||||||
|
|
||||||
|
# Determine where the EFI System Partition (ESP) is mounted in the currently running recovery system:
|
||||||
|
-esp_mountpoint=$( df -P "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" | tail -1 | awk '{print $6}' )
|
||||||
|
-# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint:
|
||||||
|
-test "$esp_mountpoint" || esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||||
|
+esp_mountpoint=$( filesystem_name "$TARGET_FS_ROOT/$UEFI_BOOTLOADER" )
|
||||||
|
+# Use TARGET_FS_ROOT/boot/efi as fallback ESP mountpoint (filesystem_name returns "/"
|
||||||
|
+# if mountpoint not found otherwise):
|
||||||
|
+if [ "$esp_mountpoint" = "/" ] ; then
|
||||||
|
+ esp_mountpoint="$TARGET_FS_ROOT/boot/efi"
|
||||||
|
+ LogPrint "Mountpoint of $TARGET_FS_ROOT/$UEFI_BOOTLOADER not found, trying $esp_mountpoint"
|
||||||
|
+fi
|
||||||
|
|
||||||
|
# Skip if there is no esp_mountpoint directory (e.g. the fallback ESP mountpoint may not exist).
|
||||||
|
# Double quotes are mandatory here because 'test -d' without any (possibly empty) argument results true:
|
||||||
|
-test -d "$esp_mountpoint" || return 0
|
||||||
|
-
|
||||||
|
-BootEfiDev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||||
|
-# /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||||
|
-Dev=$( get_device_name $BootEfiDev )
|
||||||
|
-# 1 (must anyway be a low nr <9)
|
||||||
|
-ParNr=$( get_partition_number $Dev )
|
||||||
|
-# /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||||
|
-Disk=$( echo ${Dev%$ParNr} )
|
||||||
|
-
|
||||||
|
-# Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||||
|
-# if we have 'mapper' in disk device name:
|
||||||
|
-if [[ ${Dev/mapper//} != $Dev ]] ; then
|
||||||
|
- # we only expect mpath_partX or mpathpX or mpath-partX
|
||||||
|
- case $Disk in
|
||||||
|
- (*p) Disk=${Disk%p} ;;
|
||||||
|
- (*-part) Disk=${Disk%-part} ;;
|
||||||
|
- (*_part) Disk=${Disk%_part} ;;
|
||||||
|
- (*) Log "Unsupported kpartx partition delimiter for $Dev"
|
||||||
|
- esac
|
||||||
|
+if ! test -d "$esp_mountpoint" ; then
|
||||||
|
+ LogPrintError "Failed to create EFI Boot Manager entries (no ESP mountpoint directory $esp_mountpoint)"
|
||||||
|
+ return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
-# For eMMC devices the trailing 'p' in the Disk value
|
||||||
|
-# (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||||
|
-# needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||||
|
-# efibootmgr call fails because of a wrong disk device name.
|
||||||
|
-# See also https://github.com/rear/rear/issues/2103
|
||||||
|
-if [[ $Disk = *'/mmcblk'+([0-9])p ]] ; then
|
||||||
|
- Disk=${Disk%p}
|
||||||
|
-fi
|
||||||
|
+# Mount point inside the target system,
|
||||||
|
+# accounting for possible trailing slashes in TARGET_FS_ROOT
|
||||||
|
+esp_mountpoint_inside="${esp_mountpoint#${TARGET_FS_ROOT%%*(/)}}"
|
||||||
|
|
||||||
|
-# For NVMe devices the trailing 'p' in the Disk value
|
||||||
|
-# (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||||
|
-# needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||||
|
-# efibootmgr call fails because of a wrong disk device name.
|
||||||
|
-# See also https://github.com/rear/rear/issues/1564
|
||||||
|
-if [[ $Disk = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||||
|
- Disk=${Disk%p}
|
||||||
|
+boot_efi_parts=$( find_partition "fs:$esp_mountpoint_inside" fs )
|
||||||
|
+if ! test "$boot_efi_parts" ; then
|
||||||
|
+ LogPrint "Unable to find ESP $esp_mountpoint_inside in layout"
|
||||||
|
+ LogPrint "Trying to determine device currently mounted at $esp_mountpoint as fallback"
|
||||||
|
+ boot_efi_dev="$( mount | grep "$esp_mountpoint" | awk '{print $1}' )"
|
||||||
|
+ if ! test "$boot_efi_dev" ; then
|
||||||
|
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find ESP $esp_mountpoint among mounted devices)"
|
||||||
|
+ return 1
|
||||||
|
+ fi
|
||||||
|
+ if test $(get_component_type "$boot_efi_dev") = part ; then
|
||||||
|
+ boot_efi_parts="$boot_efi_dev"
|
||||||
|
+ else
|
||||||
|
+ boot_efi_parts=$( find_partition "$boot_efi_dev" )
|
||||||
|
+ fi
|
||||||
|
+ if ! test "$boot_efi_parts" ; then
|
||||||
|
+ LogPrintError "Cannot create EFI Boot Manager entry (unable to find partition for $boot_efi_dev)"
|
||||||
|
+ return 1
|
||||||
|
+ fi
|
||||||
|
+ LogPrint "Using fallback EFI boot partition(s) $boot_efi_parts (unable to find ESP $esp_mountpoint_inside in layout)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
+local bootloader partition_block_device partition_number disk efipart
|
||||||
|
+
|
||||||
|
# EFI\fedora\shim.efi
|
||||||
|
-BootLoader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||||
|
-LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||||
|
-Log efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${BootLoader}\"
|
||||||
|
-if efibootmgr --create --gpt --disk ${Disk} --part ${ParNr} --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${BootLoader}" ; then
|
||||||
|
- # ok, boot loader has been set-up - tell rear we are done using following var.
|
||||||
|
- NOBOOTLOADER=''
|
||||||
|
- return
|
||||||
|
-fi
|
||||||
|
+bootloader=$( echo $UEFI_BOOTLOADER | cut -d"/" -f4- | sed -e 's;/;\\;g' )
|
||||||
|
+
|
||||||
|
+for efipart in $boot_efi_parts ; do
|
||||||
|
+ # /dev/sda1 or /dev/mapper/vol34_part2 or /dev/mapper/mpath99p4
|
||||||
|
+ partition_block_device=$( get_device_name $efipart )
|
||||||
|
+ # 1 or 2 or 4 for the examples above
|
||||||
|
+ partition_number=$( get_partition_number $partition_block_device )
|
||||||
|
+ if ! disk=$( get_device_from_partition $partition_block_device $partition_number ) ; then
|
||||||
|
+ LogPrintError "Cannot create EFI Boot Manager entry for ESP $partition_block_device (unable to find the underlying disk)"
|
||||||
|
+ # do not error out - we may be able to locate other disks if there are more of them
|
||||||
|
+ continue
|
||||||
|
+ fi
|
||||||
|
+ LogPrint "Creating EFI Boot Manager entry '$OS_VENDOR $OS_VERSION' for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER') "
|
||||||
|
+ Log efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label \"${OS_VENDOR} ${OS_VERSION}\" --loader \"\\${bootloader}\"
|
||||||
|
+ if efibootmgr --create --gpt --disk $disk --part $partition_number --write-signature --label "${OS_VENDOR} ${OS_VERSION}" --loader "\\${bootloader}" ; then
|
||||||
|
+ # ok, boot loader has been set-up - continue with other disks (ESP can be on RAID)
|
||||||
|
+ NOBOOTLOADER=''
|
||||||
|
+ else
|
||||||
|
+ LogPrintError "efibootmgr failed to create EFI Boot Manager entry on $disk partition $partition_number (ESP $partition_block_device )"
|
||||||
|
+ fi
|
||||||
|
+done
|
||||||
|
|
||||||
|
-LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$BootLoader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||||
|
+is_true $NOBOOTLOADER || return 0
|
||||||
|
+LogPrintError "efibootmgr failed to create EFI Boot Manager entry for '$bootloader' (UEFI_BOOTLOADER='$UEFI_BOOTLOADER')"
|
||||||
|
+return 1
|
||||||
|
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
index 54ddb50f..cdd81a14 100644
|
||||||
|
--- a/usr/share/rear/lib/layout-functions.sh
|
||||||
|
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
@@ -302,12 +302,20 @@ get_child_components() {
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
-# Return all ancestors of component $1 [ of type $2 ]
|
||||||
|
+# Return all ancestors of component $1 [ of type $2 [ skipping types $3 during resolution ] ]
|
||||||
|
get_parent_components() {
|
||||||
|
- declare -a ancestors devlist
|
||||||
|
- declare current child parent
|
||||||
|
+ declare -a ancestors devlist ignoretypes
|
||||||
|
+ declare current child parent parenttype
|
||||||
|
|
||||||
|
devlist=( "$1" )
|
||||||
|
+ if [[ "$3" ]] ; then
|
||||||
|
+ # third argument should, if present, be a space-separated list
|
||||||
|
+ # of types to ignore when walking up the dependency tree.
|
||||||
|
+ # Convert it to array
|
||||||
|
+ ignoretypes=( $3 )
|
||||||
|
+ else
|
||||||
|
+ ignoretypes=()
|
||||||
|
+ fi
|
||||||
|
while (( ${#devlist[@]} )) ; do
|
||||||
|
current=${devlist[0]}
|
||||||
|
|
||||||
|
@@ -318,6 +326,13 @@ get_parent_components() {
|
||||||
|
if IsInArray "$parent" "${ancestors[@]}" ; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
+ ### ...test if parent is of a correct type if requested...
|
||||||
|
+ if [[ ${#ignoretypes[@]} -gt 0 ]] ; then
|
||||||
|
+ parenttype=$(get_component_type "$parent")
|
||||||
|
+ if IsInArray "$parenttype" "${ignoretypes[@]}" ; then
|
||||||
|
+ continue
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
### ...and add them to the list
|
||||||
|
devlist+=( "$parent" )
|
||||||
|
ancestors+=( "$parent" )
|
||||||
|
@@ -345,22 +360,24 @@ get_parent_components() {
|
||||||
|
}
|
||||||
|
|
||||||
|
# find_devices <other>
|
||||||
|
+# ${2+"$2"} in the following functions ensures that $2 gets passed down quoted if present
|
||||||
|
+# and ignored if not present
|
||||||
|
# Find the disk device(s) component $1 resides on.
|
||||||
|
find_disk() {
|
||||||
|
- get_parent_components "$1" "disk"
|
||||||
|
+ get_parent_components "$1" "disk" ${2+"$2"}
|
||||||
|
}
|
||||||
|
|
||||||
|
find_multipath() {
|
||||||
|
- get_parent_components "$1" "multipath"
|
||||||
|
+ get_parent_components "$1" "multipath" ${2+"$2"}
|
||||||
|
}
|
||||||
|
|
||||||
|
find_disk_and_multipath() {
|
||||||
|
- find_disk "$1"
|
||||||
|
- is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1"
|
||||||
|
+ find_disk "$1" ${2+"$2"}
|
||||||
|
+ is_true "$AUTOEXCLUDE_MULTIPATH" || find_multipath "$1" ${2+"$2"}
|
||||||
|
}
|
||||||
|
|
||||||
|
find_partition() {
|
||||||
|
- get_parent_components "$1" "part"
|
||||||
|
+ get_parent_components "$1" "part" ${2+"$2"}
|
||||||
|
}
|
||||||
|
|
||||||
|
# The get_partition_number function
|
||||||
|
@@ -413,6 +430,54 @@ get_partition_number() {
|
||||||
|
echo $partition_number
|
||||||
|
}
|
||||||
|
|
||||||
|
+# Extract the underlying device name from the full partition device name.
|
||||||
|
+# Underlying device may be a disk, a multipath device or other devices that can be partitioned.
|
||||||
|
+# Should we use the information in $LAYOUT_DEPS, like get_parent_component does,
|
||||||
|
+# instead of string munging?
|
||||||
|
+function get_device_from_partition() {
|
||||||
|
+ local partition_block_device
|
||||||
|
+ local device
|
||||||
|
+ local partition_number
|
||||||
|
+
|
||||||
|
+ partition_block_device=$1
|
||||||
|
+ test -b "$partition_block_device" || BugError "get_device_from_partition called with '$partition_block_device' that is no block device"
|
||||||
|
+ partition_number=${2-$(get_partition_number $partition_block_device )}
|
||||||
|
+ # /dev/sda or /dev/mapper/vol34_part or /dev/mapper/mpath99p or /dev/mmcblk0p
|
||||||
|
+ device=${partition_block_device%$partition_number}
|
||||||
|
+
|
||||||
|
+ # Strip trailing partition remainders like '_part' or '-part' or 'p'
|
||||||
|
+ # if we have 'mapper' in disk device name:
|
||||||
|
+ if [[ ${partition_block_device/mapper//} != $partition_block_device ]] ; then
|
||||||
|
+ # we only expect mpath_partX or mpathpX or mpath-partX
|
||||||
|
+ case $device in
|
||||||
|
+ (*p) device=${device%p} ;;
|
||||||
|
+ (*-part) device=${device%-part} ;;
|
||||||
|
+ (*_part) device=${device%_part} ;;
|
||||||
|
+ (*) Log "Unsupported kpartx partition delimiter for $partition_block_device"
|
||||||
|
+ esac
|
||||||
|
+ fi
|
||||||
|
+
|
||||||
|
+ # For eMMC devices the trailing 'p' in the $device value
|
||||||
|
+ # (as in /dev/mmcblk0p that is derived from /dev/mmcblk0p1)
|
||||||
|
+ # needs to be stripped (to get /dev/mmcblk0), otherwise the
|
||||||
|
+ # efibootmgr call fails because of a wrong disk device name.
|
||||||
|
+ # See also https://github.com/rear/rear/issues/2103
|
||||||
|
+ if [[ $device = *'/mmcblk'+([0-9])p ]] ; then
|
||||||
|
+ device=${device%p}
|
||||||
|
+ fi
|
||||||
|
+
|
||||||
|
+ # For NVMe devices the trailing 'p' in the $device value
|
||||||
|
+ # (as in /dev/nvme0n1p that is derived from /dev/nvme0n1p1)
|
||||||
|
+ # needs to be stripped (to get /dev/nvme0n1), otherwise the
|
||||||
|
+ # efibootmgr call fails because of a wrong disk device name.
|
||||||
|
+ # See also https://github.com/rear/rear/issues/1564
|
||||||
|
+ if [[ $device = *'/nvme'+([0-9])n+([0-9])p ]] ; then
|
||||||
|
+ device=${device%p}
|
||||||
|
+ fi
|
||||||
|
+
|
||||||
|
+ test -b "$device" && echo $device
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
# Returns partition start block or 'unknown'
|
||||||
|
# sda/sda1 or
|
||||||
|
# dm-XX
|
2040
rear-bz1958247.patch
Normal file
2040
rear-bz1958247.patch
Normal file
File diff suppressed because it is too large
Load Diff
68
rear-bz1983013.patch
Normal file
68
rear-bz1983013.patch
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
diff --git a/usr/share/rear/conf/Linux-ppc64.conf b/usr/share/rear/conf/Linux-ppc64.conf
|
||||||
|
index 7e20ddc7..d7774062 100644
|
||||||
|
--- a/usr/share/rear/conf/Linux-ppc64.conf
|
||||||
|
+++ b/usr/share/rear/conf/Linux-ppc64.conf
|
||||||
|
@@ -1,18 +1,26 @@
|
||||||
|
-REQUIRED_PROGS+=( sfdisk )
|
||||||
|
+REQUIRED_PROGS+=( sfdisk ofpathname )
|
||||||
|
|
||||||
|
PROGS+=(
|
||||||
|
mkofboot
|
||||||
|
ofpath
|
||||||
|
ybin
|
||||||
|
yabootconfig
|
||||||
|
-bootlist
|
||||||
|
pseries_platform
|
||||||
|
nvram
|
||||||
|
-ofpathname
|
||||||
|
bc
|
||||||
|
agetty
|
||||||
|
)
|
||||||
|
|
||||||
|
+if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||||
|
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||||
|
+ # it is missing
|
||||||
|
+ PROGS+=( bootlist )
|
||||||
|
+else
|
||||||
|
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||||
|
+ # we can't make the system bpotable. Be strict about requiring it
|
||||||
|
+ REQUIRED_PROGS+=( bootlist )
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
COPY_AS_IS+=(
|
||||||
|
/usr/lib/yaboot/yaboot
|
||||||
|
/usr/lib/yaboot/ofboot
|
||||||
|
diff --git a/usr/share/rear/conf/Linux-ppc64le.conf b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||||
|
index d00154a2..df8066ea 100644
|
||||||
|
--- a/usr/share/rear/conf/Linux-ppc64le.conf
|
||||||
|
+++ b/usr/share/rear/conf/Linux-ppc64le.conf
|
||||||
|
@@ -1,10 +1,8 @@
|
||||||
|
REQUIRED_PROGS+=( sfdisk )
|
||||||
|
|
||||||
|
PROGS+=(
|
||||||
|
-bootlist
|
||||||
|
pseries_platform
|
||||||
|
nvram
|
||||||
|
-ofpathname
|
||||||
|
bc
|
||||||
|
agetty
|
||||||
|
)
|
||||||
|
@@ -17,4 +15,18 @@ agetty
|
||||||
|
if [[ $(awk '/platform/ {print $NF}' < /proc/cpuinfo) != PowerNV ]] ; then
|
||||||
|
# No firmware files when ppc64le Linux is not run in BareMetal Mode (PowerNV):
|
||||||
|
test "${FIRMWARE_FILES[*]}" || FIRMWARE_FILES=( 'no' )
|
||||||
|
+ # grub2-install for powerpc-ieee1275 calls ofpathname, so without it,
|
||||||
|
+ # the rescue system can't make the recovered system bootable
|
||||||
|
+ REQUIRED_PROGS+=( ofpathname )
|
||||||
|
+ if grep -q "emulated by qemu" /proc/cpuinfo ; then
|
||||||
|
+ # Qemu/KVM virtual machines don't need bootlist - don't complain if
|
||||||
|
+ # it is missing
|
||||||
|
+ PROGS+=( bootlist )
|
||||||
|
+ else
|
||||||
|
+ # PowerVM environment, we need to run bootlist, otherwise
|
||||||
|
+ # we can't make the system bpotable. Be strict about requiring it
|
||||||
|
+ REQUIRED_PROGS+=( bootlist )
|
||||||
|
+ fi
|
||||||
|
+else
|
||||||
|
+ PROGS+=( ofpathname bootlist )
|
||||||
|
fi
|
34
rear-bz1993296.patch
Normal file
34
rear-bz1993296.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
From 4233fe30b315737ac8c4d857e2b04e021c2e2886 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pavel Cahyna <pcahyna@redhat.com>
|
||||||
|
Date: Mon, 16 Aug 2021 10:10:38 +0300
|
||||||
|
Subject: [PATCH] Revert the main part of PR #2299
|
||||||
|
|
||||||
|
multipath -l is very slow with many multipath devices. As it will be
|
||||||
|
called for every multipath device, it leads to quadratic time complexity
|
||||||
|
in the number of multipath devices. For thousands of devices, ReaR can
|
||||||
|
take hours to scan and exclude them. We therefore have to comment
|
||||||
|
multipath -l out, as it is a huge performance regression, and find
|
||||||
|
another solution to bug #2298.
|
||||||
|
---
|
||||||
|
usr/share/rear/lib/layout-functions.sh | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/usr/share/rear/lib/layout-functions.sh b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
index cdd81a14..8c8be74b 100644
|
||||||
|
--- a/usr/share/rear/lib/layout-functions.sh
|
||||||
|
+++ b/usr/share/rear/lib/layout-functions.sh
|
||||||
|
@@ -771,7 +771,10 @@ function is_multipath_path {
|
||||||
|
# so that no "multipath -l" output could clutter the log (the "multipath -l" output is irrelevant here)
|
||||||
|
# in contrast to e.g. test "$( multipath -l )" that would falsely succeed with blank output
|
||||||
|
# and the output would appear in the log in 'set -x' debugscript mode:
|
||||||
|
- multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||||
|
+ #
|
||||||
|
+ # Unfortunately, multipat -l is quite slow with many multipath devices
|
||||||
|
+ # and becomes a performance bottleneck, so we must comment it out for now.
|
||||||
|
+ #multipath -l | grep -q '[[:alnum:]]' || return 1
|
||||||
|
# Check if a block device should be a path in a multipath device:
|
||||||
|
multipath -c /dev/$1 &>/dev/null
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.26.3
|
||||||
|
|
@ -18,7 +18,12 @@ Patch0: 0001-skip-kernel-buildin-modules.patch
|
|||||||
Patch4: rear-bz1492177-warning.patch
|
Patch4: rear-bz1492177-warning.patch
|
||||||
Patch29: rear-bz1832394.patch
|
Patch29: rear-bz1832394.patch
|
||||||
Patch30: rear-sfdc02772301.patch
|
Patch30: rear-sfdc02772301.patch
|
||||||
|
Patch31: rear-bz1945869.patch
|
||||||
|
Patch32: rear-bz1958247.patch
|
||||||
|
Patch33: rear-bz1930662.patch
|
||||||
Patch34: rear-tmpdir.patch
|
Patch34: rear-tmpdir.patch
|
||||||
|
Patch35: rear-bz1983013.patch
|
||||||
|
Patch36: rear-bz1993296.patch
|
||||||
|
|
||||||
# rear contains only bash scripts plus documentation so that on first glance it could be "BuildArch: noarch"
|
# rear contains only bash scripts plus documentation so that on first glance it could be "BuildArch: noarch"
|
||||||
# but actually it is not "noarch" because it only works on those architectures that are explicitly supported.
|
# but actually it is not "noarch" because it only works on those architectures that are explicitly supported.
|
||||||
|
Loading…
Reference in New Issue
Block a user