Use a dummy install root for unprivileged composes

Sadly, libhif keeps trying to auto-create it.  It'll need patching
there, and possibly in librpm.
This commit is contained in:
Colin Walters 2016-02-10 18:12:51 +01:00
parent f577279fac
commit 397fdd8d33
2 changed files with 21 additions and 14 deletions

View File

@ -110,21 +110,12 @@ roc_context_prepare_for_root (ROContainerContext *rocctx,
GError **error)
{
gboolean ret = FALSE;
/* We don't point the install root at the existing directory because
* libhif tries to inspect it, which is wrong. So basically make up
* a fake directory each time.
*/
g_autofree char *abs_instroot = glnx_fdrel_abspath (rocctx->roots_dfd, target);
const char *abs_instroot_tmp = glnx_strjoina (abs_instroot, ".ignore");
rocctx->ctx = rpmostree_context_new_unprivileged (rocctx->userroot_dfd, NULL, error);
if (!rocctx->ctx)
goto out;
if (!rpmostree_context_setup (rocctx->ctx, abs_instroot_tmp, treespec, cancellable, error))
goto out;
if (!glnx_shutil_rm_rf_at (AT_FDCWD, abs_instroot_tmp, cancellable, error))
if (!rpmostree_context_setup (rocctx->ctx, NULL, treespec, cancellable, error))
goto out;
ret = TRUE;

View File

@ -48,6 +48,7 @@ struct _RpmOstreeContext {
RpmOstreeTreespec *spec;
HifContext *hifctx;
OstreeRepo *ostreerepo;
char *dummy_instroot_path;
};
G_DEFINE_TYPE (RpmOstreeContext, rpmostree_context, G_TYPE_OBJECT)
@ -82,6 +83,11 @@ rpmostree_context_finalize (GObject *object)
RpmOstreeContext *rctx = RPMOSTREE_CONTEXT (object);
g_clear_object (&rctx->hifctx);
if (rctx->dummy_instroot_path)
{
(void) glnx_shutil_rm_rf_at (AT_FDCWD, rctx->dummy_instroot_path, NULL, NULL);
g_free (rctx->dummy_instroot_path);
}
G_OBJECT_CLASS (rpmostree_context_parent_class)->finalize (object);
}
@ -456,7 +462,17 @@ rpmostree_context_setup (RpmOstreeContext *self,
char **enabled_repos = NULL;
char **instlangs = NULL;
hif_context_set_install_root (self->hifctx, installroot);
if (installroot)
hif_context_set_install_root (self->hifctx, installroot);
else
{
glnx_fd_close int dfd = -1; /* Auto close, we just use the path */
if (!rpmostree_mkdtemp ("/tmp/rpmostree-dummy-instroot-XXXXXX",
&self->dummy_instroot_path,
&dfd, error))
goto out;
hif_context_set_install_root (self->hifctx, self->dummy_instroot_path);
}
if (!hif_context_setup (self->hifctx, cancellable, error))
goto out;
@ -1346,10 +1362,10 @@ rpmostree_context_assemble_commit (RpmOstreeContext *self,
set_rpm_macro_define ("_dbpath", "/usr/share/rpm");
/* Don't verify checksums here (we should have done this on ostree
* import). Also, when we do run the transaction, only update the
* rpmdb. Otherwise we unpacked with cpio.
* import). Also, avoid updating the database or anything by
* flagging it as a test. We'll do the database next.
*/
rpmtsSetVSFlags (ordering_ts, _RPMVSF_NOSIGNATURES | _RPMVSF_NODIGESTS | RPMTRANS_FLAG_JUSTDB);
rpmtsSetVSFlags (ordering_ts, _RPMVSF_NOSIGNATURES | _RPMVSF_NODIGESTS | RPMTRANS_FLAG_TEST);
/* Tell librpm about each one so it can tsort them. What we really
* want is to do this from the rpm-md metadata so that we can fully