gboolean rpmostree_db_option_context_parse (GOptionContext *context, const GOptionEntry *main_entries, int *argc, char ***argv, OstreeRepo **out_repo, GCancellable *cancellable, GError **error) { gs_unref_object OstreeRepo *repo = NULL; gboolean success = FALSE; /* Entries are listed in --help output in the order added. We add the * main entries ourselves so that we can add the --repo entry first. */ g_option_context_add_main_entries (context, global_entries, NULL); if (!rpmostree_option_context_parse (context, main_entries, argc, argv, RPM_OSTREE_BUILTIN_FLAG_LOCAL_CMD, cancellable, NULL, error)) goto out; if (opt_repo == NULL) { gs_unref_object OstreeSysroot *sysroot = NULL; sysroot = ostree_sysroot_new_default (); if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; } else { gs_unref_object GFile *repo_file = g_file_new_for_path (opt_repo); repo = ostree_repo_new (repo_file); if (!ostree_repo_open (repo, cancellable, error)) goto out; } if (rpmReadConfigFiles (NULL, NULL)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "rpm failed to init: %s", rpmlogMessage ()); goto out; } gs_transfer_out_value (out_repo, &repo); success = TRUE; out: return success; }
gboolean rpmostree_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; GOptionContext *context = g_option_context_new ("- Perform a system upgrade"); glnx_unref_object RPMOSTreeOS *os_proxy = NULL; glnx_unref_object RPMOSTreeSysroot *sysroot_proxy = NULL; g_autoptr(GVariant) default_deployment = NULL; g_autofree char *transaction_address = NULL; if (!rpmostree_option_context_parse (context, option_entries, &argc, &argv, RPM_OSTREE_BUILTIN_FLAG_NONE, cancellable, &sysroot_proxy, error)) goto out; if (opt_check_diff && opt_reboot) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "cannot specify both --reboot and --check-diff"); goto out; } if (!rpmostree_load_os_proxy (sysroot_proxy, opt_osname, cancellable, &os_proxy, error)) goto out; if (opt_check_diff) { if (!rpmostree_os_call_download_update_rpm_diff_sync (os_proxy, &transaction_address, cancellable, error)) goto out; } else { g_signal_connect (os_proxy, "notify::default-deployment", G_CALLBACK (default_changed_callback), &default_deployment); if (!rpmostree_os_call_upgrade_sync (os_proxy, get_args_variant (), &transaction_address, cancellable, error)) goto out; } if (!rpmostree_transaction_get_response_sync (sysroot_proxy, transaction_address, cancellable, error)) goto out; if (opt_check_diff) { /* yes, doing this without using dbus */ gs_unref_object OstreeSysroot *sysroot = NULL; gs_unref_object OstreeRepo *repo = NULL; gs_unref_object GFile *rpmdbdir = NULL; gs_unref_object GFile *sysroot_file = NULL; g_autofree char *origin_description = NULL; g_autoptr(GVariant) cached_update = NULL; const char *sysroot_path; GVariantDict upgrade_dict; _cleanup_rpmrev_ struct RpmRevisionData *rpmrev1 = NULL; _cleanup_rpmrev_ struct RpmRevisionData *rpmrev2 = NULL; gs_free char *ref = NULL; /* location of this rev */ gs_free char *remote = NULL; if (!rpmostree_os_get_has_cached_update_rpm_diff (os_proxy)) goto out; sysroot_path = rpmostree_sysroot_get_path (sysroot_proxy); sysroot_file = g_file_new_for_path (sysroot_path); sysroot = ostree_sysroot_new (sysroot_file); if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; cached_update = rpmostree_os_dup_cached_update(os_proxy); g_variant_dict_init (&upgrade_dict, cached_update); if (!g_variant_dict_lookup (&upgrade_dict, "origin", "s", &origin_description)) goto out; if (!ostree_parse_refspec (origin_description, &remote, &ref, error)) goto out; if (rpmReadConfigFiles (NULL, NULL)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "rpm failed to init: %s", rpmlogMessage ()); goto out; } if (!(rpmrev1 = rpmrev_new (repo, ostree_deployment_get_csum (ostree_sysroot_get_booted_deployment (sysroot)), NULL, cancellable, error))) goto out; if (!(rpmrev2 = rpmrev_new (repo, ref, NULL, cancellable, error))) goto out; rpmhdrs_diff_prnt_diff (rpmhdrs_diff (rpmrev_get_headers (rpmrev1), rpmrev_get_headers (rpmrev2))); } else { /* nothing changed */ if (default_deployment == NULL) { goto out; } if (!opt_reboot) { const char *sysroot_path; sysroot_path = rpmostree_sysroot_get_path (sysroot_proxy); if (!rpmostree_print_treepkg_diff_from_sysroot_path (sysroot_path, cancellable, error)) goto out; g_print ("Run \"systemctl reboot\" to start a reboot\n"); } } ret = TRUE; out: /* Does nothing if using the message bus. */ rpmostree_cleanup_peer (); return ret; }
gboolean rpmostree_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; GOptionContext *context = g_option_context_new ("- Perform a system upgrade"); gs_unref_object GFile *sysroot_path = NULL; gs_unref_object OstreeSysroot *sysroot = NULL; gs_unref_object OstreeSysrootUpgrader *upgrader = NULL; gs_unref_object OstreeAsyncProgress *progress = NULL; GSConsole *console = NULL; gboolean changed; OstreeSysrootUpgraderPullFlags upgraderpullflags = 0; gs_free char *origin_description = NULL; gs_unref_object OstreeRepo *repo = NULL; g_option_context_add_main_entries (context, option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, error)) goto out; sysroot_path = g_file_new_for_path (opt_sysroot); sysroot = ostree_sysroot_new (sysroot_path); if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; upgrader = ostree_sysroot_upgrader_new_for_os (sysroot, opt_osname, cancellable, error); if (!upgrader) goto out; origin_description = ostree_sysroot_upgrader_get_origin_description (upgrader); if (origin_description) g_print ("Updating from: %s\n", origin_description); if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; console = gs_console_get (); if (console) { gs_console_begin_status_line (console, "", NULL, NULL); progress = ostree_async_progress_new_and_connect (_rpmostree_pull_progress, console); } if (opt_allow_downgrade) upgraderpullflags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER; if (opt_check_diff) { if (!ostree_sysroot_upgrader_pull_one_dir (upgrader, "/usr/share/rpm", 0, 0, progress, &changed, cancellable, error)) goto out; } else { if (!ostree_sysroot_upgrader_pull (upgrader, 0, 0, progress, &changed, cancellable, error)) goto out; } if (console) { if (!gs_console_end_status_line (console, cancellable, error)) { console = NULL; goto out; } console = NULL; } if (!changed) { g_print ("No updates available.\n"); } else { if (!opt_check_diff) { if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error)) goto out; if (opt_reboot) gs_subprocess_simple_run_sync (NULL, GS_SUBPROCESS_STREAM_DISPOSITION_INHERIT, cancellable, error, "systemctl", "reboot", NULL); else { #ifdef HAVE_PATCHED_HAWKEY_AND_LIBSOLV if (!rpmostree_print_treepkg_diff (sysroot, cancellable, error)) goto out; #endif g_print ("Updates prepared for next boot; run \"systemctl reboot\" to start a reboot\n"); } } else { gs_unref_object GFile *rpmdbdir = NULL; _cleanup_rpmrev_ struct RpmRevisionData *rpmrev1 = NULL; _cleanup_rpmrev_ struct RpmRevisionData *rpmrev2 = NULL; gs_free char *tmpd = g_mkdtemp (g_strdup ("/tmp/rpm-ostree.XXXXXX")); gs_free char *ref = NULL; // location of this rev gs_free char *remote = NULL; if (!ostree_parse_refspec (origin_description, &remote, &ref, error)) goto out; if (rpmReadConfigFiles (NULL, NULL)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "rpm failed to init: %s", rpmlogMessage()); goto out; } rpmdbdir = g_file_new_for_path (tmpd); if (!(rpmrev1 = rpmrev_new (repo, rpmdbdir, ostree_deployment_get_csum (ostree_sysroot_get_booted_deployment (sysroot)), NULL, cancellable, error))) goto out; if (!(rpmrev2 = rpmrev_new (repo, rpmdbdir, ref, NULL, cancellable, error))) goto out; rpmhdrs_diff_prnt_diff (rpmrev1->root, rpmrev2->root, rpmhdrs_diff (rpmrev1->rpmdb, rpmrev2->rpmdb), cancellable, error); } } ret = TRUE; out: if (console) (void) gs_console_end_status_line (console, NULL, NULL); return ret; }
gboolean rpmostree_db_option_context_parse (GOptionContext *context, const GOptionEntry *main_entries, int *argc, char ***argv, OstreeRepo **out_repo, GFile **out_rpmdbdir, gboolean *out_rpmdbdir_is_tmp, GCancellable *cancellable, GError **error) { gs_unref_object OstreeRepo *repo = NULL; gs_unref_object GFile *rpmdbdir = NULL; gboolean rpmdbdir_is_tmp = FALSE; gboolean success = FALSE; /* Entries are listed in --help output in the order added. We add the * main entries ourselves so that we can add the --repo entry first. */ g_option_context_add_main_entries (context, global_entries, NULL); if (!rpmostree_option_context_parse (context, main_entries, argc, argv, error)) goto out; if (opt_repo == NULL) { gs_unref_object OstreeSysroot *sysroot = NULL; sysroot = ostree_sysroot_new_default (); if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) goto out; } else { gs_unref_object GFile *repo_file = g_file_new_for_path (opt_repo); repo = ostree_repo_new (repo_file); if (!ostree_repo_open (repo, cancellable, error)) goto out; } if (rpmReadConfigFiles (NULL, NULL)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "rpm failed to init: %s", rpmlogMessage ()); goto out; } if (opt_rpmdbdir != NULL) { rpmdbdir = g_file_new_for_path (opt_rpmdbdir); } else { /* tmp on tmpfs is much faster than /var/tmp, * and the rpmdb itself shouldn't be too big. */ gs_free char *tmpd = g_mkdtemp (g_strdup ("/tmp/rpm-ostree.XXXXXX")); rpmdbdir = g_file_new_for_path (tmpd); rpmdbdir_is_tmp = TRUE; ostree_repo_set_disable_fsync (repo, TRUE); } gs_transfer_out_value (out_repo, &repo); gs_transfer_out_value (out_rpmdbdir, &rpmdbdir); if (out_rpmdbdir_is_tmp != NULL) *out_rpmdbdir_is_tmp = rpmdbdir_is_tmp; success = TRUE; out: return success; }