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