void pk_console_test (gpointer user_data) { EggTest *test = (EggTest *) user_data; gboolean ret; if (!egg_test_start (test, "PkConsole")) return; /************************************************************/ egg_test_title (test, "get prompt 1"); ret = pk_console_get_prompt ("press enter", TRUE); egg_test_assert (test, ret); /************************************************************/ egg_test_title (test, "get prompt 2"); ret = pk_console_get_prompt ("press enter", TRUE); egg_test_assert (test, ret); /************************************************************/ egg_test_title (test, "get prompt 3"); ret = pk_console_get_prompt ("press Y", TRUE); egg_test_assert (test, ret); /************************************************************/ egg_test_title (test, "get prompt 3"); ret = pk_console_get_prompt ("press N", TRUE); egg_test_assert (test, !ret); egg_test_end (test); }
/** * main: **/ int main (int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; gchar *options_help; gboolean ret; gchar *filename = NULL; PkClient *client = NULL; PkControl *control = NULL; PkBitfield roles; gchar *tempdir = NULL; gboolean exists; gboolean overwrite; gchar **excludes = NULL; gchar *package_id = NULL; PkServicePack *pack = NULL; gchar *directory = NULL; gchar *package_list = NULL; gchar *package = NULL; gboolean updates = FALSE; gint retval = 1; const GOptionEntry options[] = { { "with-package-list", 'l', 0, G_OPTION_ARG_STRING, &package_list, /* TRANSLATORS: we can exclude certain packages (glibc) when we know they'll exist on the target */ _("Set the file name of dependencies to be excluded"), NULL}, { "output", 'o', 0, G_OPTION_ARG_STRING, &directory, /* TRANSLATORS: the output location */ _("The output file or directory (the current directory is used if omitted)"), NULL}, { "package", 'p', 0, G_OPTION_ARG_STRING, &package, /* TRANSLATORS: put a list of packages in the pack */ _("The package to be put into the service pack"), NULL}, { "updates", 'u', 0, G_OPTION_ARG_NONE, &updates, /* TRANSLATORS: put all pending updates in the pack */ _("Put all updates available in the service pack"), NULL}, { NULL} }; setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 31) if (! g_thread_supported ()) g_thread_init (NULL); #endif g_type_init (); /* do stuff on ctrl-c */ signal (SIGINT, pk_generate_pack_sigint_cb); context = g_option_context_new ("PackageKit Pack Generator"); g_option_context_add_main_entries (context, options, NULL); g_option_context_add_group (context, pk_debug_get_option_group ()); g_option_context_parse (context, &argc, &argv, NULL); /* Save the usage string in case command parsing fails. */ options_help = g_option_context_get_help (context, TRUE, NULL); g_option_context_free (context); client = pk_client_new (); pack = pk_service_pack_new (); cancellable = g_cancellable_new (); progressbar = pk_progress_bar_new (); pk_progress_bar_set_size (progressbar, 25); pk_progress_bar_set_padding (progressbar, 20); /* neither options selected */ if (package == NULL && !updates) { /* TRANSLATORS: This is when the user fails to supply the correct arguments */ g_print ("%s\n", _("Neither --package or --updates option selected.")); retval = 1; goto out; } /* both options selected */ if (package != NULL && updates) { /* TRANSLATORS: This is when the user fails to supply just one argument */ g_print ("%s\n", _("Both options selected.")); retval = 1; goto out; } /* no argument given to --package */ if (package != NULL && package[0] == '\0') { /* TRANSLATORS: This is when the user fails to supply the package name */ g_print ("%s\n", _("A package name is required")); retval = 1; goto out; } /* no argument given to --output */ if (directory != NULL && directory[0] == '\0') { /* TRANSLATORS: This is when the user fails to supply the output */ g_print ("%s\n", _("A output directory or file name is required")); retval = 1; goto out; } /* fall back to the system copy */ if (package_list == NULL) package_list = g_strdup (PK_SYSTEM_PACKAGE_LIST_FILENAME); /* fall back to CWD */ if (directory == NULL) directory = g_get_current_dir (); /* are we dumb and can't do some actions */ control = pk_control_new (); ret = pk_control_get_properties (control, NULL, &error); if (!ret) { /* TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup */ g_print ("%s: %s\n", _("The daemon failed to startup"), error->message); goto out; } /* get data */ g_object_get (control, "roles", &roles, NULL); if (!pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DEPENDS)) { /* TRANSLATORS: This is when the backend doesn't have the capability to get-depends */ g_print ("%s (GetDepends)\n", _("The package manager cannot perform this type of operation.")); retval = 1; goto out; } if (!pk_bitfield_contain (roles, PK_ROLE_ENUM_DOWNLOAD_PACKAGES)) { /* TRANSLATORS: This is when the backend doesn't have the capability to download */ g_print ("%s (DownloadPackage)\n", _("The package manager cannot perform this type of operation.")); retval = 1; goto out; } #ifndef HAVE_ARCHIVE_H /* TRANSLATORS: This is when the distro didn't include libarchive support into PK */ g_print ("%s\n", _("Service packs cannot be created as PackageKit was not built with libarchive support.")); goto out; #endif /* the user can speciify a complete path */ ret = g_file_test (directory, G_FILE_TEST_IS_DIR); if (ret) { filename = pk_generate_pack_get_filename (package, directory); } else { if (!g_str_has_suffix (directory, PK_SERVICE_PACK_FILE_EXTENSION)) { /* TRANSLATORS: the user specified an absolute path, but didn't get the extension correct */ g_print ("%s .%s \n", _("If specifying a file, the service pack name must end with"), PK_SERVICE_PACK_FILE_EXTENSION); retval = 1; goto out; } filename = g_strdup (directory); } /* download packages to a temporary directory */ tempdir = g_build_filename (g_get_tmp_dir (), "pack", NULL); /* check if file exists before we overwrite it */ exists = g_file_test (filename, G_FILE_TEST_EXISTS); /*ask user input*/ if (exists) { /* TRANSLATORS: This is when file already exists */ overwrite = pk_console_get_prompt (_("A pack with the same name already exists, do you want to overwrite it?"), FALSE); if (!overwrite) { /* TRANSLATORS: This is when the pack was not overwritten */ g_print ("%s\n", _("The pack was not overwritten.")); retval = 1; goto out; } } /* get rid of temp directory if it already exists */ g_rmdir (tempdir); /* make the temporary directory */ retval = g_mkdir_with_parents (tempdir, 0777); if (retval != 0) { /* TRANSLATORS: This is when the temporary directory cannot be created, the directory name follows */ g_print ("%s '%s'\n", _("Failed to create directory:"), tempdir); retval = 1; goto out; } pk_service_pack_set_temp_directory (pack, tempdir); /* get the exclude list */ excludes = NULL; #if 0 ret = pk_obj_list_from_file (PK_OBJ_LIST(list), package_list); if (!ret) { /* TRANSLATORS: This is when the list of packages from the remote computer cannot be opened */ g_print ("%s: '%s'\n", _("Failed to open package list."), package_list); retval = 1; goto out; } #endif /* resolve package name to package_id */ if (!updates) { /* TRANSLATORS: The package name is being matched up to available packages */ g_print ("%s\n", _("Finding package name.")); package_id = pk_console_resolve_package (client, pk_bitfield_value (PK_FILTER_ENUM_NONE), package, &error); if (package_id == NULL) { /* TRANSLATORS: This is when the package cannot be found in any software source. The detailed error follows */ g_print (_("Failed to find package '%s': %s"), package, error->message); g_error_free (error); retval = 1; goto out; } } /* TRANSLATORS: This is telling the user we are in the process of making the pack */ g_print ("%s\n", _("Creating service pack...")); if (updates) ret = pk_generate_pack_create_for_updates (pack, filename, excludes, &error); else { gchar **package_ids; package_ids = pk_package_ids_from_id (package_id); ret = pk_generate_pack_create_for_package_ids (pack, filename, package_ids, excludes, &error); g_strfreev (package_ids); } /* no more progress */ pk_progress_bar_end (progressbar); if (ret) { /* TRANSLATORS: we succeeded in making the file */ g_print (_("Service pack created '%s'"), filename); g_print ("\n"); retval = 0; } else { /* TRANSLATORS: we failed to make te file */ g_print (_("Failed to create '%s': %s"), filename, error->message); g_print ("\n"); g_error_free (error); } out: /* get rid of temp directory */ g_rmdir (tempdir); g_object_unref (cancellable); if (progressbar != NULL) g_object_unref (progressbar); if (pack != NULL) g_object_unref (pack); if (client != NULL) g_object_unref (client); if (control != NULL) g_object_unref (control); g_free (tempdir); g_free (filename); g_free (package_id); g_free (directory); g_free (package_list); g_free (options_help); g_strfreev (excludes); return retval; }
/** * main: **/ int main (int argc, char *argv[]) { gboolean ret; PkCnfPolicyConfig *config = NULL; guint i; guint len; gchar *text; const gchar *possible; gchar **parts; guint retval = EXIT_COMMAND_NOT_FOUND; _cleanup_ptrarray_unref_ GPtrArray *array = NULL; _cleanup_strv_free_ gchar **package_ids = NULL; setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 31) if (! g_thread_supported ()) g_thread_init (NULL); #endif #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 35) g_type_init (); #endif /* don't show debugging, unless VERBOSE is specified */ pk_debug_add_log_domain (G_LOG_DOMAIN); /* no input */ if (argv[1] == NULL) goto out; /* do stuff on ctrl-c */ signal (SIGINT, pk_cnf_sigint_handler); /* get policy config */ config = pk_cnf_get_config (); task = PK_TASK(pk_task_text_new ()); g_object_set (task, "cache-age", G_MAXUINT, "interactive", FALSE, "background", FALSE, NULL); cancellable = g_cancellable_new (); /* get length */ len = strlen (argv[1]); if (len < 1) goto out; if (argv[1][0] == '.') goto out; /* TRANSLATORS: the prefix of all the output telling the user * why it's not executing. NOTE: this is lowercase to mimic * the style of bash itself -- apologies */ g_printerr ("bash: %s: %s...\n", argv[1], _("command not found")); /* user is not allowing CNF to do anything useful */ if (!config->software_source_search && !config->similar_name_search) { goto out; } /* generate swizzles */ if (config->similar_name_search) array = pk_cnf_find_alternatives (argv[1], len); /* one exact possibility */ if (array != NULL && array->len == 1) { possible = g_ptr_array_index (array, 0); if (config->single_match == PK_CNF_POLICY_WARN) { /* TRANSLATORS: tell the user what we think the command is */ g_printerr ("%s '%s'\n", _("Similar command is:"), possible); goto out; } /* run */ if (config->single_match == PK_CNF_POLICY_RUN) { retval = pk_cnf_spawn_command (possible, &argv[2]); goto out; } /* ask */ if (config->single_match == PK_CNF_POLICY_ASK) { /* TRANSLATORS: Ask the user if we should run the similar command */ text = g_strdup_printf ("%s %s", _("Run similar command:"), possible); ret = pk_console_get_prompt (text, TRUE); if (ret) retval = pk_cnf_spawn_command (possible, &argv[2]); g_free (text); } goto out; /* multiple choice */ } else if (array != NULL && array->len > 1) { if (config->multiple_match == PK_CNF_POLICY_WARN) { /* TRANSLATORS: show the user a list of commands that they could have meant */ g_printerr ("%s:\n", _("Similar commands are:")); for (i = 0; i < array->len; i++) { possible = g_ptr_array_index (array, i); g_printerr ("'%s'\n", possible); } /* ask */ } else if (config->multiple_match == PK_CNF_POLICY_ASK) { /* TRANSLATORS: show the user a list of commands we could run */ g_printerr ("%s:\n", _("Similar commands are:")); for (i = 0; i < array->len; i++) { possible = g_ptr_array_index (array, i); g_printerr ("%i\t'%s'\n", i+1, possible); } /* TRANSLATORS: ask the user to choose a file to run */ i = pk_console_get_number (_("Please choose a command to run"), array->len); /* run command */ possible = g_ptr_array_index (array, i); retval = pk_cnf_spawn_command (possible, &argv[2]); } goto out; /* only search using PackageKit if configured to do so */ } else if (config->software_source_search) { package_ids = pk_cnf_find_available (argv[1], config->max_search_time); if (package_ids == NULL) goto out; len = g_strv_length (package_ids); if (len == 1) { parts = pk_package_id_split (package_ids[0]); if (config->single_install == PK_CNF_POLICY_WARN) { /* TRANSLATORS: tell the user what package provides the command */ g_printerr ("%s '%s'\n", _("The package providing this file is:"), parts[PK_PACKAGE_ID_NAME]); goto out; } /* ask */ if (config->single_install == PK_CNF_POLICY_ASK) { /* TRANSLATORS: as the user if we want to install a package to provide the command */ text = g_strdup_printf (_("Install package '%s' to provide command '%s'?"), parts[PK_PACKAGE_ID_NAME], argv[1]); ret = pk_console_get_prompt (text, FALSE); g_free (text); if (ret) { ret = pk_cnf_install_package_id (package_ids[0]); if (ret) retval = pk_cnf_spawn_command (argv[1], &argv[2]); } g_print ("\n"); goto out; } /* install */ if (config->single_install == PK_CNF_POLICY_INSTALL) { ret = pk_cnf_install_package_id (package_ids[0]); if (ret) retval = pk_cnf_spawn_command (argv[1], &argv[2]); } g_strfreev (parts); goto out; } else if (len > 1) { if (config->multiple_install == PK_CNF_POLICY_WARN) { /* TRANSLATORS: Show the user a list of packages that provide this command */ g_printerr ("%s\n", _("Packages providing this file are:")); for (i = 0; package_ids[i] != NULL; i++) { parts = pk_package_id_split (package_ids[i]); g_printerr ("'%s'\n", parts[PK_PACKAGE_ID_NAME]); g_strfreev (parts); } /* ask */ } else if (config->multiple_install == PK_CNF_POLICY_ASK) { /* TRANSLATORS: Show the user a list of packages that they can install to provide this command */ g_printerr ("%s:\n", _("Suitable packages are:")); for (i = 0; package_ids[i] != NULL; i++) { parts = pk_package_id_split (package_ids[i]); g_printerr ("%i\t'%s'\n", i+1, parts[PK_PACKAGE_ID_NAME]); g_strfreev (parts); } /* TRANSLATORS: ask the user to choose a file to install */ i = pk_console_get_number (_("Please choose a package to install"), len); if (i == 0) { g_printerr ("%s\n", _("User aborted selection")); goto out; } /* run command */ ret = pk_cnf_install_package_id (package_ids[i - 1]); if (ret) retval = pk_cnf_spawn_command (argv[1], &argv[2]); } goto out; } } out: if (task != NULL) g_object_unref (task); if (cancellable != NULL) g_object_unref (cancellable); if (config != NULL) { g_strfreev (config->locations); g_free (config); } return retval; }