diff options
author | Thomas Haller <thaller@redhat.com> | 2020-04-04 15:10:05 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-04-04 19:49:09 +0200 |
commit | 4987a7cd6bf63c70c5d96ea90cbcfb6f7f148379 (patch) | |
tree | 9e3a7468da274a60fd12985745d6c30690a5f841 /clients/cli/agent.c | |
parent | 306414b93d447e915b6de94b9b7410ff7aadc4cf (diff) | |
download | NetworkManager-th/cli-globals-2.tar.gz |
xxxxxxth/cli-globals-2
Diffstat (limited to 'clients/cli/agent.c')
-rw-r--r-- | clients/cli/agent.c | 153 |
1 files changed, 61 insertions, 92 deletions
diff --git a/clients/cli/agent.c b/clients/cli/agent.c index 93b5ca079a..d82c251454 100644 --- a/clients/cli/agent.c +++ b/clients/cli/agent.c @@ -5,8 +5,6 @@ #include "nm-default.h" -#include "agent.h" - #include <stdio.h> #include <stdlib.h> #include <readline/readline.h> @@ -70,6 +68,7 @@ set_deftext (void) static gboolean get_secrets_from_user (const NmcConfig *nmc_config, + NmcReadlineStatus *readline_status, const char *request_id, const char *title, const char *msg, @@ -90,9 +89,9 @@ get_secrets_from_user (const NmcConfig *nmc_config, pre_input_deftext = g_strdup (secret->value); } if (secret->no_prompt_entry_id) - pwd = nmc_readline (nmc_config, "%s: ", secret->pretty_name); + pwd = nmc_readline (nmc_config, readline_status, "%s: ", secret->pretty_name); else - pwd = nmc_readline (nmc_config, "%s (%s): ", secret->pretty_name, secret->entry_id); + pwd = nmc_readline (nmc_config, readline_status, "%s (%s): ", secret->pretty_name, secret->entry_id); /* No password provided, cancel the secrets. */ if (!pwd) @@ -117,39 +116,12 @@ secrets_requested (NMSecretAgentSimple *agent, if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); - success = get_secrets_from_user (&nmc->nmc_config, request_id, title, msg, secrets); + success = get_secrets_from_user (&nmc->nmc_config, &nmc->readline_status, request_id, title, msg, secrets); nm_secret_agent_simple_response (agent, request_id, success ? secrets : NULL); } -static NMCResultCode -do_agent_secret (NmCli *nmc, int argc, char **argv) -{ - next_arg (nmc, &argc, &argv, NULL); - if (nmc->complete) - return nmc->return_value; - - /* Create secret agent */ - nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-agent"); - if (nmc->secret_agent) { - /* We keep running */ - nmc->should_wait++; - - nm_secret_agent_simple_enable (nmc->secret_agent, NULL); - g_signal_connect (nmc->secret_agent, - NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS, - G_CALLBACK (secrets_requested), - nmc); - g_print (_("nmcli successfully registered as a NetworkManager's secret agent.\n")); - } else { - g_string_printf (nmc->return_text, _("Error: secret agent initialization failed")); - nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; - } - - return nmc->return_value; -} - static void polkit_registered (gpointer instance, gpointer user_data) @@ -162,83 +134,80 @@ polkit_error (gpointer instance, const char *error, gpointer user_data) { - g_main_loop_quit (loop); + NmCli *nmc = user_data; + + nmc_run_status_return (&nmc->run_status, + NMC_RESULT_ERROR_UNKNOWN, + _("Error: polkit agent failed: %s"), + error); } -static NMCResultCode -do_agent_polkit (NmCli *nmc, int argc, char **argv) +static void +do_agent (const NMCCommand *cmd, + NmCli *nmc, + int argc, + const char *const*argv) { gs_free_error GError *error = NULL; + gboolean with_polkit_agent = NM_IN_STRSET (cmd->cmd, NULL, "all", "polkit"); + gboolean with_secret_agent = NM_IN_STRSET (cmd->cmd, NULL, "all", "secret"); + + nm_assert (with_polkit_agent || with_secret_agent); + + if (with_polkit_agent) { + if (!nmc_polkit_agent_init (nmc, TRUE, &error)) { + g_dbus_error_strip_remote_error (error); + nmc_run_status_return (&nmc->run_status, + NMC_RESULT_ERROR_UNKNOWN, + _("Error: polkit agent initialization failed: %s"), + error->message); + return; + } + } - next_arg (nmc, &argc, &argv, NULL); - if (nmc->complete) - return nmc->return_value; - - if (!nmc_polkit_agent_init (nmc, TRUE, &error)) { - g_dbus_error_strip_remote_error (error); - g_string_printf (nmc->return_text, - _("Error: polkit agent initialization failed: %s"), - error->message); - nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; - } else { - /* We keep running */ - nmc->should_wait++; + if (with_secret_agent) { + nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-agent"); + if (!nmc->secret_agent) { + nmc_run_status_return (&nmc->run_status, + NMC_RESULT_ERROR_UNKNOWN, + _("Error: secret agent initialization failed")); + return; + } + } + + nmc_run_status_wait_push (&nmc->run_status); + + if (with_polkit_agent) { g_signal_connect (nmc->pk_listener, NM_POLKIT_LISTENER_SIGNAL_ERROR, G_CALLBACK (polkit_error), - NULL); + nmc); g_signal_connect (nmc->pk_listener, NM_POLKIT_LISTENER_SIGNAL_REGISTERED, G_CALLBACK (polkit_registered), - NULL); - - /* keep running */ - nmc->should_wait++; - } - - return nmc->return_value; -} - -static NMCResultCode -do_agent_all (NmCli *nmc, int argc, char **argv) -{ - NMCResultCode secret_res; - - next_arg (nmc, &argc, &argv, NULL); - if (nmc->complete) - return nmc->return_value; - - /* Run both secret and polkit agent */ - secret_res = do_agent_secret (nmc, argc, argv); - if (secret_res != NMC_RESULT_SUCCESS) { - g_printerr ("%s\n", nmc->return_text->str); - g_string_truncate (nmc->return_text, 0); + nmc); } - nmc->return_value = do_agent_polkit (nmc, argc, argv); - if (nmc->return_value != NMC_RESULT_SUCCESS) { - g_printerr ("%s\n", nmc->return_text->str); - g_string_truncate (nmc->return_text, 0); + if (with_secret_agent) { + nm_secret_agent_simple_enable (nmc->secret_agent, NULL); + g_signal_connect (nmc->secret_agent, + NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS, + G_CALLBACK (secrets_requested), + nmc); + g_print (_("nmcli successfully registered as a NetworkManager's secret agent.\n")); } - - if (nmc->return_value == NMC_RESULT_SUCCESS && secret_res != NMC_RESULT_SUCCESS) - nmc->return_value = secret_res; - - return nmc->return_value; } -static const NMCCommand agent_cmds[] = { - { "secret", do_agent_secret, usage_agent_secret, TRUE, TRUE }, - { "polkit", do_agent_polkit, usage_agent_polkit, TRUE, TRUE }, - { "all", do_agent_all, usage_agent_all, TRUE, TRUE }, - { NULL, do_agent_all, usage, TRUE, TRUE }, -}; - -NMCResultCode -do_agent (NmCli *nmc, int argc, char **argv) +void +nmc_command_do_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { + static const NMCCommand agent_cmds[] = { + { "secret", do_agent, usage_agent_secret, TRUE, TRUE }, + { "polkit", do_agent, usage_agent_polkit, TRUE, TRUE }, + { "all", do_agent, usage_agent_all, TRUE, TRUE }, + { NULL, do_agent, usage, TRUE, TRUE }, + }; + next_arg (nmc, &argc, &argv, NULL); nmc_do_cmd (nmc, agent_cmds, *argv, argc, argv); - - return nmc->return_value; } |