summary refs log tree commit diff
path: root/clients/cli
diff options
context:
space:
mode:
Diffstat (limited to 'clients/cli')
-rw-r--r--clients/cli/Makefile.in2
-rw-r--r--clients/cli/agent.c8
-rw-r--r--clients/cli/common.c33
-rw-r--r--clients/cli/common.h1
-rw-r--r--clients/cli/connections.c75
-rw-r--r--clients/cli/devices.c39
6 files changed, 102 insertions, 56 deletions
diff --git a/clients/cli/Makefile.in b/clients/cli/Makefile.in
index beb0d697..9aae6bfe 100644
--- a/clients/cli/Makefile.in
+++ b/clients/cli/Makefile.in
@@ -97,7 +97,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/attributes.m4 \
 	$(top_srcdir)/m4/ax_lib_readline.m4 \
 	$(top_srcdir)/m4/compiler_options.m4 \
-	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/git-sha-record.m4 \
 	$(top_srcdir)/m4/gnome-code-coverage.m4 \
 	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
diff --git a/clients/cli/agent.c b/clients/cli/agent.c
index bc837c72..9211d9a0 100644
--- a/clients/cli/agent.c
+++ b/clients/cli/agent.c
@@ -96,7 +96,8 @@ get_secrets_from_user (const char *request_id,
 		char *pwd = NULL;
 
 		/* Ask user for the password */
-		g_print ("%s\n", msg);
+		if (msg)
+			g_print ("%s\n", msg);
 		if (secret->value) {
 			/* Prefill the password if we have it. */
 			rl_startup_hook = set_deftext;
@@ -148,7 +149,10 @@ do_agent_secret (NmCli *nmc, int argc, char **argv)
 		nmc->should_wait++;
 
 		nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent), NULL);
-		g_signal_connect (nmc->secret_agent, "request-secrets", G_CALLBACK (secrets_requested), nmc);
+		g_signal_connect (nmc->secret_agent,
+		                  NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS,
+		                  G_CALLBACK (secrets_requested),
+		                  nmc);
 		g_print (_("nmcli successfully registered as a NetworkManager's secret agent.\n"));
 	} else {
 		g_string_printf (nmc->return_text, _("Error: secret agent initialization failed"));
diff --git a/clients/cli/common.c b/clients/cli/common.c
index f1ec46a1..f8dc5239 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -1058,13 +1058,15 @@ get_secrets_from_user (const char *request_id,
 						nmc_rl_pre_input_deftext = g_strdup (secret->value);
 					}
 				}
-				g_print ("%s\n", msg);
+				if (msg)
+					g_print ("%s\n", msg);
 				pwd = nmc_readline_echo (secret->password ? echo_on : TRUE,
 				                         "%s (%s): ", secret->name, secret->prop_name);
 				if (!pwd)
 					pwd = g_strdup ("");
 			} else {
-				g_print ("%s\n", msg);
+				if (msg)
+					g_print ("%s\n", msg);
 				g_printerr (_("Warning: password for '%s' not given in 'passwd-file' "
 				              "and nmcli cannot ask without '--ask' option.\n"),
 				            secret->prop_name);
@@ -1354,6 +1356,33 @@ nmc_rl_gen_func_basic (const char *text, int state, const char **words)
 	return NULL;
 }
 
+char *
+nmc_rl_gen_func_ifnames (const char *text, int state)
+{
+	int i;
+	const GPtrArray *devices;
+	const char **ifnames;
+	char *ret;
+
+	nm_cli.get_client (&nm_cli);
+	devices = nm_client_get_devices (nm_cli.client);
+	if (devices->len == 0)
+		return NULL;
+
+	ifnames = g_new (const char *, devices->len + 1);
+	for (i = 0; i < devices->len; i++) {
+		NMDevice *dev = g_ptr_array_index (devices, i);
+		const char *ifname = nm_device_get_iface (dev);
+		ifnames[i] = ifname;
+	}
+	ifnames[i] = NULL;
+
+	ret = nmc_rl_gen_func_basic (text, state, ifnames);
+
+	g_free (ifnames);
+	return ret;
+}
+
 /* for pre-filling a string to readline prompt */
 char *nmc_rl_pre_input_deftext;
 
diff --git a/clients/cli/common.h b/clients/cli/common.h
index 579c44a7..114a8e63 100644
--- a/clients/cli/common.h
+++ b/clients/cli/common.h
@@ -65,6 +65,7 @@ void nmc_cleanup_readline (void);
 char *nmc_readline (const char *prompt_fmt, ...) G_GNUC_PRINTF (1, 2);
 char *nmc_readline_echo (gboolean echo_on, const char *prompt_fmt, ...) G_GNUC_PRINTF (2, 3);
 char *nmc_rl_gen_func_basic (const char *text, int state, const char **words);
+char *nmc_rl_gen_func_ifnames (const char *text, int state);
 gboolean nmc_get_in_readline (void);
 void nmc_set_in_readline (gboolean in_readline);
 
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index ea7c8a79..dfd619cc 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -65,6 +65,7 @@ struct _OptionInfo {
 
 /* define some other prompts */
 #define PROMPT_CON_TYPE    N_("Connection type")
+#define PROMPT_IFNAME      N_("Interface name [*]")
 #define PROMPT_VPN_TYPE    N_("VPN type")
 #define PROMPT_MASTER      N_("Master")
 
@@ -2530,7 +2531,10 @@ nmc_activate_connection (NmCli *nmc,
 	/* Create secret agent */
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect");
 	if (nmc->secret_agent) {
-		g_signal_connect (nmc->secret_agent, "request-secrets", G_CALLBACK (nmc_secrets_requested), nmc);
+		g_signal_connect (nmc->secret_agent,
+		                  NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS,
+		                  G_CALLBACK (nmc_secrets_requested),
+		                  nmc);
 		if (connection) {
 			nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent),
 			                               nm_object_get_path (NM_OBJECT (connection)));
@@ -3753,6 +3757,12 @@ ensure_settings (NMConnection *connection, const NameItem *item)
 
 /*----------------------------------------------------------------------------*/
 
+static char *
+gen_func_slave_type (const char *text, int state)
+{
+	const char *words[] = { "bond", "team", "bridge", NULL };
+	return nmc_rl_gen_func_basic (text, state, words);
+}
 
 static char *
 gen_func_vpn_types (const char *text, int state)
@@ -3804,6 +3814,12 @@ gen_func_bond_mon_mode (const char *text, int state)
 	const char *words[] = { "miimon", "arp", NULL };
 	return nmc_rl_gen_func_basic (text, state, words);
 }
+static char *
+gen_func_bond_lacp_rate (const char *text, int state)
+{
+	const char *words[] = { "slow", "fast", NULL };
+	return nmc_rl_gen_func_basic (text, state, words);
+}
 
 static char *
 gen_func_adsl_proto (const char *text, int state)
@@ -4162,11 +4178,14 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_TYPE,             "type",         OPTION_REQD, PROMPT_CON_TYPE, NULL,
                                                                                                         set_connection_type, gen_connection_types },
 	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_ID,               "con-name",     OPTION_DONT_ASK, NULL, NULL, NULL, NULL },
-	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_AUTOCONNECT,      "autoconnect",  OPTION_DONT_ASK, NULL, NULL, NULL, gen_func_bool_values_l10n },
-	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_INTERFACE_NAME,   "ifname",       OPTION_REQD, N_("Interface name [*]"), NULL, set_connection_iface, NULL },
+	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_AUTOCONNECT,      "autoconnect",  OPTION_DONT_ASK, NULL, NULL, NULL,
+                                                                                                        gen_func_bool_values_l10n },
+	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_INTERFACE_NAME,   "ifname",       OPTION_REQD, PROMPT_IFNAME, NULL,
+                                                                                                        set_connection_iface, nmc_rl_gen_func_ifnames },
 	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_MASTER,           "master",       OPTION_DONT_ASK, PROMPT_MASTER, NULL,
                                                                                                         set_connection_master, gen_func_master_ifnames },
-	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_SLAVE_TYPE,       "slave-type",   OPTION_DONT_ASK, NULL, NULL, NULL, NULL },
+	{ NM_SETTING_CONNECTION_SETTING_NAME,   NM_SETTING_CONNECTION_SLAVE_TYPE,       "slave-type",   OPTION_DONT_ASK, NULL, NULL, NULL,
+                                                                                                        gen_func_slave_type },
 	{ NM_SETTING_PPPOE_SETTING_NAME,        NM_SETTING_PPPOE_USERNAME,              "username",     OPTION_REQD, N_("PPPoE username"), NULL, NULL, NULL },
 	{ NM_SETTING_PPPOE_SETTING_NAME,        NM_SETTING_PPPOE_PASSWORD,              "password",     OPTION_NONE, N_("Password [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_PPPOE_SETTING_NAME,        NM_SETTING_PPPOE_SERVICE,               "service",      OPTION_NONE, N_("Service [none]"), NULL, NULL, NULL },
@@ -4196,7 +4215,7 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_BLUETOOTH_SETTING_NAME,    NM_SETTING_BLUETOOTH_TYPE,              "bt-type",      OPTION_NONE, PROMPT_BT_TYPE, PROMPT_BT_TYPE_CHOICES,
                                                                                                         set_bluetooth_type, gen_func_bt_type },
 	{ NM_SETTING_VLAN_SETTING_NAME,         NM_SETTING_VLAN_PARENT,                 "dev",          OPTION_REQD, N_("VLAN parent device or connection UUID"), NULL,
-                                                                                                        NULL, NULL },
+                                                                                                        NULL, nmc_rl_gen_func_ifnames },
 	{ NM_SETTING_VLAN_SETTING_NAME,         NM_SETTING_VLAN_ID,                     "id",           OPTION_REQD, N_("VLAN ID (<0-4094>)"), NULL, NULL, NULL },
 	{ NM_SETTING_VLAN_SETTING_NAME,         NM_SETTING_VLAN_FLAGS,                  "flags",        OPTION_NONE, N_("VLAN flags (<0-7>) [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_VLAN_SETTING_NAME,         NM_SETTING_VLAN_INGRESS_PRIORITY_MAP,   "ingress",      OPTION_NONE, N_("Ingress priority maps [none]"), NULL, NULL, NULL },
@@ -4204,7 +4223,7 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                "mode",         OPTION_NONE, PROMPT_BOND_MODE, "[balance-rr]",
                                                                                                         set_bond_option, gen_func_bond_mode },
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                "primary",      OPTION_DONT_ASK, N_("Bonding primary interface [none]"),
-                                                                                                        NULL, set_bond_option, NULL },
+                                                                                                        NULL, set_bond_option, nmc_rl_gen_func_ifnames },
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                NULL,           OPTION_NONE, N_("Bonding monitoring mode"), PROMPT_BOND_MON_MODE_CHOICES,
                                                                                                         set_bond_monitoring_mode, gen_func_bond_mon_mode },
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                "miimon",       OPTION_DONT_ASK, N_("Bonding miimon [100]"), NULL, set_bond_option, NULL },
@@ -4215,7 +4234,7 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                "arp-ip-target", OPTION_DONT_ASK, N_("Bonding arp-ip-target [none]"),
                                                                                                         NULL, set_bond_option, NULL },
 	{ NM_SETTING_BOND_SETTING_NAME,         NM_SETTING_BOND_OPTIONS,                "lacp-rate",    OPTION_DONT_ASK, N_("LACP rate ('slow' or 'fast') [slow]"), NULL,
-                                                                                                        set_bond_option, NULL },
+                                                                                                        set_bond_option, gen_func_bond_lacp_rate },
 	{ NM_SETTING_TEAM_SETTING_NAME,         NM_SETTING_TEAM_CONFIG,                 "config",       OPTION_NONE, N_("Team JSON configuration [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_TEAM_PORT_SETTING_NAME,    NM_SETTING_TEAM_PORT_CONFIG,            "config",       OPTION_NONE, N_("Team JSON configuration [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_STP,                  "stp",          OPTION_NONE, N_("Enable STP [no]"), NULL,
@@ -4225,7 +4244,7 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_HELLO_TIME,           "hello-time",   OPTION_NONE, N_("Hello time [2]"), NULL, NULL, NULL },
 	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_MAX_AGE,              "max-age",      OPTION_NONE, N_("Max age [20]"), NULL, NULL, NULL },
 	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_AGEING_TIME,          "ageing-time",  OPTION_NONE, N_("MAC address ageing time [300]"), NULL, NULL, NULL },
-	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_MULTICAST_SNOOPING,   "multicast-snooping", OPTION_NONE, N_("Enable IGMP snooping %s [no]"), NULL,
+	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_MULTICAST_SNOOPING,   "multicast-snooping", OPTION_NONE, N_("Enable IGMP snooping [no]"), NULL,
                                                                                                         set_yes_no, gen_func_bool_values_l10n },
 	{ NM_SETTING_BRIDGE_SETTING_NAME,       NM_SETTING_BRIDGE_MAC_ADDRESS,          "mac",          OPTION_NONE, N_("MAC [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_BRIDGE_PORT_SETTING_NAME,  NM_SETTING_BRIDGE_PORT_PRIORITY,        "priority",     OPTION_NONE, N_("Bridge port priority [32]"), NULL, NULL, NULL },
@@ -4244,13 +4263,15 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_ADSL_SETTING_NAME,         NM_SETTING_ADSL_ENCAPSULATION,          "encapsulation", OPTION_NONE, PROMPT_ADSL_ENCAP, PROMPT_ADSL_ENCAP_CHOICES,
                                                                                                         NULL, gen_func_adsl_encap },
 	{ NM_SETTING_MACVLAN_SETTING_NAME,      NM_SETTING_MACVLAN_PARENT,              "dev",          OPTION_REQD, N_("MACVLAN parent device or connection UUID"), NULL,
-                                                                                                        NULL, NULL },
-	{ NM_SETTING_MACVLAN_SETTING_NAME,      NM_SETTING_MACVLAN_MODE,                "mode",         OPTION_REQD, PROMPT_MACVLAN_MODE, NULL, NULL, gen_func_macvlan_mode },
+                                                                                                        NULL, nmc_rl_gen_func_ifnames },
+	{ NM_SETTING_MACVLAN_SETTING_NAME,      NM_SETTING_MACVLAN_MODE,                "mode",         OPTION_REQD, PROMPT_MACVLAN_MODE, NULL,
+                                                                                                        NULL, gen_func_macvlan_mode },
 	{ NM_SETTING_MACVLAN_SETTING_NAME,      NM_SETTING_MACVLAN_TAP,                 "tap",          OPTION_NONE, N_("Tap [no]"), NULL,
                                                                                                         set_yes_no, gen_func_bool_values_l10n },
 	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_ID,                    "id",           OPTION_REQD, N_("VXLAN ID"), NULL, NULL, NULL },
 	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_REMOTE,                "remote",       OPTION_REQD, N_("Remote"), NULL, NULL, NULL },
-	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_PARENT,                "dev",          OPTION_NONE, N_("Parent device [none]"), NULL, NULL, NULL },
+	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_PARENT,                "dev",          OPTION_NONE, N_("Parent device [none]"), NULL,
+                                                                                                        NULL, nmc_rl_gen_func_ifnames },
 	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_LOCAL,                 "local",        OPTION_NONE, N_("Local address [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_SOURCE_PORT_MIN,       "source-port-min", OPTION_NONE, N_("Minimum source port [0]"), NULL, NULL, NULL },
 	{ NM_SETTING_VXLAN_SETTING_NAME,        NM_SETTING_VXLAN_SOURCE_PORT_MAX,       "source-port-max", OPTION_NONE, N_("Maximum source port [0]"), NULL, NULL, NULL },
@@ -4268,7 +4289,8 @@ static OptionInfo option_info[] = {
 	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,    NM_SETTING_IP_TUNNEL_MODE,              "mode",         OPTION_REQD, PROMPT_IP_TUNNEL_MODE, NULL, NULL, gen_func_ip_tunnel_mode },
 	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,    NM_SETTING_IP_TUNNEL_LOCAL,             "local",        OPTION_NONE, N_("Local endpoint [none]"), NULL, NULL, NULL },
 	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,    NM_SETTING_IP_TUNNEL_REMOTE,            "remote",       OPTION_REQD, N_("Remote"), NULL, NULL, NULL },
-	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,    NM_SETTING_IP_TUNNEL_PARENT,            "dev",          OPTION_NONE, N_("Parent device [none]"), NULL, NULL, NULL },
+	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,    NM_SETTING_IP_TUNNEL_PARENT,            "dev",          OPTION_NONE, N_("Parent device [none]"), NULL,
+                                                                                                        NULL, nmc_rl_gen_func_ifnames },
 	{ NM_SETTING_IP4_CONFIG_SETTING_NAME,   NM_SETTING_IP_CONFIG_ADDRESSES,         "ip4",          OPTION_MULTI, N_("IPv4 address (IP[/plen]) [none]"), NULL,
 	                                                                                                set_ip4_address, NULL },
 	{ NM_SETTING_IP4_CONFIG_SETTING_NAME,   NM_SETTING_IP_CONFIG_GATEWAY,           "gw4",          OPTION_NONE, N_("IPv4 gateway [none]"), NULL, NULL, NULL },
@@ -4362,6 +4384,8 @@ complete_property (const gchar *setting_name, const gchar *property, const gchar
 			run_rl_generator (gen_connection_types, prefix);
 		else if (strcmp (property, NM_SETTING_CONNECTION_MASTER) == 0)
 			run_rl_generator (gen_func_master_ifnames, prefix);
+		else if (strcmp (property, NM_SETTING_CONNECTION_INTERFACE_NAME) == 0)
+			run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
 	} else if (   strcmp (setting_name, NM_SETTING_VPN_SETTING_NAME) == 0
 	           && strcmp (property, NM_SETTING_VPN_SERVICE_TYPE) == 0)
 		run_rl_generator (gen_func_vpn_types, prefix);
@@ -4382,12 +4406,21 @@ complete_property (const gchar *setting_name, const gchar *property, const gchar
 	} else if (   strcmp (setting_name, NM_SETTING_TUN_SETTING_NAME) == 0
 	           && strcmp (property, NM_SETTING_TUN_MODE) == 0)
 		run_rl_generator (gen_func_tun_mode, prefix);
-	else if (   strcmp (setting_name, NM_SETTING_IP_TUNNEL_SETTING_NAME) == 0
-	         && strcmp (property, NM_SETTING_IP_TUNNEL_MODE) == 0)
-		run_rl_generator (gen_func_ip_tunnel_mode, prefix);
-	else if (   strcmp (setting_name, NM_SETTING_MACVLAN_SETTING_NAME) == 0
-	         && strcmp (property, NM_SETTING_MACVLAN_MODE) == 0)
-		run_rl_generator (gen_func_macvlan_mode, prefix);
+	else if (strcmp (setting_name, NM_SETTING_IP_TUNNEL_SETTING_NAME) == 0) {
+		if (strcmp (property, NM_SETTING_IP_TUNNEL_MODE) == 0)
+			run_rl_generator (gen_func_ip_tunnel_mode, prefix);
+		else if (strcmp (property, NM_SETTING_IP_TUNNEL_PARENT) == 0)
+			run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
+	} else if (strcmp (setting_name, NM_SETTING_MACVLAN_SETTING_NAME) == 0) {
+		if (strcmp (property, NM_SETTING_MACVLAN_MODE) == 0)
+			run_rl_generator (gen_func_macvlan_mode, prefix);
+		else if (strcmp (property, NM_SETTING_MACVLAN_PARENT) == 0)
+			run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
+		else if (strcmp (property, NM_SETTING_MACVLAN_TAP) == 0)
+			run_rl_generator (gen_func_bool_values_l10n, prefix);
+	} else if (   strcmp (setting_name, NM_SETTING_VXLAN_SETTING_NAME) == 0
+	           && strcmp (property, NM_SETTING_VXLAN_PARENT) == 0)
+		run_rl_generator (nmc_rl_gen_func_ifnames, prefix);
 
 }
 
@@ -4602,8 +4635,8 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
 {
 	char **match_array = NULL;
 	rl_compentry_func_t *generator_func = NULL;
-	gs_free char *no = g_strdup_printf (": [%s]", gettext ("no"));
-	gs_free char *yes = g_strdup_printf (": [%s]", gettext ("yes"));
+	gs_free char *no = g_strdup_printf ("[%s]: ", gettext ("no"));
+	gs_free char *yes = g_strdup_printf ("[%s]: ", gettext ("yes"));
 
 	/* Disable readline's default filename completion */
 	rl_attempted_completion_over = 1;
@@ -4616,6 +4649,8 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
 
 	if (g_str_has_prefix (rl_prompt, PROMPT_CON_TYPE))
 		generator_func = gen_connection_types;
+	else if (g_str_has_prefix (rl_prompt, PROMPT_IFNAME))
+		generator_func = nmc_rl_gen_func_ifnames;
 	else if (g_str_has_prefix (rl_prompt, PROMPT_VPN_TYPE))
 		generator_func = gen_func_vpn_types;
 	else if (g_str_has_prefix (rl_prompt, PROMPT_MASTER))
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index afa769f6..550f0c2e 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -1860,8 +1860,12 @@ do_device_connect (NmCli *nmc, int argc, char **argv)
 
 	/* Create secret agent */
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect");
-	if (nmc->secret_agent)
-		g_signal_connect (nmc->secret_agent, "request-secrets", G_CALLBACK (nmc_secrets_requested), nmc);
+	if (nmc->secret_agent) {
+		g_signal_connect (nmc->secret_agent,
+		                  NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS,
+		                  G_CALLBACK (nmc_secrets_requested),
+		                  nmc);
+	}
 
 	info = g_malloc0 (sizeof (AddAndActivateInfo));
 	info->nmc = nmc;
@@ -3809,33 +3813,6 @@ is_single_word (const char* line)
 		return FALSE;
 }
 
-static char *
-gen_func_ifnames (const char *text, int state)
-{
-	int i;
-	const GPtrArray *devices;
-	const char **ifnames;
-	char *ret;
-
-	nm_cli.get_client (&nm_cli);
-	devices = nm_client_get_devices (nm_cli.client);
-	if (devices->len == 0)
-		return NULL;
-
-	ifnames = g_new (const char *, devices->len + 1);
-	for (i = 0; i < devices->len; i++) {
-		NMDevice *dev = g_ptr_array_index (devices, i);
-		const char *ifname = nm_device_get_iface (dev);
-		ifnames[i] = ifname;
-	}
-	ifnames[i] = NULL;
-
-	ret = nmc_rl_gen_func_basic (text, state, ifnames);
-
-	g_free (ifnames);
-	return ret;
-}
-
 static char **
 nmcli_device_tab_completion (const char *text, int start, int end)
 {
@@ -3852,9 +3829,9 @@ nmcli_device_tab_completion (const char *text, int start, int end)
 		if (!is_single_word (rl_line_buffer))
 			return NULL;
 
-		generator_func = gen_func_ifnames;
+		generator_func = nmc_rl_gen_func_ifnames;
 	} else if (g_strcmp0 (rl_prompt, PROMPT_INTERFACES) == 0) {
-		generator_func = gen_func_ifnames;
+		generator_func = nmc_rl_gen_func_ifnames;
 	}
 
 	if (generator_func)