From 4e5186faa2330704ed9e4e9572b4bc0eaaabd7fb Mon Sep 17 00:00:00 2001 From: DistroBaker Date: Wed, 17 Feb 2021 21:35:25 +0000 Subject: [PATCH] Merged update from upstream sources This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/rpm-ostree.git#e0b1dfbe1225f55f9a1cff49c3da9530bea346c5 --- .gitignore | 1 + ...macros.d-macros.rpm-ostree-to-set-_d.patch | 132 ++++++++++++++++++ ...-Add-usr-lib-sysimage-rpm-symlink-in.patch | 33 +++++ ...-Use-usr-share-rpm-for-base-rpmdb-qu.patch | 89 ++++++++++++ ...d-usr-share-empty-over-usr-share-rpm.patch | 30 ++++ rpm-ostree.spec | 11 +- sources | 2 +- 7 files changed, 294 insertions(+), 4 deletions(-) create mode 100644 0001-Add-usr-lib-rpm-macros.d-macros.rpm-ostree-to-set-_d.patch create mode 100644 0001-libpriv-rpm-util-Add-usr-lib-sysimage-rpm-symlink-in.patch create mode 100644 0001-libpriv-rpm-util-Use-usr-share-rpm-for-base-rpmdb-qu.patch create mode 100644 0001-scripts-Bind-usr-share-empty-over-usr-share-rpm.patch diff --git a/.gitignore b/.gitignore index 494dc93..dfcd6c7 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,4 @@ /rpm-ostree-2020.9.tar.xz /rpm-ostree-2020.10.tar.xz /rpm-ostree-2021.1.tar.xz +/rpm-ostree-2021.2.tar.xz diff --git a/0001-Add-usr-lib-rpm-macros.d-macros.rpm-ostree-to-set-_d.patch b/0001-Add-usr-lib-rpm-macros.d-macros.rpm-ostree-to-set-_d.patch new file mode 100644 index 0000000..33bcc6a --- /dev/null +++ b/0001-Add-usr-lib-rpm-macros.d-macros.rpm-ostree-to-set-_d.patch @@ -0,0 +1,132 @@ +From 99486a75e8fb96649564c5b79995513dfde355f0 Mon Sep 17 00:00:00 2001 +From: Jonathan Lebon +Date: Mon, 8 Feb 2021 14:59:12 -0500 +Subject: [PATCH] Add /usr/lib/rpm/macros.d/macros.rpm-ostree to set %_dbpath + to /usr/share/rpm + +We trigger a librpm macro file load in many of our paths. Since the +default value shipped by rpm's macro file sets `_dbpath` to +`/var/lib/rpm`, we have to explicitly set that back to `/usr/share/rpm` +in those paths. + +This became more problematic recently with libsolv v0.7.17 which fully +keys off of `_dbpath` to find the rpmdb path to load: + +https://github.com/openSUSE/libsolv/commit/04d4d036b275693a23eef75fba634e7cea2f1a6d + +And it's not technically wrong; we really should make that macro not +lie. This is what this patch does by injecting an RPM macro file in our +composes which sets it to /usr/share/rpm. So then e.g. the `rpm` CLI +doesn't actually need the `/var/lib/rpm` backcompat link anymore, though +there's no harm in leaving it. + +In the future, we should be able to drop this once we move all of Fedora +to `/usr/lib/sysimage/rpm` (see +https://github.com/coreos/fedora-coreos-tracker/issues/639). + +Closes: #2548 +--- + rust/src/composepost.rs | 19 +++++++++++++++++++ + src/libpriv/rpmostree-core.cxx | 6 ++++-- + src/libpriv/rpmostree-core.h | 1 + + tests/compose/libbasic-test.sh | 4 ++++ + 4 files changed, 28 insertions(+), 2 deletions(-) + +diff --git a/rust/src/composepost.rs b/rust/src/composepost.rs +index c5bb7402..1b1c97f0 100644 +--- a/rust/src/composepost.rs ++++ b/rust/src/composepost.rs +@@ -12,6 +12,9 @@ use std::io; + use std::io::{BufRead, Write}; + use std::path::Path; + ++/* See rpmostree-core.h */ ++const RPMOSTREE_RPMDB_LOCATION: &'static str = "usr/share/rpm"; ++ + // rpm-ostree uses /home → /var/home by default as generated by our + // rootfs; we don't expect people to change this. Let's be nice + // and also fixup the $HOME entries generated by `useradd` so +@@ -55,6 +58,21 @@ fn postprocess_presets(rootfs_dfd: &openat::Dir) -> Result<()> { + Ok(()) + } + ++// We keep hitting issues with the ostree-remount preset not being ++// enabled; let's just do this rather than trying to propagate the ++// preset everywhere. ++fn postprocess_rpm_macro(rootfs_dfd: &openat::Dir) -> Result<()> { ++ let rpm_macros_dir = "usr/lib/rpm/macros.d"; ++ rootfs_dfd.ensure_dir_all(rpm_macros_dir, 0o755)?; ++ let rpm_macros_dfd = rootfs_dfd.sub_dir(rpm_macros_dir)?; ++ rpm_macros_dfd.write_file_with("macros.rpm-ostree", 0o644, |w| -> Result<()> { ++ w.write_all(b"%_dbpath /")?; ++ w.write_all(RPMOSTREE_RPMDB_LOCATION.as_bytes())?; ++ Ok(()) ++ })?; ++ Ok(()) ++} ++ + // This function does two things: (1) make sure there is a /home --> /var/home substitution rule, + // and (2) make sure there *isn't* a /var/home -> /home substition rule. The latter check won't + // technically be needed once downstreams have: +@@ -90,6 +108,7 @@ pub(crate) fn compose_postprocess_final(rootfs_dfd: i32) -> CxxResult<()> { + postprocess_useradd, + postprocess_presets, + postprocess_subs_dist, ++ postprocess_rpm_macro, + ]; + Ok(tasks.par_iter().try_for_each(|f| f(&rootfs_dfd))?) + } +diff --git a/src/libpriv/rpmostree-core.cxx b/src/libpriv/rpmostree-core.cxx +index 51ae71a4..506a0b29 100644 +--- a/src/libpriv/rpmostree-core.cxx ++++ b/src/libpriv/rpmostree-core.cxx +@@ -753,7 +753,8 @@ rpmostree_context_setup (RpmOstreeContext *self, + dnf_context_set_rpm_macro (self->dnfctx, "_install_langs", opt->str); + } + +- /* This is what we use as default. */ ++ /* This is what we use as default. Note we should be able to drop this in the ++ * future now that we inject a macro to set that value in our OSTrees. */ + dnf_context_set_rpm_macro (self->dnfctx, "_dbpath", "/" RPMOSTREE_RPMDB_LOCATION); + + /* Set the database backend only in the compose path. It then becomes the default +@@ -4123,7 +4124,8 @@ rpmostree_context_assemble (RpmOstreeContext *self, + rpmtsSetRootDir (ordering_ts, dnf_context_get_install_root (dnfctx)); + + /* First for the ordering TS, set the dbpath to relative, which will also gain +- * the root dir. ++ * the root dir. Note we should be able to drop this in the future now that we ++ * inject a macro to set that value in our OSTrees. + */ + set_rpm_macro_define ("_dbpath", "/" RPMOSTREE_RPMDB_LOCATION); + +diff --git a/src/libpriv/rpmostree-core.h b/src/libpriv/rpmostree-core.h +index fb347622..ce001232 100644 +--- a/src/libpriv/rpmostree-core.h ++++ b/src/libpriv/rpmostree-core.h +@@ -42,6 +42,7 @@ G_BEGIN_DECLS + #define RPMOSTREE_DIR_LOCK "lock" + + /* See http://lists.rpm.org/pipermail/rpm-maint/2017-October/006681.html */ ++/* This is also defined on the Rust side. */ + #define RPMOSTREE_RPMDB_LOCATION "usr/share/rpm" + #define RPMOSTREE_SYSIMAGE_DIR "usr/lib/sysimage" + #define RPMOSTREE_SYSIMAGE_RPMDB RPMOSTREE_SYSIMAGE_DIR "/rpm" +diff --git a/tests/compose/libbasic-test.sh b/tests/compose/libbasic-test.sh +index 883ddf8d..07ae0ab5 100644 +--- a/tests/compose/libbasic-test.sh ++++ b/tests/compose/libbasic-test.sh +@@ -39,6 +39,10 @@ done + ostree --repo=${repo} ls ${treeref} /usr/lib/sysimage/rpm >/dev/null + echo "ok db" + ++ostree --repo=${repo} cat ${treeref} /usr/lib/rpm/macros.d/macros.rpm-ostree > rpm-ostree-macro.txt ++assert_file_has_content_literal rpm-ostree-macro.txt '%_dbpath /usr/share/rpm' ++echo "ok rpm macro" ++ + ostree --repo=${repo} show --print-metadata-key exampleos.gitrepo ${treeref} > meta.txt + assert_file_has_content meta.txt 'rev.*97ec21c614689e533d294cdae464df607b526ab9' + assert_file_has_content meta.txt 'src.*https://gitlab.com/exampleos/custom-atomic-host' +-- +2.29.2 + diff --git a/0001-libpriv-rpm-util-Add-usr-lib-sysimage-rpm-symlink-in.patch b/0001-libpriv-rpm-util-Add-usr-lib-sysimage-rpm-symlink-in.patch new file mode 100644 index 0000000..107aaaf --- /dev/null +++ b/0001-libpriv-rpm-util-Add-usr-lib-sysimage-rpm-symlink-in.patch @@ -0,0 +1,33 @@ +From 60215ae865e639e9c5ecebcd0aef527abae29c66 Mon Sep 17 00:00:00 2001 +From: Jonathan Lebon +Date: Tue, 9 Feb 2021 10:53:33 -0500 +Subject: [PATCH] libpriv/rpm-util: Add /usr/lib/sysimage/rpm symlink in rpmdb + checkout + +We don't technically need this yet, but it mirrors how it's set up in +our composes so that if there's code that wants to use the new location +too, it'll just work. +--- + src/libpriv/rpmostree-rpm-util.cxx | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/libpriv/rpmostree-rpm-util.cxx b/src/libpriv/rpmostree-rpm-util.cxx +index cd62ee98..c8d368b3 100644 +--- a/src/libpriv/rpmostree-rpm-util.cxx ++++ b/src/libpriv/rpmostree-rpm-util.cxx +@@ -822,6 +822,12 @@ checkout_only_rpmdb (OstreeRepo *repo, + if (symlinkat ("../../" RPMOSTREE_RPMDB_LOCATION, tmpdir->fd, "var/lib/rpm") == -1) + return glnx_throw_errno_prefix (error, "symlinkat"); + ++ /* And make a symlink from our *future* location too */ ++ if (!glnx_shutil_mkdir_p_at (tmpdir->fd, RPMOSTREE_SYSIMAGE_DIR, 0777, cancellable, error)) ++ return FALSE; ++ if (symlinkat ("../../../" RPMOSTREE_RPMDB_LOCATION, tmpdir->fd, RPMOSTREE_SYSIMAGE_RPMDB) == -1) ++ return glnx_throw_errno_prefix (error, "symlinkat"); ++ + return TRUE; + } + +-- +2.29.2 + diff --git a/0001-libpriv-rpm-util-Use-usr-share-rpm-for-base-rpmdb-qu.patch b/0001-libpriv-rpm-util-Use-usr-share-rpm-for-base-rpmdb-qu.patch new file mode 100644 index 0000000..80278b2 --- /dev/null +++ b/0001-libpriv-rpm-util-Use-usr-share-rpm-for-base-rpmdb-qu.patch @@ -0,0 +1,89 @@ +From 667fdc9ff44d086140d195e4714d132edee2bf9a Mon Sep 17 00:00:00 2001 +From: Jonathan Lebon +Date: Tue, 9 Feb 2021 14:17:16 -0500 +Subject: [PATCH] libpriv/rpm-util: Use /usr/share/rpm for base rpmdb query + +Follow-up to previous commit: we had another path where we made a +temporary rootfs and symlinked `/var/lib/rpm` to the base rpmdb. That of +course broke now that we inject a macro to point the rpmdb to +`/usr/share/rpm`. + +Rework this to use `/usr/share/rpm` since that's our canonical location +for now, but also add the compat symlinks so that this logic should keep +working even on trees without the injected macro yet. +--- + src/libpriv/rpmostree-rpm-util.cxx | 38 ++++++++++++++++++++---------- + 1 file changed, 26 insertions(+), 12 deletions(-) + +diff --git a/src/libpriv/rpmostree-rpm-util.cxx b/src/libpriv/rpmostree-rpm-util.cxx +index c8d368b3..d8de9830 100644 +--- a/src/libpriv/rpmostree-rpm-util.cxx ++++ b/src/libpriv/rpmostree-rpm-util.cxx +@@ -788,6 +788,26 @@ rpmrev_free (struct RpmRevisionData *ptr) + g_free (ptr); + } + ++/* Currently, our rpmdb lives at /usr/share/rpm. Add symlinks from the legacy ++ * /var/lib/rpm *and* the future /usr/lib/sysimage/rpm paths to that. */ ++static gboolean ++mk_rpmdb_compat_symlinks (int rootfs_dfd, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ if (!glnx_shutil_mkdir_p_at (rootfs_dfd, "var/lib", 0777, cancellable, error)) ++ return FALSE; ++ if (symlinkat ("../../" RPMOSTREE_RPMDB_LOCATION, rootfs_dfd, "var/lib/rpm") == -1) ++ return glnx_throw_errno_prefix (error, "symlinkat"); ++ ++ if (!glnx_shutil_mkdir_p_at (rootfs_dfd, RPMOSTREE_SYSIMAGE_DIR, 0777, cancellable, error)) ++ return FALSE; ++ if (symlinkat ("../../../" RPMOSTREE_RPMDB_LOCATION, rootfs_dfd, RPMOSTREE_SYSIMAGE_RPMDB) == -1) ++ return glnx_throw_errno_prefix (error, "symlinkat"); ++ ++ return TRUE; ++} ++ + /* Check out a copy of the rpmdb into @tmpdir */ + static gboolean + checkout_only_rpmdb (OstreeRepo *repo, +@@ -816,17 +836,8 @@ checkout_only_rpmdb (OstreeRepo *repo, + cancellable, error)) + return FALSE; + +- /* And make a compat symlink to keep rpm happy */ +- if (!glnx_shutil_mkdir_p_at (tmpdir->fd, "var/lib", 0777, cancellable, error)) +- return FALSE; +- if (symlinkat ("../../" RPMOSTREE_RPMDB_LOCATION, tmpdir->fd, "var/lib/rpm") == -1) +- return glnx_throw_errno_prefix (error, "symlinkat"); +- +- /* And make a symlink from our *future* location too */ +- if (!glnx_shutil_mkdir_p_at (tmpdir->fd, RPMOSTREE_SYSIMAGE_DIR, 0777, cancellable, error)) ++ if (!mk_rpmdb_compat_symlinks (tmpdir->fd, cancellable, error)) + return FALSE; +- if (symlinkat ("../../../" RPMOSTREE_RPMDB_LOCATION, tmpdir->fd, RPMOSTREE_SYSIMAGE_RPMDB) == -1) +- return glnx_throw_errno_prefix (error, "symlinkat"); + + return TRUE; + } +@@ -890,13 +901,16 @@ rpmostree_get_base_refsack_for_root (int dfd, + g_auto(GLnxTmpDir) tmpdir = {0, }; + if (!glnx_mkdtemp ("rpmostree-dbquery-XXXXXX", 0700, &tmpdir, error)) + return FALSE; +- if (!glnx_shutil_mkdir_p_at (tmpdir.fd, "var/lib", 0777, cancellable, error)) ++ if (!glnx_shutil_mkdir_p_at (tmpdir.fd, dirname (strdupa (RPMOSTREE_RPMDB_LOCATION)), 0777, cancellable, error)) + return FALSE; + + g_autofree char *base_rpm = glnx_fdrel_abspath (dfd, subpath); +- if (symlinkat (base_rpm, tmpdir.fd, "var/lib/rpm") == -1) ++ if (symlinkat (base_rpm, tmpdir.fd, RPMOSTREE_RPMDB_LOCATION) == -1) + return glnx_throw_errno_prefix (error, "symlinkat"); + ++ if (!mk_rpmdb_compat_symlinks (tmpdir.fd, cancellable, error)) ++ return FALSE; ++ + g_autoptr(DnfSack) sack = NULL; /* NB: refsack adds a ref to it */ + if (!get_sack_for_root (tmpdir.fd, ".", &sack, error)) + return FALSE; +-- +2.29.2 + diff --git a/0001-scripts-Bind-usr-share-empty-over-usr-share-rpm.patch b/0001-scripts-Bind-usr-share-empty-over-usr-share-rpm.patch new file mode 100644 index 0000000..1a8bb80 --- /dev/null +++ b/0001-scripts-Bind-usr-share-empty-over-usr-share-rpm.patch @@ -0,0 +1,30 @@ +From 6886e4442597f67ea4153e3f6d9ac6e9444795a5 Mon Sep 17 00:00:00 2001 +From: Colin Walters +Date: Tue, 9 Feb 2021 21:18:49 +0000 +Subject: [PATCH] scripts: Bind /usr/share/empty over /usr/share/rpm + +Now that we inject the `%_dbpath /usr/share/rpm` macro, `rpm -q` +will start using it. But in RPM script invocation, we don't +want them to see any RPM database at all - trying to query it +should be a clean failure. +--- + src/libpriv/rpmostree-scripts.cxx | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/libpriv/rpmostree-scripts.cxx b/src/libpriv/rpmostree-scripts.cxx +index f7adb08f..4b1f5429 100644 +--- a/src/libpriv/rpmostree-scripts.cxx ++++ b/src/libpriv/rpmostree-scripts.cxx +@@ -378,6 +378,9 @@ rpmostree_run_script_in_bwrap_container (int rootfs_fd, + if (glnx_fstatat (rootfs_fd, "usr/lib/opt", &stbuf, AT_SYMLINK_NOFOLLOW, NULL) && S_ISDIR(stbuf.st_mode)) + rpmostree_bwrap_append_bwrap_argv (bwrap, "--symlink", "usr/lib/opt", "/opt", NULL); + ++ /* Don't let scripts see the base rpm database by default */ ++ rpmostree_bwrap_bind_read (bwrap, "usr/share/empty", "usr/share/rpm"); ++ + /* Add ostree-booted API; some scriptlets may work differently on OSTree systems; e.g. + * akmods. Just create it manually; /run is usually tmpfs, but scriptlets shouldn't be + * adding stuff there anyway. */ +-- +2.29.2 + diff --git a/rpm-ostree.spec b/rpm-ostree.spec index 42d62cf..3fc3124 100644 --- a/rpm-ostree.spec +++ b/rpm-ostree.spec @@ -3,14 +3,13 @@ Summary: Hybrid image/package system Name: rpm-ostree -Version: 2021.1 -Release: 3%{?dist} +Version: 2021.2 +Release: 2%{?dist} License: LGPLv2+ URL: https://github.com/coreos/rpm-ostree # This tarball is generated via "cd packaging && make -f Makefile.dist-packaging dist-snapshot" # in the upstream git. It also contains vendored Rust sources. Source0: https://github.com/coreos/rpm-ostree/releases/download/v%{version}/rpm-ostree-%{version}.tar.xz -Patch0: 0001-core-Set-_dbpath-back-to-usr-share-rpm-after-writing.patch ExclusiveArch: %{rust_arches} @@ -203,6 +202,12 @@ $PYTHON autofiles.py > files.devel \ %files devel -f files.devel %changelog +* Wed Feb 17 2021 Colin Walters - 2021.2-2 +- https://github.com/coreos/rpm-ostree/releases/tag/v2021.2 + +* Wed Feb 10 2021 Colin Walters - 2021.1-4 +- Backport patches from https://github.com/coreos/rpm-ostree/pull/2553 + * Tue Jan 26 2021 Jonathan Lebon - 2021.1-3 - Backport https://github.com/coreos/rpm-ostree/pull/2490 for rawhide diff --git a/sources b/sources index 6f2eef4..be1be5f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (rpm-ostree-2021.1.tar.xz) = e92d5feaea8a524953ffa105725450a4546dd93b94ce57d3f7cdd26d4be39ab2063e07891c025aff1e7dc04aa9198f298c19e6084e7b050293af9799887ba0be +SHA512 (rpm-ostree-2021.2.tar.xz) = 34dcbf56ba063de1dca880c85da801f36c9f603504a123760fc3b6ad525b4bbf3e997c6edd5d77c080f4bf86fc8504fe76a1ddd345d7b95ab81fdda3ea264e6d