cli: persistent vs. temporary save for 'nmcli con edit'

This commit is contained in:
Jiří Klimeš 2014-01-24 14:48:30 +01:00
parent 2d523bd800
commit ec0f629ed2

View file

@ -4944,6 +4944,18 @@ add_new_connection (gboolean persistent,
return nm_remote_settings_add_connection_unsaved (settings, connection, callback, user_data); return nm_remote_settings_add_connection_unsaved (settings, connection, callback, user_data);
} }
static void
update_connection (gboolean persistent,
NMRemoteConnection *connection,
NMRemoteConnectionResultFunc callback,
gpointer user_data)
{
if (persistent)
nm_remote_connection_commit_changes (connection, callback, user_data);
else
nm_remote_connection_commit_changes_unsaved (connection, callback, user_data);
}
static NMCResultCode static NMCResultCode
do_connection_add (NmCli *nmc, int argc, char **argv) do_connection_add (NmCli *nmc, int argc, char **argv)
{ {
@ -5245,6 +5257,13 @@ gen_cmd_print2 (char *text, int state)
return gen_func_basic (text, state, words); return gen_func_basic (text, state, words);
} }
static char *
gen_cmd_save (char *text, int state)
{
const char *words[] = { "persistent", "temporary", NULL };
return gen_func_basic (text, state, words);
}
static char * static char *
gen_connection_types (char *text, int state) gen_connection_types (char *text, int state)
{ {
@ -5619,6 +5638,8 @@ nmcli_editor_tab_completion (char *text, int start, int end)
generator_func = gen_cmd_verify0; generator_func = gen_cmd_verify0;
} else if (should_complete_cmd (line, end, "activate", &num, NULL) && num <= 2) { } else if (should_complete_cmd (line, end, "activate", &num, NULL) && num <= 2) {
generator_func = gen_compat_devices; generator_func = gen_compat_devices;
} else if (should_complete_cmd (line, end, "save", &num, NULL) && num <= 2) {
generator_func = gen_cmd_save;
} else if (should_complete_cmd (line, end, "help", &num, NULL) && num <= 2) } else if (should_complete_cmd (line, end, "help", &num, NULL) && num <= 2)
generator_func = gen_nmcli_cmds_menu; generator_func = gen_nmcli_cmds_menu;
} }
@ -5948,7 +5969,7 @@ editor_main_usage (void)
"describe [<setting>.<prop>] :: describe property\n" "describe [<setting>.<prop>] :: describe property\n"
"print [all] :: print the connection\n" "print [all] :: print the connection\n"
"verify [all] :: verify the connection\n" "verify [all] :: verify the connection\n"
"save :: save the connection\n" "save [persistent|temporary] :: save the connection\n"
"activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n" "activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n"
"back :: go one level up (back)\n" "back :: go one level up (back)\n"
"help/? [<command>] :: print this help\n" "help/? [<command>] :: print this help\n"
@ -6004,8 +6025,15 @@ editor_main_help (const char *command)
" nmcli bond> verify\n")); " nmcli bond> verify\n"));
break; break;
case NMC_EDITOR_MAIN_CMD_SAVE: case NMC_EDITOR_MAIN_CMD_SAVE:
printf (_("save :: save the connection\n\n" printf (_("save [persistent|temporary] :: save the connection\n\n"
"Sends the connection to NetworkManager that will save it.\n")); "Sends the connection profile to NetworkManager that either will save it\n"
"pesistently, or will only keep it in memory. 'save' without an argument\n"
"means 'save persistent'.\n"
"Note that once you save the profile persistently those settings are saved\n"
"across reboot or restart. Subsequent changes can also be temporary or\n"
"persistent, but any temporary changes will not persist across reboot or\n"
"restart. If you want to fully remove the persistent connection, the connection\n"
"profile must be deleted.\n"));
break; break;
case NMC_EDITOR_MAIN_CMD_ACTIVATE: case NMC_EDITOR_MAIN_CMD_ACTIVATE:
printf (_("activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n\n" printf (_("activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n\n"
@ -6332,7 +6360,7 @@ connection_remove_setting (NMConnection *connection, NMSetting *setting)
} }
static void static void
editor_show_status_line (NMConnection *connection, gboolean dirty) editor_show_status_line (NMConnection *connection, gboolean dirty, gboolean temp)
{ {
NMSettingConnection *s_con; NMSettingConnection *s_con;
const char *con_type, *con_id, *con_uuid; const char *con_type, *con_id, *con_uuid;
@ -6344,8 +6372,10 @@ editor_show_status_line (NMConnection *connection, gboolean dirty)
con_uuid = nm_connection_get_uuid (connection); con_uuid = nm_connection_get_uuid (connection);
/* TRANSLATORS: status line in nmcli connection editor */ /* TRANSLATORS: status line in nmcli connection editor */
printf (_("[ Connection type: %s | name: %s | UUID: %s | dirty: %s ]\n"), printf (_("[ Type: %s | Name: %s | UUID: %s | Dirty: %s | Temp: %s ]\n"),
con_type, con_id, con_uuid, dirty ? _("yes") : _("no")); con_type, con_id, con_uuid,
dirty ? _("yes") : _("no"),
temp ? _("yes") : _("no"));
} }
static gboolean static gboolean
@ -6392,6 +6422,7 @@ property_edit_submenu (NmCli *nmc,
char *prompt; char *prompt;
gboolean dirty; gboolean dirty;
GValue prop_g_value = G_VALUE_INIT; GValue prop_g_value = G_VALUE_INIT;
gboolean temp_changes;
gboolean removed; gboolean removed;
prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ", prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ",
@ -6409,8 +6440,9 @@ property_edit_submenu (NmCli *nmc,
/* Connection is dirty? (not saved or differs from the saved) */ /* Connection is dirty? (not saved or differs from the saved) */
dirty = is_connection_dirty (connection, *rem_con); dirty = is_connection_dirty (connection, *rem_con);
temp_changes = *rem_con ? nm_remote_connection_get_unsaved (*rem_con) : TRUE;
if (nmc->editor_status_line) if (nmc->editor_status_line)
editor_show_status_line (connection, dirty); editor_show_status_line (connection, dirty, temp_changes);
cmd_property_user = readline_x (prompt); cmd_property_user = readline_x (prompt);
if (!cmd_property_user || *cmd_property_user == '\0') if (!cmd_property_user || *cmd_property_user == '\0')
@ -6785,6 +6817,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
char *valid_settings_str = NULL; char *valid_settings_str = NULL;
AddConnectionInfo *info = NULL; AddConnectionInfo *info = NULL;
gboolean dirty; gboolean dirty;
gboolean temp_changes;
GError *err1 = NULL; GError *err1 = NULL;
NmcEditorMenuContext menu_ctx; NmcEditorMenuContext menu_ctx;
@ -6807,8 +6840,9 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
while (cmd_loop) { while (cmd_loop) {
/* Connection is dirty? (not saved or differs from the saved) */ /* Connection is dirty? (not saved or differs from the saved) */
dirty = is_connection_dirty (connection, rem_con); dirty = is_connection_dirty (connection, rem_con);
temp_changes = rem_con ? nm_remote_connection_get_unsaved (rem_con) : TRUE;
if (nmc->editor_status_line) if (nmc->editor_status_line)
editor_show_status_line (connection, dirty); editor_show_status_line (connection, dirty, temp_changes);
/* Read user input */ /* Read user input */
cmd_user = readline_x (menu_ctx.main_prompt); cmd_user = readline_x (menu_ctx.main_prompt);
@ -7176,6 +7210,20 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
case NMC_EDITOR_MAIN_CMD_SAVE: case NMC_EDITOR_MAIN_CMD_SAVE:
/* Save the connection */ /* Save the connection */
if (nm_connection_verify (connection, &err1)) { if (nm_connection_verify (connection, &err1)) {
gboolean persistent = TRUE;
/* parse argument */
if (cmd_arg) {
if (matches (cmd_arg, "temporary") == 0)
persistent = FALSE;
else if (matches (cmd_arg, "persistent") == 0)
persistent = TRUE;
else {
printf (_("Error: invalid argument '%s'\n"), cmd_arg);
break;
}
}
/* Ask for save confirmation if the connection changes to autoconnect=yes */ /* Ask for save confirmation if the connection changes to autoconnect=yes */
if (nmc->editor_save_confirmation) if (nmc->editor_save_confirmation)
if (!confirm_connection_saving (connection, NM_CONNECTION (rem_con))) if (!confirm_connection_saving (connection, NM_CONNECTION (rem_con)))
@ -7186,18 +7234,17 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
info = g_malloc0 (sizeof (AddConnectionInfo)); info = g_malloc0 (sizeof (AddConnectionInfo));
info->nmc = nmc; info->nmc = nmc;
info->con_name = g_strdup (nm_connection_get_id (connection)); info->con_name = g_strdup (nm_connection_get_id (connection));
nm_remote_settings_add_connection (nmc->system_settings, add_new_connection (persistent,
connection, nmc->system_settings,
add_connection_editor_cb, connection,
info); add_connection_editor_cb,
info);
} else { } else {
/* Save/update already saved (existing) connection */ /* Save/update already saved (existing) connection */
nm_connection_replace_settings_from_connection (NM_CONNECTION (rem_con), nm_connection_replace_settings_from_connection (NM_CONNECTION (rem_con),
connection, connection,
NULL); NULL);
nm_remote_connection_commit_changes (rem_con, update_connection (persistent, rem_con, update_connection_editor_cb, NULL);
update_connection_editor_cb,
NULL);
} }
g_mutex_lock (&nmc_editor_mutex); g_mutex_lock (&nmc_editor_mutex);
@ -7213,7 +7260,9 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
g_error_free (nmc_editor_error); g_error_free (nmc_editor_error);
} else { } else {
printf (_("Connection '%s' (%s) successfully saved.\n"), printf (!rem_con ?
_("Connection '%s' (%s) successfully saved.\n") :
_("Connection '%s' (%s) successfully updated.\n"),
nm_connection_get_id (connection), nm_connection_get_id (connection),
nm_connection_get_uuid (connection)); nm_connection_get_uuid (connection));