]> git.proxmox.com Git - mirror_frr.git/blame - vtysh/vtysh.c
build: remove INSTALL.quagga.txt
[mirror_frr.git] / vtysh / vtysh.c
CommitLineData
718e3744 1/* Virtual terminal interface shell.
2 * Copyright (C) 2000 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the Free
18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 * 02111-1307, USA.
20 */
21
22#include <zebra.h>
23
24#include <sys/un.h>
25#include <setjmp.h>
26#include <sys/wait.h>
27#include <sys/resource.h>
28#include <sys/stat.h>
29
30#include <readline/readline.h>
31#include <readline/history.h>
32
7c8ff89e
DS
33#include <dirent.h>
34#include <stdio.h>
35#include <string.h>
36
4201dd11 37#include "linklist.h"
718e3744 38#include "command.h"
39#include "memory.h"
039f3a34 40#include "filter.h"
718e3744 41#include "vtysh/vtysh.h"
6099b3b5 42#include "log.h"
320da874 43#include "bgpd/bgp_vty.h"
13460c44 44#include "ns.h"
cd2a8a42 45#include "vrf.h"
718e3744 46
4a1ab8e4
DL
47DEFINE_MTYPE_STATIC(MVTYSH, VTYSH_CMD, "Vtysh cmd copy")
48
718e3744 49/* Struct VTY. */
50struct vty *vty;
51
52/* VTY shell pager name. */
53char *vtysh_pager_name = NULL;
54
55/* VTY shell client structure. */
56struct vtysh_client
57{
58 int fd;
c0e8c16f 59 const char *name;
b1aa147d 60 int flag;
c0e8c16f 61 const char *path;
7c8ff89e
DS
62 struct vtysh_client *next;
63};
64
65struct vtysh_client vtysh_client[] =
66{
67 { .fd = -1, .name = "zebra", .flag = VTYSH_ZEBRA, .path = ZEBRA_VTYSH_PATH, .next = NULL},
68 { .fd = -1, .name = "ripd", .flag = VTYSH_RIPD, .path = RIP_VTYSH_PATH, .next = NULL},
69 { .fd = -1, .name = "ripngd", .flag = VTYSH_RIPNGD, .path = RIPNG_VTYSH_PATH, .next = NULL},
70 { .fd = -1, .name = "ospfd", .flag = VTYSH_OSPFD, .path = OSPF_VTYSH_PATH, .next = NULL},
71 { .fd = -1, .name = "ospf6d", .flag = VTYSH_OSPF6D, .path = OSPF6_VTYSH_PATH, .next = NULL},
4fcbf6e2 72 { .fd = -1, .name = "ldpd", .flag = VTYSH_LDPD, .path = LDP_VTYSH_PATH, .next = NULL},
7c8ff89e
DS
73 { .fd = -1, .name = "bgpd", .flag = VTYSH_BGPD, .path = BGP_VTYSH_PATH, .next = NULL},
74 { .fd = -1, .name = "isisd", .flag = VTYSH_ISISD, .path = ISIS_VTYSH_PATH, .next = NULL},
12e41d03 75 { .fd = -1, .name = "pimd", .flag = VTYSH_PIMD, .path = PIM_VTYSH_PATH, .next = NULL},
4a96e944 76 { .fd = -1, .name = "watchquagga", .flag = VTYSH_WATCHQUAGGA, .path = WATCHQUAGGA_VTYSH_PATH, .next = NULL},
b1aa147d 77};
78
039eaca3 79enum vtysh_write_integrated vtysh_write_integrated = WRITE_INTEGRATED_UNSPECIFIED;
e7168df4 80
274a4a44 81static void
718e3744 82vclient_close (struct vtysh_client *vclient)
83{
b1aa147d 84 if (vclient->fd >= 0)
85 {
86 fprintf(stderr,
87 "Warning: closing connection to %s because of an I/O error!\n",
88 vclient->name);
89 close (vclient->fd);
90 vclient->fd = -1;
91 }
718e3744 92}
93
f35a5350
DW
94/* Return true if str begins with prefix, else return false */
95static int
96begins_with(const char *str, const char *prefix)
97{
98 if (!str || !prefix)
99 return 0;
100 size_t lenstr = strlen(str);
101 size_t lenprefix = strlen(prefix);
102 if (lenprefix > lenstr)
103 return 0;
104 return strncmp(str, prefix, lenprefix) == 0;
105}
106
7526a182
DL
107/* NB: multiplexed function:
108 * if fp == NULL, this calls vtysh_config_parse_line
109 * if fp != NULL, this prints lines to fp
110 */
274a4a44 111static int
7526a182 112vtysh_client_run (struct vtysh_client *vclient, const char *line, FILE *fp)
718e3744 113{
114 int ret;
7526a182
DL
115 char stackbuf[4096];
116 char *buf = stackbuf;
117 size_t bufsz = sizeof(stackbuf);
118 char *bufvalid, *end = NULL;
119 char terminator[3] = {0, 0, 0};
718e3744 120
121 if (vclient->fd < 0)
122 return CMD_SUCCESS;
123
124 ret = write (vclient->fd, line, strlen (line) + 1);
125 if (ret <= 0)
7526a182 126 goto out_err;
7c8ff89e 127
7526a182
DL
128 bufvalid = buf;
129 do
7c8ff89e 130 {
7526a182
DL
131 ssize_t nread = read (vclient->fd, bufvalid, buf + bufsz - bufvalid);
132
133 if (nread < 0 && (errno == EINTR || errno == EAGAIN))
134 continue;
135
136 if (nread <= 0)
137 {
138 fprintf (stderr, "vtysh: error reading from %s: %s (%d)",
139 vclient->name, safe_strerror(errno), errno);
140 goto out_err;
141 }
142
143 bufvalid += nread;
144
145 end = memmem (buf, bufvalid - buf, terminator, sizeof(terminator));
146 if (end + sizeof(terminator) + 1 > bufvalid)
147 /* found \0\0\0 but return code hasn't been read yet */
148 end = NULL;
149 if (end)
150 ret = end[sizeof(terminator)];
151
152 while (bufvalid > buf && (end > buf || !end))
153 {
154 size_t textlen = (end ? end : bufvalid) - buf;
155 char *eol = memchr (buf, '\n', textlen);
156 if (eol)
157 /* line break */
158 *eol++ = '\0';
159 else if (end == buf)
160 /* no line break, end of input, no text left before end
161 * => don't insert an empty line at the end */
162 break;
163 else if (end)
164 /* no line break, end of input, but some text left */
165 eol = end;
166 else
167 /* continue reading */
168 break;
718e3744 169
7526a182
DL
170 /* eol is at a line end now, either \n => \0 or \0\0\0 */
171 assert(eol && eol <= bufvalid);
718e3744 172
7526a182 173 if (fp)
2852de1c 174 {
7526a182
DL
175 fputs (buf, fp);
176 fputc ('\n', fp);
2852de1c 177 }
178 else
7526a182
DL
179 vtysh_config_parse_line (buf);
180
181 if (eol == end)
182 /* \n\0\0\0 */
183 break;
184
185 memmove (buf, eol, bufvalid - eol);
186 bufvalid -= eol - buf;
2d35a720
DL
187 if (end)
188 end -= eol - buf;
7526a182
DL
189 }
190
191 if (bufvalid == buf + bufsz)
192 {
193 char *new;
194 bufsz *= 2;
195 if (buf == stackbuf)
2852de1c 196 {
7526a182
DL
197 new = XMALLOC (MTYPE_TMP, bufsz);
198 memcpy (new, stackbuf, sizeof(stackbuf));
2852de1c 199 }
7526a182
DL
200 else
201 new = XREALLOC (MTYPE_TMP, buf, bufsz);
2852de1c 202
7526a182
DL
203 bufvalid = bufvalid - buf + new;
204 buf = new;
205 /* if end != NULL, we won't be reading more data... */
206 assert (end == NULL);
207 }
718e3744 208 }
7526a182
DL
209 while (!end);
210 goto out;
211
212out_err:
213 vclient_close (vclient);
214 ret = CMD_SUCCESS;
215out:
216 if (buf != stackbuf)
217 XFREE (MTYPE_TMP, buf);
218 return ret;
718e3744 219}
220
7c8ff89e 221static int
7526a182
DL
222vtysh_client_run_all (struct vtysh_client *head_client, const char *line,
223 int continue_on_err, FILE *fp)
7c8ff89e
DS
224{
225 struct vtysh_client *client;
7526a182 226 int rc, rc_all = CMD_SUCCESS;
7c8ff89e 227
7526a182 228 for (client = head_client; client; client = client->next)
7c8ff89e 229 {
7526a182 230 rc = vtysh_client_run(client, line, fp);
7c8ff89e 231 if (rc != CMD_SUCCESS)
7526a182
DL
232 {
233 if (!continue_on_err)
234 return rc;
235 rc_all = rc;
236 }
7c8ff89e 237 }
7526a182
DL
238 return rc_all;
239}
240
241static int
242vtysh_client_execute (struct vtysh_client *head_client, const char *line,
243 FILE *fp)
244{
245 return vtysh_client_run_all (head_client, line, 0, fp);
246}
247
248static void
249vtysh_client_config (struct vtysh_client *head_client, char *line)
250{
251 vtysh_client_run_all (head_client, line, 1, NULL);
7c8ff89e
DS
252}
253
718e3744 254void
b1aa147d 255vtysh_pager_init (void)
718e3744 256{
5a9c53de 257 char *pager_defined;
258
259 pager_defined = getenv ("VTYSH_PAGER");
260
261 if (pager_defined)
262 vtysh_pager_name = strdup (pager_defined);
263 else
34553cc3 264 vtysh_pager_name = strdup ("more");
718e3744 265}
266
267/* Command execution over the vty interface. */
57fb9748 268static int
dda09522 269vtysh_execute_func (const char *line, int pager)
718e3744 270{
2c4d48bc 271 int ret, cmd_stat;
b1aa147d 272 u_int i;
718e3744 273 vector vline;
274 struct cmd_element *cmd;
275 FILE *fp = NULL;
13bfca7a 276 int closepager = 0;
277 int tried = 0;
278 int saved_ret, saved_node;
718e3744 279
95e735b5 280 /* Split readline string up into the vector. */
718e3744 281 vline = cmd_make_strvec (line);
282
283 if (vline == NULL)
57fb9748 284 return CMD_SUCCESS;
718e3744 285
13bfca7a 286 saved_ret = ret = cmd_execute_command (vline, vty, &cmd, 1);
287 saved_node = vty->node;
288
289 /* If command doesn't succeeded in current node, try to walk up in node tree.
290 * Changing vty->node is enough to try it just out without actual walkup in
291 * the vtysh. */
292 while (ret != CMD_SUCCESS && ret != CMD_SUCCESS_DAEMON && ret != CMD_WARNING
293 && vty->node > CONFIG_NODE)
294 {
295 vty->node = node_parent(vty->node);
296 ret = cmd_execute_command (vline, vty, &cmd, 1);
297 tried++;
298 }
299
300 vty->node = saved_node;
301
302 /* If command succeeded in any other node than current (tried > 0) we have
303 * to move into node in the vtysh where it succeeded. */
304 if (ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON || ret == CMD_WARNING)
305 {
bb86c601 306 if ((saved_node == BGP_VPNV4_NODE || saved_node == BGP_VPNV6_NODE
8b1fb8be 307 || saved_node == BGP_ENCAP_NODE || saved_node == BGP_ENCAPV6_NODE
8ecd3266 308 || saved_node == BGP_IPV4_NODE
57b5b7ed 309 || saved_node == BGP_IPV6_NODE || saved_node == BGP_IPV4M_NODE
310 || saved_node == BGP_IPV6M_NODE)
13bfca7a 311 && (tried == 1))
312 {
313 vtysh_execute("exit-address-family");
314 }
65efcfce
LB
315 else if ((saved_node == BGP_VNC_DEFAULTS_NODE
316 || saved_node == BGP_VNC_NVE_GROUP_NODE
317 || saved_node == BGP_VNC_L2_GROUP_NODE) && (tried == 1))
318 {
319 vtysh_execute("exit-vnc");
320 }
13bfca7a 321 else if ((saved_node == KEYCHAIN_KEY_NODE) && (tried == 1))
322 {
323 vtysh_execute("exit");
324 }
325 else if (tried)
326 {
327 vtysh_execute ("end");
328 vtysh_execute ("configure terminal");
329 }
330 }
331 /* If command didn't succeed in any node, continue with return value from
332 * first try. */
333 else if (tried)
334 {
335 ret = saved_ret;
336 }
718e3744 337
338 cmd_free_strvec (vline);
339
2c4d48bc 340 cmd_stat = ret;
718e3744 341 switch (ret)
342 {
343 case CMD_WARNING:
344 if (vty->type == VTY_FILE)
4fc01e67 345 fprintf (stdout,"Warning...\n");
718e3744 346 break;
347 case CMD_ERR_AMBIGUOUS:
4fc01e67 348 fprintf (stdout,"%% Ambiguous command.\n");
718e3744 349 break;
350 case CMD_ERR_NO_MATCH:
4fc01e67 351 fprintf (stdout,"%% Unknown command.\n");
718e3744 352 break;
353 case CMD_ERR_INCOMPLETE:
4fc01e67 354 fprintf (stdout,"%% Command incomplete.\n");
718e3744 355 break;
356 case CMD_SUCCESS_DAEMON:
357 {
97b7db2d 358 /* FIXME: Don't open pager for exit commands. popen() causes problems
359 * if exited from vtysh at all. This hack shouldn't cause any problem
360 * but is really ugly. */
361 if (pager && vtysh_pager_name && (strncmp(line, "exit", 4) != 0))
718e3744 362 {
4fc01e67 363 fp = popen (vtysh_pager_name, "w");
718e3744 364 if (fp == NULL)
365 {
a805cc2d 366 perror ("popen failed for pager");
367 fp = stdout;
718e3744 368 }
a805cc2d 369 else
370 closepager=1;
718e3744 371 }
372 else
373 fp = stdout;
374
375 if (! strcmp(cmd->string,"configure terminal"))
376 {
837d16cc 377 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 378 {
379 cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
380 if (cmd_stat == CMD_WARNING)
381 break;
382 }
383
718e3744 384 if (cmd_stat)
385 {
b094d260 386 line = "end";
387 vline = cmd_make_strvec (line);
718e3744 388
b094d260 389 if (vline == NULL)
718e3744 390 {
a805cc2d 391 if (pager && vtysh_pager_name && fp && closepager)
718e3744 392 {
393 if (pclose (fp) == -1)
394 {
a805cc2d 395 perror ("pclose failed for pager");
718e3744 396 }
397 fp = NULL;
398 }
57fb9748 399 return CMD_SUCCESS;
718e3744 400 }
401
87d683b0 402 ret = cmd_execute_command (vline, vty, &cmd, 1);
b094d260 403 cmd_free_strvec (vline);
404 if (ret != CMD_SUCCESS_DAEMON)
405 break;
718e3744 406 }
407 else
408 if (cmd->func)
409 {
410 (*cmd->func) (cmd, vty, 0, NULL);
411 break;
b094d260 412 }
718e3744 413 }
414
b1aa147d 415 cmd_stat = CMD_SUCCESS;
837d16cc 416 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 417 {
418 if (cmd->daemon & vtysh_client[i].flag)
419 {
420 cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp);
421 if (cmd_stat != CMD_SUCCESS)
422 break;
423 }
424 }
425 if (cmd_stat != CMD_SUCCESS)
426 break;
427
718e3744 428 if (cmd->func)
429 (*cmd->func) (cmd, vty, 0, NULL);
430 }
431 }
a805cc2d 432 if (pager && vtysh_pager_name && fp && closepager)
718e3744 433 {
434 if (pclose (fp) == -1)
435 {
a805cc2d 436 perror ("pclose failed for pager");
718e3744 437 }
438 fp = NULL;
439 }
57fb9748 440 return cmd_stat;
718e3744 441}
442
57fb9748 443int
dda09522 444vtysh_execute_no_pager (const char *line)
718e3744 445{
57fb9748 446 return vtysh_execute_func (line, 0);
718e3744 447}
448
57fb9748 449int
dda09522 450vtysh_execute (const char *line)
718e3744 451{
57fb9748 452 return vtysh_execute_func (line, 1);
718e3744 453}
454
a5b89524
DW
455static char *
456trim (char *s)
457{
458 size_t size;
459 char *end;
460
461 size = strlen(s);
462
463 if (!size)
464 return s;
465
466 end = s + size - 1;
467 while (end >= s && isspace(*end))
468 end--;
469 *(end + 1) = '\0';
470
471 while (*s && isspace(*s))
472 s++;
473
474 return s;
475}
476
0846286b 477int
c0e8c16f 478vtysh_mark_file (const char *filename)
0846286b
DS
479{
480 struct vty *vty;
481 FILE *confp = NULL;
482 int ret;
483 vector vline;
484 int tried = 0;
485 struct cmd_element *cmd;
486 int saved_ret, prev_node;
487 int lineno = 0;
a5b89524
DW
488 char *vty_buf_copy = NULL;
489 char *vty_buf_trimmed = NULL;
0846286b
DS
490
491 if (strncmp("-", filename, 1) == 0)
492 confp = stdin;
493 else
494 confp = fopen (filename, "r");
495
496 if (confp == NULL)
1db63918
DS
497 {
498 fprintf (stderr, "%% Can't open config file %s due to '%s'.\n",
499 filename, safe_strerror (errno));
500 return (CMD_ERR_NO_FILE);
501 }
0846286b
DS
502
503 vty = vty_new ();
504 vty->fd = 0; /* stdout */
505 vty->type = VTY_TERM;
506 vty->node = CONFIG_NODE;
507
508 vtysh_execute_no_pager ("enable");
509 vtysh_execute_no_pager ("configure terminal");
4a1ab8e4 510 vty_buf_copy = XCALLOC (MTYPE_VTYSH_CMD, VTY_BUFSIZ);
0846286b
DS
511
512 while (fgets (vty->buf, VTY_BUFSIZ, confp))
513 {
514 lineno++;
515 tried = 0;
a5b89524
DW
516 strcpy(vty_buf_copy, vty->buf);
517 vty_buf_trimmed = trim(vty_buf_copy);
0846286b 518
a5b89524 519 if (vty_buf_trimmed[0] == '!' || vty_buf_trimmed[0] == '#')
0846286b
DS
520 {
521 fprintf(stdout, "%s", vty->buf);
522 continue;
523 }
524
525 /* Split readline string up into the vector. */
526 vline = cmd_make_strvec (vty->buf);
527
528 if (vline == NULL)
529 {
530 fprintf(stdout, "%s", vty->buf);
531 continue;
532 }
533
a5b89524
DW
534 /* Ignore the "end" lines, we will generate these where appropriate */
535 if (strlen(vty_buf_trimmed) == 3 && strncmp("end", vty_buf_trimmed, 3) == 0)
536 {
537 continue;
538 }
539
0846286b
DS
540 prev_node = vty->node;
541 saved_ret = ret = cmd_execute_command_strict (vline, vty, &cmd);
542
543 /* If command doesn't succeeded in current node, try to walk up in node tree.
544 * Changing vty->node is enough to try it just out without actual walkup in
545 * the vtysh. */
546 while (ret != CMD_SUCCESS && ret != CMD_SUCCESS_DAEMON && ret != CMD_WARNING
547 && vty->node > CONFIG_NODE)
548 {
549 vty->node = node_parent(vty->node);
550 ret = cmd_execute_command_strict (vline, vty, &cmd);
551 tried++;
552 }
553
554 /* If command succeeded in any other node than current (tried > 0) we have
555 * to move into node in the vtysh where it succeeded. */
556 if (ret == CMD_SUCCESS || ret == CMD_SUCCESS_DAEMON || ret == CMD_WARNING)
557 {
558 if ((prev_node == BGP_VPNV4_NODE || prev_node == BGP_IPV4_NODE
559 || prev_node == BGP_IPV6_NODE || prev_node == BGP_IPV4M_NODE
6407da5a 560 || prev_node == BGP_IPV6M_NODE || prev_node == BGP_VPNV6_NODE)
0846286b
DS
561 && (tried == 1))
562 {
563 fprintf(stdout, "exit-address-family\n");
564 }
565 else if ((prev_node == KEYCHAIN_KEY_NODE) && (tried == 1))
566 {
567 fprintf(stdout, "exit\n");
568 }
569 else if (tried)
570 {
571 fprintf(stdout, "end\n");
572 }
573 }
574 /* If command didn't succeed in any node, continue with return value from
575 * first try. */
576 else if (tried)
577 {
578 ret = saved_ret;
579 vty->node = prev_node;
580 }
581
582 cmd_free_strvec (vline);
583 switch (ret)
584 {
585 case CMD_WARNING:
586 if (vty->type == VTY_FILE)
587 fprintf (stderr,"line %d: Warning...: %s\n", lineno, vty->buf);
588 fclose(confp);
589 vty_close(vty);
4a1ab8e4 590 XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
1db63918 591 return CMD_WARNING;
0846286b
DS
592 case CMD_ERR_AMBIGUOUS:
593 fprintf (stderr,"line %d: %% Ambiguous command: %s\n", lineno, vty->buf);
594 fclose(confp);
595 vty_close(vty);
4a1ab8e4 596 XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
1db63918 597 return CMD_ERR_AMBIGUOUS;
0846286b
DS
598 case CMD_ERR_NO_MATCH:
599 fprintf (stderr,"line %d: %% Unknown command: %s\n", lineno, vty->buf);
600 fclose(confp);
601 vty_close(vty);
4a1ab8e4 602 XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
1db63918 603 return CMD_ERR_NO_MATCH;
0846286b
DS
604 case CMD_ERR_INCOMPLETE:
605 fprintf (stderr,"line %d: %% Command incomplete: %s\n", lineno, vty->buf);
606 fclose(confp);
607 vty_close(vty);
4a1ab8e4 608 XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
1db63918 609 return CMD_ERR_INCOMPLETE;
0846286b
DS
610 case CMD_SUCCESS:
611 fprintf(stdout, "%s", vty->buf);
612 break;
613 case CMD_SUCCESS_DAEMON:
614 {
615 u_int i;
616 int cmd_stat = CMD_SUCCESS;
617
618 fprintf(stdout, "%s", vty->buf);
619 for (i = 0; i < array_size(vtysh_client); i++)
620 {
621 if (cmd->daemon & vtysh_client[i].flag)
622 {
623 cmd_stat = vtysh_client_execute (&vtysh_client[i],
624 vty->buf, stdout);
625 if (cmd_stat != CMD_SUCCESS)
626 break;
627 }
628 }
629 if (cmd_stat != CMD_SUCCESS)
630 break;
631
632 if (cmd->func)
633 (*cmd->func) (cmd, vty, 0, NULL);
634 }
635 }
636 }
637 /* This is the end */
638 fprintf(stdout, "end\n");
639 vty_close(vty);
4a1ab8e4 640 XFREE(MTYPE_VTYSH_CMD, vty_buf_copy);
0846286b
DS
641
642 if (confp != stdin)
643 fclose(confp);
644
645 return (0);
646}
647
718e3744 648/* Configration make from file. */
3221dca8 649int
718e3744 650vtysh_config_from_file (struct vty *vty, FILE *fp)
651{
652 int ret;
718e3744 653 struct cmd_element *cmd;
9117f21e 654 int lineno = 0;
3221dca8 655 int retcode = CMD_SUCCESS;
718e3744 656
657 while (fgets (vty->buf, VTY_BUFSIZ, fp))
658 {
9117f21e 659 lineno++;
718e3744 660
bed578b8 661 ret = command_config_read_one_line (vty, &cmd, 1);
718e3744 662
663 switch (ret)
664 {
665 case CMD_WARNING:
666 if (vty->type == VTY_FILE)
1db63918
DS
667 fprintf (stderr,"line %d: Warning[%d]...: %s\n", lineno, vty->node, vty->buf);
668 retcode = CMD_WARNING; /* once we have an error, we remember & return that */
718e3744 669 break;
670 case CMD_ERR_AMBIGUOUS:
1db63918
DS
671 fprintf (stderr,"line %d: %% Ambiguous command[%d]: %s\n", lineno, vty->node, vty->buf);
672 retcode = CMD_ERR_AMBIGUOUS; /* once we have an error, we remember & return that */
718e3744 673 break;
674 case CMD_ERR_NO_MATCH:
1db63918
DS
675 fprintf (stderr,"line %d: %% Unknown command[%d]: %s", lineno, vty->node, vty->buf);
676 retcode = CMD_ERR_NO_MATCH; /* once we have an error, we remember & return that */
718e3744 677 break;
678 case CMD_ERR_INCOMPLETE:
1db63918
DS
679 fprintf (stderr,"line %d: %% Command incomplete[%d]: %s\n", lineno, vty->node, vty->buf);
680 retcode = CMD_ERR_INCOMPLETE; /* once we have an error, we remember & return that */
718e3744 681 break;
682 case CMD_SUCCESS_DAEMON:
683 {
b1aa147d 684 u_int i;
685 int cmd_stat = CMD_SUCCESS;
686
837d16cc 687 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 688 {
44316fef 689 if (cmd->daemon & vtysh_client[i].flag)
b1aa147d 690 {
691 cmd_stat = vtysh_client_execute (&vtysh_client[i],
692 vty->buf, stdout);
279c6956
DS
693 /*
694 * CMD_WARNING - Can mean that the command was
695 * parsed successfully but it was already entered
696 * in a few spots. As such if we receive a
697 * CMD_WARNING from a daemon we shouldn't stop
698 * talking to the other daemons for the particular
699 * command.
700 */
701 if (cmd_stat != CMD_SUCCESS && cmd_stat != CMD_WARNING)
1db63918
DS
702 {
703 fprintf (stderr, "line %d: Failure to communicate[%d] to %s, line: %s\n",
704 lineno, cmd_stat, vtysh_client[i].name, vty->buf);
705 break;
706 }
b1aa147d 707 }
708 }
709 if (cmd_stat != CMD_SUCCESS)
710 break;
711
718e3744 712 if (cmd->func)
713 (*cmd->func) (cmd, vty, 0, NULL);
714 }
715 }
716 }
3221dca8
DS
717
718 return (retcode);
718e3744 719}
720
721/* We don't care about the point of the cursor when '?' is typed. */
4201dd11 722static int
b1aa147d 723vtysh_rl_describe (void)
718e3744 724{
725 int ret;
dda09522 726 unsigned int i;
718e3744 727 vector vline;
728 vector describe;
729 int width;
cd40b329 730 struct cmd_token *token;
718e3744 731
732 vline = cmd_make_strvec (rl_line_buffer);
733
734 /* In case of '> ?'. */
735 if (vline == NULL)
736 {
737 vline = vector_init (1);
9f7d541a 738 vector_set (vline, NULL);
718e3744 739 }
740 else
741 if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
9f7d541a 742 vector_set (vline, NULL);
718e3744 743
744 describe = cmd_describe_command (vline, vty, &ret);
745
4fc01e67 746 fprintf (stdout,"\n");
718e3744 747
748 /* Ambiguous and no match error. */
749 switch (ret)
750 {
751 case CMD_ERR_AMBIGUOUS:
752 cmd_free_strvec (vline);
4fc01e67 753 fprintf (stdout,"%% Ambiguous command.\n");
718e3744 754 rl_on_new_line ();
755 return 0;
756 break;
757 case CMD_ERR_NO_MATCH:
758 cmd_free_strvec (vline);
4fc01e67 759 fprintf (stdout,"%% There is no matched command.\n");
718e3744 760 rl_on_new_line ();
761 return 0;
762 break;
763 }
764
765 /* Get width of command string. */
766 width = 0;
55468c86 767 for (i = 0; i < vector_active (describe); i++)
cd40b329 768 if ((token = vector_slot (describe, i)) != NULL)
718e3744 769 {
770 int len;
771
cd40b329 772 if (token->cmd[0] == '\0')
718e3744 773 continue;
774
cd40b329
CF
775 len = strlen (token->cmd);
776 if (token->cmd[0] == '.')
718e3744 777 len--;
778
779 if (width < len)
780 width = len;
781 }
782
55468c86 783 for (i = 0; i < vector_active (describe); i++)
cd40b329 784 if ((token = vector_slot (describe, i)) != NULL)
718e3744 785 {
cd40b329 786 if (token->cmd[0] == '\0')
718e3744 787 continue;
788
cd40b329 789 if (! token->desc)
4fc01e67 790 fprintf (stdout," %-s\n",
cd40b329 791 token->cmd[0] == '.' ? token->cmd + 1 : token->cmd);
718e3744 792 else
4fc01e67 793 fprintf (stdout," %-*s %s\n",
b094d260 794 width,
cd40b329
CF
795 token->cmd[0] == '.' ? token->cmd + 1 : token->cmd,
796 token->desc);
718e3744 797 }
798
799 cmd_free_strvec (vline);
800 vector_free (describe);
801
802 rl_on_new_line();
803
804 return 0;
805}
806
95e735b5 807/* Result of cmd_complete_command() call will be stored here
808 * and used in new_completion() in order to put the space in
809 * correct places only. */
718e3744 810int complete_status;
811
274a4a44 812static char *
dfc0d9ba 813command_generator (const char *text, int state)
718e3744 814{
815 vector vline;
816 static char **matched = NULL;
817 static int index = 0;
818
819 /* First call. */
820 if (! state)
821 {
822 index = 0;
823
824 if (vty->node == AUTH_NODE || vty->node == AUTH_ENABLE_NODE)
825 return NULL;
826
827 vline = cmd_make_strvec (rl_line_buffer);
828 if (vline == NULL)
829 return NULL;
830
831 if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
9f7d541a 832 vector_set (vline, NULL);
718e3744 833
039dc612
QY
834 if (matched)
835 XFREE (MTYPE_TMP, matched);
718e3744 836 matched = cmd_complete_command (vline, vty, &complete_status);
039dc612 837 cmd_free_strvec (vline);
718e3744 838 }
839
840 if (matched && matched[index])
841 return matched[index++];
842
843 return NULL;
844}
845
274a4a44 846static char **
718e3744 847new_completion (char *text, int start, int end)
848{
849 char **matches;
850
dfc0d9ba 851 matches = rl_completion_matches (text, command_generator);
718e3744 852
853 if (matches)
854 {
855 rl_point = rl_end;
67e7a212
CF
856 if (complete_status != CMD_COMPLETE_FULL_MATCH)
857 /* only append a space on full match */
858 rl_completion_append_character = '\0';
718e3744 859 }
860
861 return matches;
862}
863
95e735b5 864/* Vty node structures. */
7fc626de 865static struct cmd_node bgp_node =
718e3744 866{
867 BGP_NODE,
868 "%s(config-router)# ",
869};
870
7fc626de 871static struct cmd_node rip_node =
718e3744 872{
873 RIP_NODE,
874 "%s(config-router)# ",
875};
876
7fc626de 877static struct cmd_node isis_node =
c25e458a 878{
879 ISIS_NODE,
880 "%s(config-router)# ",
c25e458a 881};
882
7fc626de 883static struct cmd_node interface_node =
718e3744 884{
885 INTERFACE_NODE,
886 "%s(config-if)# ",
887};
888
13460c44
FL
889static struct cmd_node ns_node =
890{
891 NS_NODE,
892 "%s(config-logical-router)# ",
893};
894
e9d94ea7
DS
895static struct cmd_node vrf_node =
896{
897 VRF_NODE,
898 "%s(config-vrf)# ",
899};
900
7fc626de 901static struct cmd_node rmap_node =
95e735b5 902{
903 RMAP_NODE,
904 "%s(config-route-map)# "
905};
906
7fc626de 907static struct cmd_node zebra_node =
95e735b5 908{
909 ZEBRA_NODE,
910 "%s(config-router)# "
911};
912
7fc626de 913static struct cmd_node bgp_vpnv4_node =
95e735b5 914{
915 BGP_VPNV4_NODE,
916 "%s(config-router-af)# "
917};
918
8ecd3266 919static struct cmd_node bgp_vpnv6_node =
920{
921 BGP_VPNV6_NODE,
922 "%s(config-router-af)# "
923};
924
8b1fb8be
LB
925static struct cmd_node bgp_encap_node =
926{
927 BGP_ENCAP_NODE,
928 "%s(config-router-af)# "
929};
930
931static struct cmd_node bgp_encapv6_node =
932{
933 BGP_ENCAPV6_NODE,
934 "%s(config-router-af)# "
935};
936
7fc626de 937static struct cmd_node bgp_ipv4_node =
95e735b5 938{
939 BGP_IPV4_NODE,
940 "%s(config-router-af)# "
941};
942
7fc626de 943static struct cmd_node bgp_ipv4m_node =
95e735b5 944{
945 BGP_IPV4M_NODE,
946 "%s(config-router-af)# "
947};
948
7fc626de 949static struct cmd_node bgp_ipv6_node =
95e735b5 950{
951 BGP_IPV6_NODE,
952 "%s(config-router-af)# "
953};
954
7fc626de 955static struct cmd_node bgp_ipv6m_node =
57b5b7ed 956{
957 BGP_IPV6M_NODE,
958 "%s(config-router-af)# "
959};
960
65efcfce
LB
961static struct cmd_node bgp_vnc_defaults_node =
962{
963 BGP_VNC_DEFAULTS_NODE,
964 "%s(config-router-vnc-defaults)# "
965};
966
967static struct cmd_node bgp_vnc_nve_group_node =
968{
969 BGP_VNC_NVE_GROUP_NODE,
970 "%s(config-router-vnc-nve-group)# "
971};
972
973static struct cmd_node bgp_vnc_l2_group_node =
974{
975 BGP_VNC_L2_GROUP_NODE,
976 "%s(config-router-vnc-l2-group)# "
977};
978
7fc626de 979static struct cmd_node ospf_node =
95e735b5 980{
981 OSPF_NODE,
982 "%s(config-router)# "
983};
984
7fc626de 985static struct cmd_node ripng_node =
95e735b5 986{
987 RIPNG_NODE,
988 "%s(config-router)# "
989};
990
7fc626de 991static struct cmd_node ospf6_node =
95e735b5 992{
993 OSPF6_NODE,
994 "%s(config-ospf6)# "
995};
996
4fcbf6e2
RW
997static struct cmd_node ldp_node =
998{
999 LDP_NODE,
1000 "%s(config-ldp)# "
1001};
1002
1003static struct cmd_node ldp_ipv4_node =
1004{
1005 LDP_IPV4_NODE,
1006 "%s(config-ldp-af)# "
1007};
1008
1009static struct cmd_node ldp_ipv6_node =
1010{
1011 LDP_IPV6_NODE,
1012 "%s(config-ldp-af)# "
1013};
1014
1015static struct cmd_node ldp_ipv4_iface_node =
1016{
1017 LDP_IPV4_IFACE_NODE,
1018 "%s(config-ldp-af-if)# "
1019};
1020
1021static struct cmd_node ldp_ipv6_iface_node =
1022{
1023 LDP_IPV6_IFACE_NODE,
1024 "%s(config-ldp-af-if)# "
1025};
1026
1027static struct cmd_node ldp_l2vpn_node =
1028{
1029 LDP_L2VPN_NODE,
1030 "%s(config-l2vpn)# "
1031};
1032
1033static struct cmd_node ldp_pseudowire_node =
1034{
1035 LDP_PSEUDOWIRE_NODE,
1036 "%s(config-l2vpn-pw)# "
1037};
1038
7fc626de 1039static struct cmd_node keychain_node =
95e735b5 1040{
1041 KEYCHAIN_NODE,
1042 "%s(config-keychain)# "
1043};
1044
7fc626de 1045static struct cmd_node keychain_key_node =
95e735b5 1046{
1047 KEYCHAIN_KEY_NODE,
1048 "%s(config-keychain-key)# "
1049};
1050
16f1b9ee
OD
1051struct cmd_node link_params_node =
1052{
1053 LINK_PARAMS_NODE,
1054 "%s(config-link-params)# ",
1055};
1056
e7168df4 1057/* Defined in lib/vty.c */
1058extern struct cmd_node vty_node;
1059
95e735b5 1060/* When '^Z' is received from vty, move down to the enable mode. */
4201dd11 1061static int
b1aa147d 1062vtysh_end (void)
95e735b5 1063{
1064 switch (vty->node)
1065 {
1066 case VIEW_NODE:
1067 case ENABLE_NODE:
1068 /* Nothing to do. */
1069 break;
1070 default:
1071 vty->node = ENABLE_NODE;
1072 break;
1073 }
1074 return CMD_SUCCESS;
1075}
1076
4a96e944 1077DEFUNSH (VTYSH_REALLYALL,
95e735b5 1078 vtysh_end_all,
1079 vtysh_end_all_cmd,
1080 "end",
e7168df4 1081 "End current mode and change to enable mode\n")
95e735b5 1082{
4289546d 1083 return vtysh_end ();
95e735b5 1084}
1085
718e3744 1086DEFUNSH (VTYSH_BGPD,
1087 router_bgp,
1088 router_bgp_cmd,
320da874 1089 "router bgp " CMD_AS_RANGE,
718e3744 1090 ROUTER_STR
1091 BGP_STR
1092 AS_STR)
1093{
1094 vty->node = BGP_NODE;
1095 return CMD_SUCCESS;
1096}
1097
2385a876
DW
1098ALIAS_SH (VTYSH_BGPD,
1099 router_bgp,
1100 router_bgp_asn_cmd,
1101 "router bgp",
1102 ROUTER_STR
1103 BGP_STR)
1104
10895fd6
PJ
1105ALIAS_SH (VTYSH_BGPD,
1106 router_bgp,
1107 router_bgp_view_cmd,
e9d94ea7 1108 "router bgp " CMD_AS_RANGE " (view|vrf) WORD",
10895fd6
PJ
1109 ROUTER_STR
1110 BGP_STR
1111 AS_STR
e9d94ea7
DS
1112 "BGP view\nBGP VRF\n"
1113 "View/VRF name\n")
10895fd6 1114
718e3744 1115DEFUNSH (VTYSH_BGPD,
1116 address_family_vpnv4,
1117 address_family_vpnv4_cmd,
1118 "address-family vpnv4",
1119 "Enter Address Family command mode\n"
1120 "Address family\n")
1121{
1122 vty->node = BGP_VPNV4_NODE;
1123 return CMD_SUCCESS;
1124}
1125
1126DEFUNSH (VTYSH_BGPD,
1127 address_family_vpnv4_unicast,
1128 address_family_vpnv4_unicast_cmd,
1129 "address-family vpnv4 unicast",
1130 "Enter Address Family command mode\n"
1131 "Address family\n"
1132 "Address Family Modifier\n")
1133{
1134 vty->node = BGP_VPNV4_NODE;
1135 return CMD_SUCCESS;
1136}
1137
8ecd3266 1138DEFUNSH (VTYSH_BGPD,
1139 address_family_vpnv6,
1140 address_family_vpnv6_cmd,
1141 "address-family vpnv6",
1142 "Enter Address Family command mode\n"
1143 "Address family\n")
1144{
1145 vty->node = BGP_VPNV6_NODE;
1146 return CMD_SUCCESS;
1147}
1148
1149DEFUNSH (VTYSH_BGPD,
1150 address_family_vpnv6_unicast,
1151 address_family_vpnv6_unicast_cmd,
1152 "address-family vpnv6 unicast",
1153 "Enter Address Family command mode\n"
1154 "Address family\n"
1155 "Address Family Modifier\n")
1156{
1157 vty->node = BGP_VPNV6_NODE;
1158 return CMD_SUCCESS;
1159}
1160
8b1fb8be
LB
1161DEFUNSH (VTYSH_BGPD,
1162 address_family_encap,
1163 address_family_encap_cmd,
1164 "address-family encap",
1165 "Enter Address Family command mode\n"
1166 "Address family\n")
1167{
1168 vty->node = BGP_ENCAP_NODE;
1169 return CMD_SUCCESS;
1170}
1171
1172DEFUNSH (VTYSH_BGPD,
1173 address_family_encapv4,
1174 address_family_encapv4_cmd,
1175 "address-family encapv4",
1176 "Enter Address Family command mode\n"
1177 "Address family\n")
1178{
1179 vty->node = BGP_ENCAP_NODE;
1180 return CMD_SUCCESS;
1181}
1182
1183DEFUNSH (VTYSH_BGPD,
1184 address_family_encapv6,
1185 address_family_encapv6_cmd,
1186 "address-family encapv6",
1187 "Enter Address Family command mode\n"
1188 "Address family\n")
1189{
1190 vty->node = BGP_ENCAPV6_NODE;
1191 return CMD_SUCCESS;
1192}
1193
718e3744 1194DEFUNSH (VTYSH_BGPD,
1195 address_family_ipv4_unicast,
1196 address_family_ipv4_unicast_cmd,
1197 "address-family ipv4 unicast",
1198 "Enter Address Family command mode\n"
1199 "Address family\n"
1200 "Address Family Modifier\n")
1201{
1202 vty->node = BGP_IPV4_NODE;
1203 return CMD_SUCCESS;
1204}
1205
1206DEFUNSH (VTYSH_BGPD,
1207 address_family_ipv4_multicast,
1208 address_family_ipv4_multicast_cmd,
1209 "address-family ipv4 multicast",
1210 "Enter Address Family command mode\n"
1211 "Address family\n"
1212 "Address Family Modifier\n")
1213{
1214 vty->node = BGP_IPV4M_NODE;
1215 return CMD_SUCCESS;
1216}
1217
1218DEFUNSH (VTYSH_BGPD,
1219 address_family_ipv6,
1220 address_family_ipv6_cmd,
1221 "address-family ipv6",
1222 "Enter Address Family command mode\n"
1223 "Address family\n")
1224{
1225 vty->node = BGP_IPV6_NODE;
1226 return CMD_SUCCESS;
1227}
1228
1229DEFUNSH (VTYSH_BGPD,
1230 address_family_ipv6_unicast,
1231 address_family_ipv6_unicast_cmd,
1232 "address-family ipv6 unicast",
1233 "Enter Address Family command mode\n"
1234 "Address family\n"
1235 "Address Family Modifier\n")
1236{
1237 vty->node = BGP_IPV6_NODE;
1238 return CMD_SUCCESS;
1239}
1240
57b5b7ed 1241DEFUNSH (VTYSH_BGPD,
1242 address_family_ipv6_multicast,
1243 address_family_ipv6_multicast_cmd,
1244 "address-family ipv6 multicast",
1245 "Enter Address Family command mode\n"
1246 "Address family\n"
1247 "Address Family Modifier\n")
1248{
1249 vty->node = BGP_IPV6M_NODE;
1250 return CMD_SUCCESS;
1251}
1252
87ab4aec 1253#if defined (ENABLE_BGP_VNC)
65efcfce
LB
1254DEFUNSH (VTYSH_BGPD,
1255 vnc_defaults,
1256 vnc_defaults_cmd,
1257 "vnc defaults",
1258 "VNC/RFP related configuration\n"
1259 "Configure default NVE group\n")
1260{
1261 vty->node = BGP_VNC_DEFAULTS_NODE;
1262 return CMD_SUCCESS;
1263}
1264
1265DEFUNSH (VTYSH_BGPD,
1266 vnc_nve_group,
1267 vnc_nve_group_cmd,
1268 "vnc nve-group NAME",
1269 "VNC/RFP related configuration\n"
1270 "Configure a NVE group\n"
1271 "Group name\n")
1272{
1273 vty->node = BGP_VNC_NVE_GROUP_NODE;
1274 return CMD_SUCCESS;
1275}
1276
1277DEFUNSH (VTYSH_BGPD,
1278 vnc_l2_group,
1279 vnc_l2_group_cmd,
1280 "vnc l2-group NAME",
1281 "VNC/RFP related configuration\n"
1282 "Configure a L2 group\n"
1283 "Group name\n")
1284{
1285 vty->node = BGP_VNC_L2_GROUP_NODE;
1286 return CMD_SUCCESS;
1287}
87ab4aec 1288#endif
65efcfce 1289
718e3744 1290DEFUNSH (VTYSH_RIPD,
1291 key_chain,
1292 key_chain_cmd,
1293 "key chain WORD",
1294 "Authentication key management\n"
1295 "Key-chain management\n"
1296 "Key-chain name\n")
1297{
1298 vty->node = KEYCHAIN_NODE;
1299 return CMD_SUCCESS;
1300}
1301
1302DEFUNSH (VTYSH_RIPD,
1303 key,
1304 key_cmd,
1305 "key <0-2147483647>",
1306 "Configure a key\n"
1307 "Key identifier number\n")
1308{
1309 vty->node = KEYCHAIN_KEY_NODE;
1310 return CMD_SUCCESS;
1311}
1312
1313DEFUNSH (VTYSH_RIPD,
1314 router_rip,
1315 router_rip_cmd,
1316 "router rip",
1317 ROUTER_STR
1318 "RIP")
1319{
1320 vty->node = RIP_NODE;
1321 return CMD_SUCCESS;
1322}
1323
1324DEFUNSH (VTYSH_RIPNGD,
1325 router_ripng,
1326 router_ripng_cmd,
1327 "router ripng",
1328 ROUTER_STR
1329 "RIPng")
1330{
1331 vty->node = RIPNG_NODE;
1332 return CMD_SUCCESS;
1333}
1334
1335DEFUNSH (VTYSH_OSPFD,
1336 router_ospf,
1337 router_ospf_cmd,
1338 "router ospf",
1339 "Enable a routing process\n"
1340 "Start OSPF configuration\n")
1341{
1342 vty->node = OSPF_NODE;
1343 return CMD_SUCCESS;
1344}
1345
7c8ff89e
DS
1346ALIAS_SH (VTYSH_OSPFD,
1347 router_ospf,
1348 router_ospf_instance_cmd,
1349 "router ospf <1-65535>",
1350 "Enable a routing process\n"
1351 "Start OSPF configuration\n"
1352 "Instance ID\n")
1353
718e3744 1354DEFUNSH (VTYSH_OSPF6D,
1355 router_ospf6,
1356 router_ospf6_cmd,
1357 "router ospf6",
1358 OSPF6_ROUTER_STR
1359 OSPF6_STR)
1360{
1361 vty->node = OSPF6_NODE;
1362 return CMD_SUCCESS;
1363}
1364
87ab4aec 1365#if defined (HAVE_LDPD)
4fcbf6e2
RW
1366DEFUNSH (VTYSH_LDPD,
1367 ldp_mpls_ldp,
1368 ldp_mpls_ldp_cmd,
1369 "mpls ldp",
1370 "Global MPLS configuration subcommands\n"
1371 "Label Distribution Protocol\n")
1372{
1373 vty->node = LDP_NODE;
1374 return CMD_SUCCESS;
1375}
1376
1377DEFUNSH (VTYSH_LDPD,
1378 ldp_address_family_ipv4,
1379 ldp_address_family_ipv4_cmd,
1380 "address-family ipv4",
1381 "Configure Address Family and its parameters\n"
1382 "IPv4\n")
1383{
1384 vty->node = LDP_IPV4_NODE;
1385 return CMD_SUCCESS;
1386}
1387
1388DEFUNSH (VTYSH_LDPD,
1389 ldp_address_family_ipv6,
1390 ldp_address_family_ipv6_cmd,
1391 "address-family ipv6",
1392 "Configure Address Family and its parameters\n"
1393 "IPv6\n")
1394{
1395 vty->node = LDP_IPV6_NODE;
1396 return CMD_SUCCESS;
1397}
1398
1399DEFUNSH (VTYSH_LDPD,
1400 ldp_interface_ifname,
1401 ldp_interface_ifname_cmd,
1402 "interface IFNAME",
1403 "Enable LDP on an interface and enter interface submode\n"
1404 "Interface's name\n")
1405{
1406 switch (vty->node)
1407 {
1408 case LDP_IPV4_NODE:
1409 vty->node = LDP_IPV4_IFACE_NODE;
1410 break;
1411 case LDP_IPV6_NODE:
1412 vty->node = LDP_IPV6_IFACE_NODE;
1413 break;
1414 default:
1415 break;
1416 }
1417
1418 return CMD_SUCCESS;
1419}
1420
1421DEFUNSH (VTYSH_LDPD,
1422 ldp_l2vpn_word_type_vpls,
1423 ldp_l2vpn_word_type_vpls_cmd,
1424 "l2vpn WORD type vpls",
1425 "Configure l2vpn commands\n"
1426 "L2VPN name\n"
1427 "L2VPN type\n"
1428 "Virtual Private LAN Service\n")
1429{
1430 vty->node = LDP_L2VPN_NODE;
1431 return CMD_SUCCESS;
1432}
1433
1434DEFUNSH (VTYSH_LDPD,
1435 ldp_member_pseudowire_ifname,
1436 ldp_member_pseudowire_ifname_cmd,
1437 "member pseudowire IFNAME",
1438 "L2VPN member configuration\n"
1439 "Pseudowire interface\n"
1440 "Interface's name\n")
1441{
1442 vty->node = LDP_PSEUDOWIRE_NODE;
1443 return CMD_SUCCESS;
1444}
87ab4aec 1445#endif
4fcbf6e2 1446
c25e458a 1447DEFUNSH (VTYSH_ISISD,
b094d260 1448 router_isis,
1449 router_isis_cmd,
1450 "router isis WORD",
1451 ROUTER_STR
1452 "ISO IS-IS\n"
1453 "ISO Routing area tag")
c25e458a 1454{
1455 vty->node = ISIS_NODE;
1456 return CMD_SUCCESS;
1457}
1458
718e3744 1459DEFUNSH (VTYSH_RMAP,
c43ac31c
DS
1460 vtysh_route_map,
1461 vtysh_route_map_cmd,
718e3744 1462 "route-map WORD (deny|permit) <1-65535>",
1463 "Create route-map or enter route-map command mode\n"
1464 "Route map tag\n"
1465 "Route map denies set operations\n"
1466 "Route map permits set operations\n"
1467 "Sequence to insert to/delete from existing route-map entry\n")
1468{
1469 vty->node = RMAP_NODE;
1470 return CMD_SUCCESS;
1471}
1472
e7168df4 1473DEFUNSH (VTYSH_ALL,
1474 vtysh_line_vty,
1475 vtysh_line_vty_cmd,
1476 "line vty",
1477 "Configure a terminal line\n"
1478 "Virtual terminal\n")
1479{
1480 vty->node = VTY_NODE;
1481 return CMD_SUCCESS;
1482}
1483
4a96e944
DL
1484DEFUNSH (VTYSH_REALLYALL,
1485 vtysh_enable,
718e3744 1486 vtysh_enable_cmd,
1487 "enable",
1488 "Turn on privileged mode command\n")
1489{
1490 vty->node = ENABLE_NODE;
1491 return CMD_SUCCESS;
1492}
1493
4a96e944
DL
1494DEFUNSH (VTYSH_REALLYALL,
1495 vtysh_disable,
718e3744 1496 vtysh_disable_cmd,
1497 "disable",
1498 "Turn off privileged mode command\n")
1499{
1500 if (vty->node == ENABLE_NODE)
1501 vty->node = VIEW_NODE;
1502 return CMD_SUCCESS;
1503}
1504
4a96e944 1505DEFUNSH (VTYSH_REALLYALL,
718e3744 1506 vtysh_config_terminal,
1507 vtysh_config_terminal_cmd,
1508 "configure terminal",
1509 "Configuration from vty interface\n"
1510 "Configuration terminal\n")
1511{
1512 vty->node = CONFIG_NODE;
1513 return CMD_SUCCESS;
1514}
1515
274a4a44 1516static int
718e3744 1517vtysh_exit (struct vty *vty)
1518{
1519 switch (vty->node)
1520 {
1521 case VIEW_NODE:
1522 case ENABLE_NODE:
1523 exit (0);
1524 break;
1525 case CONFIG_NODE:
1526 vty->node = ENABLE_NODE;
1527 break;
1528 case INTERFACE_NODE:
13460c44 1529 case NS_NODE:
e9d94ea7 1530 case VRF_NODE:
718e3744 1531 case ZEBRA_NODE:
1532 case BGP_NODE:
1533 case RIP_NODE:
1534 case RIPNG_NODE:
1535 case OSPF_NODE:
1536 case OSPF6_NODE:
4fcbf6e2
RW
1537 case LDP_NODE:
1538 case LDP_L2VPN_NODE:
c25e458a 1539 case ISIS_NODE:
718e3744 1540 case MASC_NODE:
1541 case RMAP_NODE:
1542 case VTY_NODE:
1543 case KEYCHAIN_NODE:
2a56df97 1544 vtysh_execute("end");
1545 vtysh_execute("configure terminal");
718e3744 1546 vty->node = CONFIG_NODE;
1547 break;
1548 case BGP_VPNV4_NODE:
8ecd3266 1549 case BGP_VPNV6_NODE:
8b1fb8be
LB
1550 case BGP_ENCAP_NODE:
1551 case BGP_ENCAPV6_NODE:
718e3744 1552 case BGP_IPV4_NODE:
1553 case BGP_IPV4M_NODE:
1554 case BGP_IPV6_NODE:
57b5b7ed 1555 case BGP_IPV6M_NODE:
65efcfce
LB
1556 case BGP_VNC_DEFAULTS_NODE:
1557 case BGP_VNC_NVE_GROUP_NODE:
1558 case BGP_VNC_L2_GROUP_NODE:
718e3744 1559 vty->node = BGP_NODE;
1560 break;
4fcbf6e2
RW
1561 case LDP_IPV4_NODE:
1562 case LDP_IPV6_NODE:
1563 vty->node = LDP_NODE;
1564 break;
1565 case LDP_IPV4_IFACE_NODE:
1566 vty->node = LDP_IPV4_NODE;
1567 break;
1568 case LDP_IPV6_IFACE_NODE:
1569 vty->node = LDP_IPV6_NODE;
1570 break;
1571 case LDP_PSEUDOWIRE_NODE:
1572 vty->node = LDP_L2VPN_NODE;
1573 break;
718e3744 1574 case KEYCHAIN_KEY_NODE:
1575 vty->node = KEYCHAIN_NODE;
1576 break;
16f1b9ee
OD
1577 case LINK_PARAMS_NODE:
1578 vty->node = INTERFACE_NODE;
1579 break;
718e3744 1580 default:
1581 break;
1582 }
1583 return CMD_SUCCESS;
1584}
1585
4a96e944 1586DEFUNSH (VTYSH_REALLYALL,
718e3744 1587 vtysh_exit_all,
1588 vtysh_exit_all_cmd,
1589 "exit",
1590 "Exit current mode and down to previous mode\n")
1591{
1592 return vtysh_exit (vty);
1593}
1594
1595ALIAS (vtysh_exit_all,
1596 vtysh_quit_all_cmd,
1597 "quit",
1598 "Exit current mode and down to previous mode\n")
1599
1600DEFUNSH (VTYSH_BGPD,
1601 exit_address_family,
1602 exit_address_family_cmd,
1603 "exit-address-family",
1604 "Exit from Address Family configuration mode\n")
1605{
1606 if (vty->node == BGP_IPV4_NODE
1607 || vty->node == BGP_IPV4M_NODE
1608 || vty->node == BGP_VPNV4_NODE
8ecd3266 1609 || vty->node == BGP_VPNV6_NODE
8b1fb8be
LB
1610 || vty->node == BGP_ENCAP_NODE
1611 || vty->node == BGP_ENCAPV6_NODE
57b5b7ed 1612 || vty->node == BGP_IPV6_NODE
1613 || vty->node == BGP_IPV6M_NODE)
718e3744 1614 vty->node = BGP_NODE;
1615 return CMD_SUCCESS;
1616}
1617
65efcfce
LB
1618DEFUNSH (VTYSH_BGPD,
1619 exit_vnc_config,
1620 exit_vnc_config_cmd,
1621 "exit-vnc",
1622 "Exit from VNC configuration mode\n")
1623{
1624 if (vty->node == BGP_VNC_DEFAULTS_NODE
1625 || vty->node == BGP_VNC_NVE_GROUP_NODE
1626 || vty->node == BGP_VNC_L2_GROUP_NODE)
1627 vty->node = BGP_NODE;
1628 return CMD_SUCCESS;
1629}
1630
718e3744 1631DEFUNSH (VTYSH_ZEBRA,
1632 vtysh_exit_zebra,
1633 vtysh_exit_zebra_cmd,
1634 "exit",
1635 "Exit current mode and down to previous mode\n")
1636{
1637 return vtysh_exit (vty);
1638}
1639
1640ALIAS (vtysh_exit_zebra,
1641 vtysh_quit_zebra_cmd,
1642 "quit",
1643 "Exit current mode and down to previous mode\n")
1644
1645DEFUNSH (VTYSH_RIPD,
1646 vtysh_exit_ripd,
1647 vtysh_exit_ripd_cmd,
1648 "exit",
1649 "Exit current mode and down to previous mode\n")
1650{
1651 return vtysh_exit (vty);
1652}
1653
1654ALIAS (vtysh_exit_ripd,
1655 vtysh_quit_ripd_cmd,
1656 "quit",
1657 "Exit current mode and down to previous mode\n")
1658
68980084 1659DEFUNSH (VTYSH_RIPNGD,
b094d260 1660 vtysh_exit_ripngd,
1661 vtysh_exit_ripngd_cmd,
1662 "exit",
1663 "Exit current mode and down to previous mode\n")
68980084 1664{
1665 return vtysh_exit (vty);
1666}
1667
1668ALIAS (vtysh_exit_ripngd,
1669 vtysh_quit_ripngd_cmd,
1670 "quit",
1671 "Exit current mode and down to previous mode\n")
1672
718e3744 1673DEFUNSH (VTYSH_RMAP,
1674 vtysh_exit_rmap,
1675 vtysh_exit_rmap_cmd,
1676 "exit",
1677 "Exit current mode and down to previous mode\n")
1678{
1679 return vtysh_exit (vty);
1680}
1681
1682ALIAS (vtysh_exit_rmap,
1683 vtysh_quit_rmap_cmd,
1684 "quit",
1685 "Exit current mode and down to previous mode\n")
1686
1687DEFUNSH (VTYSH_BGPD,
1688 vtysh_exit_bgpd,
1689 vtysh_exit_bgpd_cmd,
1690 "exit",
1691 "Exit current mode and down to previous mode\n")
1692{
1693 return vtysh_exit (vty);
1694}
1695
1696ALIAS (vtysh_exit_bgpd,
1697 vtysh_quit_bgpd_cmd,
1698 "quit",
1699 "Exit current mode and down to previous mode\n")
1700
1701DEFUNSH (VTYSH_OSPFD,
1702 vtysh_exit_ospfd,
1703 vtysh_exit_ospfd_cmd,
1704 "exit",
1705 "Exit current mode and down to previous mode\n")
1706{
1707 return vtysh_exit (vty);
1708}
1709
1710ALIAS (vtysh_exit_ospfd,
1711 vtysh_quit_ospfd_cmd,
1712 "quit",
1713 "Exit current mode and down to previous mode\n")
1714
68980084 1715DEFUNSH (VTYSH_OSPF6D,
b094d260 1716 vtysh_exit_ospf6d,
1717 vtysh_exit_ospf6d_cmd,
1718 "exit",
1719 "Exit current mode and down to previous mode\n")
68980084 1720{
1721 return vtysh_exit (vty);
1722}
1723
1724ALIAS (vtysh_exit_ospf6d,
1725 vtysh_quit_ospf6d_cmd,
1726 "quit",
1727 "Exit current mode and down to previous mode\n")
1728
87ab4aec 1729#if defined (HAVE_LDPD)
4fcbf6e2
RW
1730DEFUNSH (VTYSH_LDPD,
1731 vtysh_exit_ldpd,
1732 vtysh_exit_ldpd_cmd,
1733 "exit",
1734 "Exit current mode and down to previous mode\n")
1735{
1736 return vtysh_exit (vty);
1737}
1738
1739ALIAS (vtysh_exit_ldpd,
1740 vtysh_quit_ldpd_cmd,
1741 "quit",
1742 "Exit current mode and down to previous mode\n")
87ab4aec 1743#endif
4fcbf6e2 1744
c25e458a 1745DEFUNSH (VTYSH_ISISD,
b094d260 1746 vtysh_exit_isisd,
1747 vtysh_exit_isisd_cmd,
1748 "exit",
1749 "Exit current mode and down to previous mode\n")
c25e458a 1750{
1751 return vtysh_exit (vty);
1752}
1753
1754ALIAS (vtysh_exit_isisd,
1755 vtysh_quit_isisd_cmd,
1756 "quit",
1757 "Exit current mode and down to previous mode\n")
1758
e7168df4 1759DEFUNSH (VTYSH_ALL,
1760 vtysh_exit_line_vty,
1761 vtysh_exit_line_vty_cmd,
1762 "exit",
1763 "Exit current mode and down to previous mode\n")
1764{
1765 return vtysh_exit (vty);
1766}
1767
1768ALIAS (vtysh_exit_line_vty,
1769 vtysh_quit_line_vty_cmd,
1770 "quit",
1771 "Exit current mode and down to previous mode\n")
1772
95e735b5 1773DEFUNSH (VTYSH_INTERFACE,
718e3744 1774 vtysh_interface,
1775 vtysh_interface_cmd,
1776 "interface IFNAME",
1777 "Select an interface to configure\n"
1778 "Interface's name\n")
1779{
1780 vty->node = INTERFACE_NODE;
1781 return CMD_SUCCESS;
1782}
1783
cd2a8a42
FL
1784ALIAS_SH (VTYSH_ZEBRA,
1785 vtysh_interface,
1786 vtysh_interface_vrf_cmd,
1787 "interface IFNAME " VRF_CMD_STR,
1788 "Select an interface to configure\n"
e9d94ea7
DS
1789 "Interface's name\n"
1790 VRF_CMD_HELP_STR)
cd2a8a42 1791
95e735b5 1792/* TODO Implement "no interface command in isisd. */
4fcbf6e2 1793DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_LDPD,
32d2463c 1794 vtysh_no_interface_cmd,
1795 "no interface IFNAME",
1796 NO_STR
1797 "Delete a pseudo interface's configuration\n"
1798 "Interface's name\n")
1799
cd2a8a42
FL
1800DEFSH (VTYSH_ZEBRA,
1801 vtysh_no_interface_vrf_cmd,
1802 "no interface IFNAME " VRF_CMD_STR,
1803 NO_STR
1804 "Delete a pseudo interface's configuration\n"
1805 "Interface's name\n"
1806 VRF_CMD_HELP_STR)
1807
13460c44
FL
1808DEFUNSH (VTYSH_NS,
1809 vtysh_ns,
1810 vtysh_ns_cmd,
1811 "logical-router <1-65535 ns NAME",
1812 "Enable a logical-router\n"
1813 "Specify the logical-router indentifier\n"
1814 "The Name Space\n"
1815 "The file name in " NS_RUN_DIR ", or a full pathname\n")
1816{
1817 vty->node = NS_NODE;
1818 return CMD_SUCCESS;
1819}
1820
e9d94ea7
DS
1821DEFUNSH (VTYSH_VRF,
1822 vtysh_vrf,
1823 vtysh_vrf_cmd,
1824 "vrf NAME",
1825 "Select a VRF to configure\n"
1826 "VRF's name\n")
1827{
1828 vty->node = VRF_NODE;
1829 return CMD_SUCCESS;
1830}
1831
1832DEFSH (VTYSH_ZEBRA,
1833 vtysh_no_vrf_cmd,
1834 "no vrf NAME",
1835 NO_STR
1836 "Delete a pseudo vrf's configuration\n"
1837 "VRF's name\n")
1838
13460c44
FL
1839DEFUNSH (VTYSH_NS,
1840 vtysh_exit_ns,
1841 vtysh_exit_ns_cmd,
1842 "exit",
1843 "Exit current mode and down to previous mode\n")
1844{
1845 return vtysh_exit (vty);
1846}
1847
1848ALIAS (vtysh_exit_ns,
1849 vtysh_quit_ns_cmd,
1850 "quit",
1851 "Exit current mode and down to previous mode\n")
1852
e9d94ea7
DS
1853DEFUNSH (VTYSH_VRF,
1854 vtysh_exit_vrf,
1855 vtysh_exit_vrf_cmd,
1856 "exit",
1857 "Exit current mode and down to previous mode\n")
1858{
1859 return vtysh_exit (vty);
1860}
1861
1862ALIAS (vtysh_exit_vrf,
1863 vtysh_quit_vrf_cmd,
1864 "quit",
1865 "Exit current mode and down to previous mode\n")
1866
95e735b5 1867/* TODO Implement interface description commands in ripngd, ospf6d
1868 * and isisd. */
4fcbf6e2 1869DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD|VTYSH_LDPD,
c43ac31c 1870 vtysh_interface_desc_cmd,
338a9916 1871 "description .LINE",
1872 "Interface specific description\n"
1873 "Characters describing this interface\n")
464dc8da 1874
1875DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
c43ac31c 1876 vtysh_no_interface_desc_cmd,
464dc8da 1877 "no description",
1878 NO_STR
1879 "Interface specific description\n")
338a9916 1880
95e735b5 1881DEFUNSH (VTYSH_INTERFACE,
718e3744 1882 vtysh_exit_interface,
1883 vtysh_exit_interface_cmd,
1884 "exit",
1885 "Exit current mode and down to previous mode\n")
1886{
1887 return vtysh_exit (vty);
1888}
1889
1890ALIAS (vtysh_exit_interface,
1891 vtysh_quit_interface_cmd,
1892 "quit",
1893 "Exit current mode and down to previous mode\n")
1894
0f69b58c
DS
1895DEFUN (vtysh_show_thread,
1896 vtysh_show_thread_cmd,
1897 "show thread cpu [FILTER]",
1898 SHOW_STR
1899 "Thread information\n"
1900 "Thread CPU usage\n"
1901 "Display filter (rwtexb)\n")
1902{
1903 unsigned int i;
1904 int ret = CMD_SUCCESS;
1905 char line[100];
1906
1907 sprintf(line, "show thread cpu %s\n", (argc == 1) ? argv[0] : "");
1908 for (i = 0; i < array_size(vtysh_client); i++)
1909 if ( vtysh_client[i].fd >= 0 )
1910 {
1911 fprintf (stdout, "Thread statistics for %s:\n",
1912 vtysh_client[i].name);
1913 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
1914 fprintf (stdout,"\n");
1915 }
1916 return ret;
1917}
1918
1919DEFUN (vtysh_show_work_queues,
1920 vtysh_show_work_queues_cmd,
1921 "show work-queues",
1922 SHOW_STR
1923 "Work Queue information\n")
1924{
1925 unsigned int i;
1926 int ret = CMD_SUCCESS;
1927 char line[] = "show work-queues\n";
1928
1929 for (i = 0; i < array_size(vtysh_client); i++)
1930 if ( vtysh_client[i].fd >= 0 )
1931 {
1932 fprintf (stdout, "Work queue statistics for %s:\n",
1933 vtysh_client[i].name);
1934 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
1935 fprintf (stdout,"\n");
1936 }
1937
1938 return ret;
1939}
1940
b47b0a84
DS
1941DEFUN (vtysh_show_work_queues_daemon,
1942 vtysh_show_work_queues_daemon_cmd,
1943 "show work-queues (zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd)",
1944 SHOW_STR
1945 "Work Queue information\n"
1946 "For the zebra daemon\n"
1947 "For the rip daemon\n"
1948 "For the ripng daemon\n"
1949 "For the ospf daemon\n"
1950 "For the ospfv6 daemon\n"
1951 "For the bgp daemon\n"
1952 "For the isis daemon\n")
1953{
1954 unsigned int i;
1955 int ret = CMD_SUCCESS;
1956
1957 for (i = 0; i < array_size(vtysh_client); i++)
1958 {
1959 if (begins_with(vtysh_client[i].name, argv[0]))
1960 break;
1961 }
1962
1963 ret = vtysh_client_execute(&vtysh_client[i], "show work-queues\n", stdout);
1964
1965 return ret;
1966}
1967
16f1b9ee
OD
1968DEFUNSH (VTYSH_ZEBRA,
1969 vtysh_link_params,
1970 vtysh_link_params_cmd,
1971 "link-params",
1972 LINK_PARAMS_STR
1973 )
1974{
1975 vty->node = LINK_PARAMS_NODE;
1976 return CMD_SUCCESS;
1977}
1978
03f99d9a
DS
1979DEFUNSH (VTYSH_ZEBRA,
1980 exit_link_params,
1981 exit_link_params_cmd,
1982 "exit-link-params",
1983 "Exit from Link Params configuration node\n")
1984{
1985 if (vty->node == LINK_PARAMS_NODE)
1986 vty->node = INTERFACE_NODE;
1987 return CMD_SUCCESS;
1988}
1989
362b4031
PJ
1990/* Memory */
1991DEFUN (vtysh_show_memory,
1992 vtysh_show_memory_cmd,
1993 "show memory",
1994 SHOW_STR
1995 "Memory statistics\n")
1996{
1997 unsigned int i;
1998 int ret = CMD_SUCCESS;
1999 char line[] = "show memory\n";
2000
837d16cc 2001 for (i = 0; i < array_size(vtysh_client); i++)
362b4031
PJ
2002 if ( vtysh_client[i].fd >= 0 )
2003 {
2004 fprintf (stdout, "Memory statistics for %s:\n",
2005 vtysh_client[i].name);
2006 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
2007 fprintf (stdout,"\n");
2008 }
2009
2010 return ret;
2011}
2012
95e735b5 2013/* Logging commands. */
dbf7d13d
PJ
2014DEFUN (vtysh_show_logging,
2015 vtysh_show_logging_cmd,
2016 "show logging",
2017 SHOW_STR
2018 "Show current logging configuration\n")
2019{
2020 unsigned int i;
2021 int ret = CMD_SUCCESS;
2022 char line[] = "show logging\n";
2023
837d16cc 2024 for (i = 0; i < array_size(vtysh_client); i++)
4150f33e
PJ
2025 if ( vtysh_client[i].fd >= 0 )
2026 {
2027 fprintf (stdout,"Logging configuration for %s:\n",
2028 vtysh_client[i].name);
2029 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
2030 fprintf (stdout,"\n");
2031 }
2032
dbf7d13d
PJ
2033 return ret;
2034}
2035
95e735b5 2036DEFUNSH (VTYSH_ALL,
2037 vtysh_log_stdout,
2038 vtysh_log_stdout_cmd,
2039 "log stdout",
2040 "Logging control\n"
274a4a44 2041 "Set stdout logging level\n")
2042{
2043 return CMD_SUCCESS;
2044}
2045
2046DEFUNSH (VTYSH_ALL,
2047 vtysh_log_stdout_level,
2048 vtysh_log_stdout_level_cmd,
2049 "log stdout "LOG_LEVELS,
2050 "Logging control\n"
2051 "Set stdout logging level\n"
2052 LOG_LEVEL_DESC)
95e735b5 2053{
2054 return CMD_SUCCESS;
2055}
2056
2057DEFUNSH (VTYSH_ALL,
2058 no_vtysh_log_stdout,
2059 no_vtysh_log_stdout_cmd,
274a4a44 2060 "no log stdout [LEVEL]",
95e735b5 2061 NO_STR
2062 "Logging control\n"
274a4a44 2063 "Cancel logging to stdout\n"
2064 "Logging level\n")
95e735b5 2065{
2066 return CMD_SUCCESS;
2067}
2068
2069DEFUNSH (VTYSH_ALL,
2070 vtysh_log_file,
2071 vtysh_log_file_cmd,
2072 "log file FILENAME",
2073 "Logging control\n"
2074 "Logging to file\n"
2075 "Logging filename\n")
2076{
2077 return CMD_SUCCESS;
2078}
2079
274a4a44 2080DEFUNSH (VTYSH_ALL,
2081 vtysh_log_file_level,
2082 vtysh_log_file_level_cmd,
2083 "log file FILENAME "LOG_LEVELS,
2084 "Logging control\n"
2085 "Logging to file\n"
2086 "Logging filename\n"
2087 LOG_LEVEL_DESC)
2088{
2089 return CMD_SUCCESS;
2090}
2091
95e735b5 2092DEFUNSH (VTYSH_ALL,
2093 no_vtysh_log_file,
2094 no_vtysh_log_file_cmd,
2095 "no log file [FILENAME]",
2096 NO_STR
2097 "Logging control\n"
2098 "Cancel logging to file\n"
2099 "Logging file name\n")
2100{
2101 return CMD_SUCCESS;
2102}
2103
274a4a44 2104ALIAS_SH (VTYSH_ALL,
2105 no_vtysh_log_file,
2106 no_vtysh_log_file_level_cmd,
2107 "no log file FILENAME LEVEL",
2108 NO_STR
2109 "Logging control\n"
2110 "Cancel logging to file\n"
2111 "Logging file name\n"
2112 "Logging level\n")
2113
2114DEFUNSH (VTYSH_ALL,
2115 vtysh_log_monitor,
2116 vtysh_log_monitor_cmd,
2117 "log monitor",
2118 "Logging control\n"
2119 "Set terminal line (monitor) logging level\n")
2120{
2121 return CMD_SUCCESS;
2122}
2123
2124DEFUNSH (VTYSH_ALL,
2125 vtysh_log_monitor_level,
2126 vtysh_log_monitor_level_cmd,
2127 "log monitor "LOG_LEVELS,
2128 "Logging control\n"
2129 "Set terminal line (monitor) logging level\n"
2130 LOG_LEVEL_DESC)
2131{
2132 return CMD_SUCCESS;
2133}
2134
2135DEFUNSH (VTYSH_ALL,
2136 no_vtysh_log_monitor,
2137 no_vtysh_log_monitor_cmd,
2138 "no log monitor [LEVEL]",
2139 NO_STR
2140 "Logging control\n"
2141 "Disable terminal line (monitor) logging\n"
2142 "Logging level\n")
2143{
2144 return CMD_SUCCESS;
2145}
2146
95e735b5 2147DEFUNSH (VTYSH_ALL,
2148 vtysh_log_syslog,
2149 vtysh_log_syslog_cmd,
2150 "log syslog",
2151 "Logging control\n"
274a4a44 2152 "Set syslog logging level\n")
2153{
2154 return CMD_SUCCESS;
2155}
2156
2157DEFUNSH (VTYSH_ALL,
2158 vtysh_log_syslog_level,
2159 vtysh_log_syslog_level_cmd,
2160 "log syslog "LOG_LEVELS,
2161 "Logging control\n"
2162 "Set syslog logging level\n"
2163 LOG_LEVEL_DESC)
95e735b5 2164{
2165 return CMD_SUCCESS;
2166}
2167
2168DEFUNSH (VTYSH_ALL,
2169 no_vtysh_log_syslog,
2170 no_vtysh_log_syslog_cmd,
274a4a44 2171 "no log syslog [LEVEL]",
95e735b5 2172 NO_STR
2173 "Logging control\n"
274a4a44 2174 "Cancel logging to syslog\n"
2175 "Logging level\n")
95e735b5 2176{
2177 return CMD_SUCCESS;
2178}
2179
2180DEFUNSH (VTYSH_ALL,
274a4a44 2181 vtysh_log_facility,
2182 vtysh_log_facility_cmd,
2183 "log facility "LOG_FACILITIES,
95e735b5 2184 "Logging control\n"
274a4a44 2185 "Facility parameter for syslog messages\n"
2186 LOG_FACILITY_DESC)
2187
95e735b5 2188{
2189 return CMD_SUCCESS;
2190}
2191
2192DEFUNSH (VTYSH_ALL,
274a4a44 2193 no_vtysh_log_facility,
2194 no_vtysh_log_facility_cmd,
2195 "no log facility [FACILITY]",
95e735b5 2196 NO_STR
2197 "Logging control\n"
274a4a44 2198 "Reset syslog facility to default (daemon)\n"
2199 "Syslog facility\n")
2200
2201{
2202 return CMD_SUCCESS;
2203}
2204
2205DEFUNSH_DEPRECATED (VTYSH_ALL,
2206 vtysh_log_trap,
2207 vtysh_log_trap_cmd,
2208 "log trap "LOG_LEVELS,
2209 "Logging control\n"
2210 "(Deprecated) Set logging level and default for all destinations\n"
2211 LOG_LEVEL_DESC)
2212
2213{
2214 return CMD_SUCCESS;
2215}
2216
2217DEFUNSH_DEPRECATED (VTYSH_ALL,
2218 no_vtysh_log_trap,
2219 no_vtysh_log_trap_cmd,
2220 "no log trap [LEVEL]",
2221 NO_STR
2222 "Logging control\n"
2223 "Permit all logging information\n"
2224 "Logging level\n")
95e735b5 2225{
2226 return CMD_SUCCESS;
2227}
2228
2229DEFUNSH (VTYSH_ALL,
2230 vtysh_log_record_priority,
2231 vtysh_log_record_priority_cmd,
2232 "log record-priority",
2233 "Logging control\n"
2234 "Log the priority of the message within the message\n")
2235{
2236 return CMD_SUCCESS;
2237}
2238
2239DEFUNSH (VTYSH_ALL,
2240 no_vtysh_log_record_priority,
2241 no_vtysh_log_record_priority_cmd,
2242 "no log record-priority",
2243 NO_STR
2244 "Logging control\n"
2245 "Do not log the priority of the message within the message\n")
2246{
2247 return CMD_SUCCESS;
2248}
2249
c749b722
AS
2250DEFUNSH (VTYSH_ALL,
2251 vtysh_log_timestamp_precision,
2252 vtysh_log_timestamp_precision_cmd,
2253 "log timestamp precision <0-6>",
2254 "Logging control\n"
2255 "Timestamp configuration\n"
2256 "Set the timestamp precision\n"
2257 "Number of subsecond digits\n")
2258{
2259 return CMD_SUCCESS;
2260}
2261
2262DEFUNSH (VTYSH_ALL,
2263 no_vtysh_log_timestamp_precision,
2264 no_vtysh_log_timestamp_precision_cmd,
2265 "no log timestamp precision",
2266 NO_STR
2267 "Logging control\n"
2268 "Timestamp configuration\n"
2269 "Reset the timestamp precision to the default value of 0\n")
2270{
2271 return CMD_SUCCESS;
2272}
2273
e7168df4 2274DEFUNSH (VTYSH_ALL,
2275 vtysh_service_password_encrypt,
2276 vtysh_service_password_encrypt_cmd,
2277 "service password-encryption",
2278 "Set up miscellaneous service\n"
2279 "Enable encrypted passwords\n")
2280{
2281 return CMD_SUCCESS;
2282}
2283
2284DEFUNSH (VTYSH_ALL,
2285 no_vtysh_service_password_encrypt,
2286 no_vtysh_service_password_encrypt_cmd,
2287 "no service password-encryption",
2288 NO_STR
2289 "Set up miscellaneous service\n"
2290 "Enable encrypted passwords\n")
2291{
2292 return CMD_SUCCESS;
2293}
2294
2295DEFUNSH (VTYSH_ALL,
2296 vtysh_config_password,
2297 vtysh_password_cmd,
2298 "password (8|) WORD",
2299 "Assign the terminal connection password\n"
2300 "Specifies a HIDDEN password will follow\n"
2301 "dummy string \n"
2302 "The HIDDEN line password string\n")
2303{
2304 return CMD_SUCCESS;
2305}
2306
2307DEFUNSH (VTYSH_ALL,
2308 vtysh_password_text,
2309 vtysh_password_text_cmd,
2310 "password LINE",
2311 "Assign the terminal connection password\n"
2312 "The UNENCRYPTED (cleartext) line password\n")
2313{
2314 return CMD_SUCCESS;
2315}
2316
2317DEFUNSH (VTYSH_ALL,
2318 vtysh_config_enable_password,
2319 vtysh_enable_password_cmd,
2320 "enable password (8|) WORD",
2321 "Modify enable password parameters\n"
2322 "Assign the privileged level password\n"
2323 "Specifies a HIDDEN password will follow\n"
2324 "dummy string \n"
2325 "The HIDDEN 'enable' password string\n")
2326{
2327 return CMD_SUCCESS;
2328}
2329
2330DEFUNSH (VTYSH_ALL,
2331 vtysh_enable_password_text,
2332 vtysh_enable_password_text_cmd,
2333 "enable password LINE",
2334 "Modify enable password parameters\n"
2335 "Assign the privileged level password\n"
2336 "The UNENCRYPTED (cleartext) 'enable' password\n")
2337{
2338 return CMD_SUCCESS;
2339}
2340
2341DEFUNSH (VTYSH_ALL,
2342 no_vtysh_config_enable_password,
2343 no_vtysh_enable_password_cmd,
2344 "no enable password",
2345 NO_STR
2346 "Modify enable password parameters\n"
2347 "Assign the privileged level password\n")
2348{
2349 return CMD_SUCCESS;
2350}
2351
718e3744 2352DEFUN (vtysh_write_terminal,
2353 vtysh_write_terminal_cmd,
2354 "write terminal",
2355 "Write running configuration to memory, network, or terminal\n"
2356 "Write to terminal\n")
2357{
b1aa147d 2358 u_int i;
718e3744 2359 char line[] = "write terminal\n";
2360 FILE *fp = NULL;
2361
2362 if (vtysh_pager_name)
2363 {
4fc01e67 2364 fp = popen (vtysh_pager_name, "w");
718e3744 2365 if (fp == NULL)
2366 {
2367 perror ("popen");
2368 exit (1);
2369 }
2370 }
2371 else
2372 fp = stdout;
2373
2374 vty_out (vty, "Building configuration...%s", VTY_NEWLINE);
2375 vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
2376 VTY_NEWLINE);
e7168df4 2377 vty_out (vty, "!%s", VTY_NEWLINE);
718e3744 2378
837d16cc 2379 for (i = 0; i < array_size(vtysh_client); i++)
5be7afc8
DD
2380 if ((argc < 1 ) || (begins_with(vtysh_client[i].name, argv[0])))
2381 vtysh_client_config (&vtysh_client[i], line);
718e3744 2382
e7168df4 2383 /* Integrate vtysh specific configuration. */
2384 vtysh_config_write ();
2385
718e3744 2386 vtysh_config_dump (fp);
2387
2388 if (vtysh_pager_name && fp)
2389 {
2390 fflush (fp);
2391 if (pclose (fp) == -1)
2392 {
2393 perror ("pclose");
2394 exit (1);
2395 }
2396 fp = NULL;
2397 }
2398
6e79f8bb
CC
2399 vty_out (vty, "end%s", VTY_NEWLINE);
2400
718e3744 2401 return CMD_SUCCESS;
2402}
2403
c006e89e
DS
2404DEFUN (vtysh_write_terminal_daemon,
2405 vtysh_write_terminal_daemon_cmd,
4fcbf6e2 2406 "write terminal (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
c006e89e
DS
2407 "Write running configuration to memory, network, or terminal\n"
2408 "Write to terminal\n"
2409 "For the zebra daemon\n"
2410 "For the rip daemon\n"
2411 "For the ripng daemon\n"
2412 "For the ospf daemon\n"
2413 "For the ospfv6 daemon\n"
4fcbf6e2 2414 "For the ldp daemon\n"
c006e89e 2415 "For the bgp daemon\n"
0fab7646
DS
2416 "For the isis daemon\n"
2417 "For the pim daemon\n")
c006e89e
DS
2418{
2419 unsigned int i;
2420 int ret = CMD_SUCCESS;
2421
2422 for (i = 0; i < array_size(vtysh_client); i++)
2423 {
f35a5350 2424 if (begins_with(vtysh_client[i].name, argv[0]))
c006e89e
DS
2425 break;
2426 }
2427
ce01a2ca
CF
2428 if (i == array_size(vtysh_client))
2429 return CMD_ERR_NO_MATCH;
2430
c006e89e
DS
2431 ret = vtysh_client_execute(&vtysh_client[i], "show running-config\n", stdout);
2432
2433 return ret;
2434}
2435
e7168df4 2436DEFUN (vtysh_integrated_config,
2437 vtysh_integrated_config_cmd,
2438 "service integrated-vtysh-config",
2439 "Set up miscellaneous service\n"
2440 "Write configuration into integrated file\n")
4fc01e67 2441{
039eaca3 2442 vtysh_write_integrated = WRITE_INTEGRATED_YES;
e7168df4 2443 return CMD_SUCCESS;
4fc01e67 2444}
2445
e7168df4 2446DEFUN (no_vtysh_integrated_config,
2447 no_vtysh_integrated_config_cmd,
2448 "no service integrated-vtysh-config",
2449 NO_STR
2450 "Set up miscellaneous service\n"
2451 "Write configuration into integrated file\n")
4fc01e67 2452{
039eaca3 2453 vtysh_write_integrated = WRITE_INTEGRATED_NO;
e7168df4 2454 return CMD_SUCCESS;
4fc01e67 2455}
2456
a7222276
DS
2457static void
2458backup_config_file (const char *fbackup)
718e3744 2459{
718e3744 2460 char *integrate_sav = NULL;
2461
a7222276 2462 integrate_sav = malloc (strlen (fbackup) +
95e735b5 2463 strlen (CONF_BACKUP_EXT) + 1);
a7222276 2464 strcpy (integrate_sav, fbackup);
718e3744 2465 strcat (integrate_sav, CONF_BACKUP_EXT);
2466
95e735b5 2467 /* Move current configuration file to backup config file. */
718e3744 2468 unlink (integrate_sav);
a7222276 2469 rename (fbackup, integrate_sav);
95e735b5 2470 free (integrate_sav);
a7222276
DS
2471}
2472
a68f8616
DL
2473int
2474vtysh_write_config_integrated(void)
a7222276
DS
2475{
2476 u_int i;
2477 char line[] = "write terminal\n";
cb947ba3 2478 FILE *fp;
367988ee
DL
2479 int fd;
2480 struct passwd *pwentry;
2481 struct group *grentry;
2482 uid_t uid = -1;
2483 gid_t gid = -1;
2484 struct stat st;
2485 int err = 0;
a7222276
DS
2486
2487 fprintf (stdout,"Building Configuration...\n");
2488
cb947ba3
DL
2489 backup_config_file(quagga_config);
2490 fp = fopen (quagga_config, "w");
718e3744 2491 if (fp == NULL)
2492 {
c10c5926 2493 fprintf (stdout,"%% Error: failed to open configuration file %s: %s\n",
cb947ba3 2494 quagga_config, safe_strerror(errno));
c10c5926 2495 return CMD_WARNING;
718e3744 2496 }
367988ee 2497 fd = fileno (fp);
718e3744 2498
837d16cc 2499 for (i = 0; i < array_size(vtysh_client); i++)
c0e8c16f 2500 vtysh_client_config (&vtysh_client[i], line);
718e3744 2501
f64e741e 2502 vtysh_config_write ();
718e3744 2503 vtysh_config_dump (fp);
2504
367988ee
DL
2505 if (fchmod (fd, CONFIGFILE_MASK) != 0)
2506 {
2507 printf ("%% Warning: can't chmod configuration file %s: %s\n",
2508 quagga_config, safe_strerror(errno));
2509 err++;
2510 }
2511
b2f36157 2512 pwentry = getpwnam (FRR_USER);
367988ee
DL
2513 if (pwentry)
2514 uid = pwentry->pw_uid;
2515 else
2516 {
b2f36157 2517 printf ("%% Warning: could not look up user \"%s\"\n", FRR_USER);
367988ee
DL
2518 err++;
2519 }
718e3744 2520
b2f36157 2521 grentry = getgrnam (FRR_GROUP);
367988ee
DL
2522 if (grentry)
2523 gid = grentry->gr_gid;
2524 else
aa593d5e 2525 {
b2f36157 2526 printf ("%% Warning: could not look up group \"%s\"\n", FRR_GROUP);
367988ee 2527 err++;
aa593d5e 2528 }
2529
367988ee
DL
2530 if (!fstat (fd, &st))
2531 {
2532 if (st.st_uid == uid)
2533 uid = -1;
2534 if (st.st_gid == gid)
2535 gid = -1;
2536 if ((uid != (uid_t)-1 || gid != (gid_t)-1) && fchown (fd, uid, gid))
2537 {
2538 printf ("%% Warning: can't chown configuration file %s: %s\n",
2539 quagga_config, safe_strerror(errno));
2540 err++;
2541 }
2542 }
2543 else
2544 {
2545 printf ("%% Warning: stat() failed on %s: %s\n",
2546 quagga_config, safe_strerror(errno));
2547 err++;
2548 }
2549
2550 fclose (fp);
2551
c10c5926 2552 printf ("Integrated configuration saved to %s\n", quagga_config);
367988ee
DL
2553 if (err)
2554 return CMD_WARNING;
4fc01e67 2555
c10c5926 2556 printf ("[OK]\n");
718e3744 2557 return CMD_SUCCESS;
2558}
2559
a68f8616 2560static bool want_config_integrated(void)
039eaca3
CF
2561{
2562 struct stat s;
2563
2564 switch (vtysh_write_integrated)
2565 {
2566 case WRITE_INTEGRATED_UNSPECIFIED:
cb947ba3 2567 if (stat(quagga_config, &s) && errno == ENOENT)
039eaca3
CF
2568 return false;
2569 return true;
2570 case WRITE_INTEGRATED_NO:
2571 return false;
2572 case WRITE_INTEGRATED_YES:
2573 return true;
2574 }
3d3c3cbd 2575 return true;
039eaca3
CF
2576}
2577
4fc01e67 2578DEFUN (vtysh_write_memory,
2579 vtysh_write_memory_cmd,
2580 "write memory",
2581 "Write running configuration to memory, network, or terminal\n"
2582 "Write configuration to the file (same as write file)\n")
2583{
dfc0d9ba 2584 int ret = CMD_SUCCESS;
4fc01e67 2585 char line[] = "write memory\n";
b1aa147d 2586 u_int i;
cb947ba3
DL
2587
2588 fprintf (stdout, "Note: this version of vtysh never writes vtysh.conf\n");
a7222276 2589
e7168df4 2590 /* If integrated Quagga.conf explicitely set. */
a68f8616 2591 if (want_config_integrated())
e10ca9b6
DL
2592 {
2593 ret = CMD_WARNING;
2594 for (i = 0; i < array_size(vtysh_client); i++)
2595 if (vtysh_client[i].flag == VTYSH_WATCHQUAGGA)
2596 break;
2597 if (i < array_size(vtysh_client) && vtysh_client[i].fd != -1)
2598 ret = vtysh_client_execute (&vtysh_client[i], "write integrated", stdout);
2599
2600 if (ret != CMD_SUCCESS)
2601 {
c10c5926 2602 printf("\nWarning: attempting direct configuration write without "
e10ca9b6 2603 "watchquagga.\nFile permissions and ownership may be "
c10c5926 2604 "incorrect, or write may fail.\n\n");
e10ca9b6
DL
2605 ret = vtysh_write_config_integrated();
2606 }
2607 return ret;
2608 }
4fc01e67 2609
2610 fprintf (stdout,"Building Configuration...\n");
cb947ba3 2611
837d16cc 2612 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 2613 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
a7222276 2614
dfc0d9ba 2615 return ret;
4fc01e67 2616}
2617
718e3744 2618ALIAS (vtysh_write_memory,
2619 vtysh_copy_runningconfig_startupconfig_cmd,
2620 "copy running-config startup-config",
2621 "Copy from one file to another\n"
2622 "Copy from current system configuration\n"
2623 "Copy to startup configuration\n")
2624
2625ALIAS (vtysh_write_memory,
2626 vtysh_write_file_cmd,
2627 "write file",
2628 "Write running configuration to memory, network, or terminal\n"
2629 "Write configuration to the file (same as write memory)\n")
2630
4a6e2257 2631ALIAS (vtysh_write_memory,
2632 vtysh_write_cmd,
2633 "write",
2634 "Write running configuration to memory, network, or terminal\n")
2635
718e3744 2636ALIAS (vtysh_write_terminal,
2637 vtysh_show_running_config_cmd,
2638 "show running-config",
2639 SHOW_STR
2640 "Current operating configuration\n")
b094d260 2641
5be7afc8 2642ALIAS (vtysh_write_terminal,
c006e89e 2643 vtysh_show_running_config_daemon_cmd,
4fcbf6e2 2644 "show running-config (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
c006e89e
DS
2645 SHOW_STR
2646 "Current operating configuration\n"
2647 "For the zebra daemon\n"
2648 "For the rip daemon\n"
2649 "For the ripng daemon\n"
2650 "For the ospf daemon\n"
2651 "For the ospfv6 daemon\n"
4fcbf6e2 2652 "For the ldp daemon\n"
c006e89e 2653 "For the bgp daemon\n"
0fab7646
DS
2654 "For the isis daemon\n"
2655 "For the pim daemon\n")
c006e89e 2656
34553cc3 2657DEFUN (vtysh_terminal_length,
2658 vtysh_terminal_length_cmd,
2659 "terminal length <0-512>",
2660 "Set terminal line parameters\n"
2661 "Set number of lines on a screen\n"
2662 "Number of lines on screen (0 for no pausing)\n")
2663{
2664 int lines;
2665 char *endptr = NULL;
2666 char default_pager[10];
2667
2668 lines = strtol (argv[0], &endptr, 10);
2669 if (lines < 0 || lines > 512 || *endptr != '\0')
2670 {
2671 vty_out (vty, "length is malformed%s", VTY_NEWLINE);
2672 return CMD_WARNING;
2673 }
2674
2675 if (vtysh_pager_name)
2676 {
2677 free (vtysh_pager_name);
2678 vtysh_pager_name = NULL;
2679 }
2680
2681 if (lines != 0)
2682 {
2683 snprintf(default_pager, 10, "more -%i", lines);
2684 vtysh_pager_name = strdup (default_pager);
2685 }
2686
2687 return CMD_SUCCESS;
2688}
2689
2690DEFUN (vtysh_terminal_no_length,
2691 vtysh_terminal_no_length_cmd,
2692 "terminal no length",
2693 "Set terminal line parameters\n"
2694 NO_STR
2695 "Set number of lines on a screen\n")
2696{
2697 if (vtysh_pager_name)
2698 {
2699 free (vtysh_pager_name);
2700 vtysh_pager_name = NULL;
2701 }
2702
2703 vtysh_pager_init();
2704 return CMD_SUCCESS;
2705}
2706
f2799e69 2707DEFUN (vtysh_show_daemons,
2708 vtysh_show_daemons_cmd,
2709 "show daemons",
e7168df4 2710 SHOW_STR
2711 "Show list of running daemons\n")
2712{
b1aa147d 2713 u_int i;
2714
837d16cc 2715 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 2716 if ( vtysh_client[i].fd >= 0 )
2717 vty_out(vty, " %s", vtysh_client[i].name);
e7168df4 2718 vty_out(vty, "%s", VTY_NEWLINE);
2719
2720 return CMD_SUCCESS;
2721}
2722
718e3744 2723/* Execute command in child process. */
c0e8c16f 2724static void
5862ff52 2725execute_command (const char *command, int argc, const char *arg1,
2726 const char *arg2)
718e3744 2727{
718e3744 2728 pid_t pid;
2729 int status;
2730
2731 /* Call fork(). */
2732 pid = fork ();
2733
2734 if (pid < 0)
2735 {
2736 /* Failure of fork(). */
6099b3b5 2737 fprintf (stderr, "Can't fork: %s\n", safe_strerror (errno));
718e3744 2738 exit (1);
2739 }
2740 else if (pid == 0)
2741 {
2742 /* This is child process. */
2743 switch (argc)
2744 {
2745 case 0:
c0e8c16f 2746 execlp (command, command, (const char *)NULL);
718e3744 2747 break;
2748 case 1:
c0e8c16f 2749 execlp (command, command, arg1, (const char *)NULL);
718e3744 2750 break;
2751 case 2:
c0e8c16f 2752 execlp (command, command, arg1, arg2, (const char *)NULL);
718e3744 2753 break;
2754 }
2755
2756 /* When execlp suceed, this part is not executed. */
6099b3b5 2757 fprintf (stderr, "Can't execute %s: %s\n", command, safe_strerror (errno));
718e3744 2758 exit (1);
2759 }
2760 else
2761 {
2762 /* This is parent. */
2763 execute_flag = 1;
c0e8c16f 2764 wait4 (pid, &status, 0, NULL);
718e3744 2765 execute_flag = 0;
2766 }
718e3744 2767}
2768
2769DEFUN (vtysh_ping,
2770 vtysh_ping_cmd,
2771 "ping WORD",
4eeccf18 2772 "Send echo messages\n"
718e3744 2773 "Ping destination address or hostname\n")
2774{
2775 execute_command ("ping", 1, argv[0], NULL);
2776 return CMD_SUCCESS;
2777}
2778
4eeccf18 2779ALIAS (vtysh_ping,
2780 vtysh_ping_ip_cmd,
2781 "ping ip WORD",
2782 "Send echo messages\n"
2783 "IP echo\n"
2784 "Ping destination address or hostname\n")
2785
718e3744 2786DEFUN (vtysh_traceroute,
2787 vtysh_traceroute_cmd,
2788 "traceroute WORD",
2789 "Trace route to destination\n"
2790 "Trace route to destination address or hostname\n")
2791{
2792 execute_command ("traceroute", 1, argv[0], NULL);
2793 return CMD_SUCCESS;
2794}
2795
4eeccf18 2796ALIAS (vtysh_traceroute,
2797 vtysh_traceroute_ip_cmd,
2798 "traceroute ip WORD",
2799 "Trace route to destination\n"
2800 "IP trace\n"
2801 "Trace route to destination address or hostname\n")
2802
4eeccf18 2803DEFUN (vtysh_ping6,
2804 vtysh_ping6_cmd,
2805 "ping ipv6 WORD",
2806 "Send echo messages\n"
2807 "IPv6 echo\n"
2808 "Ping destination address or hostname\n")
2809{
2810 execute_command ("ping6", 1, argv[0], NULL);
2811 return CMD_SUCCESS;
2812}
2813
2814DEFUN (vtysh_traceroute6,
2815 vtysh_traceroute6_cmd,
2816 "traceroute ipv6 WORD",
2817 "Trace route to destination\n"
2818 "IPv6 trace\n"
2819 "Trace route to destination address or hostname\n")
2820{
2821 execute_command ("traceroute6", 1, argv[0], NULL);
2822 return CMD_SUCCESS;
2823}
4eeccf18 2824
576b6b5d 2825#if defined(HAVE_SHELL_ACCESS)
718e3744 2826DEFUN (vtysh_telnet,
2827 vtysh_telnet_cmd,
2828 "telnet WORD",
2829 "Open a telnet connection\n"
2830 "IP address or hostname of a remote system\n")
2831{
2832 execute_command ("telnet", 1, argv[0], NULL);
2833 return CMD_SUCCESS;
2834}
2835
2836DEFUN (vtysh_telnet_port,
2837 vtysh_telnet_port_cmd,
2838 "telnet WORD PORT",
2839 "Open a telnet connection\n"
2840 "IP address or hostname of a remote system\n"
2841 "TCP Port number\n")
2842{
2843 execute_command ("telnet", 2, argv[0], argv[1]);
2844 return CMD_SUCCESS;
2845}
2846
5087df56 2847DEFUN (vtysh_ssh,
2848 vtysh_ssh_cmd,
2849 "ssh WORD",
2850 "Open an ssh connection\n"
2851 "[user@]host\n")
2852{
2853 execute_command ("ssh", 1, argv[0], NULL);
2854 return CMD_SUCCESS;
2855}
2856
718e3744 2857DEFUN (vtysh_start_shell,
2858 vtysh_start_shell_cmd,
2859 "start-shell",
2860 "Start UNIX shell\n")
2861{
2862 execute_command ("sh", 0, NULL, NULL);
2863 return CMD_SUCCESS;
2864}
2865
2866DEFUN (vtysh_start_bash,
2867 vtysh_start_bash_cmd,
2868 "start-shell bash",
2869 "Start UNIX shell\n"
2870 "Start bash\n")
2871{
2872 execute_command ("bash", 0, NULL, NULL);
2873 return CMD_SUCCESS;
2874}
2875
2876DEFUN (vtysh_start_zsh,
2877 vtysh_start_zsh_cmd,
2878 "start-shell zsh",
2879 "Start UNIX shell\n"
2880 "Start Z shell\n")
2881{
2882 execute_command ("zsh", 0, NULL, NULL);
2883 return CMD_SUCCESS;
2884}
576b6b5d 2885#endif
b094d260 2886
274a4a44 2887static void
718e3744 2888vtysh_install_default (enum node_type node)
2889{
2890 install_element (node, &config_list_cmd);
2891}
2892
2893/* Making connection to protocol daemon. */
274a4a44 2894static int
b1aa147d 2895vtysh_connect (struct vtysh_client *vclient)
718e3744 2896{
2897 int ret;
2898 int sock, len;
2899 struct sockaddr_un addr;
2900 struct stat s_stat;
718e3744 2901
718e3744 2902 /* Stat socket to see if we have permission to access it. */
b1aa147d 2903 ret = stat (vclient->path, &s_stat);
718e3744 2904 if (ret < 0 && errno != ENOENT)
2905 {
2906 fprintf (stderr, "vtysh_connect(%s): stat = %s\n",
b1aa147d 2907 vclient->path, safe_strerror(errno));
718e3744 2908 exit(1);
2909 }
2910
2911 if (ret >= 0)
2912 {
2913 if (! S_ISSOCK(s_stat.st_mode))
2914 {
2915 fprintf (stderr, "vtysh_connect(%s): Not a socket\n",
b1aa147d 2916 vclient->path);
718e3744 2917 exit (1);
2918 }
2919
718e3744 2920 }
2921
2922 sock = socket (AF_UNIX, SOCK_STREAM, 0);
2923 if (sock < 0)
2924 {
2925#ifdef DEBUG
b1aa147d 2926 fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path,
6099b3b5 2927 safe_strerror(errno));
718e3744 2928#endif /* DEBUG */
2929 return -1;
2930 }
2931
2932 memset (&addr, 0, sizeof (struct sockaddr_un));
2933 addr.sun_family = AF_UNIX;
b1aa147d 2934 strncpy (addr.sun_path, vclient->path, strlen (vclient->path));
6f0e3f6e 2935#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
718e3744 2936 len = addr.sun_len = SUN_LEN(&addr);
2937#else
2938 len = sizeof (addr.sun_family) + strlen (addr.sun_path);
6f0e3f6e 2939#endif /* HAVE_STRUCT_SOCKADDR_UN_SUN_LEN */
718e3744 2940
2941 ret = connect (sock, (struct sockaddr *) &addr, len);
2942 if (ret < 0)
2943 {
2944#ifdef DEBUG
b1aa147d 2945 fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path,
6099b3b5 2946 safe_strerror(errno));
718e3744 2947#endif /* DEBUG */
2948 close (sock);
2949 return -1;
2950 }
2951 vclient->fd = sock;
2952
2953 return 0;
2954}
2955
7c8ff89e
DS
2956/* Return true if str ends with suffix, else return false */
2957static int
2958ends_with(const char *str, const char *suffix)
2959{
2960 if (!str || !suffix)
2961 return 0;
2962 size_t lenstr = strlen(str);
2963 size_t lensuffix = strlen(suffix);
2964 if (lensuffix > lenstr)
2965 return 0;
2966 return strncmp(str + lenstr - lensuffix, suffix, lensuffix) == 0;
2967}
2968
2969static void
2970vtysh_client_sorted_insert (struct vtysh_client *head_client,
2971 struct vtysh_client *client)
2972{
2973 struct vtysh_client *prev_node, *current_node;
2974
2975 prev_node = head_client;
2976 current_node = head_client->next;
2977 while (current_node)
2978 {
2979 if (strcmp(current_node->path, client->path) > 0)
2980 break;
2981
2982 prev_node = current_node;
2983 current_node = current_node->next;
2984 }
2985 client->next = current_node;
2986 prev_node->next = client;
2987}
2988
2989#define MAXIMUM_INSTANCES 10
2990
2991static void
2992vtysh_update_all_insances(struct vtysh_client * head_client)
2993{
2994 struct vtysh_client *client;
c0e8c16f 2995 char *ptr;
7c8ff89e
DS
2996 DIR *dir;
2997 struct dirent *file;
2998 int n = 0;
2999
3000 if (head_client->flag != VTYSH_OSPFD) return;
3001
3002 /* ls /var/run/quagga/ and look for all files ending in .vty */
3003 dir = opendir("/var/run/quagga/");
3004 if (dir)
3005 {
3006 while ((file = readdir(dir)) != NULL)
3007 {
3008 if (begins_with(file->d_name, "ospfd-") && ends_with(file->d_name, ".vty"))
3009 {
3010 if (n == MAXIMUM_INSTANCES)
3011 {
3012 fprintf(stderr,
3013 "Parsing /var/run/quagga/, client limit(%d) reached!\n", n);
3014 break;
3015 }
3016 client = (struct vtysh_client *) malloc(sizeof(struct vtysh_client));
3017 client->fd = -1;
c0e8c16f 3018 client->name = "ospfd";
7c8ff89e 3019 client->flag = VTYSH_OSPFD;
c0e8c16f
DS
3020 ptr = (char *) malloc(100);
3021 sprintf(ptr, "/var/run/quagga/%s", file->d_name);
3022 client->path = (const char *)ptr;
7c8ff89e
DS
3023 client->next = NULL;
3024 vtysh_client_sorted_insert(head_client, client);
3025 n++;
3026 }
3027 }
3028 closedir(dir);
3029 }
3030}
3031
4201dd11 3032static int
7c8ff89e
DS
3033vtysh_connect_all_instances (struct vtysh_client *head_client)
3034{
3035 struct vtysh_client *client;
3036 int rc = 0;
3037
3038 vtysh_update_all_insances(head_client);
3039
3040 client = head_client->next;
3041 while (client)
3042 {
3043 if (vtysh_connect(client) == 0)
3044 rc++;
3045 client = client->next;
3046 }
3047
3048 return rc;
3049}
3050
f366ad31
AS
3051int
3052vtysh_connect_all(const char *daemon_name)
718e3744 3053{
b1aa147d 3054 u_int i;
f366ad31
AS
3055 int rc = 0;
3056 int matches = 0;
b1aa147d 3057
837d16cc 3058 for (i = 0; i < array_size(vtysh_client); i++)
b1aa147d 3059 {
f366ad31
AS
3060 if (!daemon_name || !strcmp(daemon_name, vtysh_client[i].name))
3061 {
3062 matches++;
3063 if (vtysh_connect(&vtysh_client[i]) == 0)
3064 rc++;
7c8ff89e
DS
3065
3066 rc += vtysh_connect_all_instances(&vtysh_client[i]);
3067 }
b1aa147d 3068 }
f366ad31
AS
3069 if (!matches)
3070 fprintf(stderr, "Error: no daemons match name %s!\n", daemon_name);
3071 return rc;
718e3744 3072}
3073
95e735b5 3074/* To disable readline's filename completion. */
274a4a44 3075static char *
dfc0d9ba 3076vtysh_completion_entry_function (const char *ignore, int invoking_key)
718e3744 3077{
dfc0d9ba 3078 return NULL;
718e3744 3079}
3080
3081void
b1aa147d 3082vtysh_readline_init (void)
718e3744 3083{
3084 /* readline related settings. */
66d2ead7 3085 rl_bind_key ('?', (rl_command_func_t *) vtysh_rl_describe);
68980084 3086 rl_completion_entry_function = vtysh_completion_entry_function;
66d2ead7 3087 rl_attempted_completion_function = (rl_completion_func_t *)new_completion;
718e3744 3088}
3089
3090char *
b1aa147d 3091vtysh_prompt (void)
718e3744 3092{
f366ad31 3093 static struct utsname names;
718e3744 3094 static char buf[100];
3095 const char*hostname;
3096 extern struct host host;
3097
3098 hostname = host.name;
3099
3100 if (!hostname)
3101 {
f366ad31
AS
3102 if (!names.nodename[0])
3103 uname (&names);
718e3744 3104 hostname = names.nodename;
3105 }
3106
3107 snprintf (buf, sizeof buf, cmd_prompt (vty->node), hostname);
3108
3109 return buf;
3110}
3111
3112void
b1aa147d 3113vtysh_init_vty (void)
718e3744 3114{
3115 /* Make vty structure. */
3116 vty = vty_new ();
3117 vty->type = VTY_SHELL;
3118 vty->node = VIEW_NODE;
3119
3120 /* Initialize commands. */
3121 cmd_init (0);
3122
3123 /* Install nodes. */
3124 install_node (&bgp_node, NULL);
3125 install_node (&rip_node, NULL);
3126 install_node (&interface_node, NULL);
16f1b9ee 3127 install_node (&link_params_node, NULL);
13460c44 3128 install_node (&ns_node, NULL);
e9d94ea7 3129 install_node (&vrf_node, NULL);
718e3744 3130 install_node (&rmap_node, NULL);
3131 install_node (&zebra_node, NULL);
3132 install_node (&bgp_vpnv4_node, NULL);
8ecd3266 3133 install_node (&bgp_vpnv6_node, NULL);
8b1fb8be
LB
3134 install_node (&bgp_encap_node, NULL);
3135 install_node (&bgp_encapv6_node, NULL);
718e3744 3136 install_node (&bgp_ipv4_node, NULL);
3137 install_node (&bgp_ipv4m_node, NULL);
718e3744 3138 install_node (&bgp_ipv6_node, NULL);
57b5b7ed 3139 install_node (&bgp_ipv6m_node, NULL);
65efcfce
LB
3140 install_node (&bgp_vnc_defaults_node, NULL);
3141 install_node (&bgp_vnc_nve_group_node, NULL);
3142 install_node (&bgp_vnc_l2_group_node, NULL);
718e3744 3143 install_node (&ospf_node, NULL);
718e3744 3144 install_node (&ripng_node, NULL);
3145 install_node (&ospf6_node, NULL);
4fcbf6e2
RW
3146 install_node (&ldp_node, NULL);
3147 install_node (&ldp_ipv4_node, NULL);
3148 install_node (&ldp_ipv6_node, NULL);
3149 install_node (&ldp_ipv4_iface_node, NULL);
3150 install_node (&ldp_ipv6_iface_node, NULL);
3151 install_node (&ldp_l2vpn_node, NULL);
3152 install_node (&ldp_pseudowire_node, NULL);
718e3744 3153 install_node (&keychain_node, NULL);
3154 install_node (&keychain_key_node, NULL);
c25e458a 3155 install_node (&isis_node, NULL);
e7168df4 3156 install_node (&vty_node, NULL);
718e3744 3157
3158 vtysh_install_default (VIEW_NODE);
718e3744 3159 vtysh_install_default (CONFIG_NODE);
3160 vtysh_install_default (BGP_NODE);
3161 vtysh_install_default (RIP_NODE);
3162 vtysh_install_default (INTERFACE_NODE);
16f1b9ee 3163 vtysh_install_default (LINK_PARAMS_NODE);
13460c44 3164 vtysh_install_default (NS_NODE);
e9d94ea7 3165 vtysh_install_default (VRF_NODE);
718e3744 3166 vtysh_install_default (RMAP_NODE);
3167 vtysh_install_default (ZEBRA_NODE);
3168 vtysh_install_default (BGP_VPNV4_NODE);
8ecd3266 3169 vtysh_install_default (BGP_VPNV6_NODE);
8b1fb8be
LB
3170 vtysh_install_default (BGP_ENCAP_NODE);
3171 vtysh_install_default (BGP_ENCAPV6_NODE);
718e3744 3172 vtysh_install_default (BGP_IPV4_NODE);
3173 vtysh_install_default (BGP_IPV4M_NODE);
3174 vtysh_install_default (BGP_IPV6_NODE);
57b5b7ed 3175 vtysh_install_default (BGP_IPV6M_NODE);
87ab4aec 3176#if ENABLE_BGP_VNC
65efcfce
LB
3177 vtysh_install_default (BGP_VNC_DEFAULTS_NODE);
3178 vtysh_install_default (BGP_VNC_NVE_GROUP_NODE);
3179 vtysh_install_default (BGP_VNC_L2_GROUP_NODE);
87ab4aec 3180#endif
718e3744 3181 vtysh_install_default (OSPF_NODE);
3182 vtysh_install_default (RIPNG_NODE);
3183 vtysh_install_default (OSPF6_NODE);
4fcbf6e2
RW
3184 vtysh_install_default (LDP_NODE);
3185 vtysh_install_default (LDP_IPV4_NODE);
3186 vtysh_install_default (LDP_IPV6_NODE);
3187 vtysh_install_default (LDP_IPV4_IFACE_NODE);
3188 vtysh_install_default (LDP_IPV6_IFACE_NODE);
3189 vtysh_install_default (LDP_L2VPN_NODE);
3190 vtysh_install_default (LDP_PSEUDOWIRE_NODE);
c25e458a 3191 vtysh_install_default (ISIS_NODE);
718e3744 3192 vtysh_install_default (KEYCHAIN_NODE);
3193 vtysh_install_default (KEYCHAIN_KEY_NODE);
e7168df4 3194 vtysh_install_default (VTY_NODE);
718e3744 3195
3196 install_element (VIEW_NODE, &vtysh_enable_cmd);
3197 install_element (ENABLE_NODE, &vtysh_config_terminal_cmd);
3198 install_element (ENABLE_NODE, &vtysh_disable_cmd);
3199
3200 /* "exit" command. */
3201 install_element (VIEW_NODE, &vtysh_exit_all_cmd);
3202 install_element (VIEW_NODE, &vtysh_quit_all_cmd);
3203 install_element (CONFIG_NODE, &vtysh_exit_all_cmd);
3204 /* install_element (CONFIG_NODE, &vtysh_quit_all_cmd); */
718e3744 3205 install_element (RIP_NODE, &vtysh_exit_ripd_cmd);
3206 install_element (RIP_NODE, &vtysh_quit_ripd_cmd);
68980084 3207 install_element (RIPNG_NODE, &vtysh_exit_ripngd_cmd);
3208 install_element (RIPNG_NODE, &vtysh_quit_ripngd_cmd);
718e3744 3209 install_element (OSPF_NODE, &vtysh_exit_ospfd_cmd);
3210 install_element (OSPF_NODE, &vtysh_quit_ospfd_cmd);
68980084 3211 install_element (OSPF6_NODE, &vtysh_exit_ospf6d_cmd);
3212 install_element (OSPF6_NODE, &vtysh_quit_ospf6d_cmd);
87ab4aec 3213#if defined (HAVE_LDPD)
4fcbf6e2
RW
3214 install_element (LDP_NODE, &vtysh_exit_ldpd_cmd);
3215 install_element (LDP_NODE, &vtysh_quit_ldpd_cmd);
3216 install_element (LDP_IPV4_NODE, &vtysh_exit_ldpd_cmd);
3217 install_element (LDP_IPV4_NODE, &vtysh_quit_ldpd_cmd);
3218 install_element (LDP_IPV6_NODE, &vtysh_exit_ldpd_cmd);
3219 install_element (LDP_IPV6_NODE, &vtysh_quit_ldpd_cmd);
3220 install_element (LDP_IPV4_IFACE_NODE, &vtysh_exit_ldpd_cmd);
3221 install_element (LDP_IPV4_IFACE_NODE, &vtysh_quit_ldpd_cmd);
3222 install_element (LDP_IPV6_IFACE_NODE, &vtysh_exit_ldpd_cmd);
3223 install_element (LDP_IPV6_IFACE_NODE, &vtysh_quit_ldpd_cmd);
3224 install_element (LDP_L2VPN_NODE, &vtysh_exit_ldpd_cmd);
3225 install_element (LDP_L2VPN_NODE, &vtysh_quit_ldpd_cmd);
3226 install_element (LDP_PSEUDOWIRE_NODE, &vtysh_exit_ldpd_cmd);
3227 install_element (LDP_PSEUDOWIRE_NODE, &vtysh_quit_ldpd_cmd);
87ab4aec 3228#endif
718e3744 3229 install_element (BGP_NODE, &vtysh_exit_bgpd_cmd);
3230 install_element (BGP_NODE, &vtysh_quit_bgpd_cmd);
3231 install_element (BGP_VPNV4_NODE, &vtysh_exit_bgpd_cmd);
3232 install_element (BGP_VPNV4_NODE, &vtysh_quit_bgpd_cmd);
8ecd3266 3233 install_element (BGP_VPNV6_NODE, &vtysh_exit_bgpd_cmd);
3234 install_element (BGP_VPNV6_NODE, &vtysh_quit_bgpd_cmd);
8b1fb8be
LB
3235 install_element (BGP_ENCAP_NODE, &vtysh_exit_bgpd_cmd);
3236 install_element (BGP_ENCAP_NODE, &vtysh_quit_bgpd_cmd);
3237 install_element (BGP_ENCAPV6_NODE, &vtysh_exit_bgpd_cmd);
3238 install_element (BGP_ENCAPV6_NODE, &vtysh_quit_bgpd_cmd);
718e3744 3239 install_element (BGP_IPV4_NODE, &vtysh_exit_bgpd_cmd);
3240 install_element (BGP_IPV4_NODE, &vtysh_quit_bgpd_cmd);
3241 install_element (BGP_IPV4M_NODE, &vtysh_exit_bgpd_cmd);
3242 install_element (BGP_IPV4M_NODE, &vtysh_quit_bgpd_cmd);
3243 install_element (BGP_IPV6_NODE, &vtysh_exit_bgpd_cmd);
3244 install_element (BGP_IPV6_NODE, &vtysh_quit_bgpd_cmd);
57b5b7ed 3245 install_element (BGP_IPV6M_NODE, &vtysh_exit_bgpd_cmd);
3246 install_element (BGP_IPV6M_NODE, &vtysh_quit_bgpd_cmd);
87ab4aec 3247#if defined (ENABLE_BGP_VNC)
65efcfce
LB
3248 install_element (BGP_VNC_DEFAULTS_NODE, &vtysh_exit_bgpd_cmd);
3249 install_element (BGP_VNC_DEFAULTS_NODE, &vtysh_quit_bgpd_cmd);
3250 install_element (BGP_VNC_NVE_GROUP_NODE, &vtysh_exit_bgpd_cmd);
3251 install_element (BGP_VNC_NVE_GROUP_NODE, &vtysh_quit_bgpd_cmd);
3252 install_element (BGP_VNC_L2_GROUP_NODE, &vtysh_exit_bgpd_cmd);
3253 install_element (BGP_VNC_L2_GROUP_NODE, &vtysh_quit_bgpd_cmd);
87ab4aec 3254#endif
c25e458a 3255 install_element (ISIS_NODE, &vtysh_exit_isisd_cmd);
3256 install_element (ISIS_NODE, &vtysh_quit_isisd_cmd);
718e3744 3257 install_element (KEYCHAIN_NODE, &vtysh_exit_ripd_cmd);
3258 install_element (KEYCHAIN_NODE, &vtysh_quit_ripd_cmd);
3259 install_element (KEYCHAIN_KEY_NODE, &vtysh_exit_ripd_cmd);
3260 install_element (KEYCHAIN_KEY_NODE, &vtysh_quit_ripd_cmd);
3261 install_element (RMAP_NODE, &vtysh_exit_rmap_cmd);
3262 install_element (RMAP_NODE, &vtysh_quit_rmap_cmd);
e7168df4 3263 install_element (VTY_NODE, &vtysh_exit_line_vty_cmd);
3264 install_element (VTY_NODE, &vtysh_quit_line_vty_cmd);
718e3744 3265
3266 /* "end" command. */
3267 install_element (CONFIG_NODE, &vtysh_end_all_cmd);
3268 install_element (ENABLE_NODE, &vtysh_end_all_cmd);
3269 install_element (RIP_NODE, &vtysh_end_all_cmd);
3270 install_element (RIPNG_NODE, &vtysh_end_all_cmd);
3271 install_element (OSPF_NODE, &vtysh_end_all_cmd);
3272 install_element (OSPF6_NODE, &vtysh_end_all_cmd);
4fcbf6e2
RW
3273 install_element (LDP_NODE, &vtysh_end_all_cmd);
3274 install_element (LDP_IPV4_NODE, &vtysh_end_all_cmd);
3275 install_element (LDP_IPV6_NODE, &vtysh_end_all_cmd);
3276 install_element (LDP_IPV4_IFACE_NODE, &vtysh_end_all_cmd);
3277 install_element (LDP_IPV6_IFACE_NODE, &vtysh_end_all_cmd);
3278 install_element (LDP_L2VPN_NODE, &vtysh_end_all_cmd);
3279 install_element (LDP_PSEUDOWIRE_NODE, &vtysh_end_all_cmd);
718e3744 3280 install_element (BGP_NODE, &vtysh_end_all_cmd);
3281 install_element (BGP_IPV4_NODE, &vtysh_end_all_cmd);
3282 install_element (BGP_IPV4M_NODE, &vtysh_end_all_cmd);
3283 install_element (BGP_VPNV4_NODE, &vtysh_end_all_cmd);
8ecd3266 3284 install_element (BGP_VPNV6_NODE, &vtysh_end_all_cmd);
8b1fb8be
LB
3285 install_element (BGP_ENCAP_NODE, &vtysh_end_all_cmd);
3286 install_element (BGP_ENCAPV6_NODE, &vtysh_end_all_cmd);
718e3744 3287 install_element (BGP_IPV6_NODE, &vtysh_end_all_cmd);
57b5b7ed 3288 install_element (BGP_IPV6M_NODE, &vtysh_end_all_cmd);
65efcfce
LB
3289 install_element (BGP_VNC_DEFAULTS_NODE, &vtysh_end_all_cmd);
3290 install_element (BGP_VNC_NVE_GROUP_NODE, &vtysh_end_all_cmd);
3291 install_element (BGP_VNC_L2_GROUP_NODE, &vtysh_end_all_cmd);
c25e458a 3292 install_element (ISIS_NODE, &vtysh_end_all_cmd);
718e3744 3293 install_element (KEYCHAIN_NODE, &vtysh_end_all_cmd);
3294 install_element (KEYCHAIN_KEY_NODE, &vtysh_end_all_cmd);
3295 install_element (RMAP_NODE, &vtysh_end_all_cmd);
e7168df4 3296 install_element (VTY_NODE, &vtysh_end_all_cmd);
718e3744 3297
c43ac31c
DS
3298 install_element (INTERFACE_NODE, &vtysh_interface_desc_cmd);
3299 install_element (INTERFACE_NODE, &vtysh_no_interface_desc_cmd);
718e3744 3300 install_element (INTERFACE_NODE, &vtysh_end_all_cmd);
3301 install_element (INTERFACE_NODE, &vtysh_exit_interface_cmd);
03f99d9a 3302 install_element (LINK_PARAMS_NODE, &exit_link_params_cmd);
16f1b9ee
OD
3303 install_element (LINK_PARAMS_NODE, &vtysh_end_all_cmd);
3304 install_element (LINK_PARAMS_NODE, &vtysh_exit_interface_cmd);
718e3744 3305 install_element (INTERFACE_NODE, &vtysh_quit_interface_cmd);
e9d94ea7 3306
13460c44
FL
3307 install_element (NS_NODE, &vtysh_end_all_cmd);
3308 install_element (NS_NODE, &vtysh_exit_ns_cmd);
3309 install_element (NS_NODE, &vtysh_quit_ns_cmd);
3310
e9d94ea7
DS
3311 install_element (VRF_NODE, &vtysh_end_all_cmd);
3312 install_element (VRF_NODE, &vtysh_exit_vrf_cmd);
3313 install_element (VRF_NODE, &vtysh_quit_vrf_cmd);
3314
718e3744 3315 install_element (CONFIG_NODE, &router_rip_cmd);
718e3744 3316 install_element (CONFIG_NODE, &router_ripng_cmd);
718e3744 3317 install_element (CONFIG_NODE, &router_ospf_cmd);
7c8ff89e 3318 install_element (CONFIG_NODE, &router_ospf_instance_cmd);
718e3744 3319 install_element (CONFIG_NODE, &router_ospf6_cmd);
87ab4aec 3320#if defined (HAVE_LDPD)
4fcbf6e2
RW
3321 install_element (CONFIG_NODE, &ldp_mpls_ldp_cmd);
3322 install_element (LDP_NODE, &ldp_address_family_ipv4_cmd);
3323 install_element (LDP_NODE, &ldp_address_family_ipv6_cmd);
3324 install_element (LDP_IPV4_NODE, &ldp_interface_ifname_cmd);
3325 install_element (LDP_IPV6_NODE, &ldp_interface_ifname_cmd);
3326 install_element (CONFIG_NODE, &ldp_l2vpn_word_type_vpls_cmd);
3327 install_element (LDP_L2VPN_NODE, &ldp_member_pseudowire_ifname_cmd);
87ab4aec 3328#endif
c25e458a 3329 install_element (CONFIG_NODE, &router_isis_cmd);
718e3744 3330 install_element (CONFIG_NODE, &router_bgp_cmd);
2385a876 3331 install_element (CONFIG_NODE, &router_bgp_asn_cmd);
10895fd6 3332 install_element (CONFIG_NODE, &router_bgp_view_cmd);
718e3744 3333 install_element (BGP_NODE, &address_family_vpnv4_cmd);
3334 install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
8ecd3266 3335 install_element (BGP_NODE, &address_family_vpnv6_cmd);
3336 install_element (BGP_NODE, &address_family_vpnv6_unicast_cmd);
8b1fb8be
LB
3337 install_element (BGP_NODE, &address_family_encap_cmd);
3338 install_element (BGP_NODE, &address_family_encapv6_cmd);
87ab4aec 3339#if defined(ENABLE_BGP_VNC)
65efcfce
LB
3340 install_element (BGP_NODE, &vnc_defaults_cmd);
3341 install_element (BGP_NODE, &vnc_nve_group_cmd);
87ab4aec 3342#endif
718e3744 3343 install_element (BGP_NODE, &address_family_ipv4_unicast_cmd);
3344 install_element (BGP_NODE, &address_family_ipv4_multicast_cmd);
3345#ifdef HAVE_IPV6
3346 install_element (BGP_NODE, &address_family_ipv6_cmd);
3347 install_element (BGP_NODE, &address_family_ipv6_unicast_cmd);
01a2af45 3348 install_element (BGP_NODE, &address_family_ipv6_multicast_cmd);
718e3744 3349#endif
3350 install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
8ecd3266 3351 install_element (BGP_VPNV6_NODE, &exit_address_family_cmd);
8b1fb8be
LB
3352 install_element (BGP_ENCAP_NODE, &exit_address_family_cmd);
3353 install_element (BGP_ENCAPV6_NODE, &exit_address_family_cmd);
718e3744 3354 install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
3355 install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
3356 install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
57b5b7ed 3357 install_element (BGP_IPV6M_NODE, &exit_address_family_cmd);
65efcfce
LB
3358
3359 install_element (BGP_VNC_DEFAULTS_NODE, &exit_vnc_config_cmd);
3360 install_element (BGP_VNC_NVE_GROUP_NODE, &exit_vnc_config_cmd);
3361 install_element (BGP_VNC_L2_GROUP_NODE, &exit_vnc_config_cmd);
3362
718e3744 3363 install_element (CONFIG_NODE, &key_chain_cmd);
c43ac31c 3364 install_element (CONFIG_NODE, &vtysh_route_map_cmd);
e7168df4 3365 install_element (CONFIG_NODE, &vtysh_line_vty_cmd);
718e3744 3366 install_element (KEYCHAIN_NODE, &key_cmd);
3367 install_element (KEYCHAIN_NODE, &key_chain_cmd);
3368 install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
3369 install_element (CONFIG_NODE, &vtysh_interface_cmd);
32d2463c 3370 install_element (CONFIG_NODE, &vtysh_no_interface_cmd);
cd2a8a42
FL
3371 install_element (CONFIG_NODE, &vtysh_interface_vrf_cmd);
3372 install_element (CONFIG_NODE, &vtysh_no_interface_vrf_cmd);
16f1b9ee 3373 install_element (INTERFACE_NODE, &vtysh_link_params_cmd);
718e3744 3374 install_element (ENABLE_NODE, &vtysh_show_running_config_cmd);
c006e89e 3375 install_element (ENABLE_NODE, &vtysh_show_running_config_daemon_cmd);
718e3744 3376 install_element (ENABLE_NODE, &vtysh_copy_runningconfig_startupconfig_cmd);
3377 install_element (ENABLE_NODE, &vtysh_write_file_cmd);
4a6e2257 3378 install_element (ENABLE_NODE, &vtysh_write_cmd);
718e3744 3379
e9d94ea7
DS
3380 install_element (CONFIG_NODE, &vtysh_vrf_cmd);
3381 install_element (CONFIG_NODE, &vtysh_no_vrf_cmd);
3382
95e735b5 3383 /* "write terminal" command. */
718e3744 3384 install_element (ENABLE_NODE, &vtysh_write_terminal_cmd);
c006e89e 3385 install_element (ENABLE_NODE, &vtysh_write_terminal_daemon_cmd);
b47b0a84 3386
e7168df4 3387 install_element (CONFIG_NODE, &vtysh_integrated_config_cmd);
3388 install_element (CONFIG_NODE, &no_vtysh_integrated_config_cmd);
718e3744 3389
95e735b5 3390 /* "write memory" command. */
718e3744 3391 install_element (ENABLE_NODE, &vtysh_write_memory_cmd);
718e3744 3392
34553cc3 3393 install_element (VIEW_NODE, &vtysh_terminal_length_cmd);
34553cc3 3394 install_element (VIEW_NODE, &vtysh_terminal_no_length_cmd);
f2799e69 3395 install_element (VIEW_NODE, &vtysh_show_daemons_cmd);
34553cc3 3396
718e3744 3397 install_element (VIEW_NODE, &vtysh_ping_cmd);
4eeccf18 3398 install_element (VIEW_NODE, &vtysh_ping_ip_cmd);
718e3744 3399 install_element (VIEW_NODE, &vtysh_traceroute_cmd);
4eeccf18 3400 install_element (VIEW_NODE, &vtysh_traceroute_ip_cmd);
4eeccf18 3401 install_element (VIEW_NODE, &vtysh_ping6_cmd);
3402 install_element (VIEW_NODE, &vtysh_traceroute6_cmd);
576b6b5d 3403#if defined(HAVE_SHELL_ACCESS)
718e3744 3404 install_element (VIEW_NODE, &vtysh_telnet_cmd);
3405 install_element (VIEW_NODE, &vtysh_telnet_port_cmd);
5087df56 3406 install_element (VIEW_NODE, &vtysh_ssh_cmd);
4eeccf18 3407#endif
576b6b5d 3408#if defined(HAVE_SHELL_ACCESS)
718e3744 3409 install_element (ENABLE_NODE, &vtysh_start_shell_cmd);
3410 install_element (ENABLE_NODE, &vtysh_start_bash_cmd);
3411 install_element (ENABLE_NODE, &vtysh_start_zsh_cmd);
576b6b5d
DS
3412#endif
3413
362b4031 3414 install_element (VIEW_NODE, &vtysh_show_memory_cmd);
362b4031 3415
0f69b58c 3416 install_element (VIEW_NODE, &vtysh_show_work_queues_cmd);
b47b0a84 3417 install_element (VIEW_NODE, &vtysh_show_work_queues_daemon_cmd);
0f69b58c
DS
3418
3419 install_element (VIEW_NODE, &vtysh_show_thread_cmd);
0f69b58c 3420
dbf7d13d 3421 /* Logging */
dbf7d13d 3422 install_element (VIEW_NODE, &vtysh_show_logging_cmd);
718e3744 3423 install_element (CONFIG_NODE, &vtysh_log_stdout_cmd);
274a4a44 3424 install_element (CONFIG_NODE, &vtysh_log_stdout_level_cmd);
718e3744 3425 install_element (CONFIG_NODE, &no_vtysh_log_stdout_cmd);
3426 install_element (CONFIG_NODE, &vtysh_log_file_cmd);
274a4a44 3427 install_element (CONFIG_NODE, &vtysh_log_file_level_cmd);
718e3744 3428 install_element (CONFIG_NODE, &no_vtysh_log_file_cmd);
274a4a44 3429 install_element (CONFIG_NODE, &no_vtysh_log_file_level_cmd);
3430 install_element (CONFIG_NODE, &vtysh_log_monitor_cmd);
3431 install_element (CONFIG_NODE, &vtysh_log_monitor_level_cmd);
3432 install_element (CONFIG_NODE, &no_vtysh_log_monitor_cmd);
718e3744 3433 install_element (CONFIG_NODE, &vtysh_log_syslog_cmd);
274a4a44 3434 install_element (CONFIG_NODE, &vtysh_log_syslog_level_cmd);
718e3744 3435 install_element (CONFIG_NODE, &no_vtysh_log_syslog_cmd);
3436 install_element (CONFIG_NODE, &vtysh_log_trap_cmd);
3437 install_element (CONFIG_NODE, &no_vtysh_log_trap_cmd);
274a4a44 3438 install_element (CONFIG_NODE, &vtysh_log_facility_cmd);
3439 install_element (CONFIG_NODE, &no_vtysh_log_facility_cmd);
718e3744 3440 install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
3441 install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
c749b722
AS
3442 install_element (CONFIG_NODE, &vtysh_log_timestamp_precision_cmd);
3443 install_element (CONFIG_NODE, &no_vtysh_log_timestamp_precision_cmd);
e7168df4 3444
3445 install_element (CONFIG_NODE, &vtysh_service_password_encrypt_cmd);
3446 install_element (CONFIG_NODE, &no_vtysh_service_password_encrypt_cmd);
3447
3448 install_element (CONFIG_NODE, &vtysh_password_cmd);
3449 install_element (CONFIG_NODE, &vtysh_password_text_cmd);
3450 install_element (CONFIG_NODE, &vtysh_enable_password_cmd);
3451 install_element (CONFIG_NODE, &vtysh_enable_password_text_cmd);
3452 install_element (CONFIG_NODE, &no_vtysh_enable_password_cmd);
3453
718e3744 3454}