gboolean ot_admin_builtin_os_init (int argc, char **argv, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; glnx_unref_object OstreeSysroot *sysroot = NULL; gboolean ret = FALSE; const char *osname = NULL; context = g_option_context_new ("OSNAME - Initialize empty state for given operating system"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, &sysroot, cancellable, error)) goto out; if (!ostree_sysroot_ensure_initialized (sysroot, cancellable, error)) goto out; if (argc < 2) { ot_util_usage_error (context, "OSNAME must be specified", error); goto out; } osname = argv[1]; if (!ostree_sysroot_init_osname (sysroot, osname, cancellable, error)) goto out; g_print ("ostree/deploy/%s initialized as OSTree root\n", osname); ret = TRUE; out: return ret; }
gboolean ot_admin_builtin_init_fs (int argc, char **argv, OstreeSysroot *sysroot, GCancellable *cancellable, GError **error) { GOptionContext *context; gboolean ret = FALSE; gs_unref_object GFile *dir = NULL; gs_unref_object GFile *child = NULL; gs_unref_object OstreeSysroot *target_sysroot = NULL; guint i; const char *normal_toplevels[] = {"boot", "dev", "home", "proc", "run", "sys"}; context = g_option_context_new ("PATH - Initialize a root filesystem"); g_option_context_add_main_entries (context, options, NULL); if (!g_option_context_parse (context, &argc, &argv, error)) goto out; if (argc < 2) { ot_util_usage_error (context, "PATH must be specified", error); goto out; } dir = g_file_new_for_path (argv[1]); target_sysroot = ostree_sysroot_new (dir); for (i = 0; i < G_N_ELEMENTS(normal_toplevels); i++) { child = g_file_get_child (dir, normal_toplevels[i]); if (!gs_file_ensure_directory_mode (child, 0755, cancellable, error)) goto out; g_clear_object (&child); } child = g_file_get_child (dir, "root"); if (!gs_file_ensure_directory_mode (child, 0700, cancellable, error)) goto out; g_clear_object (&child); child = g_file_get_child (dir, "tmp"); if (!gs_file_ensure_directory_mode (child, 01777, cancellable, error)) goto out; g_clear_object (&child); if (!ostree_sysroot_ensure_initialized (target_sysroot, cancellable, error)) goto out; ret = TRUE; out: if (context) g_option_context_free (context); return ret; }
static gboolean handle_create_osname (RPMOSTreeSysroot *object, GDBusMethodInvocation *invocation, const gchar *osname) { RpmostreedSysroot *self = RPMOSTREED_SYSROOT (object); GError *error = NULL; g_autofree gchar *dbus_path = NULL; if (!ostree_sysroot_ensure_initialized (self->ot_sysroot, self->cancellable, &error)) goto out; if (strchr (osname, '/') != 0) { g_set_error_literal (&error, RPM_OSTREED_ERROR, RPM_OSTREED_ERROR_FAILED, "Invalid osname"); goto out; } if (!ostree_sysroot_init_osname (self->ot_sysroot, osname, self->cancellable, &error)) goto out; dbus_path = rpmostreed_generate_object_path (BASE_DBUS_PATH, osname, NULL); rpmostree_sysroot_complete_create_osname (RPMOSTREE_SYSROOT (self), invocation, g_strdup (dbus_path)); out: if (error) g_dbus_method_invocation_take_error (invocation, error); return TRUE; }
gboolean ot_admin_builtin_os_init (int argc, char **argv, GCancellable *cancellable, GError **error) { GOptionContext *context; glnx_unref_object OstreeSysroot *sysroot = NULL; gboolean ret = FALSE; const char *osname = NULL; g_autoptr(GFile) deploy_dir = NULL; g_autoptr(GFile) dir = NULL; context = g_option_context_new ("OSNAME - Initialize empty state for given operating system"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, &sysroot, cancellable, error)) goto out; if (!ostree_sysroot_ensure_initialized (sysroot, cancellable, error)) goto out; if (argc < 2) { ot_util_usage_error (context, "OSNAME must be specified", error); goto out; } osname = argv[1]; deploy_dir = ot_gfile_get_child_build_path (ostree_sysroot_get_path (sysroot), "ostree", "deploy", osname, NULL); /* Ensure core subdirectories of /var exist, since we need them for * dracut generation, and the host will want them too. */ g_clear_object (&dir); dir = ot_gfile_get_child_build_path (deploy_dir, "var", "tmp", NULL); if (!gs_file_ensure_directory (dir, TRUE, cancellable, error)) goto out; if (chmod (gs_file_get_path_cached (dir), 01777) < 0) { gs_set_error_from_errno (error, errno); goto out; } g_clear_object (&dir); dir = ot_gfile_get_child_build_path (deploy_dir, "var", "lib", NULL); if (!gs_file_ensure_directory (dir, TRUE, cancellable, error)) goto out; g_clear_object (&dir); dir = ot_gfile_get_child_build_path (deploy_dir, "var", "run", NULL); if (!g_file_test (gs_file_get_path_cached (dir), G_FILE_TEST_IS_SYMLINK)) { if (symlink ("../run", gs_file_get_path_cached (dir)) < 0) { gs_set_error_from_errno (error, errno); goto out; } } dir = ot_gfile_get_child_build_path (deploy_dir, "var", "lock", NULL); if (!g_file_test (gs_file_get_path_cached (dir), G_FILE_TEST_IS_SYMLINK)) { if (symlink ("../run/lock", gs_file_get_path_cached (dir)) < 0) { gs_set_error_from_errno (error, errno); goto out; } } g_print ("%s initialized as OSTree root\n", gs_file_get_path_cached (deploy_dir)); ret = TRUE; out: if (context) g_option_context_free (context); return ret; }