cli: simplify do_connections() now that we don't wait for "connection-read"

nm_remote_settings_list_connections() ensures the connections are loaded first.
We check "help" commands before getting connections, because it is time
intensive action.
This commit is contained in:
Jiří Klimeš
2014-08-22 20:19:13 +02:00
parent 3cf1131e89
commit a1907ec257

View File

@@ -475,20 +475,33 @@ usage_connection_load (void)
"state.\n\n")); "state.\n\n"));
} }
static gboolean
usage_connection_second_level (const char *cmd)
{
gboolean ret = TRUE;
/* The real commands that do something - i.e. not 'help', etc. */ if (matches (cmd, "show") == 0)
static const char *real_con_commands[] = { usage_connection_show ();
"show", else if (matches (cmd, "up") == 0)
"up", usage_connection_up ();
"down", else if (matches (cmd, "down") == 0)
"add", usage_connection_down ();
"modify", else if (matches (cmd, "add") == 0)
"edit", usage_connection_add ();
"delete", else if (matches (cmd, "modify") == 0)
"reload", usage_connection_modify ();
"load", else if (matches (cmd, "edit") == 0)
NULL usage_connection_edit ();
}; else if (matches (cmd, "delete") == 0)
usage_connection_delete ();
else if (matches (cmd, "reload") == 0)
usage_connection_reload ();
else if (matches (cmd, "load") == 0)
usage_connection_load ();
else
ret = FALSE;
return ret;
}
/* quit main loop */ /* quit main loop */
static void static void
@@ -8491,150 +8504,33 @@ nmcli_con_tab_completion (const char *text, int start, int end)
return match_array; return match_array;
} }
static NMCResultCode
parse_cmd (NmCli *nmc, int argc, char **argv)
{
GError *error = NULL;
rl_attempted_completion_function = (rl_completion_func_t *) nmcli_con_tab_completion;
if (argc == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto opt_error;
nmc->return_value = do_connections_show (nmc, FALSE, argc, argv);
} else {
if (nmc_arg_is_help (*argv)) {
usage ();
goto usage_exit;
}
else if (matches (*argv, "show") == 0) {
gboolean active = FALSE;
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_show ();
goto usage_exit;
}
next_arg (&argc, &argv);
if (nmc_arg_is_option (*argv, "active")) {
active = TRUE;
next_arg (&argc, &argv);
}
nmc->return_value = do_connections_show (nmc, active, argc, argv);
}
else if (matches(*argv, "up") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_up ();
goto usage_exit;
}
nmc->return_value = do_connection_up (nmc, argc-1, argv+1);
}
else if (matches(*argv, "down") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_down ();
goto usage_exit;
}
nmc->return_value = do_connection_down (nmc, argc-1, argv+1);
}
else if (matches(*argv, "add") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_add ();
goto usage_exit;
}
nmc->return_value = do_connection_add (nmc, argc-1, argv+1);
}
else if (matches(*argv, "edit") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_edit ();
goto usage_exit;
}
nmc->should_wait = TRUE;
editor_thread_data.nmc = nmc;
editor_thread_data.argc = argc - 1;
editor_thread_data.argv = argv + 1;
editor_thread = g_thread_new ("editor-thread", connection_editor_thread_func, &editor_thread_data);
g_thread_unref (editor_thread);
}
else if (matches(*argv, "delete") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_delete ();
goto usage_exit;
}
nmc->return_value = do_connection_delete (nmc, argc-1, argv+1);
}
else if (matches(*argv, "reload") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_reload ();
goto usage_exit;
}
nmc->return_value = do_connection_reload (nmc, argc-1, argv+1);
}
else if (matches(*argv, "load") == 0) {
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_load ();
goto usage_exit;
}
nmc->return_value = do_connection_load (nmc, argc-1, argv+1);
}
else if (matches (*argv, "modify") == 0) {
gboolean temporary = FALSE;
if (nmc_arg_is_help (*(argv+1))) {
usage_connection_modify ();
goto usage_exit;
}
next_arg (&argc, &argv);
if (nmc_arg_is_option (*argv, "temporary")) {
temporary = TRUE;
next_arg (&argc, &argv);
}
nmc->return_value = do_connection_modify (nmc, temporary, argc, argv);
}
else {
usage ();
g_string_printf (nmc->return_text, _("Error: '%s' is not valid 'connection' command."), *argv);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
}
}
usage_exit:
return nmc->return_value;
opt_error:
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
g_error_free (error);
return nmc->return_value;
}
/* Entry point function for connections-related commands: 'nmcli connection' */ /* Entry point function for connections-related commands: 'nmcli connection' */
NMCResultCode NMCResultCode
do_connections (NmCli *nmc, int argc, char **argv) do_connections (NmCli *nmc, int argc, char **argv)
{ {
int i = 0;
gboolean real_cmd = FALSE;
GError *error = NULL; GError *error = NULL;
if (argc == 0) /* Set completion function for 'nmcli con' */
real_cmd = TRUE; rl_attempted_completion_function = (rl_completion_func_t *) nmcli_con_tab_completion;
else {
while (real_con_commands[i] && matches (*argv, real_con_commands[i]) != 0) /* Exit early on help */
i++; if (nmc_arg_is_help (*argv)) {
if (real_con_commands[i] != NULL) usage ();
real_cmd = TRUE; return nmc->return_value;
}
if (argc != 0 && nmc_arg_is_help (*(argv+1))) {
if (usage_connection_second_level (*argv))
return nmc->return_value;
} }
if (!real_cmd) { /* Compare NM and nmcli versions */
/* no real execution command - no need to get connections */
return parse_cmd (nmc, argc, argv);
} else {
if (!nmc_versions_match (nmc)) if (!nmc_versions_match (nmc))
return nmc->return_value; return nmc->return_value;
/* Get NMClient object early */ /* Get NMClient object early */
nmc->get_client (nmc); nmc->get_client (nmc);
/* get system settings */ /* Get NMRemoteSettings object */
if (!(nmc->system_settings = nm_remote_settings_new (NULL, &error))) { if (!(nmc->system_settings = nm_remote_settings_new (NULL, &error))) {
g_string_printf (nmc->return_text, _("Error: Could not get system settings: %s."), error->message); g_string_printf (nmc->return_text, _("Error: Could not get system settings: %s."), error->message);
g_error_free (error); g_error_free (error);
@@ -8643,9 +8539,8 @@ do_connections (NmCli *nmc, int argc, char **argv)
return nmc->return_value; return nmc->return_value;
} }
/* find out whether settings service is running */ /* Find out whether settings service is running */
g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_NM_RUNNING, &nmc->system_settings_running, NULL); g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_NM_RUNNING, &nmc->system_settings_running, NULL);
if (!nmc->system_settings_running) { if (!nmc->system_settings_running) {
g_string_printf (nmc->return_text, _("Error: Can't obtain connections: settings service is not running.")); g_string_printf (nmc->return_text, _("Error: Can't obtain connections: settings service is not running."));
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
@@ -8656,6 +8551,61 @@ do_connections (NmCli *nmc, int argc, char **argv)
/* Get the connection list */ /* Get the connection list */
nmc->system_connections = nm_remote_settings_list_connections (nmc->system_settings); nmc->system_connections = nm_remote_settings_list_connections (nmc->system_settings);
return parse_cmd (nmc, argc, argv); /* Now parse the command line and perform the required operation */
if (argc == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto opt_error;
nmc->return_value = do_connections_show (nmc, FALSE, argc, argv);
} else {
if (matches (*argv, "show") == 0) {
gboolean active = FALSE;
next_arg (&argc, &argv);
if (nmc_arg_is_option (*argv, "active")) {
active = TRUE;
next_arg (&argc, &argv);
} }
nmc->return_value = do_connections_show (nmc, active, argc, argv);
} else if (matches(*argv, "up") == 0) {
nmc->return_value = do_connection_up (nmc, argc-1, argv+1);
} else if (matches(*argv, "down") == 0) {
nmc->return_value = do_connection_down (nmc, argc-1, argv+1);
} else if (matches(*argv, "add") == 0) {
nmc->return_value = do_connection_add (nmc, argc-1, argv+1);
} else if (matches(*argv, "edit") == 0) {
nmc->should_wait = TRUE;
editor_thread_data.nmc = nmc;
editor_thread_data.argc = argc - 1;
editor_thread_data.argv = argv + 1;
editor_thread = g_thread_new ("editor-thread", connection_editor_thread_func, &editor_thread_data);
g_thread_unref (editor_thread);
} else if (matches(*argv, "delete") == 0) {
nmc->return_value = do_connection_delete (nmc, argc-1, argv+1);
} else if (matches(*argv, "reload") == 0) {
nmc->return_value = do_connection_reload (nmc, argc-1, argv+1);
} else if (matches(*argv, "load") == 0) {
nmc->return_value = do_connection_load (nmc, argc-1, argv+1);
} else if (matches (*argv, "modify") == 0) {
gboolean temporary = FALSE;
next_arg (&argc, &argv);
if (nmc_arg_is_option (*argv, "temporary")) {
temporary = TRUE;
next_arg (&argc, &argv);
}
nmc->return_value = do_connection_modify (nmc, temporary, argc, argv);
} else {
usage ();
g_string_printf (nmc->return_text, _("Error: '%s' is not valid 'connection' command."), *argv);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
}
}
return nmc->return_value;
opt_error:
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
g_error_free (error);
return nmc->return_value;
} }