cli: merge branch 'bg/cli-editor-save-rh1546805'

https://github.com/NetworkManager/NetworkManager/pull/244
https://bugzilla.redhat.com/show_bug.cgi?id=1546805
This commit is contained in:
Beniamino Galvani 2018-11-20 15:20:20 +01:00
commit 8af4f76638
2 changed files with 51 additions and 3 deletions

View file

@ -6588,6 +6588,12 @@ static gboolean nmc_editor_cb_called;
static GError *nmc_editor_error;
static MonitorACInfo *nmc_editor_monitor_ac;
static void
editor_connection_changed_cb (NMConnection *connection, gboolean *changed)
{
*changed = TRUE;
}
/*
* Store 'error' to shared 'nmc_editor_error' and monitoring info to
* 'nmc_editor_monitor_ac' and signal the condition so that
@ -7194,6 +7200,16 @@ menu_switch_to_level1 (const NmcConfig *nmc_config,
menu_ctx->valid_props_str = g_strjoinv (", ", menu_ctx->valid_props);
}
static gboolean
editor_save_timeout (gpointer user_data)
{
gboolean *timeout = user_data;
*timeout = TRUE;
return G_SOURCE_REMOVE;
}
static gboolean
editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_type)
{
@ -7726,6 +7742,10 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
/* Save the connection */
if (nm_connection_verify (connection, &err1)) {
gboolean persistent = TRUE;
gboolean connection_changed;
nm_auto_unref_gsource GSource *source = NULL;
gboolean timeout = FALSE;
gulong handler_id = 0;
/* parse argument */
if (cmd_arg) {
@ -7757,23 +7777,44 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
connection,
add_connection_editor_cb,
info);
connection_changed = TRUE;
} else {
/* Save/update already saved (existing) connection */
nm_connection_replace_settings_from_connection (NM_CONNECTION (rem_con),
connection);
update_connection (persistent, rem_con, update_connection_editor_cb, NULL);
handler_id = g_signal_connect (rem_con,
NM_CONNECTION_CHANGED,
G_CALLBACK (editor_connection_changed_cb),
&connection_changed);
connection_changed = FALSE;
}
//FIXME: add also a timeout for cases the callback is not called
while (!nmc_editor_cb_called)
source = g_timeout_source_new (10 * NM_UTILS_MSEC_PER_SECOND);
g_source_set_callback (source, editor_save_timeout, &timeout, NULL);
g_source_attach (source, g_main_loop_get_context (loop));
while (!nmc_editor_cb_called && !timeout)
g_main_context_iteration (NULL, TRUE);
while (!connection_changed && !timeout)
g_main_context_iteration (NULL, TRUE);
if (handler_id)
g_signal_handler_disconnect (rem_con, handler_id);
g_source_destroy (source);
if (nmc_editor_error) {
g_print (_("Error: Failed to save '%s' (%s) connection: %s\n"),
nm_connection_get_id (connection),
nm_connection_get_uuid (connection),
nmc_editor_error->message);
g_error_free (nmc_editor_error);
} else if (timeout) {
g_print (_("Error: Timeout saving '%s' (%s) connection\n"),
nm_connection_get_id (connection),
nm_connection_get_uuid (connection));
} else {
g_print (!rem_con ?
_("Connection '%s' (%s) successfully saved.\n") :
@ -7796,9 +7837,10 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
if (menu_ctx.curr_setting)
s_name = g_strdup (nm_setting_get_name (menu_ctx.curr_setting));
/* Update settings in the local connection */
/* Update settings and secrets in the local connection */
nm_connection_replace_settings_from_connection (connection,
NM_CONNECTION (con_tmp));
update_secrets_in_connection (con_tmp, connection);
/* Also update setting for menu context and TAB-completion */
menu_ctx.curr_setting = s_name ? nm_connection_get_setting_by_name (connection, s_name) : NULL;

View file

@ -245,6 +245,12 @@ verify_macsec_key (const char *key, gboolean cak, GError **error)
{
int req_len;
/* CAK is a connection secret and can be NULL for various
* reasons (agent-owned, no permissions to get secrets, etc.)
*/
if (cak && !key)
return TRUE;
if (!key || !key[0]) {
g_set_error_literal (error,
NM_CONNECTION_ERROR,