Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package transactional-update for
openSUSE:Factory checked in at 2023-05-10 16:16:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/transactional-update (Old)
and /work/SRC/openSUSE:Factory/.transactional-update.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "transactional-update"
Wed May 10 16:16:44 2023 rev:99 rq:1085717 version:4.2.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/transactional-update/transactional-update.changes
2023-03-27 18:15:18.046796493 +0200
+++
/work/SRC/openSUSE:Factory/.transactional-update.new.1533/transactional-update.changes
2023-05-10 16:16:46.150351701 +0200
@@ -1,0 +2,24 @@
+Mon May 8 17:38:24 UTC 2023 - Ignaz Forster <[email protected]>
+
+- Version 4.2.1
+ - Implement "apply" command to switch into new snapshot directly
+ [jsc#PED-3912]
+ - Use new snapper functionality to set default snapshot - this
+ makes it possible to execute hooks as requested in
+ [poo#127160], [gh#openSUSE/transactional-update#85] and
+ [gh#openSUSE/transactional-update#105].
+ - Don't hardcode GRUB2 [gh#openSUSE/transactional-update#100] /
+ [poo#127154]
+ - Fix cleanup handler
+ - Fix unmounting temporary mounts
+ - Prevent loosing track of snapshots in certain rollback
+ scenarios - these would not be marked for deletion otherwise
+ - Document "notify" reboot method
+- Minimal required snapper version is 0.8.10 now, for the new
+ snapper functionality there is a backwards compatibility layer.
+- Conflict with health-checker < 1.8 - the "good" snapshot
+ detection of GRUB cannot rely on transactional-update any more
+ due to the new apply command
+- Depend on usrmerge for apply command
+
+-------------------------------------------------------------------
Old:
----
transactional-update-4.1.5.tar.gz
New:
----
transactional-update-4.2.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ transactional-update.spec ++++++
--- /var/tmp/diff_new_pack.JNZwXM/_old 2023-05-10 16:16:46.730355131 +0200
+++ /var/tmp/diff_new_pack.JNZwXM/_new 2023-05-10 16:16:46.734355155 +0200
@@ -26,7 +26,7 @@
%{!?_distconfdir: %global _distconfdir %{_prefix}%{_sysconfdir}}
Name: transactional-update
-Version: 4.1.5
+Version: 4.2.1
Release: 0
Summary: Transactional Updates with btrfs and snapshots
License: GPL-2.0-or-later AND LGPL-2.1-or-later
@@ -64,6 +64,8 @@
BuildRequires: python3-lxml
BuildRequires: w3m
BuildRequires: xsltproc
+# XXX libsolv never sees the rpmlib provides fulfilled
+Requires: (compat-usrmerge-tools or rpmlib(X-CheckUnifiedSystemdir))
Requires: /usr/bin/bc
Requires: dracut-transactional-update = %{version}-%{release}
Requires: logrotate
@@ -76,6 +78,7 @@
Recommends: inotify-tools
Recommends: rebootmgr
Suggests: tukitd = %{version}-%{release}
+Conflicts: health-checker < 1.8
%description
transactional-update is a tool to update a system in an atomic
@@ -111,7 +114,7 @@
Group: System/Libraries
Requires: btrfsprogs
Requires: rsync
-Requires: snapper
+Requires: snapper >= 0.8.10
%description -n %{libname}
This package contains the libraries required for programs to do
++++++ transactional-update-4.1.5.tar.gz -> transactional-update-4.2.1.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.5/NEWS
new/transactional-update-4.2.1/NEWS
--- old/transactional-update-4.1.5/NEWS 2023-03-23 11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/NEWS 2023-05-09 14:44:34.000000000 +0200
@@ -2,6 +2,25 @@
Copyright (C) 2016-2022 Thorsten Kukuk, Ignaz Forster et al.
+Version 4.2.1
+* Add backwards compatibility with older snapper releases, otherwise
+ the selfupdate may break if the installed snapper version is too old;
+ requires snapper 0.8.10 as a minimal base (for rollbacks) now
+
+Version 4.2.0
+* Implement "apply" command to switch into new snapshot directly
+* Use new snapper functionality to set default snapshot - this makes it
+ possible to execute hooks as requested in [poo#127160],
+ [gh#openSUSE/transactional-update#85] and
+ [gh#openSUSE/transactional-update#105].
+* Don't hardcode GRUB2 [gh#openSUSE/transactional-update#85] /
+ [poo#127154]
+* Fix cleanup handler
+* Fix unmounting temporary mounts
+* Prevent loosing track of snapshots in certain rollback scenarios - these
+ would not be marked for deletion otherwise
+* Document "notify" reboot method
+
Version 4.1.5
* Add support for configuration file snippets
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.5/configure.ac
new/transactional-update-4.2.1/configure.ac
--- old/transactional-update-4.1.5/configure.ac 2023-03-23 11:48:29.000000000
+0100
+++ new/transactional-update-4.2.1/configure.ac 2023-05-09 14:44:34.000000000
+0200
@@ -1,11 +1,11 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(transactional-update, 4.1.5)
+AC_INIT(transactional-update, 4.2.1)
# Increase on any interface change and reset revision
LIBTOOL_CURRENT=4
# On interface change increase if backwards compatible, reset otherwise
LIBTOOL_AGE=0
# Increase on *any* C/C++ library code change, reset at interface change
-LIBTOOL_REVISION=3
+LIBTOOL_REVISION=5
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_FILES([tukit.pc])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.5/lib/Overlay.cpp
new/transactional-update-4.2.1/lib/Overlay.cpp
--- old/transactional-update-4.1.5/lib/Overlay.cpp 2023-03-23
11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/lib/Overlay.cpp 2023-05-09
14:44:34.000000000 +0200
@@ -104,7 +104,7 @@
tulog.info("Parent snapshot ", previousSnapId, " does not exist any
more - skipping rsync");
return;
}
- unique_ptr<Mount> previousEtc{new Mount("/etc")};
+ unique_ptr<Mount> previousEtc{new Mount("/etc", 0, true)};
previousEtc->setTabSource(previousSnapshot->getRoot() / "etc" / "fstab");
// Mount read-only, so mount everything as lowerdir
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.5/lib/Snapshot/Snapper.cpp
new/transactional-update-4.2.1/lib/Snapshot/Snapper.cpp
--- old/transactional-update-4.1.5/lib/Snapshot/Snapper.cpp 2023-03-23
11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/lib/Snapshot/Snapper.cpp 2023-05-09
14:44:34.000000000 +0200
@@ -141,14 +141,22 @@
}
void Snapper::setDefault() {
- Util::exec("btrfs subvolume set-default " + std::string(getRoot()));
+ try {
+ callSnapper("modify --default " + snapshotId);
+ } catch (const ExecutionException &e) {
+ Util::exec("btrfs subvolume set-default " + std::string(getRoot()));
+ }
}
void Snapper::setReadOnly(bool readonly) {
- std::string boolstr = "true";
- if (readonly == false)
- boolstr = "false";
- Util::exec("btrfs property set " + std::string(getRoot()) + " ro " +
boolstr);
+ try {
+ if (readonly == true)
+ callSnapper("modify --read-only " + snapshotId);
+ else
+ callSnapper("modify --read-write " + snapshotId);
+ } catch (const ExecutionException &e) {
+ Util::exec("btrfs property set " + std::string(getRoot()) + " ro " +
(readonly ? "true" : "false"));
+ }
}
/* Helper methods */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.5/lib/Transaction.cpp
new/transactional-update-4.2.1/lib/Transaction.cpp
--- old/transactional-update-4.1.5/lib/Transaction.cpp 2023-03-23
11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/lib/Transaction.cpp 2023-05-09
14:44:34.000000000 +0200
@@ -185,10 +185,12 @@
dirsToMount.push_back(std::move(mntVarTmp));
// Mount platform specific GRUB directories for GRUB updates
- for (auto& path: fs::directory_iterator("/boot/grub2")) {
- if (fs::is_directory(path)) {
- if (BindMount{path.path()}.isMount())
-
dirsToMount.push_back(std::make_unique<BindMount>(path.path()));
+ if (fs::exists("/boot/grub2")) {
+ for (auto& path: fs::directory_iterator("/boot/grub2")) {
+ if (fs::is_directory(path)) {
+ if (BindMount{path.path()}.isMount())
+
dirsToMount.push_back(std::make_unique<BindMount>(path.path()));
+ }
}
}
if (BindMount{"/boot/efi"}.isMount())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-4.1.5/man/transactional-update.8.xml
new/transactional-update-4.2.1/man/transactional-update.8.xml
--- old/transactional-update-4.1.5/man/transactional-update.8.xml
2023-03-23 11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/man/transactional-update.8.xml
2023-05-09 14:44:34.000000000 +0200
@@ -155,6 +155,29 @@
</para>
<variablelist remap='TP'>
<varlistentry>
+ <term><option>apply</option></term>
+ <listitem>
+ <para>
+ Mounts <filename class='directory'>/usr</filename>,
+ <filename class='directory'>/etc</filename> and
+ <filename class='directory'>/boot</filename> of the (new) default
+ snapshot into the currently running system. This is mostly useful for
+ using newly installed packages directly without a reboot. When using
+ apply on a system where existing files will be replaced (e.g. when doing
+ a system update) this behaves similarly to a regular zypper update where
+ files of currently running applications will also be replaced, but with
+ the additional advantage that the update itself was finished successfully
+ as a whole, avoiding inconsistent states on update failures.
+ </para>
+ <para>
+ Note that - in contrast to regular zypper updates - services will not be
+ restarted automatically. Additionally mounting the three directories is
+ not one atomic operation, so there will be a short timespan where the
+ directories visible to the system will not be in sync.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><option>cleanup</option></term>
<listitem>
<para>Identical to calling both <option>cleanup-snapshots</option> and
@@ -477,6 +500,10 @@
<option>last</option>. <option>last</option> will try to reset to the
latest working snapshot.
</para>
+ <para>
+ This command can be combind with the <option>apply</option> command
+ to make the snapshot effective immediately.
+ </para>
</listitem>
</varlistentry>
<varlistentry>
@@ -608,6 +635,33 @@
</variablelist>
</refsect1>
+<refsect1 id='exitstatus'><title>EXIT STATUS</title>
+<variablelist>
+ <varlistentry>
+ <term><option>0</option></term>
+ <listitem>
+ <para>All commands were executed successfully.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>1</option></term>
+ <listitem>
+ <para>One of the commands returned with an error. Due to that a
+ potential new snapshot has been deleted again.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>2</option></term>
+ <listitem>
+ <para>The <option>apply</option> command was not successfull.
+ If called together with another commands, these commands were completed
+ successfully, but the new default snapshot will not be set in the
+ live system.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</refsect1>
+
<refsect1 id='important'><title>IMPORTANT</title>
<para>
Only RPMs which are fully part of the root filesystem and
@@ -630,7 +684,9 @@
system</emphasis>.
Calling <command>transactional-update</command> multiple times without
rebooting will <emphasis>not</emphasis> include the changes of the previous
- snapshot, thus effectively discarding all previous changes.
+ snapshot, thus effectively discarding all previous changes (except when
+ using <option>--continue</option> to explicitly continue a previous snapshot
+ or when <option>apply</option> was called previously).
</para>
</refsect1>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-4.1.5/man/transactional-update.conf.5.xml
new/transactional-update-4.2.1/man/transactional-update.conf.5.xml
--- old/transactional-update-4.1.5/man/transactional-update.conf.5.xml
2023-03-23 11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/man/transactional-update.conf.5.xml
2023-05-09 14:44:34.000000000 +0200
@@ -138,6 +138,16 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><literal>notify</literal></term>
+ <listitem>
+ <para>
+ Trigger the <application>Transactional Update
+ Notifier</application> to inform the user about the
+ necessary reboot.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><literal>none</literal></term>
<listitem>
<para>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-4.1.5/sbin/transactional-update.in
new/transactional-update-4.2.1/sbin/transactional-update.in
--- old/transactional-update-4.1.5/sbin/transactional-update.in 2023-03-23
11:48:29.000000000 +0100
+++ new/transactional-update-4.2.1/sbin/transactional-update.in 2023-05-09
14:44:34.000000000 +0200
@@ -30,6 +30,7 @@
REWRITE_GRUB_CFG=0
REWRITE_INITRD=0
REBUILD_KDUMP_INITRD=0
+DO_APPLY=0
DO_CLEANUP_OVERLAYS=0
DO_CLEANUP_SNAPSHOTS=0
DO_MIGRATION=0
@@ -91,6 +92,7 @@
SNAPSHOT_DIR=""
BASE_SNAPSHOT_ID=""
TMPFILE=""
+APPLYWORKDIR=""
DO_CALLEXT=0
declare -A ROLES=()
@@ -137,6 +139,7 @@
echo "system."
echo ""
echo "General Commands:"
+ echo "apply Switch into default snapshot without
reboot"
echo "cleanup Run both cleanup-snapshots and
cleanup-overlays"
echo "cleanup-snapshots Mark unused snapshots for snapper removal"
echo "cleanup-overlays Remove unused overlay layers"
@@ -292,6 +295,14 @@
# Cleanup temporary files
rm -f ${TMPFILE}
+ if [ -d "${APPLYWORKDIR}" ]; then
+ if mountpoint --quiet "${APPLYWORKDIR}/mount"; then
+ umount --recursive "${APPLYWORKDIR}/mount"
+ fi
+ rmdir "${APPLYWORKDIR}/mount"
+ rmdir "${APPLYWORKDIR}"
+ fi
+
# The following commands only make sense if snapshot dir is set already
if [ "${SNAPSHOT_DIR}" = "" ]; then
return
@@ -301,6 +312,97 @@
rm -rf ${SNAPSHOT_DIR}/run/*
}
+do_apply() {
+ if [ -n "${SNAPSHOT_ID}" -o -n "${ROLLBACK_SNAPSHOT}" -o
"${DEFAULT_SNAPSHOT_ID}" != "${CURRENT_SNAPSHOT_ID}" ]; then
+ NEW_DEFAULT_SNAPSHOT_ID=`btrfs subvolume get-default / | sed -e
's|.*.snapshots/\(.*\)/snapshot|\1|g'`
+ if ! APPLYWORKDIR="$(mktemp -d
/tmp/transactional-update.apply.XXXXXXXX)"; then
+ log_error "ERROR during apply: Temporary directory template failed."
+ fi
+ if ! mkdir "${APPLYWORKDIR}/mount"; then
+ log_error "ERROR during apply: Couldn't create mount directory."
+ fi
+
+ sourcedevice="$(findmnt --target /usr --raw --noheadings --output
SOURCE --nofsroot | tail -n 1)"
+ # Mount new snapshot as base
+ if ! mount "${sourcedevice}" "${APPLYWORKDIR}/mount"; then
+ log_error "ERROR during apply: Mounting ${sourcedevice} to
${APPLYWORKDIR}/mount failed."
+ quit 2
+ fi
+ # Mount /etc overlay
+ if [ "$(findmnt --noheadings --nofsroot --output FSTYPE /etc | tail -n
1)" == "overlay" ]; then
+ if ! mount overlay -t overlay -o "$(findmnt --tab-file
"${APPLYWORKDIR}/mount/etc/fstab" --noheadings --nofsroot --output OPTIONS /etc
| sed 's/\/sysroot//g' | sed
's/:\/etc,/:\/.snapshots\/'${NEW_DEFAULT_SNAPSHOT_ID}'\/snapshot\/etc,/g')"
"${APPLYWORKDIR}/mount/etc"; then
+ log_error "ERROR during apply: Mounting /etc overlay failed."
+ quit 2
+ fi
+ fi
+ # Find and mount potential submounts
+ VISIBLEMOUNTS=(/usr /etc /boot)
+ for line in $(findmnt --raw --noheadings --nofsroot --output TARGET -d
forward | grep -E "^/(usr|etc|boot)"); do
+ for i in ${!VISIBLEMOUNTS[@]}; do
+ if [[ $line == ${VISIBLEMOUNTS[$i]} ]]; then
+ while [ $i -lt ${#VISIBLEMOUNTS[@]} ]; do
+ if [[ ${VISIBLEMOUNTS[$i]} == ${line}* ]]; then
+ unset -v VISIBLEMOUNTS[$i]
+ VISIBLEMOUNTS=("${VISIBLEMOUNTS[@]}")
+ else
+ ((i++))
+ fi
+ done
+ break
+ fi
+ done
+ VISIBLEMOUNTS+=(${line})
+ done
+ for dir in ${VISIBLEMOUNTS[@]}; do
+ if [[ $dir =~ ^/(usr|etc|boot)$ ]]; then
+ continue;
+ fi
+ dir="$(echo -e ${dir})"
+ if ! mount --bind "${dir}" "${APPLYWORKDIR}/mount/${dir}"; then
+ log_error "ERROR during apply: Bind-mounting ${dir} failed."
+ quit 2
+ fi
+ done
+ if ! mount --make-rprivate "${APPLYWORKDIR}/mount"; then
+ log_error "ERROR during apply: make-rprivate failed."
+ quit 2
+ fi
+
+ log_info ""
+ log_info "Using default snapshot ${NEW_DEFAULT_SNAPSHOT_ID} to replace
running system..."
+
+ # Mount new snapshot into running system
+ for rbinddir in usr etc boot; do
+ log_info "Applying /${rbinddir}..."
+ if ! mount --rbind "${APPLYWORKDIR}/mount/${rbinddir}"
"/${rbinddir}"; then
+ log_error "ERROR during apply: Mounting /${rbinddir} failed!"
+ for dir in ${rbinddir_done}; do
+ umount "/${dir}"
+ done
+ quit 2
+ fi
+ rbinddir_done="${rbinddir_done} ${rbinddir}"
+ done
+
+ umount --lazy "${APPLYWORKDIR}/mount"
+ rmdir "${APPLYWORKDIR}/mount"
+ rmdir "${APPLYWORKDIR}"
+
+ log_info "Executing systemctl daemon-reexec..."
+ systemctl daemon-reexec
+ log_info "Executing create_dirs_from_rpmdb..."
+ create_dirs_from_rpmdb
+ log_info "Executing systemd-tmpfiles --create..."
+ systemd-tmpfiles --create
+
+ log_info "=> Applied default snapshot as new base for running system!"
+ log_info " Running processes will not be restarted automatically."
+ else
+ log_info ""
+ log_info "The default snapshot is active already."
+ fi
+}
+
reboot_via_rebootmgr() {
TELEM_PAYLOAD="${TELEM_PAYLOAD}\nreboot=rebootmgr"
tukit reboot rebootmgr |& tee -a ${LOGFILE}
@@ -892,6 +994,10 @@
shift
fi
;;
+ apply)
+ DO_APPLY=1
+ shift
+ ;;
run)
test -z "$TELEM_CLASS" && TELEM_CLASS="shell"
DO_RUN=1
@@ -1011,7 +1117,7 @@
exec {origstderr}>&2
# Log stderr to log file in case anything goes wrong within
transactional-update
-exec 2> >(exec tee -a "${LOGFILE}" >&2)
+exec 2> >(exec tee -i -a "${LOGFILE}" >&2)
if [ "${VERBOSITY}" -eq 1 ]; then
exec 1>/dev/null
if [ -n "${ZYPPER_ARG}" ]; then
@@ -1065,7 +1171,7 @@
# If no commands were given, assume "up"
if [ -z "${ZYPPER_ARG}" -a -z "${TELEM_CLASS}" -a "${REBOOT_AFTERWARDS}" -eq 0
\
-a "${DO_REGISTRATION}" -eq 0 -a "${DO_CLEANUP_OVERLAYS}" -eq 0 \
- -a "${DO_CLEANUP_SNAPSHOTS}" -eq 0 ]; then
+ -a "${DO_CLEANUP_SNAPSHOTS}" -eq 0 -a "${DO_APPLY}" -eq 0 ]; then
ZYPPER_ARG="up"
TELEM_CLASS="update"
fi
@@ -1155,7 +1261,8 @@
ZYPPER_ARG="--gpg-auto-import-keys ${ZYPPER_ARG}"
fi
-CURRENT_SNAPSHOT_ID=`grep subvol=/@/.snapshots/ /proc/mounts | grep "/ btrfs"
| sed -e 's|.*.snapshots/\(.*\)/snapshot.*|\1|g'`
+BOOTED_SNAPSHOT_ID=`grep subvol=/@/.snapshots/ /proc/mounts | grep "/ btrfs" |
sed -e 's|.*.snapshots/\(.*\)/snapshot.*|\1|g'`
+CURRENT_SNAPSHOT_ID=`findmnt --target /usr --raw --noheadings --output FSROOT
| tail -n 1 | sed -e 's|.*.snapshots/\(.*\)/snapshot.*|\1|g'`
DEFAULT_SNAPSHOT_ID=`btrfs subvolume get-default / | sed -e
's|.*.snapshots/\(.*\)/snapshot|\1|g'`
RO_ROOT=`btrfs property get / ro | sed -e 's|ro=||'`
@@ -1181,34 +1288,35 @@
log_info "Rollback to snapshot ${ROLLBACK_SNAPSHOT}..."
+ snapper rollback "${ROLLBACK_SNAPSHOT}"
+ if [ $? -ne 0 ]; then
+ log_error "ERROR: Rollback to snapshot $ROLLBACK_SNAPSHOT failed!"
+ quit 1
+ fi
if [ ${RO_ROOT} == "true" ]; then
- BTRFS_ID=`btrfs subvolume list -o /.snapshots | grep
/.snapshots/${ROLLBACK_SNAPSHOT}/snapshot | awk '{print $2}'`
- if [ -z $BTRFS_ID ]; then
- log_error "ERROR: couldn't determine btrfs subvolume ID"
- quit 1
- else
- btrfs subvolume set-default $BTRFS_ID /.snapshots
- if [ $? -ne 0 ]; then
- log_error "ERROR: btrfs set-default $BTRFS_ID failed!"
- quit 1
- fi
- # Create the trigger to re-register the system as new version after
next
- # reboot.
- check_registration_on_next_reboot
+ # Create the trigger to re-register the system as new version after next
+ # reboot.
+ check_registration_on_next_reboot
+ # Remove possible cleanup algo and re-add to list
+ if ! ( echo "${LAST_WORKING_SNAPSHOTS} ${UNUSED_SNAPSHOTS}" | grep
--word-regexp --quiet "${ROLLBACK_SNAPSHOT}" ); then
+ UNUSED_SNAPSHOTS="${UNUSED_SNAPSHOTS} ${ROLLBACK_SNAPSHOT}"
+ save_state_file 0
fi
- # Remove possible cleanup algo
- snapper modify -c '' ${ROLLBACK_SNAPSHOT}
if [ ${NEED_REBOOT_WARNING} -eq 0 ]; then
rm -f "${NEEDS_RESTARTING_FILE}"
fi
else
- snapper rollback ${ROLLBACK_SNAPSHOT}
NEED_REBOOT_WARNING=1
fi
if [ ${NEED_REBOOT_WARNING} -eq 1 ]; then
- log_error "Please reboot to finish rollback!"
+ if [ ${DO_APPLY} -eq 1 ]; then
+ do_apply
+ else
+ log_error "Please reboot to finish rollback!"
+ fi
fi
+ log_info "transactional-update finished"
telem_finish 0
exit 0
fi
@@ -1230,10 +1338,11 @@
#
if [ ${DO_CLEANUP_SNAPSHOTS} -eq 1 ]; then
# If there is a list of working snapshots, go through it and mark any
snapshot for deletion, if it is
- # not the currently used one or the active one.
+ # not the currently used one, the booted one (still required for
health-checker rollbacks) or the
+ # active one.
if [ -n "${LAST_WORKING_SNAPSHOTS}" ]; then
for snap in ${LAST_WORKING_SNAPSHOTS}; do
- if [ ${CURRENT_SNAPSHOT_ID} -ne ${snap} ]; then
+ if [ ${CURRENT_SNAPSHOT_ID} -ne ${snap} -a ${BOOTED_SNAPSHOT_ID}
-ne ${snap} ]; then
log_info "Adding cleanup algorithm to snapshot #${snap}"
snapper modify -c number ${snap} |& tee -a ${LOGFILE}
if [ ${PIPESTATUS[0]} -ne 0 ]; then
@@ -1266,13 +1375,15 @@
UNUSED_SNAPSHOTS="${UNUSED_SNAPSHOTS} ${snap}"
done
- # Always try to cleanup all snapshots; only the current snapshot and an
- # eventual new default one needs to be kept.
+ # Always try to cleanup all snapshots; only the current snapshot, the
+ # one which the system was booted from and some parts of the system
+ # may still use, and an eventual new default one needs to be kept.
if [ -n "${UNUSED_SNAPSHOTS}" ]; then
_new_unused=""
for snap in ${UNUSED_SNAPSHOTS}; do
# Don't mark our current in use snapshot for deletion
if [ ${snap} -ne ${CURRENT_SNAPSHOT_ID} ] && \
+ [ ${snap} -ne ${BOOTED_SNAPSHOT_ID} ] && \
[ ${snap} -ne ${DEFAULT_SNAPSHOT_ID} ]; then
log_info "Mark unused snapshot #${snap} for deletion"
snapper modify -c number ${snap} |& tee -a ${LOGFILE}
@@ -1284,7 +1395,7 @@
_new_unused="${snap} ${_new_unused}"
fi
fi
- elif [ ${snap} -ne ${CURRENT_SNAPSHOT_ID} ]; then
+ elif [ ${snap} -ne ${CURRENT_SNAPSHOT_ID} -a ${snap} -ne
${BOOTED_SNAPSHOT_ID} ]; then
# This is the snapshot which is currently in use, so keep it in
# the list. We would probably never clean it up later otherwise.
_new_unused="${snap} ${_new_unused}"
@@ -1409,7 +1520,7 @@
# Rebuild grub.cfg if /etc/os-release changes, could change grub
# menu output, too.
cmp -s /etc/os-release ${SNAPSHOT_DIR}/etc/os-release
- if [ $? -ne 0 ]; then
+ if [ $? -ne 0 -a -x /usr/sbin/grub2-mkconfig ]; then
REWRITE_GRUB_CFG=1
fi
source <(grep VERSION_ID ${SNAPSHOT_DIR}/etc/os-release)
@@ -1569,7 +1680,7 @@
if [ ${EXITCODE} -ne 0 ]; then
quit ${EXITCODE}
- elif [ $REBOOT_AFTERWARDS -eq 0 ]; then
+ elif [ $REBOOT_AFTERWARDS -eq 0 -a $DO_APPLY -ne 1 ]; then
log_info ""
log_info "Please reboot your machine to activate the changes and avoid
data loss."
touch "${NEEDS_RESTARTING_FILE}"
@@ -1586,6 +1697,10 @@
log_info "New default snapshot is #${SNAPSHOT_ID} (${SNAPSHOT_DIR})."
fi
+if [ ${DO_APPLY} -eq 1 -a ${EXITCODE} -eq 0 ]; then
+ do_apply
+fi
+
log_info "transactional-update finished"
if [ ${EXITCODE} -eq 0 ]; then