diff --git a/rear-bz2188593-nbu-systemd.patch b/rear-bz2188593-nbu-systemd.patch new file mode 100644 index 0000000..24b117a --- /dev/null +++ b/rear-bz2188593-nbu-systemd.patch @@ -0,0 +1,440 @@ +diff --git a/usr/share/rear/rescue/NBU/default/460_prepare_netbackup_systemd.sh b/usr/share/rear/rescue/NBU/default/460_prepare_netbackup_systemd.sh +new file mode 100644 +index 00000000..f7423e0a +--- /dev/null ++++ b/usr/share/rear/rescue/NBU/default/460_prepare_netbackup_systemd.sh +@@ -0,0 +1,41 @@ ++# 460_prepare_netbackup_systemd.sh ++# prepare systemd units for NBU (only if NBU version >=7.x) ++ ++# set in 450_prepare_netbackup.sh ++[[ $NBU_version -lt 7 ]] && return # NBU is using xinetd when version <7.x ++ ++# Skip if systemd is not used. ++has_binary systemctl || return 0 ++ ++# Local functions that are 'unset' at the end of this script: ++ ++function get_unit_path () { ++ systemctl show -P FragmentPath $1 ++} ++ ++function get_unit_dropin_paths () { ++ systemctl show -P DropInPaths $1 ++} ++ ++local unit_file_path ++local i ++local unit ++ ++for unit in vxpbx_exchanged.service netbackup.service ; do ++ unit_file_path="$( get_unit_path $unit )" ++ if [ -n "$unit_file_path" ]; then ++ cp $v "$unit_file_path" $ROOTFS_DIR/etc/systemd/system ++ ln -s ../$unit $ROOTFS_DIR/etc/systemd/system/default.target.wants || Error "Failed to enable Netbackup service $unit in the rescue system" ++ Log "Enabled Netbackup service $unit in the rescue system" ++ for i in $( get_unit_dropin_paths $unit ) ; do ++ mkdir -p $ROOTFS_DIR/etc/systemd/system/$unit.d ++ cp $v $i $ROOTFS_DIR/etc/systemd/system/$unit.d ++ done ++ fi ++done ++ ++# Local functions must be 'unset' because bash does not support 'local function ...' ++# cf. https://unix.stackexchange.com/questions/104755/how-can-i-create-a-local-function-in-my-bashrc ++unset -f get_unit_path ++unset -f get_unit_dropin_paths ++unset -f unit_is_enabled +diff --git a/usr/share/rear/skel/default/etc/scripts/run-automatic-rear b/usr/share/rear/skel/default/etc/scripts/run-automatic-rear +new file mode 100755 +index 00000000..6edc657a +--- /dev/null ++++ b/usr/share/rear/skel/default/etc/scripts/run-automatic-rear +@@ -0,0 +1,82 @@ ++#!/bin/bash ++ ++source /etc/scripts/system-setup-functions.sh ++ ++# In debug mode run the automated 'rear recover' also with debug options. ++# Because the kernel command line option 'debug' means 'set -x' for the system setup scripts ++# it also means '-D' (i.e. 'set -x') for the automated 'rear recover' run: ++if rear_debug ; then ++ rear_debug_options='-D' ++else ++ rear_debug_options='' ++fi ++ ++# Launch rear recover automatically: ++if automatic_recovery ; then ++ choices=( "View Relax-and-Recover log file(s)" ++ "Go to Relax-and-Recover shell" ++ ) ++ echo -e "\nLaunching 'rear recover' automatically\n" ++ if rear $rear_debug_options recover ; then ++ echo -e "\n'rear recover' finished successfully\n" ++ choices+=( "Reboot" ) ++ else ++ echo -e "\n'rear recover' failed, check the Relax-and-Recover log file(s)\n" ++ fi ++ PS3="Select what to do " ++ select choice in "${choices[@]}" ; do ++ case "$REPLY" in ++ (1) ++ # Do not assume the ReaR log file is named rear-$HOSTNAME.log ++ # the user can have specified any name as LOGFILE: ++ less /var/log/rear/* ++ ;; ++ (2) ++ echo "" > /etc/issue ++ echo "" > /etc/motd ++ break ++ ;; ++ (3) ++ reboot ++ ;; ++ esac ++ for (( i=1 ; i <= ${#choices[@]} ; i++ )) ; do ++ echo "$i) ${choices[$i-1]}" ++ done ++ done 2>&1 ++fi ++ ++# Launch rear recover automatically in unattended mode ++# i.e. with automated reboot after successful 'rear recover': ++if unattended_recovery ; then ++ choices=( "View Relax-and-Recover log file(s)" ++ "Go to Relax-and-Recover shell" ++ ) ++ echo -e "\nLaunching 'rear recover' automatically in unattended mode\n" ++ if rear $rear_debug_options recover ; then ++ echo -e "\n'rear recover' finished successfully\n" ++ echo -e "\nRebooting in 30 seconds (Ctrl-C to interrupt)\n" ++ sleep 30 ++ reboot ++ else ++ echo -e "\n'rear recover' failed, check the Relax-and-Recover log file(s)\n" ++ PS3="Select what to do " ++ select choice in "${choices[@]}" ; do ++ case "$REPLY" in ++ (1) ++ # Do not assume the ReaR log file is named rear-$HOSTNAME.log ++ # the user can have specified any name as LOGFILE: ++ less /var/log/rear/* ++ ;; ++ (2) ++ echo "" > /etc/issue ++ echo "" > /etc/motd ++ break ++ ;; ++ esac ++ for (( i=1 ; i <= ${#choices[@]} ; i++ )) ; do ++ echo "$i) ${choices[$i-1]}" ++ done ++ done 2>&1 ++ fi ++fi +diff --git a/usr/share/rear/skel/default/etc/scripts/system-setup b/usr/share/rear/skel/default/etc/scripts/system-setup +index 1dc7f1e8..17487ac7 100755 +--- a/usr/share/rear/skel/default/etc/scripts/system-setup ++++ b/usr/share/rear/skel/default/etc/scripts/system-setup +@@ -9,36 +9,7 @@ + # (e.g. "ls foo*bar" becomes plain "ls" without "foo*bar: No such file or directory" error). + shopt -s nullglob + +-# Use an artificial array to get the kernel command line parameters as array elements +-kernel_command_line=( $( cat /proc/cmdline ) ) +- +-function rear_debug() { +- for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do +- test "debug" = "$kernel_command_line_parameter" && return 0 +- done +- return 1 +-} +- +-function unattended_recovery() { +- for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do +- test "unattended" = "$kernel_command_line_parameter" && return 0 +- done +- return 1 +-} +- +-function automatic_recovery() { +- # The unattended recovery mode implies automatic recovery (see the implementations below) +- # so that in unattended mode the automatic recovery code below must not be run +- # otherwise first the automatic recovery code and then the unattended recovery code +- # get run automatically one after the other where the unattended recovery fails +- # because for two subsequent 'rear recover' the second one fails: +- unattended_recovery && return 1 +- for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do +- test "auto_recover" = "$kernel_command_line_parameter" && return 0 +- test "automatic" = "$kernel_command_line_parameter" && return 0 +- done +- return 1 +-} ++source /etc/scripts/system-setup-functions.sh + + # The 'sleep 1' is used as workaround to avoid whatever inexplicable actual reason + # that at least on SLES12 some initial output lines of this script would get lost +@@ -135,84 +106,3 @@ echo -e "\nRelax-and-Recover rescue system is ready\n" + # Wait two seconds so that the user can read the 'Relax-and-Recover rescue system is ready' message + # on his screen before the screen gets cleared and replaced by the login screen: + sleep 2 +- +-# In debug mode run the automated 'rear recover' also with debug options. +-# Because the kernel command line option 'debug' means 'set -x' for the system setup scripts +-# it also means '-D' (i.e. 'set -x') for the automated 'rear recover' run: +-if rear_debug ; then +- rear_debug_options='-D' +-else +- rear_debug_options='' +-fi +- +-# Launch rear recover automatically: +-if automatic_recovery ; then +- choices=( "View Relax-and-Recover log file(s)" +- "Go to Relax-and-Recover shell" +- ) +- echo -e "\nLaunching 'rear recover' automatically\n" +- # The recover workflow is always verbose (see usr/sbin/rear): +- if rear $rear_debug_options recover ; then +- echo -e "\n'rear recover' finished successfully\n" +- choices+=( "Reboot" ) +- else +- echo -e "\n'rear recover' failed, check the Relax-and-Recover log file(s)\n" +- fi +- PS3="Select what to do " +- select choice in "${choices[@]}" ; do +- case "$REPLY" in +- (1) +- # Do not assume the ReaR log file is named rear-$HOSTNAME.log +- # the user can have specified any name as LOGFILE: +- less /var/log/rear/* +- ;; +- (2) +- echo "" > /etc/issue +- echo "" > /etc/motd +- break +- ;; +- (3) +- reboot +- ;; +- esac +- for (( i=1 ; i <= ${#choices[@]} ; i++ )) ; do +- echo "$i) ${choices[$i-1]}" +- done +- done 2>&1 +-fi +- +-# Launch rear recover automatically in unattended mode +-# i.e. with automated reboot after successful 'rear recover': +-if unattended_recovery ; then +- choices=( "View Relax-and-Recover log file(s)" +- "Go to Relax-and-Recover shell" +- ) +- echo -e "\nLaunching 'rear recover' automatically in unattended mode\n" +- # The recover workflow is always verbose (see usr/sbin/rear): +- if rear $rear_debug_options recover ; then +- echo -e "\n'rear recover' finished successfully\n" +- echo -e "\nRebooting in 30 seconds (Ctrl-C to interrupt)\n" +- sleep 30 +- reboot +- else +- echo -e "\n'rear recover' failed, check the Relax-and-Recover log file(s)\n" +- PS3="Select what to do " +- select choice in "${choices[@]}" ; do +- case "$REPLY" in +- (1) +- # Do not assume the ReaR log file is named rear-$HOSTNAME.log +- # the user can have specified any name as LOGFILE: +- less /var/log/rear/* +- ;; +- (2) +- echo "" > /etc/issue +- echo "" > /etc/motd +- break +- ;; +- esac +- for (( i=1 ; i <= ${#choices[@]} ; i++ )) ; do +- echo "$i) ${choices[$i-1]}" +- done +- done 2>&1 +- fi +-fi +diff --git a/usr/share/rear/skel/default/etc/scripts/system-setup-functions.sh b/usr/share/rear/skel/default/etc/scripts/system-setup-functions.sh +new file mode 100644 +index 00000000..c320cf88 +--- /dev/null ++++ b/usr/share/rear/skel/default/etc/scripts/system-setup-functions.sh +@@ -0,0 +1,30 @@ ++# Use an artificial array to get the kernel command line parameters as array elements ++kernel_command_line=( $( cat /proc/cmdline ) ) ++ ++function rear_debug() { ++ for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do ++ test "debug" = "$kernel_command_line_parameter" && return 0 ++ done ++ return 1 ++} ++ ++function unattended_recovery() { ++ for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do ++ test "unattended" = "$kernel_command_line_parameter" && return 0 ++ done ++ return 1 ++} ++ ++function automatic_recovery() { ++ # The unattended recovery mode implies automatic recovery (see the implementations below) ++ # so that in unattended mode the automatic recovery code below must not be run ++ # otherwise first the automatic recovery code and then the unattended recovery code ++ # get run automatically one after the other where the unattended recovery fails ++ # because for two subsequent 'rear recover' the second one fails: ++ unattended_recovery && return 1 ++ for kernel_command_line_parameter in "${kernel_command_line[@]}" ; do ++ test "auto_recover" = "$kernel_command_line_parameter" && return 0 ++ test "automatic" = "$kernel_command_line_parameter" && return 0 ++ done ++ return 1 ++} +diff --git a/usr/share/rear/skel/default/etc/systemd/system/default.target.wants/.gitignore b/usr/share/rear/skel/default/etc/systemd/system/default.target.wants/.gitignore +new file mode 100644 +index 00000000..d6b7ef32 +--- /dev/null ++++ b/usr/share/rear/skel/default/etc/systemd/system/default.target.wants/.gitignore +@@ -0,0 +1,2 @@ ++* ++!.gitignore +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/automatic-rear.service b/usr/share/rear/skel/default/usr/lib/systemd/system/automatic-rear.service +new file mode 100644 +index 00000000..ee3187a8 +--- /dev/null ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/automatic-rear.service +@@ -0,0 +1,13 @@ ++[Unit] ++Description=Run Relax-and-Recover recovery automatically if requested ++Wants=network-online.target ++After=network-online.target ++ ++[Service] ++Type=oneshot ++ExecStart=/etc/scripts/run-automatic-rear ++StandardInput=tty ++RemainAfterExit=yes ++ ++[Install] ++WantedBy=multi-user.target +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/getty@.service b/usr/share/rear/skel/default/usr/lib/systemd/system/getty@.service +index bf858ca8..abafd8b5 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/getty@.service ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/getty@.service +@@ -6,6 +6,8 @@ Description=Getty on %I + Documentation=man:agetty(8) + After=systemd-user-sessions.service plymouth-quit-wait.service + After=sysinit.service ++# Automatic ReaR uses the system console ++After=automatic-rear.service + + # If additional gettys are spawned during boot then we should make + # sure that this is synchronized before getty.target, even though +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target b/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target +index c5ea1cca..a88e219f 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target +@@ -4,7 +4,7 @@ + + [Unit] + Description=Multi-User +-Requires=sysinit.target ++Requires=sysinit.target basic.target + AllowIsolate=yes + + [Install] +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target.wants/automatic-rear.service b/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target.wants/automatic-rear.service +new file mode 120000 +index 00000000..3e8a4161 +--- /dev/null ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/multi-user.target.wants/automatic-rear.service +@@ -0,0 +1 @@ ++../automatic-rear.service +\ No newline at end of file +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target b/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target +new file mode 100644 +index 00000000..c3edfeb4 +--- /dev/null ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target +@@ -0,0 +1,14 @@ ++# SPDX-License-Identifier: LGPL-2.1-or-later ++# ++# This file is part of systemd. ++# ++# systemd is free software; you can redistribute it and/or modify it ++# under the terms of the GNU Lesser General Public License as published by ++# the Free Software Foundation; either version 2.1 of the License, or ++# (at your option) any later version. ++ ++[Unit] ++Description=Network is Online ++Documentation=man:systemd.special(7) ++Documentation=https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget ++After=network.target +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target.wants/sysinit.service b/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target.wants/sysinit.service +new file mode 120000 +index 00000000..ed660a10 +--- /dev/null ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/network-online.target.wants/sysinit.service +@@ -0,0 +1 @@ ++../sysinit.service +\ No newline at end of file +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/rsyslog.service b/usr/share/rear/skel/default/usr/lib/systemd/system/rsyslog.service +index ac171e0f..18fa17b5 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/rsyslog.service ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/rsyslog.service +@@ -1,6 +1,5 @@ + [Unit] + Description=Relax-and-Recover run-syslog script +-DefaultDependencies=no + + [Service] + Type=simple +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.service b/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.service +index ee22fafc..b34b2fe8 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.service ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.service +@@ -1,9 +1,14 @@ + [Unit] + Description=Initialize Rescue System +-After=systemd-udevd.service ++DefaultDependencies=no ++After=systemd-udevd.service rear-boot-helper.service ++Before=network-online.target + + [Service] + Type=oneshot + ExecStart=/etc/scripts/system-setup + StandardInput=tty + RemainAfterExit=yes ++ ++[Install] ++WantedBy=network-online.target +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.target b/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.target +index 4187ef67..2a16369b 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.target ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/sysinit.target +@@ -4,3 +4,5 @@ + + [Unit] + Description=System Initialization ++Wants=sysinit.service rear-boot-helper.service ++After=sysinit.service rear-boot-helper.service +diff --git a/usr/share/rear/skel/default/usr/lib/systemd/system/syslog.socket b/usr/share/rear/skel/default/usr/lib/systemd/system/syslog.socket +index 9a0064c0..3fb02344 100644 +--- a/usr/share/rear/skel/default/usr/lib/systemd/system/syslog.socket ++++ b/usr/share/rear/skel/default/usr/lib/systemd/system/syslog.socket +@@ -4,7 +4,6 @@ + + [Unit] + Description=Syslog Socket +-DefaultDependencies=no + Before=sockets.target syslog.target + + [Socket] diff --git a/rear.spec b/rear.spec index 9da1a06..41539f8 100644 --- a/rear.spec +++ b/rear.spec @@ -44,6 +44,7 @@ Patch53: rear-bz2091163.patch Patch54: rear-bz2130945.patch Patch55: rear-bz2131946.patch Patch56: s390-no-clobber-disks.patch +Patch57: rear-bz2188593-nbu-systemd.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.