From ec6e77120bc3c31494696447055715a7b7e24209 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Sep 27 2022 12:49:27 +0000 Subject: import rear-2.6-15.el9 --- diff --git a/SOURCES/rear-bz2083272.patch b/SOURCES/rear-bz2083272.patch new file mode 100644 index 0000000..03c8a8a --- /dev/null +++ b/SOURCES/rear-bz2083272.patch @@ -0,0 +1,171 @@ +commit 3d1bcf1b50ca8201a3805bc7cab6ca69c14951a1 +Author: pcahyna +Date: Thu May 5 12:11:55 2022 +0200 + + Merge pull request #2795 from pcahyna/recover-check-sums + + Verify file hashes at the end of recover after file restore from backup + +diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf +index f231bf3d..881a0af0 100644 +--- a/usr/share/rear/conf/default.conf ++++ b/usr/share/rear/conf/default.conf +@@ -313,8 +313,30 @@ CDROM_SIZE=20 + # which exits with non-zero exit code when the disk layout or those files changed + # (cf. https://github.com/rear/rear/issues/1134) but the checklayout workflow + # does not automatically recreate the rescue/recovery system. ++# Files matching FILES_TO_PATCH_PATTERNS are added to this list automatically. + CHECK_CONFIG_FILES=( '/etc/drbd/' '/etc/drbd.conf' '/etc/lvm/lvm.conf' '/etc/multipath.conf' '/etc/rear/' '/etc/udev/udev.conf' ) + ++# FILES_TO_PATCH_PATTERNS is a space-separated list of shell glob patterns. ++# Files that match are eligible for a final migration of UUIDs and other ++# identifiers after recovery (if the layout recreation process has led ++# to a change of an UUID or a device name and a corresponding change needs ++# to be performed on restored configuration files ). ++# See finalize/GNU/Linux/280_migrate_uuid_tags.sh ++# The [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist ++ ++FILES_TO_PATCH_PATTERNS="[b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* \ ++ [b]oot/grub/{grub.conf,grub.cfg,menu.lst,device.map} \ ++ [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \ ++ [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \ ++ [e]tc/lilo.conf [e]tc/elilo.conf \ ++ [e]tc/yaboot.conf \ ++ [e]tc/mtab [e]tc/fstab \ ++ [e]tc/mtools.conf \ ++ [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \ ++ [e]tc/sysconfig/rawdevices \ ++ [e]tc/security/pam_mount.conf.xml \ ++ [b]oot/efi/*/*/grub.cfg" ++ + ## + # Relax-and-Recover recovery system update during "rear recover" + # +diff --git a/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh b/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh +index 1a91a0e3..e869e5e9 100644 +--- a/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh ++++ b/usr/share/rear/finalize/GNU/Linux/250_migrate_disk_devices_layout.sh +@@ -29,19 +29,9 @@ LogPrint "The original restored files get saved in $save_original_file_dir (in $ + + local symlink_target="" + local restored_file="" +-# the funny [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist +-# the files without a [] are mandatory, like fstab FIXME: but below there is [e]tc/fstab not etc/fstab - why? +- +-for restored_file in [b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* [b]oot/grub/{grub.conf,menu.lst,device.map} \ +- [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \ +- [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \ +- [e]tc/lilo.conf \ +- [e]tc/yaboot.conf \ +- [e]tc/mtab [e]tc/fstab \ +- [e]tc/mtools.conf \ +- [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \ +- [e]tc/sysconfig/rawdevices \ +- [e]tc/security/pam_mount.conf.xml [b]oot/efi/*/*/grub.cfg ++# The variable expansion is deliberately not quoted in order to perform ++# pathname expansion on the variable value. ++for restored_file in $FILES_TO_PATCH_PATTERNS + do + # Silently skip directories and file not found: + test -f "$restored_file" || continue +diff --git a/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh b/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh +index 074689a1..d994ce8e 100644 +--- a/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh ++++ b/usr/share/rear/finalize/GNU/Linux/280_migrate_uuid_tags.sh +@@ -23,18 +23,9 @@ LogPrint "Migrating filesystem UUIDs in certain restored files in $TARGET_FS_ROO + + local symlink_target="" + local restored_file="" +-# the funny [] around the first letter make sure that shopt -s nullglob removes this file from the list if it does not exist +-# the files without a [] are mandatory, like fstab FIXME: but below there is [e]tc/fstab not etc/fstab - why? +-for restored_file in [b]oot/{grub.conf,menu.lst,device.map} [e]tc/grub.* \ +- [b]oot/grub/{grub.conf,grub.cfg,menu.lst,device.map} \ +- [b]oot/grub2/{grub.conf,grub.cfg,menu.lst,device.map} \ +- [e]tc/sysconfig/grub [e]tc/sysconfig/bootloader \ +- [e]tc/lilo.conf [e]tc/elilo.conf \ +- [e]tc/mtab [e]tc/fstab \ +- [e]tc/mtools.conf \ +- [e]tc/smartd.conf [e]tc/sysconfig/smartmontools \ +- [e]tc/sysconfig/rawdevices \ +- [e]tc/security/pam_mount.conf.xml [b]oot/efi/*/*/grub.cfg ++# The variable expansion is deliberately not quoted in order to perform ++# pathname expansion on the variable value. ++for restored_file in $FILES_TO_PATCH_PATTERNS + do + # Silently skip directories and file not found: + test -f "$restored_file" || continue +diff --git a/usr/share/rear/finalize/default/060_compare_files.sh b/usr/share/rear/finalize/default/060_compare_files.sh +new file mode 100644 +index 00000000..6947fda9 +--- /dev/null ++++ b/usr/share/rear/finalize/default/060_compare_files.sh +@@ -0,0 +1,6 @@ ++if [ -e $VAR_DIR/layout/config/files.md5sum ] ; then ++ if ! chroot $TARGET_FS_ROOT md5sum -c --quiet < $VAR_DIR/layout/config/files.md5sum 1>> >( tee -a "$RUNTIME_LOGFILE" 1>&7 ) 2>> >( tee -a "$RUNTIME_LOGFILE" 1>&8 ) ; then ++ LogPrintError "Error: Restored files do not match the recreated system in $TARGET_FS_ROOT" ++ return 1 ++ fi ++fi +diff --git a/usr/share/rear/layout/save/default/490_check_files_to_patch.sh b/usr/share/rear/layout/save/default/490_check_files_to_patch.sh +new file mode 100644 +index 00000000..ee717063 +--- /dev/null ++++ b/usr/share/rear/layout/save/default/490_check_files_to_patch.sh +@@ -0,0 +1,43 @@ ++# FILES_TO_PATCH_PATTERNS is a space-separated list of shell glob patterns. ++# Files that match are eligible for a final migration of UUIDs and other ++# identifiers after recovery (if the layout recreation process has led ++# to a change of an UUID or a device name and a corresponding change needs ++# to be performed on restored configuration files ). ++# See finalize/GNU/Linux/280_migrate_uuid_tags.sh ++# We should add all such files to CHECK_CONFIG_FILES - if they change, ++# we risk inconsistencies between the restored files and recreated layout, ++# or failures of UUID migration. ++ ++local file final_file symlink_target ++ ++# The patterns are relative to /, change directory there ++# so that the shell finds the files during pathname expansion ++pushd / >/dev/null ++# The variable expansion is deliberately not quoted in order to perform ++# pathname expansion on the variable value. ++for file in $FILES_TO_PATCH_PATTERNS ; do ++ final_file="/$file" ++ IsInArray "$final_file" "${CHECK_CONFIG_FILES[@]}" && continue ++ # Symlink handling (partially from 280_migrate_uuid_tags.sh): ++ # avoid dead symlinks, and symlinks to files on dynamic filesystems ++ # ( /proc etc.) - they are expected to change and validating ++ # their checksums has no sense ++ if test -L "$final_file" ; then ++ if symlink_target="$( readlink -e "$final_file" )" ; then ++ # If the symlink target contains /proc/ /sys/ /dev/ or /run/ we skip it because then ++ # the symlink target is considered to not be a restored file that needs to be patched ++ # and thus we don't need to generate and check its hash, either ++ # cf. https://github.com/rear/rear/pull/2047#issuecomment-464846777 ++ if echo $symlink_target | egrep -q '/proc/|/sys/|/dev/|/run/' ; then ++ Log "Skip adding symlink $final_file target $symlink_target on /proc/ /sys/ /dev/ or /run/ to CHECK_CONFIG_FILES" ++ continue ++ fi ++ Debug "Adding symlink $final_file with target $symlink_target to CHECK_CONFIG_FILES" ++ else ++ LogPrint "Skip adding dead symlink $final_file to CHECK_CONFIG_FILES" ++ continue ++ fi ++ fi ++ CHECK_CONFIG_FILES+=( "$final_file" ) ++done ++popd >/dev/null +diff --git a/usr/share/rear/layout/save/default/600_snapshot_files.sh b/usr/share/rear/layout/save/default/600_snapshot_files.sh +index 0ebf197c..3ac6b07e 100644 +--- a/usr/share/rear/layout/save/default/600_snapshot_files.sh ++++ b/usr/share/rear/layout/save/default/600_snapshot_files.sh +@@ -3,7 +3,8 @@ if [ "$WORKFLOW" = "checklayout" ] ; then + return 0 + fi + +-config_files=() ++local obj ++local config_files=() + for obj in "${CHECK_CONFIG_FILES[@]}" ; do + if [ -d "$obj" ] ; then + config_files+=( $( find "$obj" -type f ) ) diff --git a/SOURCES/rear-bz2096900.patch b/SOURCES/rear-bz2096900.patch new file mode 100644 index 0000000..595c147 --- /dev/null +++ b/SOURCES/rear-bz2096900.patch @@ -0,0 +1,58 @@ +commit 389e5026df575ad98695191044257cf2b33d565b +Author: pcahyna +Date: Mon Jul 4 15:48:43 2022 +0200 + + Merge pull request #2825 from lzaoral/replace-mkinitrd-with-dracut + + Replace `mkinitrd` with `dracut` on Fedora and RHEL + +diff --git a/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh b/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh +index 3476b77f..f296e624 100644 +--- a/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh ++++ b/usr/share/rear/finalize/Fedora/i386/550_rebuild_initramfs.sh +@@ -61,7 +61,7 @@ NEW_INITRD_MODULES=( $(tr " " "\n" <<< "${NEW_INITRD_MODULES[*]}" | sort | uniq + Log "New INITRD_MODULES='${OLD_INITRD_MODULES[@]} ${NEW_INITRD_MODULES[@]}'" + INITRD_MODULES="${OLD_INITRD_MODULES[@]} ${NEW_INITRD_MODULES[@]}" + +-WITH_INITRD_MODULES=$( printf '%s\n' ${INITRD_MODULES[@]} | awk '{printf "--with=%s ", $1}' ) ++WITH_INITRD_MODULES=$( printf '%s\n' ${INITRD_MODULES[@]} | awk '{printf "--add-drivers=%s ", $1}' ) + + # Recreate any initrd or initramfs image under $TARGET_FS_ROOT/boot/ with new drivers + # Images ignored: +@@ -76,19 +76,19 @@ for INITRD_IMG in $( ls $TARGET_FS_ROOT/boot/initramfs-*.img $TARGET_FS_ROOT/boo + # Do not use KERNEL_VERSION here because that is readonly in the rear main script: + kernel_version=$( basename $( echo $INITRD_IMG ) | cut -f2- -d"-" | sed s/"\.img"// ) + INITRD=$( echo $INITRD_IMG | egrep -o "/boot/.*" ) +- LogPrint "Running mkinitrd..." +- # Run mkinitrd directly in chroot without a login shell in between (see https://github.com/rear/rear/issues/862). +- # We need the mkinitrd binary in the chroot environment i.e. the mkinitrd binary in the recreated system. +- # Normally we would use a login shell like: chroot $TARGET_FS_ROOT /bin/bash --login -c 'type -P mkinitrd' ++ LogPrint "Running dracut..." ++ # Run dracut directly in chroot without a login shell in between (see https://github.com/rear/rear/issues/862). ++ # We need the dracut binary in the chroot environment i.e. the dracut binary in the recreated system. ++ # Normally we would use a login shell like: chroot $TARGET_FS_ROOT /bin/bash --login -c 'type -P dracut' + # because otherwise there is no useful PATH (PATH is only /bin) so that 'type -P' won't find it + # but we cannot use a login shell because that contradicts https://github.com/rear/rear/issues/862 + # so that we use a plain (non-login) shell and set a (hopefully) reasonable PATH: +- local mkinitrd_binary=$( chroot $TARGET_FS_ROOT /bin/bash -c 'PATH=/sbin:/usr/sbin:/usr/bin:/bin type -P mkinitrd' ) +- # If there is no mkinitrd in the chroot environment plain 'chroot $TARGET_FS_ROOT' will hang up endlessly ++ local dracut_binary=$( chroot $TARGET_FS_ROOT /bin/bash -c 'PATH=/sbin:/usr/sbin:/usr/bin:/bin type -P dracut' ) ++ # If there is no dracut in the chroot environment plain 'chroot $TARGET_FS_ROOT' will hang up endlessly + # and then "rear recover" cannot be aborted with the usual [Ctrl]+[C] keys. + # Use plain $var because when var contains only blanks test "$var" results true because test " " results true: +- if test $mkinitrd_binary ; then +- if chroot $TARGET_FS_ROOT $mkinitrd_binary -v -f ${WITH_INITRD_MODULES[@]} $INITRD $kernel_version >&2 ; then ++ if test $dracut_binary ; then ++ if chroot $TARGET_FS_ROOT $dracut_binary -v -f ${WITH_INITRD_MODULES[@]} $INITRD $kernel_version >&2 ; then + LogPrint "Updated initrd with new drivers for kernel $kernel_version." + else + LogPrint "WARNING: +@@ -99,7 +99,7 @@ and decide yourself, whether the system will boot or not. + fi + else + LogPrint "WARNING: +-Cannot create initrd (found no mkinitrd in the recreated system). ++Cannot create initrd (found no dracut in the recreated system). + Check the recreated system (mounted at $TARGET_FS_ROOT) + and decide yourself, whether the system will boot or not. + " diff --git a/SOURCES/rear-bz2096916.patch b/SOURCES/rear-bz2096916.patch new file mode 100644 index 0000000..6a8a62f --- /dev/null +++ b/SOURCES/rear-bz2096916.patch @@ -0,0 +1,130 @@ +commit b06d059108db9b0c46cba29cc174f60e129164f1 +Author: Johannes Meixner +Date: Tue Mar 9 14:40:59 2021 +0100 + + Merge pull request #2580 from rear/jsmeix-load-nvram-module + + In etc/scripts/system-setup.d/41-load-special-modules.sh + load the nvram kernel module if possible to make /dev/nvram appear + because /dev/nvram should be there when installing GRUB, + see https://github.com/rear/rear/issues/2554 + and include the nvram kernel module in the recovery system + because nvram could be a module in particular on POWER architecture + see https://github.com/rear/rear/issues/2554#issuecomment-764720180 + +diff --git a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh +index d8d733d2..a0ca9084 100644 +--- a/usr/share/rear/build/GNU/Linux/400_copy_modules.sh ++++ b/usr/share/rear/build/GNU/Linux/400_copy_modules.sh +@@ -116,8 +116,12 @@ for dummy in "once" ; do + # As a way out of this dilemma we add the below listed modules no longer via conf/GNU/Linux.conf + # but here after the user config files were sourced so that now the user can specify + # MODULES=( 'moduleX' 'moduleY' ) in etc/rear/local.conf to get additional kernel modules +- # included in the recovery system in addition to the ones via an empty MODULES=() setting: +- MODULES+=( vfat ++ # included in the recovery system in addition to the ones via an empty MODULES=() setting. ++ # nvram could be a module in particular on POWER architecture, ++ # cf. https://github.com/rear/rear/issues/2554#issuecomment-764720180 ++ # and https://github.com/rear/rear/pull/2580#issuecomment-791344794 ++ MODULES+=( nvram ++ vfat + nls_iso8859_1 nls_utf8 nls_cp437 + af_packet + unix +diff --git a/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh b/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh +index 4c2698f3..0cb3ee41 100644 +--- a/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh ++++ b/usr/share/rear/finalize/Linux-ppc64le/660_install_grub2.sh +@@ -104,9 +104,39 @@ fi + # Do not update nvram when system is running in PowerNV mode (BareMetal). + # grub2-install will fail if not run with the --no-nvram option on a PowerNV system, + # see https://github.com/rear/rear/pull/1742 +-grub2_install_option="" ++grub2_no_nvram_option="" + if [[ $(awk '/platform/ {print $NF}' < /proc/cpuinfo) == PowerNV ]] ; then +- grub2_install_option="--no-nvram" ++ grub2_no_nvram_option="--no-nvram" ++fi ++# Also do not update nvram when no character device node /dev/nvram exists. ++# On POWER architecture the nvram kernel driver could be also built as a kernel module ++# that gets loaded via etc/scripts/system-setup.d/41-load-special-modules.sh ++# but whether or not the nvram kernel driver will then create /dev/nvram ++# depends on whether or not the hardware platform supports nvram. ++# I asked on a SUSE internal mailing list ++# and got the following reply (excerpts): ++# ---------------------------------------------------------------- ++# > I would like to know when /dev/nvram exists and when not. ++# > I assume /dev/nvram gets created as other device nodes ++# > by the kernel (probably together with udev). ++# > I would like to know under what conditions /dev/nvram ++# > gets created and when it is not created. ++# > It seems on PPC /dev/nvram usually exist but sometimes not. ++# In case of powerpc, it gets created by nvram driver ++# (nvram_module_init) whenever the powerpc platform driver ++# has ppc_md.nvram_size greater than zero in it's machine ++# description structure. ++# How exactly ppc_md.nvram_size gets gets populated by platform ++# code depends on the platform, e.g. on most modern systems ++# it gets populated from 'nvram' device tree node ++# (and only if such node has #bytes > 0). ++# ---------------------------------------------------------------- ++# So /dev/nvram may not exist regardless that the nvram kernel driver is there ++# and then grub2-install must be called with the '--no-nvram' option ++# because otherwise installing the bootloader fails ++# cf. https://github.com/rear/rear/issues/2554 ++if ! test -c /dev/nvram ; then ++ grub2_no_nvram_option="--no-nvram" + fi + + # When GRUB2_INSTALL_DEVICES is specified by the user +@@ -134,7 +164,7 @@ if test "$GRUB2_INSTALL_DEVICES" ; then + else + LogPrint "Installing GRUB2 on $grub2_install_device (specified in GRUB2_INSTALL_DEVICES)" + fi +- if ! chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_install_option $grub2_install_device" ; then ++ if ! chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_no_nvram_option $grub2_install_device" ; then + LogPrintError "Failed to install GRUB2 on $grub2_install_device" + grub2_install_failed="yes" + fi +@@ -170,7 +200,7 @@ for part in $part_list ; do + LogPrint "Found PPC PReP boot partition $part - installing GRUB2 there" + # Erase the first 512 bytes of the PPC PReP boot partition: + dd if=/dev/zero of=$part +- if chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_install_option $part" ; then ++ if chroot $TARGET_FS_ROOT /bin/bash --login -c "$grub_name-install $grub2_no_nvram_option $part" ; then + # In contrast to the above behaviour when GRUB2_INSTALL_DEVICES is specified + # consider it here as a successful bootloader installation when GRUB2 + # got installed on at least one PPC PReP boot partition: +diff --git a/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh b/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh +index 9b0b3b8a..2e1d1912 100644 +--- a/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh ++++ b/usr/share/rear/skel/default/etc/scripts/system-setup.d/41-load-special-modules.sh +@@ -1,6 +1,24 @@ +-# some things are special ++# Special cases of kernel module loading. + +-# XEN PV does not autoload some modules +-if [ -d /proc/xen ] ; then +- modprobe xenblk ++# XEN PV does not autoload some modules: ++test -d /proc/xen && modprobe xenblk ++ ++# On POWER architecture the nvram kernel driver may be no longer built into the kernel ++# but nowadays it could be also built as a kernel module that needs to be loaded ++# cf. https://github.com/rear/rear/issues/2554#issuecomment-764720180 ++# because normally grub2-install gets called without the '--no-nvram' option ++# e.g. see finalize/Linux-ppc64le/620_install_grub2.sh ++# which is how grub2-install should be called when the hardware supports nvram. ++# Nothing to do when the character device node /dev/nvram exists ++# because then the nvram kernel driver is already there: ++if ! test -c /dev/nvram ; then ++ # Nothing can be done when there is no nvram kernel module. ++ # Suppress the possible 'modprobe -n nvram' error message like ++ # "modprobe: FATAL: Module nvram not found in directory /lib/modules/..." ++ # to avoid a possible "FATAL" false alarm message that would appear ++ # on the user's terminal during recovery system startup ++ # cf. https://github.com/rear/rear/pull/2537#issuecomment-741825046 ++ # but when there is a nvram kernel module show possible 'modprobe nvram' ++ # (error) messages on the user's terminal during recovery system startup: ++ modprobe -n nvram 2>/dev/null && modprobe nvram + fi diff --git a/SOURCES/rear-bz2097437.patch b/SOURCES/rear-bz2097437.patch new file mode 100644 index 0000000..8d58ef2 --- /dev/null +++ b/SOURCES/rear-bz2097437.patch @@ -0,0 +1,37 @@ +commit 2922b77e950537799fdadf5b3ebf6a05d97f6f2f +Author: pcahyna +Date: Mon Jun 20 17:42:58 2022 +0200 + + Merge pull request #2822 from pcahyna/fix-vim-symlink + + Fix vi in the rescue system on Fedora and RHEL 9 + +diff --git a/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh b/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh +index df75e07d..55f25bef 100644 +--- a/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh ++++ b/usr/share/rear/build/GNU/Linux/005_create_symlinks.sh +@@ -8,7 +8,6 @@ + ln -sf $v bin/init $ROOTFS_DIR/init >&2 + ln -sf $v bin $ROOTFS_DIR/sbin >&2 + ln -sf $v bash $ROOTFS_DIR/bin/sh >&2 +-ln -sf $v vi $ROOTFS_DIR/bin/vim >&2 + ln -sf $v true $ROOTFS_DIR/bin/pam_console_apply >&2 # RH/Fedora with udev needs this + ln -sf $v ../bin $ROOTFS_DIR/usr/bin >&2 + ln -sf $v ../bin $ROOTFS_DIR/usr/sbin >&2 +diff --git a/usr/share/rear/conf/GNU/Linux.conf b/usr/share/rear/conf/GNU/Linux.conf +index 89aedd4c..0c97594a 100644 +--- a/usr/share/rear/conf/GNU/Linux.conf ++++ b/usr/share/rear/conf/GNU/Linux.conf +@@ -206,6 +206,12 @@ LIBS+=( + ) + + COPY_AS_IS+=( /dev /etc/inputr[c] /etc/protocols /etc/services /etc/rpc /etc/termcap /etc/terminfo /lib*/terminfo /usr/share/terminfo /etc/netconfig /etc/mke2fs.conf /etc/*-release /etc/localtime /etc/magic /usr/share/misc/magic /etc/dracut.conf /etc/dracut.conf.d /usr/lib/dracut /sbin/modprobe.ksplice-orig /etc/sysctl.conf /etc/sysctl.d /etc/e2fsck.conf ) ++ ++# Needed by vi on Fedora and derived distributions ++# where vi is a shell script that executes /usr/libexec/vi ++# see https://github.com/rear/rear/pull/2822 ++COPY_AS_IS+=( /usr/libexec/vi ) ++ + # Required by curl with https: + # There are stored the distribution provided certificates + # installed from packages, nothing confidential. diff --git a/SOURCES/rear-bz2104005.patch b/SOURCES/rear-bz2104005.patch new file mode 100644 index 0000000..db2c9dc --- /dev/null +++ b/SOURCES/rear-bz2104005.patch @@ -0,0 +1,21 @@ +commit 40ec3bf072a51229e81bfbfa7cedb8a7c7902dbd +Author: Johannes Meixner +Date: Fri Jun 24 15:11:27 2022 +0200 + + Merge pull request #2827 from rear/jsmeix-fail-safe-yes-pipe-lvcreate + + and commit b3fd58fc871e00bd713a0cb081de54d746ffffb3 from pull request #2839 + +diff --git a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh +index 1be17ba8..d34ab335 100644 +--- a/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh ++++ b/usr/share/rear/layout/prepare/GNU/Linux/110_include_lvm_code.sh +@@ -263,7 +263,7 @@ $ifline + + LogPrint "Creating LVM volume '$vg/$lvname'; Warning: some properties may not be preserved..." + $warnraidline +- lvm lvcreate $lvopts $vg << +Date: Wed May 25 13:51:14 2022 +0200 + + Merge pull request #2808 from rear/jsmeix-exclude-watchdog + + Exclude dev/watchdog* from the ReaR recovery system: + In default.conf add dev/watchdog* to COPY_AS_IS_EXCLUDE + because watchdog functionality is not wanted in the recovery system + because we do not want any automated reboot functionality + while disaster recovery happens via "rear recover", + see https://github.com/rear/rear/pull/2808 + Furthermore having a copy of dev/watchdog* + during "rear mkrescue" in ReaR's build area + may even trigger a system crash that is caused by a + buggy TrendMicro ds_am module touching dev/watchdog + in ReaR's build area (/var/tmp/rear.XXX/rootfs), + see https://github.com/rear/rear/issues/2798 + +diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf +index 881a0af0..cb14da8b 100644 +--- a/usr/share/rear/conf/default.conf ++++ b/usr/share/rear/conf/default.conf +@@ -1414,7 +1414,12 @@ COPY_AS_IS=( $SHARE_DIR $VAR_DIR ) + # We let them being recreated by device mapper in the recovery system during the recovery process. + # Copying them into the recovery system would let "rear recover" avoid the migration process. + # See https://github.com/rear/rear/pull/1393 for details. +-COPY_AS_IS_EXCLUDE=( $VAR_DIR/output/\* dev/.udev dev/shm dev/shm/\* dev/oracleasm dev/mapper ) ++# /dev/watchdog /dev/watchdog\* functionality is not wanted in the ReaR rescue/recovery system ++# because we do not want any automated reboot while disaster recovery happens via "rear recover". ++# Furthermore having dev/watchdog* during "rear mkrescue" may even trigger a system "crash" that is ++# caused by TrendMicro ds_am module touching dev/watchdog in ReaR's build area (/var/tmp/rear.XXX/rootfs). ++# See https://github.com/rear/rear/issues/2798 ++COPY_AS_IS_EXCLUDE=( $VAR_DIR/output/\* dev/.udev dev/shm dev/shm/\* dev/oracleasm dev/mapper dev/watchdog\* ) + # Array of user names that are trusted owners of files where RequiredSharedObjects calls ldd (cf. COPY_AS_IS) + # and where a ldd test is run inside the recovery system that tests all binaries for 'not found' libraries. + # The default is 'root' plus those standard system users that have a 'bin' or 'sbin' or 'root' home directory diff --git a/SOURCES/rear-bz2111059.patch b/SOURCES/rear-bz2111059.patch new file mode 100644 index 0000000..fff1437 --- /dev/null +++ b/SOURCES/rear-bz2111059.patch @@ -0,0 +1,105 @@ +commit 552dd6bfb20fdb3dc712b5243656d147392c27c3 +Author: Johannes Meixner +Date: Thu Jun 2 15:25:52 2022 +0200 + + Merge pull request #2811 from rear/jsmeix-RECOVERY_COMMANDS + + Add PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS + as alternative to PRE_RECOVERY_SCRIPT and POST_RECOVERY_SCRIPT + see the description in default.conf how to use them and how they work. + See https://github.com/rear/rear/pull/2811 and see also + https://github.com/rear/rear/pull/2735 therein in particular + https://github.com/rear/rear/pull/2735#issuecomment-1134686196 + Additionally use LogPrint to show the user the executed commands, + see https://github.com/rear/rear/pull/2789 + +diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf +index cb14da8b..b14525da 100644 +--- a/usr/share/rear/conf/default.conf ++++ b/usr/share/rear/conf/default.conf +@@ -3117,14 +3117,37 @@ ELILO_BIN= + ################ ---- custom scripts + # + # NOTE: The scripts can be defined as an array to better handly spaces in parameters. +-# The scripts are called like this: eval "${PRE_RECOVERY_SCRIPT[@]}" ++# The scripts are called like this: ++# eval "${PRE_RECOVERY_SCRIPT[@]}" ++# ++# Alternatively, commands can be executed by using the corresponding ++# PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS array variables ++# which evaluate like this: ++# for command in "${PRE_RECOVERY_COMMANDS[@]}" ; do ++# eval "$command" ++# done ++# ++# Using PRE_RECOVERY_COMMANDS and POST_RECOVERY_COMMANDS ++# is simpler when multiple commands should be executed. ++# For example, ++# PRE_RECOVERY_SCRIPT=( 'echo Hello' ';' 'sleep 3' ) ++# can be rewritten as ++# PRE_RECOVERY_COMMANDS=( 'echo Hello' 'sleep 3' ) ++# or ++# PRE_RECOVERY_COMMANDS=( 'echo Hello' ) ++# PRE_RECOVERY_COMMANDS+=( 'sleep 3' ) ++ ++# Those get called at the very beginning of "rear recover". ++# The PRE_RECOVERY_COMMANDS are called directly before the PRE_RECOVERY_SCRIPT. ++# Nothing was recreated and you have only the plain ReaR rescue/recovery system: ++PRE_RECOVERY_COMMANDS=() ++PRE_RECOVERY_SCRIPT= + +-# Call this after Relax-and-Recover did everything in the recover workflow. +-# Use $TARGET_FS_ROOT (by default '/mnt/local') to refer to the recovered system. ++# Those get called at the very end of "rear recover". ++# The POST_RECOVERY_COMMANDS are called directly after the POST_RECOVERY_SCRIPT. ++# Use $TARGET_FS_ROOT (by default '/mnt/local') to access the recreated target system. + POST_RECOVERY_SCRIPT= +- +-# Call this before Relax-and-Recover starts to do anything in the recover workflow. You have the rescue system but nothing else +-PRE_RECOVERY_SCRIPT= ++POST_RECOVERY_COMMANDS=() + + # PRE/POST Backup scripts will provide the ability to run certain tasks before and after a ReaR backup. + # for example: +diff --git a/usr/share/rear/setup/default/010_pre_recovery_script.sh b/usr/share/rear/setup/default/010_pre_recovery_script.sh +index 005107cc..8b4e4a36 100644 +--- a/usr/share/rear/setup/default/010_pre_recovery_script.sh ++++ b/usr/share/rear/setup/default/010_pre_recovery_script.sh +@@ -1,4 +1,14 @@ ++ ++# The PRE_RECOVERY_COMMANDS are called directly before the PRE_RECOVERY_SCRIPT ++# so PRE_RECOVERY_COMMANDS can also be used to prepare things for the PRE_RECOVERY_SCRIPT: ++ ++local command ++for command in "${PRE_RECOVERY_COMMANDS[@]}" ; do ++ LogPrint "Running PRE_RECOVERY_COMMANDS '$command'" ++ eval "$command" ++done ++ + if test "$PRE_RECOVERY_SCRIPT" ; then +- Log "Running PRE_RECOVERY_SCRIPT '${PRE_RECOVERY_SCRIPT[@]}'" +- eval "${PRE_RECOVERY_SCRIPT[@]}" ++ LogPrint "Running PRE_RECOVERY_SCRIPT '${PRE_RECOVERY_SCRIPT[@]}'" ++ eval "${PRE_RECOVERY_SCRIPT[@]}" + fi +diff --git a/usr/share/rear/wrapup/default/500_post_recovery_script.sh b/usr/share/rear/wrapup/default/500_post_recovery_script.sh +index 77751800..866c9368 100644 +--- a/usr/share/rear/wrapup/default/500_post_recovery_script.sh ++++ b/usr/share/rear/wrapup/default/500_post_recovery_script.sh +@@ -1,4 +1,14 @@ ++ ++# The POST_RECOVERY_COMMANDS are called directly after the POST_RECOVERY_SCRIPT ++# so POST_RECOVERY_COMMANDS can also be used to clean up things after the POST_RECOVERY_SCRIPT: ++ + if test "$POST_RECOVERY_SCRIPT" ; then +- Log "Running POST_RECOVERY_SCRIPT '${POST_RECOVERY_SCRIPT[@]}'" +- eval "${POST_RECOVERY_SCRIPT[@]}" ++ LogPrint "Running POST_RECOVERY_SCRIPT '${POST_RECOVERY_SCRIPT[@]}'" ++ eval "${POST_RECOVERY_SCRIPT[@]}" + fi ++ ++local command ++for command in "${POST_RECOVERY_COMMANDS[@]}" ; do ++ LogPrint "Running POST_RECOVERY_COMMANDS '$command'" ++ eval "$command" ++done diff --git a/SOURCES/rear-bz2117937.patch b/SOURCES/rear-bz2117937.patch new file mode 100644 index 0000000..24e6fb5 --- /dev/null +++ b/SOURCES/rear-bz2117937.patch @@ -0,0 +1,18 @@ +diff --git a/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh b/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh +index 4b73fb05..c7704032 100644 +--- a/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh ++++ b/usr/share/rear/prep/GNU/Linux/220_include_lvm_tools.sh +@@ -8,6 +8,13 @@ PROGS+=( lvm dmsetup dmeventd fsadm ) + + COPY_AS_IS+=( /etc/lvm ) + ++# Workaround for a LVM segfault when creating a PV with an UUID already present ++# in the device file: omit the device file from the rescue system ++# https://bugzilla.redhat.com/show_bug.cgi?id=2117937 ++# proper fix: ++# https://sourceware.org/git/?p=lvm2.git;a=commit;h=8c3cfc75c72696ae8b620555fcc4f815b0c1d6b6 ++COPY_AS_IS_EXCLUDE+=( /etc/lvm/devices ) ++ + if lvs --noheadings -o thin_count | grep -q -v "^\s*$" ; then + # There are Thin Pools on the system, include required binaries + PROGS+=( thin_check ) diff --git a/SOURCES/rear-bz2119501.patch b/SOURCES/rear-bz2119501.patch new file mode 100644 index 0000000..71b4d47 --- /dev/null +++ b/SOURCES/rear-bz2119501.patch @@ -0,0 +1,39 @@ +diff --git a/usr/share/rear/build/default/490_fix_broken_links.sh b/usr/share/rear/build/default/490_fix_broken_links.sh +index 5bace664..cf960be8 100644 +--- a/usr/share/rear/build/default/490_fix_broken_links.sh ++++ b/usr/share/rear/build/default/490_fix_broken_links.sh +@@ -7,6 +7,23 @@ + # see https://github.com/rear/rear/issues/1638 + # and https://github.com/rear/rear/pull/1734 + ++# Some broken symlinks are expected. The 'build' and 'source' symlinks in kernel modules point to kernel sources ++# and are broken untol one installs the kernel-debug-devel or kernel-devel packages (on Fedora) and even then ++# the targets are jot included in the rescue system by default. ++# Do not warn about those, it is just noise. ++local irrelevant_symlinks=( '*/lib/modules/*/build' '*/lib/modules/*/source' ) ++function symlink_is_irrelevant () { ++ for i in "${irrelevant_symlinks[@]}"; do ++ # do not quote $i, it is a glob pattern, matching will be performed by [[ ... == ... ]] ++ # quoting inside [[ ]] prevents pattern matching ++ if [[ "$1" == $i ]]; then ++ return 0 ++ fi ++ done ++ return 1 ++} ++ ++ + # FIXME: The following code fails if symlinks or their targets contain characters from IFS (e.g. blanks), + # cf. the same kind of comments in build/default/990_verify_rootfs.sh + # and layout/prepare/GNU/Linux/130_include_mount_subvolumes_code.sh +@@ -38,6 +55,10 @@ pushd $ROOTFS_DIR + local broken_symlink='' + local link_target='' + for broken_symlink in $broken_symlinks ; do ++ if symlink_is_irrelevant "$broken_symlink" ; then ++ DebugPrint "Ignoring irrelevant broken symlink $broken_symlink" ++ continue ++ fi + # For each broken symlink absolute path inside ROOTFS_DIR + # we call "readlink -e" in the original system to get its link target there. + # If in the original system there was a chain of symbolic links like diff --git a/SOURCES/rear-bz2120736.patch b/SOURCES/rear-bz2120736.patch new file mode 100644 index 0000000..8bcce79 --- /dev/null +++ b/SOURCES/rear-bz2120736.patch @@ -0,0 +1,18 @@ +diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf +index b14525da..23a83b71 100644 +--- a/usr/share/rear/conf/default.conf ++++ b/usr/share/rear/conf/default.conf +@@ -1841,10 +1841,10 @@ OBDR_BLOCKSIZE=2048 + # BACKUP=NBU stuff (Symantec/Veritas NetBackup) + ## + # +-COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf ) +-COPY_AS_IS_EXCLUDE_NBU=( /usr/openv/netbackup/logs "/usr/openv/netbackup/bin/bpjava*" /usr/openv/netbackup/bin/xbp /usr/openv/netbackup/bin/private /usr/openv/lib/java /usr/openv/lib/shared/vddk /usr/openv/netbackup/baremetal ) ++COPY_AS_IS_NBU=( /usr/openv/bin/vnetd /usr/openv/bin/vopied /usr/openv/lib /usr/openv/netbackup /usr/openv/var/auth/[mn]*.txt /usr/openv/var/vxss /usr/openv/var/webtruststore /usr/openv/resources/nbpxyhelper /opt/VRTSpbx /etc/vx/VxICS /etc/vx/vrtslog.conf /var/log/VRTSpbx ) ++COPY_AS_IS_EXCLUDE_NBU=( "/usr/openv/netbackup/logs/*" "/usr/openv/netbackup/bin/bpjava*" /usr/openv/netbackup/bin/xbp /usr/openv/netbackup/bin/private /usr/openv/lib/java "/usr/openv/lib/*-plugins" /usr/openv/lib/shared/vddk /usr/openv/netbackup/baremetal "/var/log/VRTSpbx/*" ) + # See https://github.com/rear/rear/issues/2105 why /usr/openv/netbackup/sec/at/lib/ is needed: +-NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/" ++NBU_LD_LIBRARY_PATH="/usr/openv/lib:/usr/openv/netbackup/sec/at/lib/:/usr/openv/lib/boost" + PROGS_NBU=( ) + + ## diff --git a/SOURCES/rsync-output.patch b/SOURCES/rsync-output.patch new file mode 100644 index 0000000..42d3ece --- /dev/null +++ b/SOURCES/rsync-output.patch @@ -0,0 +1,864 @@ +commit e6a9c973dbb7be6e46ed9a7fe34df0635635fed6 +Author: Johannes Meixner +Date: Tue Jul 12 13:59:28 2022 +0200 + + Merge pull request #2831 from pcahyna/rsync-url-fix-refactor + + Refactor rsync URL support, fixes rsync OUTPUT_URL: + The code to parse rsync:// URLs was BACKUP_URL specific. + If one specified BACKUP=RSYNC and an OUTPUT_URL different from BACKUP_URL, + the OUTPUT_URL was ignored and the output files went to BACKUP_URL. + Fix by introducing generic functions for rsync URL parsing and + use them for both BACKUP_URL and OUTPUT_URL, as appropriate. + Replace all uses of global RSYNC_* variables derived + from BACKUP_URL by those functions. + There also was inconsistent special handling for OUTPUT=PXE which is now removed: + An rsync OUTPUT_URL with OUTPUT=PXE now creates the RSYNC_PREFIX directory + at the destination and the URL is interpreted as in all other cases. + See https://github.com/rear/rear/pull/2831 + and https://github.com/rear/rear/issues/2781 + +diff --git a/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh +deleted file mode 120000 +index 336b83f5..00000000 +--- a/usr/share/rear/backup/NETFS/default/200_check_rsync_relative_option.sh ++++ /dev/null +@@ -1 +0,0 @@ +-../../RSYNC/default/200_check_rsync_relative_option.sh +\ No newline at end of file +diff --git a/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh b/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh +new file mode 120000 +index 00000000..0570eb44 +--- /dev/null ++++ b/usr/share/rear/backup/NETFS/default/210_check_rsync_relative_option.sh +@@ -0,0 +1 @@ ++../../RSYNC/default/210_check_rsync_relative_option.sh +\ No newline at end of file +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 1692ba4c..dd198ede 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 +@@ -6,29 +6,29 @@ local backup_prog_rc + touch "${TMP_DIR}/selinux.autorelabel" + cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE + Log "Restored original SELinux mode" +- case $RSYNC_PROTO in ++ case $(rsync_proto "$BACKUP_URL") in + + (ssh) + # for some reason rsync changes the mode of backup after each run to 666 + # FIXME: Add an explanatory comment why "2>/dev/null" is useful here + # or remove it according to https://github.com/rear/rear/issues/1395 +- ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null ++ ssh $(rsync_remote_ssh "$BACKUP_URL") "chmod $v 755 $(rsync_path_full "$BACKUP_URL")/backup" 2>/dev/null + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \ +- "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null ++ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" 2>/dev/null + 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" ++ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]" ++ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup" + fi + ;; + + (rsync) + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \ +- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" ++ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" + 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" ++ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]" ++ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/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 9a17d6bb..de57d571 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 +@@ -4,29 +4,29 @@ local backup_prog_rc + + > "${TMP_DIR}/selinux.autorelabel" + +- case $RSYNC_PROTO in ++ case $(rsync_proto "$BACKUP_URL") in + + (ssh) + # for some reason rsync changes the mode of backup after each run to 666 + # FIXME: Add an explanatory comment why "2>/dev/null" is useful here + # or remove it according to https://github.com/rear/rear/issues/1395 +- ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null ++ ssh $(rsync_remote_ssh "$BACKUP_URL") "chmod $v 755 $(rsync_path_full "$BACKUP_URL")/backup" 2>/dev/null + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \ +- "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null ++ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" 2>/dev/null + 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" ++ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]" ++ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup" + fi + ;; + + (rsync) + $BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \ +- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" ++ "$(rsync_remote_full "$BACKUP_URL")/backup/.autorelabel" + 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" ++ LogPrint "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup [${rsync_err_msg[$backup_prog_rc]}]" ++ #StopIfError "Failed to create .autorelabel on $(rsync_path_full "$BACKUP_URL")/backup" + fi + ;; + +diff --git a/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh +new file mode 100644 +index 00000000..81aa6879 +--- /dev/null ++++ b/usr/share/rear/backup/RSYNC/default/200_make_prefix_dir.sh +@@ -0,0 +1,28 @@ ++# Create RSYNC_PREFIX/backup on remote rsync server ++# RSYNC_PREFIX=$HOSTNAME as set in default.conf ++ ++local proto host ++ ++proto="$(rsync_proto "$BACKUP_URL")" ++host="$(rsync_host "$BACKUP_URL")" ++ ++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 $proto in ++ ++ (ssh) ++ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "$(rsync_remote "$BACKUP_URL")" >/dev/null 2>&1 \ ++ || Error "Could not create '$(rsync_path_full "$BACKUP_URL")' on remote ${host}" ++ ;; ++ ++ (rsync) ++ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote "$BACKUP_URL")/" >/dev/null \ ++ || Error "Could not create '$(rsync_path_full "$BACKUP_URL")' on remote ${host}" ++ ;; ++ ++esac ++ ++# We don't need it anymore, from now we operate on the remote copy ++rmdir $v "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" ++rmdir $v "${TMP_DIR}/rsync/${RSYNC_PREFIX}" +diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh +similarity index 91% +rename from usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh +rename to usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh +index cedee9ce..692616b7 100644 +--- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh ++++ b/usr/share/rear/backup/RSYNC/default/210_check_rsync_relative_option.sh +@@ -1,4 +1,4 @@ +-# 200_check_rsync_relative_option.sh ++# 210_check_rsync_relative_option.sh + # See issue #871 for details + + # check for the --relative option in BACKUP_RSYNC_OPTIONS array +diff --git a/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh b/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh +index eb99dbf6..037e49c0 100644 +--- a/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh ++++ b/usr/share/rear/backup/RSYNC/default/450_calculate_req_space.sh +@@ -1,6 +1,12 @@ + # here we will calculate the space required to hold the backup archive on the remote rsync system + # 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 proto host path ++ ++proto="$(rsync_proto "$BACKUP_URL")" ++host="$(rsync_host "$BACKUP_URL")" ++path="$(rsync_path "$BACKUP_URL")" ++ + _local_size=0 + _remote_size=0 + while read -r ; do +@@ -13,17 +19,17 @@ while read -r ; do + done < $TMP_DIR/backup-include.txt + LogPrint "Estimated size of local file systems is $(( _local_size / 1024 )) MB" + +-case $RSYNC_PROTO in ++case $proto in + (ssh) +- LogPrint "Calculating size of $RSYNC_HOST:$RSYNC_PATH" +- ssh -l $RSYNC_USER $RSYNC_HOST "df -P $RSYNC_PATH" >$TMP_DIR/rs_size +- StopIfError "Failed to determine size of $RSYNC_PATH" ++ LogPrint "Calculating size of ${host}:${path}" ++ ssh $(rsync_remote_ssh "$BACKUP_URL") "df -P ${path}" >$TMP_DIR/rs_size ++ StopIfError "Failed to determine size of ${path}" + _div=1 # 1024-blocks + grep -q "512-blocks" $TMP_DIR/rs_size && _div=2 # HPUX: divide with 2 to get kB size + _remote_size=$( tail -n 1 $TMP_DIR/rs_size | awk '{print $2}' ) + _remote_size=$(( _remote_size / _div )) + [[ $_remote_size -gt $_local_size ]] +- StopIfError "Not enough disk space available on $RSYNC_HOST:$RSYNC_PATH ($_remote_size < $_local_size)" ++ StopIfError "Not enough disk space available on ${host}:${path} ($_remote_size < $_local_size)" + ;; + (rsync) + # TODO: how can we calculate the free size on remote system via rsync protocol?? +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 750a04ca..aa8192c0 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 +@@ -5,6 +5,11 @@ + local backup_prog_rc + local backup_log_message + ++local host path ++ ++host="$(rsync_host "$BACKUP_URL")" ++path="$(rsync_path "$BACKUP_URL")" ++ + Log "Include list:" + while read -r ; do + Log " $REPLY" +@@ -14,26 +19,27 @@ while read -r ; do + Log " $REPLY" + done < $TMP_DIR/backup-exclude.txt + +-LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'" ++LogPrint "Creating $BACKUP_PROG backup on '${host}:${path}'" + + ProgressStart "Running backup operation" + ( + case "$(basename $BACKUP_PROG)" in + + (rsync) ++ # We are in a subshell, so this change will not propagate to later scripts + BACKUP_RSYNC_OPTIONS+=( --one-file-system --delete --exclude-from=$TMP_DIR/backup-exclude.txt --delete-excluded ) + +- case $RSYNC_PROTO in ++ case $(rsync_proto "$BACKUP_URL") in + + (ssh) +- Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup" ++ Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) "$(rsync_remote_full "$BACKUP_URL")/backup" + $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) \ +- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup" ++ "$(rsync_remote_full "$BACKUP_URL")/backup" + ;; + + (rsync) + $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(cat $TMP_DIR/backup-include.txt) \ +- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" ++ "$(rsync_remote_full "$BACKUP_URL")/backup" + ;; + + esac +@@ -57,11 +63,11 @@ get_size() { + } + + check_remote_df() { +- echo $(ssh ${RSYNC_USER}@${RSYNC_HOST} df -P ${RSYNC_PATH} 2>/dev/null | tail -1 | awk '{print $5}' | sed -e 's/%//') ++ echo $(ssh $(rsync_remote_ssh "$BACKUP_URL") df -P ${path} 2>/dev/null | tail -1 | awk '{print $5}' | sed -e 's/%//') + } + + check_remote_du() { +- x=$(ssh ${RSYNC_USER}@${RSYNC_HOST} du -sb ${RSYNC_PATH}/${RSYNC_PREFIX}/backup 2>/dev/null | awk '{print $1}') ++ x=$(ssh $(rsync_remote_ssh "$BACKUP_URL") du -sb $(rsync_path_full "$BACKUP_URL")/backup 2>/dev/null | awk '{print $1}') + [[ -z "${x}" ]] && x=0 + echo $x + } +@@ -81,7 +87,7 @@ case "$(basename $BACKUP_PROG)" in + case $i in + + 300) +- [[ $(check_remote_df) -eq 100 ]] && Error "Disk is full on system ${RSYNC_HOST}" ++ [[ $(check_remote_df) -eq 100 ]] && Error "Disk is full on system ${host}" + ;; + + 15|30|45|60|75|90|105|120|135|150|165|180|195|210|225|240|255|270|285) +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 b90d459b..76b9f971 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,26 +1,27 @@ + + # copy the backup.log & rear.log file to remote destination with timestamp added +-local timestamp ++local timestamp proto + + timestamp=$( date +%Y%m%d.%H%M ) ++proto="$(rsync_proto "$BACKUP_URL")" + + # compress the log file first + gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'" + +-case $RSYNC_PROTO in ++case $proto in + (ssh) + # 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_remote_full "$BACKUP_URL")/${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_remote_full "$BACKUP_URL")/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" ++ "$(rsync_remote_full "$BACKUP_URL")/${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_remote_full "$BACKUP_URL")//rear-${timestamp}.log" + ;; + esac + +diff --git a/usr/share/rear/lib/global-functions.sh b/usr/share/rear/lib/global-functions.sh +index 32aeb8ca..2edb64a6 100644 +--- a/usr/share/rear/lib/global-functions.sh ++++ b/usr/share/rear/lib/global-functions.sh +@@ -259,7 +259,7 @@ function url_scheme() { + # the scheme is the leading part up to '://' + local scheme=${url%%://*} + # rsync scheme does not have to start with rsync:// it can also be scp style +- # see the comments in usr/share/rear/prep/RSYNC/default/100_check_rsync.sh ++ # see the comments in usr/share/rear/lib/rsync-functions.sh + echo $scheme | grep -q ":" && echo rsync || echo $scheme + } + +diff --git a/usr/share/rear/lib/rsync-functions.sh b/usr/share/rear/lib/rsync-functions.sh +new file mode 100644 +index 00000000..443a9625 +--- /dev/null ++++ b/usr/share/rear/lib/rsync-functions.sh +@@ -0,0 +1,178 @@ ++# Functions for manipulation of rsync URLs (both OUTPUT_URL and BACKUP_URL) ++ ++#### OLD STYLE: ++# BACKUP_URL=[USER@]HOST:PATH # using ssh (no rsh) ++# ++# with rsync protocol PATH is a MODULE name defined in remote /etc/rsyncd.conf file ++# BACKUP_URL=[USER@]HOST::PATH # using rsync ++# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using rsync (is not compatible with new style!!!) ++ ++#### NEW STYLE: ++# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using ssh ++# BACKUP_URL=rsync://[USER@]HOST[:PORT]::/PATH # using rsync ++ ++function rsync_validate () { ++ local url="$1" ++ ++ if [[ "$(url_scheme "$url")" != "rsync" ]]; then # url_scheme still recognizes old style ++ BugError "Non-rsync URL $url !" ++ fi ++} ++ ++# Determine whether the URL specifies the use of the rsync protocol (rsyncd) or ssh ++# Do not call on non-rsync URLs (use url_scheme first) ++function rsync_proto () { ++ local url="$1" ++ ++ rsync_validate "$url" ++ if egrep -q '(::)' <<< $url ; then # new style '::' means rsync protocol ++ echo rsync ++ else ++ echo ssh ++ fi ++} ++ ++# Functions to parse the URL into its components: ++# USER, HOST, PORT, PATH ++ ++function rsync_user () { ++ local url="$1" ++ local host ++ ++ host=$(url_host "$url") ++ ++ if grep -q '@' <<< $host ; then ++ echo "${host%%@*}" # grab user name ++ else ++ echo root ++ fi ++} ++ ++function rsync_host () { ++ local url="$1" ++ local host ++ local path ++ ++ host=$(url_host "$url") ++ path=$(url_path "$url") ++ # remove USER@ if present ++ local tmp2="${host#*@}" ++ ++ case "$(rsync_proto "$url")" in ++ (rsync) ++ # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02:: ++ echo "${tmp2%%::*}" ++ ;; ++ (ssh) ++ # tmp2=host or tmp2=host: ++ echo "${tmp2%%:*}" ++ ;; ++ esac ++} ++ ++function rsync_path () { ++ local url="$1" ++ local host ++ local path ++ local url_without_scheme ++ local url_without_scheme_user ++ ++ host=$(url_host "$url") ++ path=$(url_path "$url") ++ local tmp2="${host#*@}" ++ ++ url_without_scheme="${url#*//}" ++ url_without_scheme_user="${url_without_scheme#$(rsync_user "$url")@}" ++ ++ case "$(rsync_proto "$url")" in ++ ++ (rsync) ++ if grep -q '::' <<< $url_without_scheme_user ; then ++ # we can not use url_path here, it uses / as separator, not :: ++ local url_after_separator="${url_without_scheme_user##*::}" ++ # remove leading / - this is a module name ++ echo "${url_after_separator#/}" ++ else ++ echo "${path#*/}" ++ fi ++ ;; ++ (ssh) ++ if [ "$url_without_scheme" == "$url" ]; then ++ # no scheme - old-style URL ++ if grep -q ':' <<< $url_without_scheme_user ; then ++ echo "${url_without_scheme_user##*:}" ++ else ++ BugError "Old-style rsync URL $url without : !" ++ fi ++ else ++ echo "$path" ++ fi ++ ;; ++ ++ esac ++} ++ ++function rsync_port () { ++ # XXX changing port not implemented yet ++ echo 873 ++} ++ ++# Full path to the destination directory on the remote server, ++# includes RSYNC_PREFIX. RSYNC_PREFIX is not given by the URL, ++# it is a global parameter (by default derived from hostname). ++function rsync_path_full () { ++ local url="$1" ++ ++ echo "$(rsync_path "$url")/${RSYNC_PREFIX}" ++} ++ ++# Argument for the ssh command to log in to the remote host ("user@host") ++function rsync_remote_ssh () { ++ local url="$1" ++ ++ local user host ++ ++ user="$(rsync_user "$url")" ++ host="$(rsync_host "$url")" ++ ++ echo "${user}@${host}" ++} ++ ++# Argument for the rsync command to reach the remote host, without path. ++function rsync_remote_base () { ++ local url="$1" ++ ++ local user host port ++ ++ user="$(rsync_user "$url")" ++ host="$(rsync_host "$url")" ++ port="$(rsync_port "$url")" ++ ++ case "$(rsync_proto "$url")" in ++ ++ (rsync) ++ echo "rsync://${user}@${host}:${port}/" ++ ;; ++ (ssh) ++ echo "$(rsync_remote_ssh "$url"):" ++ ;; ++ ++ esac ++} ++ ++# Complete argument to rsync to reach the remote location identified by URL, ++# but without the added RSYNC_PREFIX. ++# This essentially converts our rsync:// URLs into a form accepted by the rsync command. ++function rsync_remote () { ++ local url="$1" ++ ++ echo "$(rsync_remote_base "$url")$(rsync_path "$url")" ++} ++ ++# Complete argument to rsync including even RSYNC_PREFIX. ++# Determined from the URL and RSYNC_PREFIX. ++function rsync_remote_full () { ++ local url="$1" ++ ++ echo "$(rsync_remote_base "$url")$(rsync_path_full "$url")" ++} +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 519febf5..d00d15e4 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 +@@ -1,20 +1,32 @@ + # Create RSYNC_PREFIX under the local TMP_DIR and also on remote rsync server + # 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!!) ++local proto host scheme ++ ++scheme="$(url_scheme "$OUTPUT_URL")" ++ ++# we handle only rsync:// output schemes. ++# ToDo: why does handling of the output URL scheme belong under RSYNC (which is a backup method)? ++# OUTPUT_URL is independent on the chosen backup method, so this code should be moved to be backup-independent. ++test "rsync" = "$scheme" || return 0 ++ ++proto="$(rsync_proto "$OUTPUT_URL")" ++host="$(rsync_host "$OUTPUT_URL")" ++ ++# create temporary local work-spaces to collect files + 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 ++case $proto in + + (ssh) +- $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}" ++ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "$(rsync_remote "$OUTPUT_URL")" >/dev/null 2>&1 \ ++ || Error "Could not create '$(rsync_path_full "$OUTPUT_URL")' on remote ${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 \ +- || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}" ++ # This must run before the backup stage. Otherwise --relative gets added to BACKUP_RSYNC_OPTIONS ++ $BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote "$OUTPUT_URL")/" >/dev/null \ ++ || Error "Could not create '$(rsync_path_full "$OUTPUT_URL")' on remote ${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 96b62da1..4ddf3cb4 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 +@@ -1,6 +1,17 @@ + # + # copy resulting files to remote network (backup) location + ++local proto scheme ++ ++scheme="$(url_scheme "$OUTPUT_URL")" ++ ++# we handle only rsync:// output schemes. ++# ToDo: why does handling of the output URL scheme belong under RSYNC (which is a backup method)? ++# OUTPUT_URL is independent on the chosen backup method, so this code should be moved to be backup-independent. ++test "rsync" = "$scheme" || return 0 ++ ++proto="$(rsync_proto "$OUTPUT_URL")" ++ + LogPrint "Copying resulting files to $OUTPUT_URL location" + + # if called as mkbackuponly then we just don't have any result files. +@@ -19,21 +30,21 @@ cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFI + cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \ + || Error "Could not copy $RUNTIME_LOGFILE to local rsync location" + +-case $RSYNC_PROTO in ++case $proto in + + (ssh) +- Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" ++ Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ $(rsync_remote_full "$OUTPUT_URL")/" + # 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 \ ++ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "$(rsync_remote_full "$OUTPUT_URL")/" 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_remote_full "$OUTPUT_URL")/" + # 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 \ ++ $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote_full "$OUTPUT_URL")/" 2>/dev/null \ + || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location" + ;; + +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 eb7df29e..84500039 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 +@@ -25,8 +25,10 @@ case $(basename $BACKUP_PROG) in + + (rsync) + if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then ++ local host ++ host="$(rsync_host "$BACKUP_URL")" + # no xattrs compiled in remote rsync, so saving SELinux attributes are not possible +- Log "WARNING: --xattrs not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)" ++ Log "WARNING: --xattrs not possible on system ($host) (no xattrs compiled in rsync)" + # $TMP_DIR/selinux.mode is a trigger during backup to disable SELinux + cat $SELINUX_ENFORCE > $TMP_DIR/selinux.mode + RSYNC_SELINUX= # internal variable used in recover mode (empty means 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 c964a148..448a1b1a 100644 +--- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh ++++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh +@@ -3,97 +3,40 @@ + # 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. + +-#### OLD STYLE: +-# BACKUP_URL=[USER@]HOST:PATH # using ssh (no rsh) +-# +-# with rsync protocol PATH is a MODULE name defined in remote /etc/rsyncd.conf file +-# BACKUP_URL=[USER@]HOST::PATH # using rsync +-# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using rsync (is not compatible with new style!!!) +- +-#### NEW STYLE: +-# BACKUP_URL=rsync://[USER@]HOST[:PORT]/PATH # using ssh +-# BACKUP_URL=rsync://[USER@]HOST[:PORT]::/PATH # using rsync +- + if test -z "$BACKUP_URL" ; then + Error "Missing BACKUP_URL=rsync://[USER@]HOST[:PORT][::]/PATH !" + fi + +-local host=$(url_host $BACKUP_URL) + local scheme=$(url_scheme $BACKUP_URL) # url_scheme still recognizes old style +-local path=$(url_path $BACKUP_URL) + + if [[ "$scheme" != "rsync" ]]; then + Error "Missing BACKUP_URL=rsync://[USER@]HOST[:PORT][::]/PATH !" + fi + +-RSYNC_PROTO= # ssh or rsync +-RSYNC_USER= +-RSYNC_HOST= +-RSYNC_PORT=873 # default port (of rsync server) +-RSYNC_PATH= +- +- +-if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol +- RSYNC_PROTO=rsync +-else +- RSYNC_PROTO=ssh +-fi +- +-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) +-local tmp2="${host#*@}" +- +-case "$RSYNC_PROTO" in +- +- (rsync) +- # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02:: +- RSYNC_HOST="${tmp2%%::*}" +- # path=/gdhaese1@witsbebelnx02::backup or path=/backup +- if grep -q '::' <<< $path ; then +- RSYNC_PATH="${path##*::}" +- else +- RSYNC_PATH="${path##*/}" +- fi +- ;; +- (ssh) +- # tmp2=host or tmp2=host: +- RSYNC_HOST="${tmp2%%:*}" +- RSYNC_PATH=$path +- ;; +- +-esac +- +-#echo RSYNC_PROTO=$RSYNC_PROTO +-#echo RSYNC_USER=$RSYNC_USER +-#echo RSYNC_HOST=$RSYNC_HOST +-#echo RSYNC_PORT=$RSYNC_PORT +-#echo RSYNC_PATH=$RSYNC_PATH ++local host proto ++host="$(rsync_host "$BACKUP_URL")" ++proto="$(rsync_proto "$BACKUP_URL")" + + # check if host is reachable + if test "$PING" ; then +- ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable." ++ ping -c 2 "$host" >/dev/null || Error "Backup host [$host] not reachable." + else + Log "Skipping ping test" + fi + + # check protocol connectivity +-case "$RSYNC_PROTO" in ++case "$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 \ +- || Error "Rsync daemon not running on $RSYNC_HOST" ++ Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} $(rsync_remote_base "$BACKUP_URL")" ++ $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" $(rsync_remote_base "$BACKUP_URL") >/dev/null \ ++ || Error "Rsync daemon not running on $host" + ;; + + (ssh) +- Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true" +- ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \ +- || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" ++ Log "Test: ssh $(rsync_remote_ssh "$BACKUP_URL") /bin/true" ++ ssh $(rsync_remote_ssh "$BACKUP_URL") /bin/true >/dev/null 2>&1 \ ++ || Error "Secure shell connection not setup properly [$(rsync_remote_ssh "$BACKUP_URL")]" + ;; + + 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 e9103531..becf35a0 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 +@@ -3,15 +3,18 @@ + # 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 ++local remote_mountpoint host path proto ++host="$(rsync_host "$BACKUP_URL")" ++path="$(rsync_path "$BACKUP_URL")" ++proto="$(rsync_proto "$BACKUP_URL")" + + if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then + +- case $RSYNC_PROTO in ++ case $proto in + + (ssh) +- ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \ +- || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]" ++ ssh $(rsync_remote_ssh "$BACKUP_URL") rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \ ++ || Error "Secure shell connection not setup properly [$(rsync_remote_ssh "$BACKUP_URL")]" + if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then + RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}') + else +@@ -24,29 +27,29 @@ if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then + RSYNC_PROTOCOL_VERSION=29 # being conservative (old rsync) + ;; + esac +- Log "Remote rsync system ($RSYNC_HOST) uses rsync protocol version $RSYNC_PROTOCOL_VERSION" ++ Log "Remote rsync system ($host) uses rsync protocol version $RSYNC_PROTOCOL_VERSION" + + else + +- Log "Remote rsync system ($RSYNC_HOST) uses rsync protocol version $RSYNC_PROTOCOL_VERSION (overruled by user)" ++ Log "Remote rsync system ($host) uses rsync protocol version $RSYNC_PROTOCOL_VERSION (overruled by user)" + + fi + +-if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then ++if [ "$(rsync_user "$BACKUP_URL")" != "root" -a $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)" ++ Error "rsync --fake-super not possible on system ($host) (no xattrs compiled in rsync)" + else + # when using --fake-super we must have user_xattr mount options on the remote mntpt +- 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" \ ++ remote_mountpoint=$(ssh $(rsync_remote_ssh "$BACKUP_URL") 'cd ${path}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}') ++ ssh $(rsync_remote_ssh "$BACKUP_URL") "cd ${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" ) + fi + else +- Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)" ++ Error "rsync --fake-super not possible on system ($host) (please upgrade rsync to 3.x)" + fi + 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 993088be..0fa08587 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 +@@ -7,7 +7,11 @@ get_size() { + local backup_prog_rc + local restore_log_message + +-LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'" ++local host path ++host="$(rsync_host "$BACKUP_URL")" ++path="$(rsync_path "$BACKUP_URL")" ++ ++LogPrint "Restoring $BACKUP_PROG backup from '${host}:${path}'" + + ProgressStart "Restore operation" + ( +@@ -15,18 +19,18 @@ ProgressStart "Restore operation" + + (rsync) + +- case $RSYNC_PROTO in ++ case $(rsync_proto "$BACKUP_URL") in + + (ssh) +- Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ $TARGET_FS_ROOT/ ++ Log $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" "$(rsync_remote_full "$BACKUP_URL")/backup"/ $TARGET_FS_ROOT/ + $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" \ +- "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ \ ++ "$(rsync_remote_full "$BACKUP_URL")/backup"/ \ + $TARGET_FS_ROOT/ + ;; + + (rsync) + $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" \ +- "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup"/ $TARGET_FS_ROOT/ ++ "$(rsync_remote_full "$BACKUP_URL")/backup"/ $TARGET_FS_ROOT/ + ;; + + esac +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 b2fb72f5..76132794 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 +@@ -1,14 +1,14 @@ + # check the backup archive on remote rsync server + +-case $RSYNC_PROTO in ++case $(rsync_proto "$BACKUP_URL") in + + (ssh) +- 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}]" ++ ssh $(rsync_remote_ssh "$BACKUP_URL") "ls -ld $(rsync_path_full "$BACKUP_URL")/backup" >/dev/null 2>&1 \ ++ || Error "Archive not found on [$(rsync_remote_full "$BACKUP_URL")]" + ;; + + (rsync) +- $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}]" ++ $BACKUP_PROG "$(rsync_remote_full "$BACKUP_URL")/backup" >/dev/null 2>&1 \ ++ || Error "Archive not found on [$(rsync_remote_full "$BACKUP_URL")]" + ;; + esac diff --git a/SPECS/rear.spec b/SPECS/rear.spec index b7564a5..9e83a48 100644 --- a/SPECS/rear.spec +++ b/SPECS/rear.spec @@ -3,7 +3,7 @@ Name: rear Version: 2.6 -Release: 11%{?dist} +Release: 15%{?dist} Summary: Relax-and-Recover is a Linux disaster recovery and system migration tool URL: http://relax-and-recover.org/ License: GPLv3 @@ -29,6 +29,17 @@ Patch38: rear-bz2049091.patch Patch39: rear-pr2675.patch Patch40: rear-bz2048454.patch Patch41: rear-bz2035939.patch +Patch42: rear-bz2083272.patch +Patch43: rear-bz2111049.patch +Patch44: rear-bz2104005.patch +Patch45: rear-bz2097437.patch +Patch46: rear-bz2096916.patch +Patch47: rear-bz2096900.patch +Patch48: rear-bz2111059.patch +Patch49: rsync-output.patch +Patch50: rear-bz2119501.patch +Patch51: rear-bz2120736.patch +Patch52: rear-bz2117937.patch # 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. @@ -42,6 +53,8 @@ ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64 s390x # see the GitHub issue https://github.com/rear/rear/issues/629 %ifarch %ix86 x86_64 Requires: syslinux +# We need mkfs.vfat for recreating EFI System Partition +Recommends: dosfstools %endif %ifarch ppc ppc64 ppc64le # Called by grub2-install (except on PowerNV) @@ -147,6 +160,31 @@ install -m 0644 %{SOURCE3} %{buildroot}%{_docdir}/%{name}/ #-- CHANGELOG -----------------------------------------------------------------# %changelog +* Thu Aug 25 2022 Pavel Cahyna - 2.6-15 +- Exclude /etc/lvm/devices from the rescue system to work around a segfault + in lvm pvcreate + +* Wed Aug 24 2022 Pavel Cahyna - 2.6-14 +- Avoid stderr message about irrelevant broken links +- Changes for NetBackup (NBU) 9.x support + +* Tue Aug 9 2022 Pavel Cahyna - 2.6-13 +- Backport PR2831 - rsync URL refactoring + fixes rsync OUTPUT_URL when different from BACKUP_URL + +* Mon Aug 8 2022 Pavel Cahyna - 2.6-12 +- Apply PR2795 to detect changes in system files between backup + and rescue image +- Apply PR2808 to exclude dev/watchdog* from recovery system +- Backport upstream PRs 2827 and 2839 to pass -y to lvcreate instead of one "y" + on stdin +- Apply PR2811 to add the PRE/POST_RECOVERY_COMMANDS directives +- Recommend dosfstools on x86_64, needed for EFI System Partition +- Backport PR2825 to replace defunct mkinitrd with dracut +- Apply PR2580 to load the nvram module in the rescue environment in order + to be able to set the boot order on ppc64le LPARs +- Backport PR2822 to include the true vi executable in rescue ramdisk + * Sun Feb 27 2022 Pavel Cahyna - 2.6-11 - Apply PR2675 to fix leftover temp dir bug (introduced in backported PR2625) - Apply PR2603 to ignore unused PV devices