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-01-23 04:38:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/transactional-update (Old)
and /work/SRC/openSUSE:Factory/.transactional-update.new.32243 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "transactional-update"
Mon Jan 23 04:38:07 2023 rev:94 rq: version:4.1.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/transactional-update/transactional-update.changes
2023-01-20 17:38:05.548326178 +0100
+++
/work/SRC/openSUSE:Factory/.transactional-update.new.32243/transactional-update.changes
2023-01-23 04:38:08.576888702 +0100
@@ -1,17 +0,0 @@
--------------------------------------------------------------------
-Wed Jan 18 16:56:16 UTC 2023 - Ignaz Forster <[email protected]>
-
-- Version 4.1.1
- - Mount user specific binddirs last: Prevously the internal mounts would
- potentially overwrite user bind mounts [boo#1205011]
- - selinux: Relabel shadowed /var files during update to make sure they
- don't interfere with the update [boo#1205937]
- - Clean up /var/lib/overlay more aggressively [boo#1206947]
- - tukit: Merge /etc overlay into parent if --discard is used together
- with --continue - previously the files were incorrectly always merged
- with the currently running system
- - status: do not execute the status command if experimental
- - Don't delete created mount point dirs any more
- - Small code optimizations
-
--------------------------------------------------------------------
Old:
----
transactional-update-4.1.1.tar.gz
New:
----
transactional-update-4.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ transactional-update.spec ++++++
--- /var/tmp/diff_new_pack.xLFIZj/_old 2023-01-23 04:38:09.228892437 +0100
+++ /var/tmp/diff_new_pack.xLFIZj/_new 2023-01-23 04:38:09.232892460 +0100
@@ -1,7 +1,7 @@
#
# spec file for package transactional-update
#
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
# Copyright (c) 2021 Neal Gompa
#
# All modifications and additions to the file contributed by third parties
@@ -26,7 +26,7 @@
%{!?_distconfdir: %global _distconfdir %{_prefix}%{_sysconfdir}}
Name: transactional-update
-Version: 4.1.1
+Version: 4.1.0
Release: 0
Summary: Transactional Updates with btrfs and snapshots
License: GPL-2.0-or-later AND LGPL-2.1-or-later
++++++ transactional-update-4.1.1.tar.gz -> transactional-update-4.1.0.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/NEWS
new/transactional-update-4.1.0/NEWS
--- old/transactional-update-4.1.1/NEWS 2023-01-18 16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/NEWS 2022-10-26 16:50:43.000000000 +0200
@@ -2,19 +2,6 @@
Copyright (C) 2016-2022 Thorsten Kukuk, Ignaz Forster et al.
-Version 4.1.1
-* Mount user specific binddirs last: Prevously the internal mounts would
- potentially overwrite user bind mounts [boo#1205011]
-* selinux: Relabel shadowed /var files during update to make sure they
- don't interfere with the update [boo#1205937]
-* Clean up /var/lib/overlay more aggressively [boo#1206947]
-* tukit: Merge /etc overlay into parent if --discard is used together
- with --continue - previously the files were incorrectly always merged
- with the currently running system
-* status: do not execute the status command if experimental
-* Don't delete created mount point dirs any more
-* Small code optimizations
-
Version 4.1.0
* t-u: Add a "setup-kdump" command; implements [jsc#PED-1441]
* Add support for ULP (Userspace Live Patching) [jsc#PED-1078]:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/README.md
new/transactional-update-4.1.0/README.md
--- old/transactional-update-4.1.1/README.md 2023-01-18 16:35:08.000000000
+0100
+++ new/transactional-update-4.1.0/README.md 2022-10-26 16:50:43.000000000
+0200
@@ -29,7 +29,7 @@
## Known users
* **dnf**, Fedora's package management system, supports transactional systems
directly via the
[libdnf-plugin-txnupd](https://code.opensuse.org/microos/libdnf-plugin-txnupd)
plugin (libtukit).
-* **Cockpit** can update transactional systems via the
[cockpit-tukit](https://github.com/openSUSE/cockpit-tukit) plugin (tukitd).
+* **Cockpit** can update transactionals systems via the
[cockpit-tukit](https://github.com/openSUSE/cockpit-tukit) plugin (tukitd).
* **Salt** contains the [salt.modules.transactional\_update
module](https://docs.saltproject.io/en/3004/ref/modules/all/salt.modules.transactional_update.html)
module (transactional-update).
* **Ansible** also supports transactional-update via the the
[community.general.zypper](https://docs.ansible.com/ansible/latest/collections/community/general/zypper_module.html)
module (transactional-update).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/configure.ac
new/transactional-update-4.1.0/configure.ac
--- old/transactional-update-4.1.1/configure.ac 2023-01-18 16:35:08.000000000
+0100
+++ new/transactional-update-4.1.0/configure.ac 2022-10-26 16:50:43.000000000
+0200
@@ -1,11 +1,11 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(transactional-update, 4.1.1)
+AC_INIT(transactional-update, 4.1.0)
# 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=2
+LIBTOOL_REVISION=1
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.1/lib/Mount.cpp
new/transactional-update-4.1.0/lib/Mount.cpp
--- old/transactional-update-4.1.1/lib/Mount.cpp 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/lib/Mount.cpp 2022-10-26
16:50:43.000000000 +0200
@@ -13,9 +13,9 @@
namespace TransactionalUpdate {
-Mount::Mount(std::string mountpoint, unsigned long flags, bool umount)
+Mount::Mount(std::string mountpoint, unsigned long flags)
: mnt_table{mnt_new_table()}, mountpoint{std::move(mountpoint)},
- flags{std::move(flags)}, umount{std::move(umount)}
+ flags{std::move(flags)}
{
}
@@ -29,7 +29,7 @@
}
Mount::~Mount() {
- if (mnt_fs && umount) {
+ if (mnt_fs) {
struct libmnt_table* umount_table = mnt_new_table();
if ((mnt_table_parse_mtab(umount_table, nullptr)) != 0)
tulog.error("Error reading mtab for umount");
@@ -39,6 +39,14 @@
mnt_free_table(umount_table);
}
+ if (!directoryCreated.empty()) {
+ try {
+
std::filesystem::remove_all(std::filesystem::path{directoryCreated});
+ } catch (const std::exception &e) {
+ tulog.error("ERROR: ", e.what());
+ }
+ }
+
mnt_free_context(mnt_cxt);
mnt_unref_fs(mnt_fs);
mnt_free_table(mnt_table);
@@ -184,6 +192,10 @@
throw std::runtime_error{"Setting mount flags for '" + mountpoint + "'
failed: " + std::to_string(rc)};
}
+ if (! std::filesystem::is_directory(mounttarget)) {
+ tulog.debug("Mount target ", mounttarget, " does not exist -
creating...");
+ directoryCreated = mounttarget;
+ }
std::filesystem::create_directories(mounttarget);
rc = mnt_context_mount(mnt_cxt);
@@ -257,8 +269,8 @@
mnt_free_context(umount_cxt);
}
-BindMount::BindMount(std::string mountpoint, unsigned long flags, bool umount)
- : Mount(mountpoint, flags | MS_BIND, umount)
+BindMount::BindMount(std::string mountpoint, unsigned long flags)
+ : Mount(mountpoint, flags | MS_BIND)
{
}
@@ -269,8 +281,8 @@
Mount::mount(prefix);
}
-PropagatedBindMount::PropagatedBindMount(std::string mountpoint, unsigned long
flags, bool umount)
- : BindMount(mountpoint, flags | MS_REC | MS_SLAVE, umount)
+PropagatedBindMount::PropagatedBindMount(std::string mountpoint, unsigned long
flags)
+ : BindMount(mountpoint, flags | MS_REC | MS_SLAVE)
{
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/lib/Mount.hpp
new/transactional-update-4.1.0/lib/Mount.hpp
--- old/transactional-update-4.1.1/lib/Mount.hpp 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/lib/Mount.hpp 2022-10-26
16:50:43.000000000 +0200
@@ -18,7 +18,7 @@
class Mount
{
public:
- Mount(std::string mountpoint, unsigned long flags = 0, bool umount =
false);
+ Mount(std::string mountpoint, unsigned long flags = 0);
Mount(Mount&& other) noexcept;
virtual ~Mount();
std::string getFilesystem();
@@ -38,7 +38,7 @@
std::string tabsource;
std::string mountpoint;
unsigned long flags;
- bool umount;
+ std::string directoryCreated;
struct libmnt_fs* findFS();
struct libmnt_fs* getTabEntry();
struct libmnt_fs* newFS();
@@ -48,14 +48,14 @@
class BindMount : public Mount
{
public:
- BindMount(std::string mountpoint, unsigned long flags = 0, bool umount =
false);
+ BindMount(std::string mountpoint, unsigned long flags = 0);
void mount(std::string prefix = "/") override;
};
class PropagatedBindMount : public BindMount
{
public:
- PropagatedBindMount(std::string mountpoint, unsigned long flags = 0, bool
umount = false);
+ PropagatedBindMount(std::string mountpoint, unsigned long flags = 0);
};
class MountList
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/lib/Overlay.cpp
new/transactional-update-4.1.0/lib/Overlay.cpp
--- old/transactional-update-4.1.1/lib/Overlay.cpp 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/lib/Overlay.cpp 2022-10-26
16:50:43.000000000 +0200
@@ -115,6 +115,7 @@
previousEtc->removeOption("workdir");
string syncSource = string(previousOvl.upperdir.parent_path() / "sync" /
"etc") + "/";
+ string rsyncExtraArgs;
previousEtc->mount(previousOvl.upperdir.parent_path() / "sync");
tulog.info("Syncing /etc of previous snapshot ", previousSnapId, " as base
into new snapshot ", snapRoot);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/lib/Snapshot/Snapper.cpp
new/transactional-update-4.1.0/lib/Snapshot/Snapper.cpp
--- old/transactional-update-4.1.1/lib/Snapshot/Snapper.cpp 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/lib/Snapshot/Snapper.cpp 2022-10-26
16:50:43.000000000 +0200
@@ -7,6 +7,7 @@
#include "Snapper.hpp"
#include "Exceptions.hpp"
+#include "Log.hpp"
#include "Util.hpp"
#include <regex>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.1.1/lib/Transaction.cpp
new/transactional-update-4.1.0/lib/Transaction.cpp
--- old/transactional-update-4.1.1/lib/Transaction.cpp 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/lib/Transaction.cpp 2022-10-26
16:50:43.000000000 +0200
@@ -25,8 +25,6 @@
#include <limits.h>
#include <poll.h>
#include <sched.h>
-#include <selinux/restorecon.h>
-#include <selinux/selinux.h>
#include <signal.h>
#include <sys/inotify.h>
#include <sys/mount.h>
@@ -108,13 +106,18 @@
// mount the snapshot directory on a temporary mount point
char bindTemplate[] = "/tmp/transactional-update-XXXXXX";
bindDir = mkdtemp(bindTemplate);
- std::unique_ptr<BindMount> mntBind{new BindMount{bindDir, MS_PRIVATE,
true}};
+ std::unique_ptr<BindMount> mntBind{new BindMount{bindDir, MS_PRIVATE}};
mntBind->setSource(snapshot->getRoot());
mntBind->mount();
dirsToMount.push_back(std::make_unique<PropagatedBindMount>("/dev"));
dirsToMount.push_back(std::make_unique<BindMount>("/var/log"));
+ std::vector<std::string> customDirs = config.getArray("BINDDIRS");
+ for (auto it = customDirs.begin(); it != customDirs.end(); ++it) {
+ dirsToMount.push_back(std::make_unique<BindMount>(*it));
+ }
+
Mount mntVar{"/var"};
if (mntVar.isMount()) {
if (fs::is_directory("/var/lib/zypp"))
@@ -124,41 +127,7 @@
dirsToMount.push_back(std::make_unique<BindMount>("/var/lib/alternatives"));
if (fs::is_directory("/var/lib/selinux"))
dirsToMount.push_back(std::make_unique<BindMount>("/var/lib/selinux"));
- if (is_selinux_enabled()) {
- // If packages installed files into /var (which is not allowed,
but still happens), they will end
- // up in the root file system, but will always be shadowed by the
real /var mount. Due to that they
- // also won't be relabelled at any time. During updates this may
cause problems if packages try to
- // access those leftover directories with wrong permissions, so
they have to be relabelled manually...
- BindMount selinuxVar("/var/lib/selinux", 0, true);
- selinuxVar.mount(bindDir);
- BindMount selinuxEtc("/etc/selinux", 0, true);
- selinuxEtc.mount(bindDir);
-
- // restorecon keeps open file handles, so execute it in a child
process - umount will fail otherwise
- pid_t childPid = fork();
- if (childPid < 0) {
- throw std::runtime_error{"Forking for SELinux relabelling
failed: " + std::string(strerror(errno))};
- } else if (childPid == 0) {
- if (chroot(bindDir.c_str()) < 0) {
- tulog.error("Chrooting to " + bindDir + " for SELinux
relabelling failed: " + std::string(strerror(errno)));
- _exit(errno);
- }
- if (selinux_restorecon("/var", SELINUX_RESTORECON_RECURSE |
SELINUX_RESTORECON_VERBOSE | SELINUX_RESTORECON_IGNORE_DIGEST) < 0) {
- tulog.error("Relabelling of snapshot /var failed: " +
std::string(strerror(errno)));
- _exit(errno);
- }
- _exit(0);
- }
- else {
- int status;
- waitpid(childPid, &status, 0);
- if ((WIFEXITED(status) && WEXITSTATUS(status) != 0) ||
WIFSIGNALED(status)) {
- throw std::runtime_error{"SELinux relabelling failed."};
- }
- }
- }
}
-
std::unique_ptr<Mount> mntEtc{new Mount{"/etc"}};
if (mntEtc->isMount() && mntEtc->getFilesystem() == "overlay") {
Overlay overlay = Overlay{snapshot->getUid()};
@@ -202,11 +171,6 @@
if (BindMount{"/boot/writable"}.isMount())
dirsToMount.push_back(std::make_unique<BindMount>("/boot/writable"));
- std::vector<std::string> customDirs = config.getArray("BINDDIRS");
- for (auto it = customDirs.begin(); it != customDirs.end(); ++it) {
- dirsToMount.push_back(std::make_unique<BindMount>(*it));
- }
-
dirsToMount.push_back(std::make_unique<BindMount>("/.snapshots"));
for (auto it = dirsToMount.begin(); it != dirsToMount.end(); ++it) {
@@ -312,7 +276,7 @@
struct pollfd pfd = {inotifyFd, POLLIN, 0};
ret = (poll(&pfd, 1, 500));
if (ret == -1) {
- throw std::runtime_error{"Polling inotify file descriptor failed: " +
std::string(strerror(errno))};
+ throw std::runtime_error{"Polling inotify file descriptior failed: " +
std::string(strerror(errno))};
} else if (ret > 0) {
numRead = read(inotifyFd, buf, bufLen);
if (numRead == 0)
@@ -468,33 +432,12 @@
(inotifyFd == 0 && fs::exists(getRoot() / "discardIfNoChange")))) {
tulog.info("No changes to the root file system - discarding
snapshot.");
- // Even if the snapshot itself does not contain any changes, /etc may
do so. If the new snapshot is a
- // direct descendant of the currently running system, then merge the
changes back into the currently
- // running system directly and delete the snapshot. Otherwise merge it
back into the previous overlay
- // (using rsync instead of a plain copy to preserve xattrs).
+ // Even if the snapshot itself did not contain any changes, /etc may
do so. Changes
+ // in /etc may be applied immediately, so merge them back into the
running system.
std::unique_ptr<Mount> mntEtc{new Mount{"/etc"}};
if (mntEtc->isMount() && mntEtc->getFilesystem() == "overlay") {
- std::filesystem::path targetRoot;
- std::unique_ptr<Mount> previousEtc{new Mount("/etc", 0, true)};
- if (pImpl->snapshotMgr->getCurrent() ==
Overlay{pImpl->snapshot->getUid()}.getPreviousSnapshotOvlId()) {
- tulog.info("Merging changes in /etc into the running system.");
- targetRoot = "/";
- } else {
- tulog.info("Merging changes in /etc into the previous
snapshot.");
-
- auto previousSnapId =
Overlay{pImpl->snapshot->getUid()}.getPreviousSnapshotOvlId();
- std::unique_ptr<Snapshot> previousSnapshot =
pImpl->snapshotMgr->open(previousSnapId);
- previousEtc->setTabSource(previousSnapshot->getRoot() / "etc"
/ "fstab");
-
- Overlay previousOvl{previousSnapId};
- previousOvl.lowerdirs.back() = previousSnapshot->getRoot();
- previousOvl.setMountOptionsForMount(previousEtc);
- targetRoot = previousOvl.upperdir.parent_path() / "sync";
- previousEtc->mount(targetRoot);
- }
- Util::exec("rsync --archive --inplace --xattrs --acls --exclude
'fstab' --delete --quiet '" + this->pImpl->bindDir + "/etc/' " +
targetRoot.native() + "/etc");
+ Util::exec("rsync --archive --inplace --xattrs --acls --exclude
'fstab' --delete --quiet '" + this->pImpl->bindDir + "/etc/' /etc");
}
-
return;
}
if (fs::exists(getRoot() / "discardIfNoChange")) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-4.1.1/sbin/transactional-update.in
new/transactional-update-4.1.0/sbin/transactional-update.in
--- old/transactional-update-4.1.1/sbin/transactional-update.in 2023-01-18
16:35:08.000000000 +0100
+++ new/transactional-update-4.1.0/sbin/transactional-update.in 2022-10-26
16:50:43.000000000 +0200
@@ -1209,14 +1209,10 @@
fi
if [ "${DO_STATUS}" -eq 1 ]; then
- if [ "${EXPERIMENTAL_STATUS}" -eq 1 ]; then
- for snapshot in $(ls -d /.snapshots/*/ | cut -d '/' -f 3 | sort
--reverse --numeric-sort); do
- show_snapshot_status "/.snapshots/$snapshot/"
- [ "${DO_STATUS_LAST}" -eq 1 ] && break
- done
- else
- echo "The status command is disabled by default as it is marked as
experimental"
- fi
+ for snapshot in $(ls -d /.snapshots/*/ | cut -d '/' -f 3 | sort --reverse
--numeric-sort); do
+ show_snapshot_status "/.snapshots/$snapshot/"
+ [ "${DO_STATUS_LAST}" -eq 1 ] && break
+ done
exit 0
fi
@@ -1294,10 +1290,11 @@
# Clean up old unused overlays
if [ ${RO_ROOT} == "true" ]; then
shopt -s nullglob
- for overlay in /var/lib/overlay/*; do
+ for overlay in /var/lib/overlay/[0-9]*/etc /var/lib/overlay/etc; do
if [ -e ${overlay} ] && ! grep -qs "${overlay}"
/.snapshots/*/snapshot/etc/fstab{,.sys}; then
log_info "Deleting unused overlay ${overlay}"
- rm -r "${overlay}"
+ rm -rf "${overlay}"
+ rmdir --ignore-fail-on-non-empty "$(dirname "${overlay}")"
fi
done
shopt -u nullglob