summaryrefslogtreecommitdiffstats
path: root/vtysh
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-05-30 16:58:03 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-05-30 16:58:03 +0200
commit293067f086565c294862b954bf58e1680d758280 (patch)
treecf5ebe06faba962952846ab2dc682cbdd62dadcd /vtysh
parentbabeld: The sockaddr code is not passed through anymore (diff)
parentMerge pull request #617 from donaldsharp/bgp_nexthop (diff)
downloadfrr-293067f086565c294862b954bf58e1680d758280.tar.xz
frr-293067f086565c294862b954bf58e1680d758280.zip
Merge remote-tracking branch 'origin/master' into babel
Diffstat (limited to 'vtysh')
-rw-r--r--vtysh/Makefile.am2
-rw-r--r--vtysh/vtysh.c168
-rw-r--r--vtysh/vtysh.h9
-rw-r--r--vtysh/vtysh_config.c44
-rw-r--r--vtysh/vtysh_main.c7
-rw-r--r--vtysh/vtysh_user.c7
-rw-r--r--vtysh/vtysh_user.h7
7 files changed, 121 insertions, 123 deletions
diff --git a/vtysh/Makefile.am b/vtysh/Makefile.am
index 49b96d1b9..587f72c80 100644
--- a/vtysh/Makefile.am
+++ b/vtysh/Makefile.am
@@ -47,10 +47,10 @@ if BGPD
vtysh_scan += $(top_srcdir)/bgpd/bgp_bfd.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_debug.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_dump.c
-vtysh_scan += $(top_srcdir)/bgpd/bgp_encap.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_evpn_vty.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_filter.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_mplsvpn.c
+vtysh_scan += $(top_srcdir)/bgpd/bgp_nexthop.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_route.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_routemap.c
vtysh_scan += $(top_srcdir)/bgpd/bgp_vty.c
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 6e0aec2ed..137ce1182 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>
@@ -108,12 +107,9 @@ begins_with(const char *str, const char *prefix)
return strncmp(str, prefix, lenprefix) == 0;
}
-/* NB: multiplexed function:
- * if fp == NULL, this calls vtysh_config_parse_line
- * if fp != NULL, this prints lines to fp
- */
static int
-vtysh_client_run (struct vtysh_client *vclient, const char *line, FILE *fp)
+vtysh_client_run (struct vtysh_client *vclient, const char *line, FILE *fp,
+ void (*callback)(void *, const char *), void *cbarg)
{
int ret;
char stackbuf[4096];
@@ -179,8 +175,8 @@ vtysh_client_run (struct vtysh_client *vclient, const char *line, FILE *fp)
fputs (buf, fp);
fputc ('\n', fp);
}
- else
- vtysh_config_parse_line (buf);
+ if (callback)
+ callback(cbarg, buf);
if (eol == end)
/* \n\0\0\0 */
@@ -224,14 +220,15 @@ out:
static int
vtysh_client_run_all (struct vtysh_client *head_client, const char *line,
- int continue_on_err, FILE *fp)
+ int continue_on_err, FILE *fp,
+ void (*callback)(void *, const char *), void *cbarg)
{
struct vtysh_client *client;
int rc, rc_all = CMD_SUCCESS;
for (client = head_client; client; client = client->next)
{
- rc = vtysh_client_run(client, line, fp);
+ rc = vtysh_client_run(client, line, fp, callback, cbarg);
if (rc != CMD_SUCCESS)
{
if (!continue_on_err)
@@ -246,13 +243,13 @@ static int
vtysh_client_execute (struct vtysh_client *head_client, const char *line,
FILE *fp)
{
- return vtysh_client_run_all (head_client, line, 0, fp);
+ return vtysh_client_run_all (head_client, line, 0, fp, NULL, NULL);
}
static void
vtysh_client_config (struct vtysh_client *head_client, char *line)
{
- vtysh_client_run_all (head_client, line, 1, NULL);
+ vtysh_client_run_all (head_client, line, 1, NULL, vtysh_config_parse_line, NULL);
}
void
@@ -308,7 +305,6 @@ vtysh_execute_func (const char *line, int pager)
if (ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON || ret == CMD_WARNING)
{
if ((saved_node == BGP_VPNV4_NODE || saved_node == BGP_VPNV6_NODE
- || saved_node == BGP_ENCAP_NODE || saved_node == BGP_ENCAPV6_NODE
|| saved_node == BGP_IPV4_NODE
|| saved_node == BGP_IPV6_NODE || saved_node == BGP_IPV4M_NODE
|| saved_node == BGP_IPV4L_NODE || saved_node == BGP_IPV6L_NODE
@@ -327,7 +323,11 @@ vtysh_execute_func (const char *line, int pager)
{
vtysh_execute("exit-vnc");
}
- else if ((saved_node == KEYCHAIN_KEY_NODE) && (tried == 1))
+ else if ((saved_node == KEYCHAIN_KEY_NODE
+ || saved_node == LDP_PSEUDOWIRE_NODE
+ || saved_node == LDP_IPV4_IFACE_NODE
+ || saved_node == LDP_IPV6_IFACE_NODE)
+ && (tried == 1))
{
vtysh_execute("exit");
}
@@ -645,7 +645,7 @@ vtysh_mark_file (const char *filename)
}
}
/* This is the end */
- fprintf(stdout, "end\n");
+ fprintf(stdout, "\nend\n");
vty_close(vty);
XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
@@ -797,6 +797,27 @@ vtysh_rl_describe (void)
width,
token->text,
token->desc);
+
+ if (IS_VARYING_TOKEN(token->type))
+ {
+ const char *ref = vector_slot(vline, vector_active(vline) - 1);
+
+ vector varcomps = vector_init (VECTOR_MIN_SIZE);
+ cmd_variable_complete (token, ref, varcomps);
+
+ if (vector_active (varcomps) > 0)
+ {
+ fprintf(stdout, " ");
+ for (size_t j = 0; j < vector_active (varcomps); j++)
+ {
+ char *item = vector_slot (varcomps, j);
+ fprintf (stdout, " %s", item);
+ XFREE (MTYPE_COMPLETION, item);
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ vector_free (varcomps);
+ }
}
cmd_free_strvec (vline);
@@ -839,6 +860,7 @@ command_generator (const char *text, int state)
}
if (matched && matched[index])
+ /* this is free()'d by readline, but we leak 1 count of MTYPE_COMPLETION */
return matched[index++];
XFREE (MTYPE_TMP, matched);
@@ -926,18 +948,6 @@ static struct cmd_node bgp_vpnv6_node =
"%s(config-router-af)# "
};
-static struct cmd_node bgp_encap_node =
-{
- BGP_ENCAP_NODE,
- "%s(config-router-af)# "
-};
-
-static struct cmd_node bgp_encapv6_node =
-{
- BGP_ENCAPV6_NODE,
- "%s(config-router-af)# "
-};
-
static struct cmd_node bgp_ipv4_node =
{
BGP_IPV4_NODE,
@@ -1161,31 +1171,6 @@ DEFUNSH (VTYSH_BGPD,
}
DEFUNSH (VTYSH_BGPD,
- address_family_encapv4,
- address_family_encapv4_cmd,
- "address-family [ipv4] <encap|encapv4>",
- "Enter Address Family command mode\n"
- "Address Family\n"
- "Address Family\n"
- "Address Family\n")
-{
- vty->node = BGP_ENCAP_NODE;
- return CMD_SUCCESS;
-}
-
-DEFUNSH (VTYSH_BGPD,
- address_family_encapv6,
- address_family_encapv6_cmd,
- "address-family [ipv6] encapv6",
- "Enter Address Family command mode\n"
- "Address Family\n"
- "Address Family\n")
-{
- vty->node = BGP_ENCAPV6_NODE;
- return CMD_SUCCESS;
-}
-
-DEFUNSH (VTYSH_BGPD,
address_family_ipv4,
address_family_ipv4_cmd,
"address-family ipv4 [unicast]",
@@ -1366,22 +1351,22 @@ DEFUNSH (VTYSH_RIPD,
}
DEFUNSH (VTYSH_RIPD,
- router_rip,
- router_rip_cmd,
- "router rip",
- ROUTER_STR
- "RIP")
+ router_rip,
+ router_rip_cmd,
+ "router rip",
+ ROUTER_STR
+ "RIP\n")
{
vty->node = RIP_NODE;
return CMD_SUCCESS;
}
DEFUNSH (VTYSH_RIPNGD,
- router_ripng,
- router_ripng_cmd,
- "router ripng",
- ROUTER_STR
- "RIPng")
+ router_ripng,
+ router_ripng_cmd,
+ "router ripng",
+ ROUTER_STR
+ "RIPng\n")
{
vty->node = RIPNG_NODE;
return CMD_SUCCESS;
@@ -1620,8 +1605,6 @@ vtysh_exit (struct vty *vty)
break;
case BGP_VPNV4_NODE:
case BGP_VPNV6_NODE:
- case BGP_ENCAP_NODE:
- case BGP_ENCAPV6_NODE:
case BGP_IPV4_NODE:
case BGP_IPV4M_NODE:
case BGP_IPV4L_NODE:
@@ -1689,8 +1672,6 @@ DEFUNSH (VTYSH_BGPD,
|| vty->node == BGP_IPV4L_NODE
|| vty->node == BGP_VPNV4_NODE
|| vty->node == BGP_VPNV6_NODE
- || vty->node == BGP_ENCAP_NODE
- || vty->node == BGP_ENCAPV6_NODE
|| vty->node == BGP_IPV6_NODE
|| vty->node == BGP_IPV6L_NODE
|| vty->node == BGP_IPV6M_NODE)
@@ -3230,6 +3211,40 @@ vtysh_prompt (void)
return buf;
}
+static void vtysh_ac_line(void *arg, const char *line)
+{
+ vector comps = arg;
+ size_t i;
+ for (i = 0; i < vector_active(comps); i++)
+ if (!strcmp(line, (char *)vector_slot(comps, i)))
+ return;
+ vector_set(comps, XSTRDUP(MTYPE_COMPLETION, line));
+}
+
+static void vtysh_autocomplete(vector comps, struct cmd_token *token)
+{
+ char accmd[256];
+ size_t i;
+
+ snprintf(accmd, sizeof(accmd), "autocomplete %d %s %s", token->type,
+ token->text, token->varname ? token->varname : "-");
+
+ for (i = 0; i < array_size(vtysh_client); i++)
+ vtysh_client_run_all (&vtysh_client[i], accmd, 1, NULL,
+ vtysh_ac_line, comps);
+}
+
+static const struct cmd_variable_handler vtysh_var_handler[] = {
+ {
+ /* match all */
+ .tokenname = NULL,
+ .varname = NULL,
+ .completions = vtysh_autocomplete
+ }, {
+ .completions = NULL
+ }
+};
+
void
vtysh_init_vty (void)
{
@@ -3240,6 +3255,7 @@ vtysh_init_vty (void)
/* Initialize commands. */
cmd_init (0);
+ cmd_variable_handler_register(vtysh_var_handler);
/* Install nodes. */
install_node (&bgp_node, NULL);
@@ -3252,8 +3268,6 @@ vtysh_init_vty (void)
install_node (&zebra_node, NULL);
install_node (&bgp_vpnv4_node, NULL);
install_node (&bgp_vpnv6_node, NULL);
- install_node (&bgp_encap_node, NULL);
- install_node (&bgp_encapv6_node, NULL);
install_node (&bgp_ipv4_node, NULL);
install_node (&bgp_ipv4m_node, NULL);
install_node (&bgp_ipv4l_node, NULL);
@@ -3294,8 +3308,6 @@ vtysh_init_vty (void)
vtysh_install_default (ZEBRA_NODE);
vtysh_install_default (BGP_VPNV4_NODE);
vtysh_install_default (BGP_VPNV6_NODE);
- vtysh_install_default (BGP_ENCAP_NODE);
- vtysh_install_default (BGP_ENCAPV6_NODE);
vtysh_install_default (BGP_IPV4_NODE);
vtysh_install_default (BGP_IPV4M_NODE);
vtysh_install_default (BGP_IPV4L_NODE);
@@ -3369,10 +3381,6 @@ vtysh_init_vty (void)
install_element (BGP_VPNV4_NODE, &vtysh_quit_bgpd_cmd);
install_element (BGP_VPNV6_NODE, &vtysh_exit_bgpd_cmd);
install_element (BGP_VPNV6_NODE, &vtysh_quit_bgpd_cmd);
- install_element (BGP_ENCAP_NODE, &vtysh_exit_bgpd_cmd);
- install_element (BGP_ENCAP_NODE, &vtysh_quit_bgpd_cmd);
- install_element (BGP_ENCAPV6_NODE, &vtysh_exit_bgpd_cmd);
- install_element (BGP_ENCAPV6_NODE, &vtysh_quit_bgpd_cmd);
install_element (BGP_IPV4_NODE, &vtysh_exit_bgpd_cmd);
install_element (BGP_IPV4_NODE, &vtysh_quit_bgpd_cmd);
install_element (BGP_IPV4M_NODE, &vtysh_exit_bgpd_cmd);
@@ -3429,8 +3437,6 @@ vtysh_init_vty (void)
install_element (BGP_IPV4L_NODE, &vtysh_end_all_cmd);
install_element (BGP_VPNV4_NODE, &vtysh_end_all_cmd);
install_element (BGP_VPNV6_NODE, &vtysh_end_all_cmd);
- install_element (BGP_ENCAP_NODE, &vtysh_end_all_cmd);
- install_element (BGP_ENCAPV6_NODE, &vtysh_end_all_cmd);
install_element (BGP_IPV6_NODE, &vtysh_end_all_cmd);
install_element (BGP_IPV6M_NODE, &vtysh_end_all_cmd);
install_element (BGP_IPV6L_NODE, &vtysh_end_all_cmd);
@@ -3483,8 +3489,6 @@ vtysh_init_vty (void)
install_element (CONFIG_NODE, &router_bgp_cmd);
install_element (BGP_NODE, &address_family_vpnv4_cmd);
install_element (BGP_NODE, &address_family_vpnv6_cmd);
- install_element (BGP_NODE, &address_family_encapv4_cmd);
- install_element (BGP_NODE, &address_family_encapv6_cmd);
#if defined(ENABLE_BGP_VNC)
install_element (BGP_NODE, &vnc_vrf_policy_cmd);
install_element (BGP_NODE, &vnc_defaults_cmd);
@@ -3502,8 +3506,6 @@ vtysh_init_vty (void)
install_element (BGP_NODE, &address_family_evpn_cmd);
install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
install_element (BGP_VPNV6_NODE, &exit_address_family_cmd);
- install_element (BGP_ENCAP_NODE, &exit_address_family_cmd);
- install_element (BGP_ENCAPV6_NODE, &exit_address_family_cmd);
install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
install_element (BGP_IPV4L_NODE, &exit_address_family_cmd);
diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h
index b5f42bdaa..71a0d876f 100644
--- a/vtysh/vtysh.h
+++ b/vtysh/vtysh.h
@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef VTYSH_H
@@ -86,7 +85,7 @@ int vtysh_mark_file(const char *filename);
int vtysh_read_config (const char *);
int vtysh_write_config_integrated (void);
-void vtysh_config_parse_line (const char *);
+void vtysh_config_parse_line (void *, const char *);
void vtysh_config_dump (FILE *);
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index a51d42415..7ca74da10 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -1,22 +1,22 @@
/* Configuration generator.
- Copyright (C) 2000 Kunihiro Ishiguro
-
-This file is part of GNU Zebra.
-
-GNU Zebra is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-GNU Zebra is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Zebra; see the file COPYING. If not, write to the Free
-Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+ * Copyright (C) 2000 Kunihiro Ishiguro
+ *
+ * This file is part of GNU Zebra.
+ *
+ * GNU Zebra is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * GNU Zebra is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#include <zebra.h>
@@ -145,7 +145,7 @@ config_add_line_uniq (struct list *config, const char *line)
}
void
-vtysh_config_parse_line (const char *line)
+vtysh_config_parse_line (void *arg, const char *line)
{
char c;
static struct config *config = NULL;
@@ -420,12 +420,12 @@ vtysh_config_write ()
if (host.name)
{
sprintf (line, "hostname %s", host.name);
- vtysh_config_parse_line(line);
+ vtysh_config_parse_line(NULL, line);
}
if (vtysh_write_integrated == WRITE_INTEGRATED_NO)
- vtysh_config_parse_line ("no service integrated-vtysh-config");
+ vtysh_config_parse_line (NULL, "no service integrated-vtysh-config");
if (vtysh_write_integrated == WRITE_INTEGRATED_YES)
- vtysh_config_parse_line ("service integrated-vtysh-config");
+ vtysh_config_parse_line (NULL, "service integrated-vtysh-config");
user_config_write ();
}
diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c
index bf62850e2..d2ac56c36 100644
--- a/vtysh/vtysh_main.c
+++ b/vtysh/vtysh_main.c
@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>
diff --git a/vtysh/vtysh_user.c b/vtysh/vtysh_user.c
index cce797c93..97720e9fd 100644
--- a/vtysh/vtysh_user.c
+++ b/vtysh/vtysh_user.c
@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>
diff --git a/vtysh/vtysh_user.h b/vtysh/vtysh_user.h
index 16fcdd03a..9d8f4ae62 100644
--- a/vtysh/vtysh_user.h
+++ b/vtysh/vtysh_user.h
@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _VTYSH_USER_H