summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2021-06-16 09:26:24 -0400
committerColin Walters <walters@verbum.org>2021-06-16 09:40:28 -0400
commit73e3ccc401829025a9151fddff29d67a0ac2321d (patch)
tree5fb1163f57f84ec63b4e6f4f1efd0691ea7993ca /src
parentf8496098eed306a5f5ccee95e03339e474221f23 (diff)
downloadostree-73e3ccc401829025a9151fddff29d67a0ac2321d.tar.gz
Use generator to enable ostree-remount.service and ostree-finalize-staged.path
We struggled for a long time with enablement of our "internal units", trying to follow the philosophy that units should only be enabled by explicit preset. See https://bugzilla.redhat.com/show_bug.cgi?id=1451458 and https://github.com/coreos/rpm-ostree/pull/1482 etc. And I just saw chat (RH internal on a proprietary system sadly) where someone hit `ostree-remount.service` not being enabled in CentOS8. Thinking about this more, I realized we've shipped a systemd generator for a long time and while its only role until now was to generate `var.mount`, but by using it to force on our internal units, we don't require people to deal with presets anymore. Basically we're inverting things so that "if ostree= is on the kernel cmdline, then enable our units" and not "enable our units, but have them use ConditionKernelCmdline=ostree to skip". Drop the weird gyrations we were doing around `ostree-finalize-staged.path` too; forking `systemctl start` is just asking for bugs. So after this, hopefully we won't ever again have to think about distribution presets and our units.
Diffstat (limited to 'src')
-rw-r--r--src/libostree/ostree-impl-system-generator.c56
-rw-r--r--src/libostree/ostree-sysroot-deploy.c22
-rw-r--r--src/libostree/ostree-sysroot-private.h3
-rw-r--r--src/libostree/ostree-sysroot.c1
4 files changed, 50 insertions, 32 deletions
diff --git a/src/libostree/ostree-impl-system-generator.c b/src/libostree/ostree-impl-system-generator.c
index cb9170b3..73da882d 100644
--- a/src/libostree/ostree-impl-system-generator.c
+++ b/src/libostree/ostree-impl-system-generator.c
@@ -113,13 +113,39 @@ stateroot_from_ostree_cmdline (const char *ostree_cmdline,
}
#endif
-/* Implementation of ostree-system-generator */
-gboolean
-_ostree_impl_system_generator (const char *ostree_cmdline,
- const char *normal_dir,
- const char *early_dir,
- const char *late_dir,
- GError **error)
+/* Forcibly enable our internal units, since we detected ostree= on the kernel cmdline */
+static gboolean
+require_internal_units (const char *normal_dir,
+ const char *early_dir,
+ const char *late_dir,
+ GError **error)
+{
+ GCancellable *cancellable = NULL;
+
+ glnx_autofd int normal_dir_dfd = -1;
+ if (!glnx_opendirat (AT_FDCWD, normal_dir, TRUE, &normal_dir_dfd, error))
+ return FALSE;
+
+ if (!glnx_shutil_mkdir_p_at (normal_dir_dfd, "local-fs.target.requires", 0755, cancellable, error))
+ return FALSE;
+ if (symlinkat (SYSTEM_DATA_UNIT_PATH "/ostree-remount.service", normal_dir_dfd, "local-fs.target.requires/ostree-remount.service") < 0)
+ return glnx_throw_errno_prefix (error, "symlinkat");
+
+ if (!glnx_shutil_mkdir_p_at (normal_dir_dfd, "multi-user.target.wants", 0755, cancellable, error))
+ return FALSE;
+ if (symlinkat (SYSTEM_DATA_UNIT_PATH "/ostree-finalize-staged.path", normal_dir_dfd, "multi-user.target.wants/ostree-finalize-staged.path") < 0)
+ return glnx_throw_errno_prefix (error, "symlinkat");
+
+ return TRUE;
+}
+
+/* Generate var.mount */
+static gboolean
+fstab_generator (const char *ostree_cmdline,
+ const char *normal_dir,
+ const char *early_dir,
+ const char *late_dir,
+ GError **error)
{
#ifdef HAVE_LIBMOUNT
/* Not currently cancellable, but define a var in case we care later */
@@ -225,3 +251,19 @@ _ostree_impl_system_generator (const char *ostree_cmdline,
return glnx_throw (error, "Not implemented");
#endif
}
+
+/* Implementation of ostree-system-generator */
+gboolean
+_ostree_impl_system_generator (const char *ostree_cmdline,
+ const char *normal_dir,
+ const char *early_dir,
+ const char *late_dir,
+ GError **error)
+{
+ if (!require_internal_units (normal_dir, early_dir, late_dir, error))
+ return FALSE;
+ if (!fstab_generator (ostree_cmdline, normal_dir, early_dir, late_dir, error))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c
index 840775d4..6a13a41b 100644
--- a/src/libostree/ostree-sysroot-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -3106,28 +3106,6 @@ ostree_sysroot_stage_tree_with_options (OstreeSysroot *self,
if (booted_deployment == NULL)
return glnx_prefix_error (error, "Cannot stage deployment");
- /* This is used by the testsuite to exercise the path unit, until it becomes the default
- * (which is pending on the preset making it everywhere). */
- if ((self->debug_flags & OSTREE_SYSROOT_DEBUG_TEST_STAGED_PATH) == 0)
- {
- /* This is a bit of a hack. When adding a new service we have to end up getting
- * into the presets for downstream distros; see e.g. https://src.fedoraproject.org/rpms/ostree/pull-request/7
- *
- * Then again, it's perhaps a bit nicer to only start the service on-demand anyways.
- */
- const char *const systemctl_argv[] = {"systemctl", "start", "ostree-finalize-staged.service", NULL};
- int estatus;
- if (!g_spawn_sync (NULL, (char**)systemctl_argv, NULL, G_SPAWN_SEARCH_PATH,
- NULL, NULL, NULL, NULL, &estatus, error))
- return FALSE;
- if (!g_spawn_check_exit_status (estatus, error))
- return FALSE;
- }
- else
- {
- g_print ("test-staged-path: Not running `systemctl start`\n");
- } /* OSTREE_SYSROOT_DEBUG_TEST_STAGED_PATH */
-
g_autoptr(OstreeDeployment) deployment = NULL;
if (!sysroot_initialize_deployment (self, osname, revision, origin, opts, &deployment,
cancellable, error))
diff --git a/src/libostree/ostree-sysroot-private.h b/src/libostree/ostree-sysroot-private.h
index 641f0533..bf3ecf32 100644
--- a/src/libostree/ostree-sysroot-private.h
+++ b/src/libostree/ostree-sysroot-private.h
@@ -37,8 +37,7 @@ typedef enum {
OSTREE_SYSROOT_DEBUG_TEST_FIFREEZE = 1 << 2,
/* This is a temporary flag until we fully drop the explicit `systemctl start
* ostree-finalize-staged.service` so that tests can exercise the new path unit. */
- OSTREE_SYSROOT_DEBUG_TEST_STAGED_PATH = 1 << 3,
- OSTREE_SYSROOT_DEBUG_TEST_NO_DTB = 1 << 4, /* https://github.com/ostreedev/ostree/issues/2154 */
+ OSTREE_SYSROOT_DEBUG_TEST_NO_DTB = 1 << 3, /* https://github.com/ostreedev/ostree/issues/2154 */
} OstreeSysrootDebugFlags;
typedef enum {
diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c
index b0ae66cf..9d4d64c9 100644
--- a/src/libostree/ostree-sysroot.c
+++ b/src/libostree/ostree-sysroot.c
@@ -190,7 +190,6 @@ ostree_sysroot_init (OstreeSysroot *self)
{ "mutable-deployments", OSTREE_SYSROOT_DEBUG_MUTABLE_DEPLOYMENTS },
{ "test-fifreeze", OSTREE_SYSROOT_DEBUG_TEST_FIFREEZE },
{ "no-xattrs", OSTREE_SYSROOT_DEBUG_NO_XATTRS },
- { "test-staged-path", OSTREE_SYSROOT_DEBUG_TEST_STAGED_PATH },
{ "no-dtb", OSTREE_SYSROOT_DEBUG_TEST_NO_DTB },
};