summaryrefslogtreecommitdiff
path: root/clients/cli/agent.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-04-04 15:10:05 +0200
committerThomas Haller <thaller@redhat.com>2020-04-04 19:49:09 +0200
commit4987a7cd6bf63c70c5d96ea90cbcfb6f7f148379 (patch)
tree9e3a7468da274a60fd12985745d6c30690a5f841 /clients/cli/agent.c
parent306414b93d447e915b6de94b9b7410ff7aadc4cf (diff)
downloadNetworkManager-th/cli-globals-2.tar.gz
Diffstat (limited to 'clients/cli/agent.c')
-rw-r--r--clients/cli/agent.c153
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;
}