cli: add 'remove' command to the interactive editor

remove <setting>[.property] | <property>

It entirely removes given setting from edited connection. If a property is given,
the command instead resets the property to its default value.

https://bugzilla.gnome.org/show_bug.cgi?id=707576
This commit is contained in:
Jiří Klimeš
2013-09-05 16:58:33 +02:00
parent c2faf32b88
commit 242bebfb3d

View File

@@ -1740,169 +1740,170 @@ typedef struct NameItem {
const char *name; const char *name;
const char *alias; const char *alias;
const struct NameItem *settings; const struct NameItem *settings;
gboolean mandatory;
} NameItem; } NameItem;
static const NameItem nmc_ethernet_settings [] = { static const NameItem nmc_ethernet_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE },
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_infiniband_settings [] = { static const NameItem nmc_infiniband_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_INFINIBAND_SETTING_NAME, NULL, NULL }, { NM_SETTING_INFINIBAND_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_wifi_settings [] = { static const NameItem nmc_wifi_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRELESS_SETTING_NAME, "wifi", NULL }, { NM_SETTING_WIRELESS_SETTING_NAME, "wifi", NULL, TRUE },
{ NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-sec", NULL }, { NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-sec", NULL, FALSE },
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_wimax_settings [] = { static const NameItem nmc_wimax_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIMAX_SETTING_NAME, NULL, NULL }, { NM_SETTING_WIMAX_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_gsm_settings [] = { static const NameItem nmc_gsm_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_GSM_SETTING_NAME, NULL, NULL }, { NM_SETTING_GSM_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_cdma_settings [] = { static const NameItem nmc_cdma_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_CDMA_SETTING_NAME, NULL, NULL }, { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_mobile_settings [] = { static const NameItem nmc_mobile_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL }, { NM_SETTING_SERIAL_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_PPP_SETTING_NAME, NULL, NULL }, { NM_SETTING_PPP_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_GSM_SETTING_NAME, NULL, NULL }, { NM_SETTING_GSM_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_CDMA_SETTING_NAME, NULL, NULL }, { NM_SETTING_CDMA_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_bluetooth_settings [] = { static const NameItem nmc_bluetooth_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_BLUETOOTH_SETTING_NAME, NULL, NULL }, { NM_SETTING_BLUETOOTH_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_adsl_settings [] = { static const NameItem nmc_adsl_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_ADSL_SETTING_NAME, NULL, NULL }, { NM_SETTING_ADSL_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_ppoe_settings [] = { static const NameItem nmc_ppoe_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE },
{ NM_SETTING_PPPOE_SETTING_NAME, NULL, NULL }, { NM_SETTING_PPPOE_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_PPP_SETTING_NAME, NULL, NULL }, { NM_SETTING_PPP_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_olpc_mesh_settings [] = { static const NameItem nmc_olpc_mesh_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_OLPC_MESH_SETTING_NAME, "olpc-mesh", NULL }, { NM_SETTING_OLPC_MESH_SETTING_NAME, "olpc-mesh", NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_vpn_settings [] = { static const NameItem nmc_vpn_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_VPN_SETTING_NAME, NULL, NULL }, { NM_SETTING_VPN_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_vlan_settings [] = { static const NameItem nmc_vlan_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE },
{ NM_SETTING_VLAN_SETTING_NAME, NULL, NULL }, { NM_SETTING_VLAN_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_bond_settings [] = { static const NameItem nmc_bond_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_BOND_SETTING_NAME, NULL, NULL }, { NM_SETTING_BOND_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_team_settings [] = { static const NameItem nmc_team_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_TEAM_SETTING_NAME, NULL, NULL }, { NM_SETTING_TEAM_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_bridge_settings [] = { static const NameItem nmc_bridge_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_BRIDGE_SETTING_NAME, NULL, NULL }, { NM_SETTING_BRIDGE_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL }, { NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_bond_slave_settings [] = { static const NameItem nmc_bond_slave_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE },
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_team_slave_settings [] = { static const NameItem nmc_team_slave_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE },
{ NM_SETTING_TEAM_PORT_SETTING_NAME, NULL, NULL }, { NM_SETTING_TEAM_PORT_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
static const NameItem nmc_bridge_slave_settings [] = { static const NameItem nmc_bridge_slave_settings [] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL }, { NM_SETTING_CONNECTION_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_BRIDGE_PORT_SETTING_NAME, NULL, NULL }, { NM_SETTING_BRIDGE_PORT_SETTING_NAME, NULL, NULL, TRUE },
{ NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL }, { NM_SETTING_WIRED_SETTING_NAME, "ethernet", NULL, TRUE },
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL }, { NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL } { NULL, NULL, NULL, FALSE }
}; };
@@ -2053,6 +2054,29 @@ get_valid_settings_array (const char *con_type)
return NULL; return NULL;
} }
static gboolean
is_setting_mandatory (NMConnection *connection, NMSetting *setting)
{
NMSettingConnection *s_con;
const char *c_type;
const NameItem *item;
const char *name;
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
c_type = nm_setting_connection_get_connection_type (s_con);
name = nm_setting_get_name (setting);
item = get_valid_settings_array (c_type);
while (item && item->name) {
if (!strcmp (name, item->name))
return item->mandatory;
item++;
}
return FALSE;
}
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
static gboolean static gboolean
@@ -4325,7 +4349,7 @@ gen_nmcli_cmds (char *text, int state, const char **commands)
static char * static char *
gen_nmcli_cmds_menu (char *text, int state) gen_nmcli_cmds_menu (char *text, int state)
{ {
const char *commands[] = { "goto", "set", "describe", "print", "verify", const char *commands[] = { "goto", "set", "remove", "describe", "print", "verify",
"save", "back", "help", "quit", "nmcli", "save", "back", "help", "quit", "nmcli",
NULL }; NULL };
return gen_nmcli_cmds (text, state, commands); return gen_nmcli_cmds (text, state, commands);
@@ -4545,6 +4569,7 @@ nmcli_editor_tab_completion (char *text, int start, int end)
else else
generator_func = gen_property_names; generator_func = gen_property_names;
} else if ( should_complete_cmd (line, "set ") } else if ( should_complete_cmd (line, "set ")
|| should_complete_cmd (line, "remove ")
|| should_complete_cmd (line, "describe ")) { || should_complete_cmd (line, "describe ")) {
if (level == 0 && !strchr (line, '.')) { if (level == 0 && !strchr (line, '.')) {
generator_func = gen_setting_names; generator_func = gen_setting_names;
@@ -4793,6 +4818,7 @@ editor_show_setting (NMSetting *setting, NmCli *nmc)
typedef enum { typedef enum {
NMC_EDITOR_MAIN_CMD_UNKNOWN = 0, NMC_EDITOR_MAIN_CMD_UNKNOWN = 0,
NMC_EDITOR_MAIN_CMD_GOTO, NMC_EDITOR_MAIN_CMD_GOTO,
NMC_EDITOR_MAIN_CMD_REMOVE,
NMC_EDITOR_MAIN_CMD_SET, NMC_EDITOR_MAIN_CMD_SET,
NMC_EDITOR_MAIN_CMD_DESCRIBE, NMC_EDITOR_MAIN_CMD_DESCRIBE,
NMC_EDITOR_MAIN_CMD_PRINT, NMC_EDITOR_MAIN_CMD_PRINT,
@@ -4819,6 +4845,8 @@ parse_editor_main_cmd (const char *cmd, char **cmd_arg)
if (matches (vec[0], "goto") == 0) if (matches (vec[0], "goto") == 0)
editor_cmd = NMC_EDITOR_MAIN_CMD_GOTO; editor_cmd = NMC_EDITOR_MAIN_CMD_GOTO;
else if (matches (vec[0], "remove") == 0)
editor_cmd = NMC_EDITOR_MAIN_CMD_REMOVE;
else if (matches (vec[0], "set") == 0) else if (matches (vec[0], "set") == 0)
editor_cmd = NMC_EDITOR_MAIN_CMD_SET; editor_cmd = NMC_EDITOR_MAIN_CMD_SET;
else if (matches (vec[0], "describe") == 0) else if (matches (vec[0], "describe") == 0)
@@ -4855,6 +4883,7 @@ editor_main_usage (void)
*/ */
printf (_("---[ Main menu ]---\n" printf (_("---[ Main menu ]---\n"
"goto [<setting> | <prop>] :: go to a setting or property\n" "goto [<setting> | <prop>] :: go to a setting or property\n"
"remove <setting>[.<prop>] | <prop> :: remove setting or reset property value\n"
"set [<setting>.<prop> <value>] :: set property value\n" "set [<setting>.<prop> <value>] :: set property value\n"
"describe [<setting>.<prop>] :: describe property\n" "describe [<setting>.<prop>] :: describe property\n"
"print [all] :: print the connection\n" "print [all] :: print the connection\n"
@@ -4884,6 +4913,13 @@ editor_main_help (const char *command)
" nmcli connection> goto secondaries\n" " nmcli connection> goto secondaries\n"
" nmcli> goto ipv4.addresses\n")); " nmcli> goto ipv4.addresses\n"));
break; break;
case NMC_EDITOR_MAIN_CMD_REMOVE:
printf (_("remove <setting>[.<prop>] :: remove setting or reset property value\n\n"
"This command removes an entire setting from the connection, or if a property\n"
"is given, resets that property to the default value.\n\n"
"Examples: nmcli> remove wifi-sec\n"
" nmcli> remove eth.mtu\n"));
break;
case NMC_EDITOR_MAIN_CMD_SET: case NMC_EDITOR_MAIN_CMD_SET:
printf (_("set [<setting>.<prop> <value>] :: set property value\n\n" printf (_("set [<setting>.<prop> <value>] :: set property value\n\n"
"This command sets property value.\n\n" "This command sets property value.\n\n"
@@ -5142,6 +5178,21 @@ print_setting_description (NMSetting *setting)
g_strfreev (all_props); g_strfreev (all_props);
} }
static gboolean
connection_remove_setting (NMConnection *connection, NMSetting *setting)
{
gboolean mandatory;
mandatory = is_setting_mandatory (connection, setting);
if (!mandatory) {
nm_connection_remove_setting (connection, G_OBJECT_TYPE (setting));
return TRUE;
}
printf (_("Error: setting '%s' is mandatory and cannot be removed.\n"),
nm_setting_get_name (setting));
return FALSE;
}
static void static void
editor_show_status_line (NMConnection *connection, gboolean dirty) editor_show_status_line (NMConnection *connection, gboolean dirty)
{ {
@@ -5720,6 +5771,79 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
} }
break; break;
case NMC_EDITOR_MAIN_CMD_REMOVE:
/* Remove setting from connection, or delete value of a property */
if (!cmd_arg) {
if (menu_ctx.level == 1) {
const char *prop_name;
prop_name = ask_check_property (cmd_arg,
(const char **) menu_ctx.valid_props,
menu_ctx.valid_props_str);
if (!prop_name)
break;
/* Delete property value */
nmc_property_set_default_value (menu_ctx.curr_setting, prop_name);
} else
printf (_("Error: no argument given; valid are [%s]\n"), valid_settings_str);
} else {
NMSetting *ss = NULL;
gboolean descr_all;
char *user_s;
/* cmd_arg_s != NULL means argument is "setting.property" */
descr_all = !cmd_arg_s && !menu_ctx.curr_setting;
user_s = descr_all ? cmd_arg_p : cmd_arg_s ? cmd_arg_s : NULL;
if (user_s) {
ss = is_setting_valid (connection, valid_settings_arr, user_s);
if (!ss) {
if (check_valid_name (user_s, valid_settings_arr, NULL))
printf (_("Setting '%s' is not present in the connection.\n"), user_s);
else
printf (_("Error: invalid setting argument '%s'; valid are [%s]\n"),
user_s, valid_settings_str);
break;
}
} else
ss = menu_ctx.curr_setting;
if (descr_all) {
/* Remove setting from the connection */
connection_remove_setting (connection, ss);
if (ss == menu_ctx.curr_setting) {
/* If we removed the setting we are in, go up */
menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
nmc_completion_setting = NULL; /* for TAB completion */
}
} else {
GError *tmp_err = NULL;
char *prop_name = is_property_valid (ss, cmd_arg_p, &tmp_err);
if (prop_name) {
/* Delete property value */
nmc_property_set_default_value (ss, prop_name);
} else {
/* If the string is not a property, try it as a setting */
NMSetting *s_tmp;
s_tmp = is_setting_valid (connection, valid_settings_arr, cmd_arg_p);
if (s_tmp) {
/* Remove setting from the connection */
connection_remove_setting (connection, s_tmp);
if (ss == menu_ctx.curr_setting) {
/* If we removed the setting we are in, go up */
menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
nmc_completion_setting = NULL; /* for TAB completion */
}
} else
printf (_("Error: %s properties, nor it is a setting name.\n"),
tmp_err->message);
g_clear_error (&tmp_err);
}
g_free (prop_name);
}
}
break;
case NMC_EDITOR_MAIN_CMD_DESCRIBE: case NMC_EDITOR_MAIN_CMD_DESCRIBE:
/* Print property description */ /* Print property description */
if (!cmd_arg) { if (!cmd_arg) {