/** * main: **/ int main (int argc, char *argv[]) { PkOfflineAction action = PK_OFFLINE_ACTION_UNKNOWN; gint retval; _cleanup_error_free_ GError *error = NULL; _cleanup_main_loop_unref_ GMainLoop *loop = NULL; _cleanup_object_unref_ GFile *file = NULL; _cleanup_object_unref_ PkProgressBar *progressbar = NULL; _cleanup_object_unref_ PkResults *results = NULL; _cleanup_object_unref_ PkTask *task = NULL; _cleanup_strv_free_ gchar **package_ids = NULL; #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 35) g_type_init (); #endif /* ensure root user */ if (getuid () != 0 || geteuid () != 0) { retval = EXIT_FAILURE; g_print ("This program can only be used using root\n"); sd_journal_print (LOG_WARNING, "not called with the root user"); goto out; } /* get the action, and then delete the file */ action = pk_offline_update_get_action (); g_unlink (PK_OFFLINE_ACTION_FILENAME); /* always do this first to avoid a loop if this tool segfaults */ g_unlink (PK_OFFLINE_TRIGGER_FILENAME); /* do stuff on ctrl-c */ g_unix_signal_add_full (G_PRIORITY_DEFAULT, SIGINT, pk_offline_update_sigint_cb, NULL, NULL); /* get the list of packages to update */ package_ids = pk_offline_get_prepared_ids (&error); if (package_ids == NULL) { retval = EXIT_FAILURE; sd_journal_print (LOG_WARNING, "failed to read %s: %s", PK_OFFLINE_PREPARED_FILENAME, error->message); goto out; } /* use a progress bar when the user presses <esc> in plymouth */ progressbar = pk_progress_bar_new (); pk_progress_bar_set_size (progressbar, 25); pk_progress_bar_set_padding (progressbar, 30); /* just update the system */ task = pk_task_new (); pk_client_set_interactive (PK_CLIENT (task), FALSE); pk_offline_update_set_plymouth_mode ("updates"); /* TRANSLATORS: we've started doing offline updates */ pk_offline_update_set_plymouth_msg (_("Installing updates, this could take a while...")); pk_offline_update_write_dummy_results (package_ids); results = pk_client_update_packages (PK_CLIENT (task), 0, package_ids, NULL, /* GCancellable */ pk_offline_update_progress_cb, progressbar, /* user_data */ &error); if (results == NULL) { retval = EXIT_FAILURE; pk_offline_update_write_error (error); sd_journal_print (LOG_WARNING, "failed to update system: %s", error->message); goto out; } pk_progress_bar_end (progressbar); pk_offline_update_write_results (results); /* delete prepared-update file if it's not already been done by the * pk-plugin-systemd-update daemon plugin */ if (!pk_offline_auth_invalidate (&error)) { retval = EXIT_FAILURE; sd_journal_print (LOG_WARNING, "failed to delete %s: %s", PK_OFFLINE_PREPARED_FILENAME, error->message); goto out; } retval = EXIT_SUCCESS; out: /* if we failed, we pause to show any error on the screen */ if (retval != EXIT_SUCCESS) { loop = g_main_loop_new (NULL, FALSE); g_timeout_add_seconds (10, pk_offline_update_loop_quit_cb, loop); g_main_loop_run (loop); } /* we have to manually either restart or shutdown */ if (action == PK_OFFLINE_ACTION_REBOOT) pk_offline_update_reboot (); else if (action == PK_OFFLINE_ACTION_POWER_OFF) pk_offline_update_power_off (); return retval; }
/** * main: **/ int main (int argc, char *argv[]) { gboolean ret; gchar **package_ids = NULL; gchar *packages_data = NULL; GError *error = NULL; GFile *file = NULL; gint retval; GMainLoop *loop = NULL; PkResults *results; PkTask *task = NULL; PkProgressBar *progressbar = NULL; #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 35) g_type_init (); #endif /* ensure root user */ if (getuid () != 0 || geteuid () != 0) { retval = EXIT_FAILURE; g_warning ("This program can only be used using root"); goto out; } /* always do this first to avoid a loop if this tool segfaults */ g_unlink (PK_OFFLINE_UPDATE_TRIGGER_FILENAME); /* get the list of packages to update */ ret = g_file_get_contents (PK_OFFLINE_PREPARED_UPDATE_FILENAME, &packages_data, NULL, &error); if (!ret) { retval = EXIT_FAILURE; g_warning ("failed to read: %s", error->message); g_error_free (error); goto out; } /* use a progress bar when the user presses <esc> in plymouth */ progressbar = pk_progress_bar_new (); pk_progress_bar_set_size (progressbar, 25); pk_progress_bar_set_padding (progressbar, 30); /* just update the system */ task = pk_task_new (); pk_task_set_interactive (task, FALSE); pk_offline_update_set_plymouth_mode ("updates"); package_ids = g_strsplit (packages_data, "\n", -1); pk_offline_update_write_dummy_results (package_ids); results = pk_client_update_packages (PK_CLIENT (task), 0, package_ids, NULL, /* GCancellable */ pk_offline_update_progress_cb, progressbar, /* user_data */ &error); if (results == NULL) { retval = EXIT_FAILURE; pk_offline_update_write_error (error); g_warning ("failed to update system: %s", error->message); g_error_free (error); goto out; } pk_progress_bar_end (progressbar); pk_offline_update_write_results (results); /* delete prepared-update file */ file = g_file_new_for_path (PK_OFFLINE_PREPARED_UPDATE_FILENAME); ret = g_file_delete (file, NULL, &error); if (!ret) { retval = EXIT_FAILURE; g_warning ("failed to delete %s: %s", PK_OFFLINE_PREPARED_UPDATE_FILENAME, error->message); g_error_free (error); goto out; } retval = EXIT_SUCCESS; out: /* if we failed, we pause to show any error on the screen */ if (retval != EXIT_SUCCESS) { loop = g_main_loop_new (NULL, FALSE); g_timeout_add_seconds (10, pk_offline_update_loop_quit_cb, loop); g_main_loop_run (loop); } pk_offline_update_reboot (); g_free (packages_data); g_strfreev (package_ids); if (progressbar != NULL) g_object_unref (progressbar); if (file != NULL) g_object_unref (file); if (task != NULL) g_object_unref (task); if (loop != NULL) g_main_loop_unref (loop); return retval; }