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:
@@ -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,113 +8504,103 @@ nmcli_con_tab_completion (const char *text, int start, int end)
|
|||||||
return match_array;
|
return match_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NMCResultCode
|
/* Entry point function for connections-related commands: 'nmcli connection' */
|
||||||
parse_cmd (NmCli *nmc, int argc, char **argv)
|
NMCResultCode
|
||||||
|
do_connections (NmCli *nmc, int argc, char **argv)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
|
/* Set completion function for 'nmcli con' */
|
||||||
rl_attempted_completion_function = (rl_completion_func_t *) nmcli_con_tab_completion;
|
rl_attempted_completion_function = (rl_completion_func_t *) nmcli_con_tab_completion;
|
||||||
|
|
||||||
|
/* Exit early on help */
|
||||||
|
if (nmc_arg_is_help (*argv)) {
|
||||||
|
usage ();
|
||||||
|
return nmc->return_value;
|
||||||
|
}
|
||||||
|
if (argc != 0 && nmc_arg_is_help (*(argv+1))) {
|
||||||
|
if (usage_connection_second_level (*argv))
|
||||||
|
return nmc->return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compare NM and nmcli versions */
|
||||||
|
if (!nmc_versions_match (nmc))
|
||||||
|
return nmc->return_value;
|
||||||
|
|
||||||
|
/* Get NMClient object early */
|
||||||
|
nmc->get_client (nmc);
|
||||||
|
|
||||||
|
/* Get NMRemoteSettings object */
|
||||||
|
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_error_free (error);
|
||||||
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
||||||
|
nmc->should_wait = FALSE;
|
||||||
|
return nmc->return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out whether settings service is running */
|
||||||
|
g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_NM_RUNNING, &nmc->system_settings_running, NULL);
|
||||||
|
if (!nmc->system_settings_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->should_wait = FALSE;
|
||||||
|
return nmc->return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the connection list */
|
||||||
|
nmc->system_connections = nm_remote_settings_list_connections (nmc->system_settings);
|
||||||
|
|
||||||
|
/* Now parse the command line and perform the required operation */
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
|
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
|
||||||
goto opt_error;
|
goto opt_error;
|
||||||
nmc->return_value = do_connections_show (nmc, FALSE, argc, argv);
|
nmc->return_value = do_connections_show (nmc, FALSE, argc, argv);
|
||||||
} else {
|
} else {
|
||||||
if (nmc_arg_is_help (*argv)) {
|
if (matches (*argv, "show") == 0) {
|
||||||
usage ();
|
|
||||||
goto usage_exit;
|
|
||||||
}
|
|
||||||
else if (matches (*argv, "show") == 0) {
|
|
||||||
gboolean active = FALSE;
|
gboolean active = FALSE;
|
||||||
|
|
||||||
if (nmc_arg_is_help (*(argv+1))) {
|
|
||||||
usage_connection_show ();
|
|
||||||
goto usage_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
next_arg (&argc, &argv);
|
next_arg (&argc, &argv);
|
||||||
if (nmc_arg_is_option (*argv, "active")) {
|
if (nmc_arg_is_option (*argv, "active")) {
|
||||||
active = TRUE;
|
active = TRUE;
|
||||||
next_arg (&argc, &argv);
|
next_arg (&argc, &argv);
|
||||||
}
|
}
|
||||||
nmc->return_value = do_connections_show (nmc, active, argc, argv);
|
nmc->return_value = do_connections_show (nmc, active, argc, argv);
|
||||||
}
|
} else if (matches(*argv, "up") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_up (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches(*argv, "down") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_down (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches(*argv, "add") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_add (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches(*argv, "edit") == 0) {
|
||||||
else if (matches(*argv, "edit") == 0) {
|
|
||||||
if (nmc_arg_is_help (*(argv+1))) {
|
|
||||||
usage_connection_edit ();
|
|
||||||
goto usage_exit;
|
|
||||||
}
|
|
||||||
nmc->should_wait = TRUE;
|
nmc->should_wait = TRUE;
|
||||||
editor_thread_data.nmc = nmc;
|
editor_thread_data.nmc = nmc;
|
||||||
editor_thread_data.argc = argc - 1;
|
editor_thread_data.argc = argc - 1;
|
||||||
editor_thread_data.argv = argv + 1;
|
editor_thread_data.argv = argv + 1;
|
||||||
editor_thread = g_thread_new ("editor-thread", connection_editor_thread_func, &editor_thread_data);
|
editor_thread = g_thread_new ("editor-thread", connection_editor_thread_func, &editor_thread_data);
|
||||||
g_thread_unref (editor_thread);
|
g_thread_unref (editor_thread);
|
||||||
}
|
} else if (matches(*argv, "delete") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_delete (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches(*argv, "reload") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_reload (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches(*argv, "load") == 0) {
|
||||||
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);
|
nmc->return_value = do_connection_load (nmc, argc-1, argv+1);
|
||||||
}
|
} else if (matches (*argv, "modify") == 0) {
|
||||||
else if (matches (*argv, "modify") == 0) {
|
|
||||||
gboolean temporary = FALSE;
|
gboolean temporary = FALSE;
|
||||||
|
|
||||||
if (nmc_arg_is_help (*(argv+1))) {
|
|
||||||
usage_connection_modify ();
|
|
||||||
goto usage_exit;
|
|
||||||
}
|
|
||||||
next_arg (&argc, &argv);
|
next_arg (&argc, &argv);
|
||||||
if (nmc_arg_is_option (*argv, "temporary")) {
|
if (nmc_arg_is_option (*argv, "temporary")) {
|
||||||
temporary = TRUE;
|
temporary = TRUE;
|
||||||
next_arg (&argc, &argv);
|
next_arg (&argc, &argv);
|
||||||
}
|
}
|
||||||
nmc->return_value = do_connection_modify (nmc, temporary, argc, argv);
|
nmc->return_value = do_connection_modify (nmc, temporary, argc, argv);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
usage ();
|
usage ();
|
||||||
g_string_printf (nmc->return_text, _("Error: '%s' is not valid 'connection' command."), *argv);
|
g_string_printf (nmc->return_text, _("Error: '%s' is not valid 'connection' command."), *argv);
|
||||||
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
usage_exit:
|
|
||||||
return nmc->return_value;
|
return nmc->return_value;
|
||||||
|
|
||||||
opt_error:
|
opt_error:
|
||||||
@@ -8606,56 +8609,3 @@ opt_error:
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return nmc->return_value;
|
return nmc->return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Entry point function for connections-related commands: 'nmcli connection' */
|
|
||||||
NMCResultCode
|
|
||||||
do_connections (NmCli *nmc, int argc, char **argv)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
gboolean real_cmd = FALSE;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
if (argc == 0)
|
|
||||||
real_cmd = TRUE;
|
|
||||||
else {
|
|
||||||
while (real_con_commands[i] && matches (*argv, real_con_commands[i]) != 0)
|
|
||||||
i++;
|
|
||||||
if (real_con_commands[i] != NULL)
|
|
||||||
real_cmd = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!real_cmd) {
|
|
||||||
/* no real execution command - no need to get connections */
|
|
||||||
return parse_cmd (nmc, argc, argv);
|
|
||||||
} else {
|
|
||||||
if (!nmc_versions_match (nmc))
|
|
||||||
return nmc->return_value;
|
|
||||||
|
|
||||||
/* Get NMClient object early */
|
|
||||||
nmc->get_client (nmc);
|
|
||||||
|
|
||||||
/* get system settings */
|
|
||||||
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_error_free (error);
|
|
||||||
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
|
||||||
nmc->should_wait = FALSE;
|
|
||||||
return nmc->return_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find out whether settings service is running */
|
|
||||||
g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_NM_RUNNING, &nmc->system_settings_running, NULL);
|
|
||||||
|
|
||||||
if (!nmc->system_settings_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->should_wait = FALSE;
|
|
||||||
return nmc->return_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the connection list */
|
|
||||||
nmc->system_connections = nm_remote_settings_list_connections (nmc->system_settings);
|
|
||||||
|
|
||||||
return parse_cmd (nmc, argc, argv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user