]> git.proxmox.com Git - mirror_frr.git/blob - vtysh/vtysh.c
build: rename (1 of ?): configure.ac + preproc
[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 = "watchquagga", .flag = VTYSH_WATCHQUAGGA, .path = WATCHQUAGGA_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 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 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 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 int len;
771
772 if (token->cmd[0] == '\0')
773 continue;
774
775 len = strlen (token->cmd);
776 if (token->cmd[0] == '.')
777 len--;
778
779 if (width < len)
780 width = len;
781 }
782
783 for (i = 0; i < vector_active (describe); i++)
784 if ((token = vector_slot (describe, i)) != NULL)
785 {
786 if (token->cmd[0] == '\0')
787 continue;
788
789 if (! token->desc)
790 fprintf (stdout," %-s\n",
791 token->cmd[0] == '.' ? token->cmd + 1 : token->cmd);
792 else
793 fprintf (stdout," %-*s %s\n",
794 width,
795 token->cmd[0] == '.' ? token->cmd + 1 : token->cmd,
796 token->desc);
797 }
798
799 cmd_free_strvec (vline);
800 vector_free (describe);
801
802 rl_on_new_line();
803
804 return 0;
805 }
806
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. */
810 int complete_status;
811
812 static char *
813 command_generator (const char *text, int state)
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]))
832 vector_set (vline, NULL);
833
834 if (matched)
835 XFREE (MTYPE_TMP, matched);
836 matched = cmd_complete_command (vline, vty, &complete_status);
837 cmd_free_strvec (vline);
838 }
839
840 if (matched && matched[index])
841 return matched[index++];
842
843 return NULL;
844 }
845
846 static char **
847 new_completion (char *text, int start, int end)
848 {
849 char **matches;
850
851 matches = rl_completion_matches (text, command_generator);
852
853 if (matches)
854 {
855 rl_point = rl_end;
856 if (complete_status != CMD_COMPLETE_FULL_MATCH)
857 /* only append a space on full match */
858 rl_completion_append_character = '\0';
859 }
860
861 return matches;
862 }
863
864 /* Vty node structures. */
865 static struct cmd_node bgp_node =
866 {
867 BGP_NODE,
868 "%s(config-router)# ",
869 };
870
871 static struct cmd_node rip_node =
872 {
873 RIP_NODE,
874 "%s(config-router)# ",
875 };
876
877 static struct cmd_node isis_node =
878 {
879 ISIS_NODE,
880 "%s(config-router)# ",
881 };
882
883 static struct cmd_node interface_node =
884 {
885 INTERFACE_NODE,
886 "%s(config-if)# ",
887 };
888
889 static struct cmd_node ns_node =
890 {
891 NS_NODE,
892 "%s(config-logical-router)# ",
893 };
894
895 static struct cmd_node vrf_node =
896 {
897 VRF_NODE,
898 "%s(config-vrf)# ",
899 };
900
901 static struct cmd_node rmap_node =
902 {
903 RMAP_NODE,
904 "%s(config-route-map)# "
905 };
906
907 static struct cmd_node zebra_node =
908 {
909 ZEBRA_NODE,
910 "%s(config-router)# "
911 };
912
913 static struct cmd_node bgp_vpnv4_node =
914 {
915 BGP_VPNV4_NODE,
916 "%s(config-router-af)# "
917 };
918
919 static struct cmd_node bgp_vpnv6_node =
920 {
921 BGP_VPNV6_NODE,
922 "%s(config-router-af)# "
923 };
924
925 static struct cmd_node bgp_encap_node =
926 {
927 BGP_ENCAP_NODE,
928 "%s(config-router-af)# "
929 };
930
931 static struct cmd_node bgp_encapv6_node =
932 {
933 BGP_ENCAPV6_NODE,
934 "%s(config-router-af)# "
935 };
936
937 static struct cmd_node bgp_ipv4_node =
938 {
939 BGP_IPV4_NODE,
940 "%s(config-router-af)# "
941 };
942
943 static struct cmd_node bgp_ipv4m_node =
944 {
945 BGP_IPV4M_NODE,
946 "%s(config-router-af)# "
947 };
948
949 static struct cmd_node bgp_ipv6_node =
950 {
951 BGP_IPV6_NODE,
952 "%s(config-router-af)# "
953 };
954
955 static struct cmd_node bgp_ipv6m_node =
956 {
957 BGP_IPV6M_NODE,
958 "%s(config-router-af)# "
959 };
960
961 static struct cmd_node bgp_vnc_defaults_node =
962 {
963 BGP_VNC_DEFAULTS_NODE,
964 "%s(config-router-vnc-defaults)# "
965 };
966
967 static struct cmd_node bgp_vnc_nve_group_node =
968 {
969 BGP_VNC_NVE_GROUP_NODE,
970 "%s(config-router-vnc-nve-group)# "
971 };
972
973 static struct cmd_node bgp_vnc_l2_group_node =
974 {
975 BGP_VNC_L2_GROUP_NODE,
976 "%s(config-router-vnc-l2-group)# "
977 };
978
979 static struct cmd_node ospf_node =
980 {
981 OSPF_NODE,
982 "%s(config-router)# "
983 };
984
985 static struct cmd_node ripng_node =
986 {
987 RIPNG_NODE,
988 "%s(config-router)# "
989 };
990
991 static struct cmd_node ospf6_node =
992 {
993 OSPF6_NODE,
994 "%s(config-ospf6)# "
995 };
996
997 static struct cmd_node ldp_node =
998 {
999 LDP_NODE,
1000 "%s(config-ldp)# "
1001 };
1002
1003 static struct cmd_node ldp_ipv4_node =
1004 {
1005 LDP_IPV4_NODE,
1006 "%s(config-ldp-af)# "
1007 };
1008
1009 static struct cmd_node ldp_ipv6_node =
1010 {
1011 LDP_IPV6_NODE,
1012 "%s(config-ldp-af)# "
1013 };
1014
1015 static struct cmd_node ldp_ipv4_iface_node =
1016 {
1017 LDP_IPV4_IFACE_NODE,
1018 "%s(config-ldp-af-if)# "
1019 };
1020
1021 static struct cmd_node ldp_ipv6_iface_node =
1022 {
1023 LDP_IPV6_IFACE_NODE,
1024 "%s(config-ldp-af-if)# "
1025 };
1026
1027 static struct cmd_node ldp_l2vpn_node =
1028 {
1029 LDP_L2VPN_NODE,
1030 "%s(config-l2vpn)# "
1031 };
1032
1033 static struct cmd_node ldp_pseudowire_node =
1034 {
1035 LDP_PSEUDOWIRE_NODE,
1036 "%s(config-l2vpn-pw)# "
1037 };
1038
1039 static struct cmd_node keychain_node =
1040 {
1041 KEYCHAIN_NODE,
1042 "%s(config-keychain)# "
1043 };
1044
1045 static struct cmd_node keychain_key_node =
1046 {
1047 KEYCHAIN_KEY_NODE,
1048 "%s(config-keychain-key)# "
1049 };
1050
1051 struct cmd_node link_params_node =
1052 {
1053 LINK_PARAMS_NODE,
1054 "%s(config-link-params)# ",
1055 };
1056
1057 /* Defined in lib/vty.c */
1058 extern struct cmd_node vty_node;
1059
1060 /* When '^Z' is received from vty, move down to the enable mode. */
1061 static int
1062 vtysh_end (void)
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
1077 DEFUNSH (VTYSH_REALLYALL,
1078 vtysh_end_all,
1079 vtysh_end_all_cmd,
1080 "end",
1081 "End current mode and change to enable mode\n")
1082 {
1083 return vtysh_end ();
1084 }
1085
1086 DEFUNSH (VTYSH_BGPD,
1087 router_bgp,
1088 router_bgp_cmd,
1089 "router bgp " CMD_AS_RANGE,
1090 ROUTER_STR
1091 BGP_STR
1092 AS_STR)
1093 {
1094 vty->node = BGP_NODE;
1095 return CMD_SUCCESS;
1096 }
1097
1098 ALIAS_SH (VTYSH_BGPD,
1099 router_bgp,
1100 router_bgp_asn_cmd,
1101 "router bgp",
1102 ROUTER_STR
1103 BGP_STR)
1104
1105 ALIAS_SH (VTYSH_BGPD,
1106 router_bgp,
1107 router_bgp_view_cmd,
1108 "router bgp " CMD_AS_RANGE " (view|vrf) WORD",
1109 ROUTER_STR
1110 BGP_STR
1111 AS_STR
1112 "BGP view\nBGP VRF\n"
1113 "View/VRF name\n")
1114
1115 DEFUNSH (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
1126 DEFUNSH (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
1138 DEFUNSH (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
1149 DEFUNSH (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
1161 DEFUNSH (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
1172 DEFUNSH (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
1183 DEFUNSH (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
1194 DEFUNSH (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
1206 DEFUNSH (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
1218 DEFUNSH (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
1229 DEFUNSH (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
1241 DEFUNSH (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
1253 #if defined (ENABLE_BGP_VNC)
1254 DEFUNSH (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
1265 DEFUNSH (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
1277 DEFUNSH (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 }
1288 #endif
1289
1290 DEFUNSH (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
1302 DEFUNSH (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
1313 DEFUNSH (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
1324 DEFUNSH (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
1335 DEFUNSH (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
1346 ALIAS_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
1354 DEFUNSH (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
1365 #if defined (HAVE_LDPD)
1366 DEFUNSH (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
1377 DEFUNSH (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
1388 DEFUNSH (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
1399 DEFUNSH (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
1421 DEFUNSH (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
1434 DEFUNSH (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 }
1445 #endif
1446
1447 DEFUNSH (VTYSH_ISISD,
1448 router_isis,
1449 router_isis_cmd,
1450 "router isis WORD",
1451 ROUTER_STR
1452 "ISO IS-IS\n"
1453 "ISO Routing area tag")
1454 {
1455 vty->node = ISIS_NODE;
1456 return CMD_SUCCESS;
1457 }
1458
1459 DEFUNSH (VTYSH_RMAP,
1460 vtysh_route_map,
1461 vtysh_route_map_cmd,
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
1473 DEFUNSH (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
1484 DEFUNSH (VTYSH_REALLYALL,
1485 vtysh_enable,
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
1494 DEFUNSH (VTYSH_REALLYALL,
1495 vtysh_disable,
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
1505 DEFUNSH (VTYSH_REALLYALL,
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
1516 static int
1517 vtysh_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:
1529 case NS_NODE:
1530 case VRF_NODE:
1531 case ZEBRA_NODE:
1532 case BGP_NODE:
1533 case RIP_NODE:
1534 case RIPNG_NODE:
1535 case OSPF_NODE:
1536 case OSPF6_NODE:
1537 case LDP_NODE:
1538 case LDP_L2VPN_NODE:
1539 case ISIS_NODE:
1540 case MASC_NODE:
1541 case RMAP_NODE:
1542 case VTY_NODE:
1543 case KEYCHAIN_NODE:
1544 vtysh_execute("end");
1545 vtysh_execute("configure terminal");
1546 vty->node = CONFIG_NODE;
1547 break;
1548 case BGP_VPNV4_NODE:
1549 case BGP_VPNV6_NODE:
1550 case BGP_ENCAP_NODE:
1551 case BGP_ENCAPV6_NODE:
1552 case BGP_IPV4_NODE:
1553 case BGP_IPV4M_NODE:
1554 case BGP_IPV6_NODE:
1555 case BGP_IPV6M_NODE:
1556 case BGP_VNC_DEFAULTS_NODE:
1557 case BGP_VNC_NVE_GROUP_NODE:
1558 case BGP_VNC_L2_GROUP_NODE:
1559 vty->node = BGP_NODE;
1560 break;
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;
1574 case KEYCHAIN_KEY_NODE:
1575 vty->node = KEYCHAIN_NODE;
1576 break;
1577 case LINK_PARAMS_NODE:
1578 vty->node = INTERFACE_NODE;
1579 break;
1580 default:
1581 break;
1582 }
1583 return CMD_SUCCESS;
1584 }
1585
1586 DEFUNSH (VTYSH_REALLYALL,
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
1595 ALIAS (vtysh_exit_all,
1596 vtysh_quit_all_cmd,
1597 "quit",
1598 "Exit current mode and down to previous mode\n")
1599
1600 DEFUNSH (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
1609 || vty->node == BGP_VPNV6_NODE
1610 || vty->node == BGP_ENCAP_NODE
1611 || vty->node == BGP_ENCAPV6_NODE
1612 || vty->node == BGP_IPV6_NODE
1613 || vty->node == BGP_IPV6M_NODE)
1614 vty->node = BGP_NODE;
1615 return CMD_SUCCESS;
1616 }
1617
1618 DEFUNSH (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
1631 DEFUNSH (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
1640 ALIAS (vtysh_exit_zebra,
1641 vtysh_quit_zebra_cmd,
1642 "quit",
1643 "Exit current mode and down to previous mode\n")
1644
1645 DEFUNSH (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
1654 ALIAS (vtysh_exit_ripd,
1655 vtysh_quit_ripd_cmd,
1656 "quit",
1657 "Exit current mode and down to previous mode\n")
1658
1659 DEFUNSH (VTYSH_RIPNGD,
1660 vtysh_exit_ripngd,
1661 vtysh_exit_ripngd_cmd,
1662 "exit",
1663 "Exit current mode and down to previous mode\n")
1664 {
1665 return vtysh_exit (vty);
1666 }
1667
1668 ALIAS (vtysh_exit_ripngd,
1669 vtysh_quit_ripngd_cmd,
1670 "quit",
1671 "Exit current mode and down to previous mode\n")
1672
1673 DEFUNSH (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
1682 ALIAS (vtysh_exit_rmap,
1683 vtysh_quit_rmap_cmd,
1684 "quit",
1685 "Exit current mode and down to previous mode\n")
1686
1687 DEFUNSH (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
1696 ALIAS (vtysh_exit_bgpd,
1697 vtysh_quit_bgpd_cmd,
1698 "quit",
1699 "Exit current mode and down to previous mode\n")
1700
1701 DEFUNSH (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
1710 ALIAS (vtysh_exit_ospfd,
1711 vtysh_quit_ospfd_cmd,
1712 "quit",
1713 "Exit current mode and down to previous mode\n")
1714
1715 DEFUNSH (VTYSH_OSPF6D,
1716 vtysh_exit_ospf6d,
1717 vtysh_exit_ospf6d_cmd,
1718 "exit",
1719 "Exit current mode and down to previous mode\n")
1720 {
1721 return vtysh_exit (vty);
1722 }
1723
1724 ALIAS (vtysh_exit_ospf6d,
1725 vtysh_quit_ospf6d_cmd,
1726 "quit",
1727 "Exit current mode and down to previous mode\n")
1728
1729 #if defined (HAVE_LDPD)
1730 DEFUNSH (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
1739 ALIAS (vtysh_exit_ldpd,
1740 vtysh_quit_ldpd_cmd,
1741 "quit",
1742 "Exit current mode and down to previous mode\n")
1743 #endif
1744
1745 DEFUNSH (VTYSH_ISISD,
1746 vtysh_exit_isisd,
1747 vtysh_exit_isisd_cmd,
1748 "exit",
1749 "Exit current mode and down to previous mode\n")
1750 {
1751 return vtysh_exit (vty);
1752 }
1753
1754 ALIAS (vtysh_exit_isisd,
1755 vtysh_quit_isisd_cmd,
1756 "quit",
1757 "Exit current mode and down to previous mode\n")
1758
1759 DEFUNSH (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
1768 ALIAS (vtysh_exit_line_vty,
1769 vtysh_quit_line_vty_cmd,
1770 "quit",
1771 "Exit current mode and down to previous mode\n")
1772
1773 DEFUNSH (VTYSH_INTERFACE,
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
1784 ALIAS_SH (VTYSH_ZEBRA,
1785 vtysh_interface,
1786 vtysh_interface_vrf_cmd,
1787 "interface IFNAME " VRF_CMD_STR,
1788 "Select an interface to configure\n"
1789 "Interface's name\n"
1790 VRF_CMD_HELP_STR)
1791
1792 /* TODO Implement "no interface command in isisd. */
1793 DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_LDPD,
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
1800 DEFSH (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
1808 DEFUNSH (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
1821 DEFUNSH (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
1832 DEFSH (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
1839 DEFUNSH (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
1848 ALIAS (vtysh_exit_ns,
1849 vtysh_quit_ns_cmd,
1850 "quit",
1851 "Exit current mode and down to previous mode\n")
1852
1853 DEFUNSH (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
1862 ALIAS (vtysh_exit_vrf,
1863 vtysh_quit_vrf_cmd,
1864 "quit",
1865 "Exit current mode and down to previous mode\n")
1866
1867 /* TODO Implement interface description commands in ripngd, ospf6d
1868 * and isisd. */
1869 DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD|VTYSH_LDPD,
1870 vtysh_interface_desc_cmd,
1871 "description .LINE",
1872 "Interface specific description\n"
1873 "Characters describing this interface\n")
1874
1875 DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
1876 vtysh_no_interface_desc_cmd,
1877 "no description",
1878 NO_STR
1879 "Interface specific description\n")
1880
1881 DEFUNSH (VTYSH_INTERFACE,
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
1890 ALIAS (vtysh_exit_interface,
1891 vtysh_quit_interface_cmd,
1892 "quit",
1893 "Exit current mode and down to previous mode\n")
1894
1895 DEFUN (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
1919 DEFUN (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
1941 DEFUN (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
1968 DEFUNSH (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
1979 DEFUNSH (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
1990 /* Memory */
1991 DEFUN (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
2001 for (i = 0; i < array_size(vtysh_client); i++)
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
2013 /* Logging commands. */
2014 DEFUN (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
2024 for (i = 0; i < array_size(vtysh_client); i++)
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
2033 return ret;
2034 }
2035
2036 DEFUNSH (VTYSH_ALL,
2037 vtysh_log_stdout,
2038 vtysh_log_stdout_cmd,
2039 "log stdout",
2040 "Logging control\n"
2041 "Set stdout logging level\n")
2042 {
2043 return CMD_SUCCESS;
2044 }
2045
2046 DEFUNSH (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)
2053 {
2054 return CMD_SUCCESS;
2055 }
2056
2057 DEFUNSH (VTYSH_ALL,
2058 no_vtysh_log_stdout,
2059 no_vtysh_log_stdout_cmd,
2060 "no log stdout [LEVEL]",
2061 NO_STR
2062 "Logging control\n"
2063 "Cancel logging to stdout\n"
2064 "Logging level\n")
2065 {
2066 return CMD_SUCCESS;
2067 }
2068
2069 DEFUNSH (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
2080 DEFUNSH (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
2092 DEFUNSH (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
2104 ALIAS_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
2114 DEFUNSH (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
2124 DEFUNSH (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
2135 DEFUNSH (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
2147 DEFUNSH (VTYSH_ALL,
2148 vtysh_log_syslog,
2149 vtysh_log_syslog_cmd,
2150 "log syslog",
2151 "Logging control\n"
2152 "Set syslog logging level\n")
2153 {
2154 return CMD_SUCCESS;
2155 }
2156
2157 DEFUNSH (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)
2164 {
2165 return CMD_SUCCESS;
2166 }
2167
2168 DEFUNSH (VTYSH_ALL,
2169 no_vtysh_log_syslog,
2170 no_vtysh_log_syslog_cmd,
2171 "no log syslog [LEVEL]",
2172 NO_STR
2173 "Logging control\n"
2174 "Cancel logging to syslog\n"
2175 "Logging level\n")
2176 {
2177 return CMD_SUCCESS;
2178 }
2179
2180 DEFUNSH (VTYSH_ALL,
2181 vtysh_log_facility,
2182 vtysh_log_facility_cmd,
2183 "log facility "LOG_FACILITIES,
2184 "Logging control\n"
2185 "Facility parameter for syslog messages\n"
2186 LOG_FACILITY_DESC)
2187
2188 {
2189 return CMD_SUCCESS;
2190 }
2191
2192 DEFUNSH (VTYSH_ALL,
2193 no_vtysh_log_facility,
2194 no_vtysh_log_facility_cmd,
2195 "no log facility [FACILITY]",
2196 NO_STR
2197 "Logging control\n"
2198 "Reset syslog facility to default (daemon)\n"
2199 "Syslog facility\n")
2200
2201 {
2202 return CMD_SUCCESS;
2203 }
2204
2205 DEFUNSH_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
2217 DEFUNSH_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")
2225 {
2226 return CMD_SUCCESS;
2227 }
2228
2229 DEFUNSH (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
2239 DEFUNSH (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
2250 DEFUNSH (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
2262 DEFUNSH (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
2274 DEFUNSH (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
2284 DEFUNSH (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
2295 DEFUNSH (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
2307 DEFUNSH (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
2317 DEFUNSH (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
2330 DEFUNSH (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
2341 DEFUNSH (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
2352 DEFUN (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 {
2358 u_int i;
2359 char line[] = "write terminal\n";
2360 FILE *fp = NULL;
2361
2362 if (vtysh_pager_name)
2363 {
2364 fp = popen (vtysh_pager_name, "w");
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);
2377 vty_out (vty, "!%s", VTY_NEWLINE);
2378
2379 for (i = 0; i < array_size(vtysh_client); i++)
2380 if ((argc < 1 ) || (begins_with(vtysh_client[i].name, argv[0])))
2381 vtysh_client_config (&vtysh_client[i], line);
2382
2383 /* Integrate vtysh specific configuration. */
2384 vtysh_config_write ();
2385
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
2399 vty_out (vty, "end%s", VTY_NEWLINE);
2400
2401 return CMD_SUCCESS;
2402 }
2403
2404 DEFUN (vtysh_write_terminal_daemon,
2405 vtysh_write_terminal_daemon_cmd,
2406 "write terminal (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
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"
2414 "For the ldp daemon\n"
2415 "For the bgp daemon\n"
2416 "For the isis daemon\n"
2417 "For the pim daemon\n")
2418 {
2419 unsigned int i;
2420 int ret = CMD_SUCCESS;
2421
2422 for (i = 0; i < array_size(vtysh_client); i++)
2423 {
2424 if (begins_with(vtysh_client[i].name, argv[0]))
2425 break;
2426 }
2427
2428 if (i == array_size(vtysh_client))
2429 return CMD_ERR_NO_MATCH;
2430
2431 ret = vtysh_client_execute(&vtysh_client[i], "show running-config\n", stdout);
2432
2433 return ret;
2434 }
2435
2436 DEFUN (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")
2441 {
2442 vtysh_write_integrated = WRITE_INTEGRATED_YES;
2443 return CMD_SUCCESS;
2444 }
2445
2446 DEFUN (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")
2452 {
2453 vtysh_write_integrated = WRITE_INTEGRATED_NO;
2454 return CMD_SUCCESS;
2455 }
2456
2457 static void
2458 backup_config_file (const char *fbackup)
2459 {
2460 char *integrate_sav = NULL;
2461
2462 integrate_sav = malloc (strlen (fbackup) +
2463 strlen (CONF_BACKUP_EXT) + 1);
2464 strcpy (integrate_sav, fbackup);
2465 strcat (integrate_sav, CONF_BACKUP_EXT);
2466
2467 /* Move current configuration file to backup config file. */
2468 unlink (integrate_sav);
2469 rename (fbackup, integrate_sav);
2470 free (integrate_sav);
2471 }
2472
2473 int
2474 vtysh_write_config_integrated(void)
2475 {
2476 u_int i;
2477 char line[] = "write terminal\n";
2478 FILE *fp;
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;
2486
2487 fprintf (stdout,"Building Configuration...\n");
2488
2489 backup_config_file(quagga_config);
2490 fp = fopen (quagga_config, "w");
2491 if (fp == NULL)
2492 {
2493 fprintf (stdout,"%% Error: failed to open configuration file %s: %s\n",
2494 quagga_config, safe_strerror(errno));
2495 return CMD_WARNING;
2496 }
2497 fd = fileno (fp);
2498
2499 for (i = 0; i < array_size(vtysh_client); i++)
2500 vtysh_client_config (&vtysh_client[i], line);
2501
2502 vtysh_config_write ();
2503 vtysh_config_dump (fp);
2504
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
2512 pwentry = getpwnam (FRR_USER);
2513 if (pwentry)
2514 uid = pwentry->pw_uid;
2515 else
2516 {
2517 printf ("%% Warning: could not look up user \"%s\"\n", FRR_USER);
2518 err++;
2519 }
2520
2521 grentry = getgrnam (FRR_GROUP);
2522 if (grentry)
2523 gid = grentry->gr_gid;
2524 else
2525 {
2526 printf ("%% Warning: could not look up group \"%s\"\n", FRR_GROUP);
2527 err++;
2528 }
2529
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
2552 printf ("Integrated configuration saved to %s\n", quagga_config);
2553 if (err)
2554 return CMD_WARNING;
2555
2556 printf ("[OK]\n");
2557 return CMD_SUCCESS;
2558 }
2559
2560 static bool want_config_integrated(void)
2561 {
2562 struct stat s;
2563
2564 switch (vtysh_write_integrated)
2565 {
2566 case WRITE_INTEGRATED_UNSPECIFIED:
2567 if (stat(quagga_config, &s) && errno == ENOENT)
2568 return false;
2569 return true;
2570 case WRITE_INTEGRATED_NO:
2571 return false;
2572 case WRITE_INTEGRATED_YES:
2573 return true;
2574 }
2575 return true;
2576 }
2577
2578 DEFUN (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 {
2584 int ret = CMD_SUCCESS;
2585 char line[] = "write memory\n";
2586 u_int i;
2587
2588 fprintf (stdout, "Note: this version of vtysh never writes vtysh.conf\n");
2589
2590 /* If integrated Quagga.conf explicitely set. */
2591 if (want_config_integrated())
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 {
2602 printf("\nWarning: attempting direct configuration write without "
2603 "watchquagga.\nFile permissions and ownership may be "
2604 "incorrect, or write may fail.\n\n");
2605 ret = vtysh_write_config_integrated();
2606 }
2607 return ret;
2608 }
2609
2610 fprintf (stdout,"Building Configuration...\n");
2611
2612 for (i = 0; i < array_size(vtysh_client); i++)
2613 ret = vtysh_client_execute (&vtysh_client[i], line, stdout);
2614
2615 return ret;
2616 }
2617
2618 ALIAS (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
2625 ALIAS (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
2631 ALIAS (vtysh_write_memory,
2632 vtysh_write_cmd,
2633 "write",
2634 "Write running configuration to memory, network, or terminal\n")
2635
2636 ALIAS (vtysh_write_terminal,
2637 vtysh_show_running_config_cmd,
2638 "show running-config",
2639 SHOW_STR
2640 "Current operating configuration\n")
2641
2642 ALIAS (vtysh_write_terminal,
2643 vtysh_show_running_config_daemon_cmd,
2644 "show running-config (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
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"
2652 "For the ldp daemon\n"
2653 "For the bgp daemon\n"
2654 "For the isis daemon\n"
2655 "For the pim daemon\n")
2656
2657 DEFUN (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
2690 DEFUN (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
2707 DEFUN (vtysh_show_daemons,
2708 vtysh_show_daemons_cmd,
2709 "show daemons",
2710 SHOW_STR
2711 "Show list of running daemons\n")
2712 {
2713 u_int i;
2714
2715 for (i = 0; i < array_size(vtysh_client); i++)
2716 if ( vtysh_client[i].fd >= 0 )
2717 vty_out(vty, " %s", vtysh_client[i].name);
2718 vty_out(vty, "%s", VTY_NEWLINE);
2719
2720 return CMD_SUCCESS;
2721 }
2722
2723 /* Execute command in child process. */
2724 static void
2725 execute_command (const char *command, int argc, const char *arg1,
2726 const char *arg2)
2727 {
2728 pid_t pid;
2729 int status;
2730
2731 /* Call fork(). */
2732 pid = fork ();
2733
2734 if (pid < 0)
2735 {
2736 /* Failure of fork(). */
2737 fprintf (stderr, "Can't fork: %s\n", safe_strerror (errno));
2738 exit (1);
2739 }
2740 else if (pid == 0)
2741 {
2742 /* This is child process. */
2743 switch (argc)
2744 {
2745 case 0:
2746 execlp (command, command, (const char *)NULL);
2747 break;
2748 case 1:
2749 execlp (command, command, arg1, (const char *)NULL);
2750 break;
2751 case 2:
2752 execlp (command, command, arg1, arg2, (const char *)NULL);
2753 break;
2754 }
2755
2756 /* When execlp suceed, this part is not executed. */
2757 fprintf (stderr, "Can't execute %s: %s\n", command, safe_strerror (errno));
2758 exit (1);
2759 }
2760 else
2761 {
2762 /* This is parent. */
2763 execute_flag = 1;
2764 wait4 (pid, &status, 0, NULL);
2765 execute_flag = 0;
2766 }
2767 }
2768
2769 DEFUN (vtysh_ping,
2770 vtysh_ping_cmd,
2771 "ping WORD",
2772 "Send echo messages\n"
2773 "Ping destination address or hostname\n")
2774 {
2775 execute_command ("ping", 1, argv[0], NULL);
2776 return CMD_SUCCESS;
2777 }
2778
2779 ALIAS (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
2786 DEFUN (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
2796 ALIAS (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
2803 DEFUN (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
2814 DEFUN (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 }
2824
2825 #if defined(HAVE_SHELL_ACCESS)
2826 DEFUN (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
2836 DEFUN (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
2847 DEFUN (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
2857 DEFUN (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
2866 DEFUN (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
2876 DEFUN (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 }
2885 #endif
2886
2887 static void
2888 vtysh_install_default (enum node_type node)
2889 {
2890 install_element (node, &config_list_cmd);
2891 }
2892
2893 /* Making connection to protocol daemon. */
2894 static int
2895 vtysh_connect (struct vtysh_client *vclient)
2896 {
2897 int ret;
2898 int sock, len;
2899 struct sockaddr_un addr;
2900 struct stat s_stat;
2901
2902 /* Stat socket to see if we have permission to access it. */
2903 ret = stat (vclient->path, &s_stat);
2904 if (ret < 0 && errno != ENOENT)
2905 {
2906 fprintf (stderr, "vtysh_connect(%s): stat = %s\n",
2907 vclient->path, safe_strerror(errno));
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",
2916 vclient->path);
2917 exit (1);
2918 }
2919
2920 }
2921
2922 sock = socket (AF_UNIX, SOCK_STREAM, 0);
2923 if (sock < 0)
2924 {
2925 #ifdef DEBUG
2926 fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path,
2927 safe_strerror(errno));
2928 #endif /* DEBUG */
2929 return -1;
2930 }
2931
2932 memset (&addr, 0, sizeof (struct sockaddr_un));
2933 addr.sun_family = AF_UNIX;
2934 strncpy (addr.sun_path, vclient->path, strlen (vclient->path));
2935 #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
2936 len = addr.sun_len = SUN_LEN(&addr);
2937 #else
2938 len = sizeof (addr.sun_family) + strlen (addr.sun_path);
2939 #endif /* HAVE_STRUCT_SOCKADDR_UN_SUN_LEN */
2940
2941 ret = connect (sock, (struct sockaddr *) &addr, len);
2942 if (ret < 0)
2943 {
2944 #ifdef DEBUG
2945 fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path,
2946 safe_strerror(errno));
2947 #endif /* DEBUG */
2948 close (sock);
2949 return -1;
2950 }
2951 vclient->fd = sock;
2952
2953 return 0;
2954 }
2955
2956 /* Return true if str ends with suffix, else return false */
2957 static int
2958 ends_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
2969 static void
2970 vtysh_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
2991 static void
2992 vtysh_update_all_insances(struct vtysh_client * head_client)
2993 {
2994 struct vtysh_client *client;
2995 char *ptr;
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;
3018 client->name = "ospfd";
3019 client->flag = VTYSH_OSPFD;
3020 ptr = (char *) malloc(100);
3021 sprintf(ptr, "/var/run/quagga/%s", file->d_name);
3022 client->path = (const char *)ptr;
3023 client->next = NULL;
3024 vtysh_client_sorted_insert(head_client, client);
3025 n++;
3026 }
3027 }
3028 closedir(dir);
3029 }
3030 }
3031
3032 static int
3033 vtysh_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
3051 int
3052 vtysh_connect_all(const char *daemon_name)
3053 {
3054 u_int i;
3055 int rc = 0;
3056 int matches = 0;
3057
3058 for (i = 0; i < array_size(vtysh_client); i++)
3059 {
3060 if (!daemon_name || !strcmp(daemon_name, vtysh_client[i].name))
3061 {
3062 matches++;
3063 if (vtysh_connect(&vtysh_client[i]) == 0)
3064 rc++;
3065
3066 rc += vtysh_connect_all_instances(&vtysh_client[i]);
3067 }
3068 }
3069 if (!matches)
3070 fprintf(stderr, "Error: no daemons match name %s!\n", daemon_name);
3071 return rc;
3072 }
3073
3074 /* To disable readline's filename completion. */
3075 static char *
3076 vtysh_completion_entry_function (const char *ignore, int invoking_key)
3077 {
3078 return NULL;
3079 }
3080
3081 void
3082 vtysh_readline_init (void)
3083 {
3084 /* readline related settings. */
3085 rl_bind_key ('?', (rl_command_func_t *) vtysh_rl_describe);
3086 rl_completion_entry_function = vtysh_completion_entry_function;
3087 rl_attempted_completion_function = (rl_completion_func_t *)new_completion;
3088 }
3089
3090 char *
3091 vtysh_prompt (void)
3092 {
3093 static struct utsname names;
3094 static char buf[100];
3095 const char*hostname;
3096 extern struct host host;
3097
3098 hostname = host.name;
3099
3100 if (!hostname)
3101 {
3102 if (!names.nodename[0])
3103 uname (&names);
3104 hostname = names.nodename;
3105 }
3106
3107 snprintf (buf, sizeof buf, cmd_prompt (vty->node), hostname);
3108
3109 return buf;
3110 }
3111
3112 void
3113 vtysh_init_vty (void)
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);
3127 install_node (&link_params_node, NULL);
3128 install_node (&ns_node, NULL);
3129 install_node (&vrf_node, NULL);
3130 install_node (&rmap_node, NULL);
3131 install_node (&zebra_node, NULL);
3132 install_node (&bgp_vpnv4_node, NULL);
3133 install_node (&bgp_vpnv6_node, NULL);
3134 install_node (&bgp_encap_node, NULL);
3135 install_node (&bgp_encapv6_node, NULL);
3136 install_node (&bgp_ipv4_node, NULL);
3137 install_node (&bgp_ipv4m_node, NULL);
3138 install_node (&bgp_ipv6_node, NULL);
3139 install_node (&bgp_ipv6m_node, NULL);
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);
3143 install_node (&ospf_node, NULL);
3144 install_node (&ripng_node, NULL);
3145 install_node (&ospf6_node, NULL);
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);
3153 install_node (&keychain_node, NULL);
3154 install_node (&keychain_key_node, NULL);
3155 install_node (&isis_node, NULL);
3156 install_node (&vty_node, NULL);
3157
3158 vtysh_install_default (VIEW_NODE);
3159 vtysh_install_default (CONFIG_NODE);
3160 vtysh_install_default (BGP_NODE);
3161 vtysh_install_default (RIP_NODE);
3162 vtysh_install_default (INTERFACE_NODE);
3163 vtysh_install_default (LINK_PARAMS_NODE);
3164 vtysh_install_default (NS_NODE);
3165 vtysh_install_default (VRF_NODE);
3166 vtysh_install_default (RMAP_NODE);
3167 vtysh_install_default (ZEBRA_NODE);
3168 vtysh_install_default (BGP_VPNV4_NODE);
3169 vtysh_install_default (BGP_VPNV6_NODE);
3170 vtysh_install_default (BGP_ENCAP_NODE);
3171 vtysh_install_default (BGP_ENCAPV6_NODE);
3172 vtysh_install_default (BGP_IPV4_NODE);
3173 vtysh_install_default (BGP_IPV4M_NODE);
3174 vtysh_install_default (BGP_IPV6_NODE);
3175 vtysh_install_default (BGP_IPV6M_NODE);
3176 #if ENABLE_BGP_VNC
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);
3180 #endif
3181 vtysh_install_default (OSPF_NODE);
3182 vtysh_install_default (RIPNG_NODE);
3183 vtysh_install_default (OSPF6_NODE);
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);
3191 vtysh_install_default (ISIS_NODE);
3192 vtysh_install_default (KEYCHAIN_NODE);
3193 vtysh_install_default (KEYCHAIN_KEY_NODE);
3194 vtysh_install_default (VTY_NODE);
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); */
3205 install_element (RIP_NODE, &vtysh_exit_ripd_cmd);
3206 install_element (RIP_NODE, &vtysh_quit_ripd_cmd);
3207 install_element (RIPNG_NODE, &vtysh_exit_ripngd_cmd);
3208 install_element (RIPNG_NODE, &vtysh_quit_ripngd_cmd);
3209 install_element (OSPF_NODE, &vtysh_exit_ospfd_cmd);
3210 install_element (OSPF_NODE, &vtysh_quit_ospfd_cmd);
3211 install_element (OSPF6_NODE, &vtysh_exit_ospf6d_cmd);
3212 install_element (OSPF6_NODE, &vtysh_quit_ospf6d_cmd);
3213 #if defined (HAVE_LDPD)
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);
3228 #endif
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);
3233 install_element (BGP_VPNV6_NODE, &vtysh_exit_bgpd_cmd);
3234 install_element (BGP_VPNV6_NODE, &vtysh_quit_bgpd_cmd);
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);
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);
3245 install_element (BGP_IPV6M_NODE, &vtysh_exit_bgpd_cmd);
3246 install_element (BGP_IPV6M_NODE, &vtysh_quit_bgpd_cmd);
3247 #if defined (ENABLE_BGP_VNC)
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);
3254 #endif
3255 install_element (ISIS_NODE, &vtysh_exit_isisd_cmd);
3256 install_element (ISIS_NODE, &vtysh_quit_isisd_cmd);
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);
3263 install_element (VTY_NODE, &vtysh_exit_line_vty_cmd);
3264 install_element (VTY_NODE, &vtysh_quit_line_vty_cmd);
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);
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);
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);
3284 install_element (BGP_VPNV6_NODE, &vtysh_end_all_cmd);
3285 install_element (BGP_ENCAP_NODE, &vtysh_end_all_cmd);
3286 install_element (BGP_ENCAPV6_NODE, &vtysh_end_all_cmd);
3287 install_element (BGP_IPV6_NODE, &vtysh_end_all_cmd);
3288 install_element (BGP_IPV6M_NODE, &vtysh_end_all_cmd);
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);
3292 install_element (ISIS_NODE, &vtysh_end_all_cmd);
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);
3296 install_element (VTY_NODE, &vtysh_end_all_cmd);
3297
3298 install_element (INTERFACE_NODE, &vtysh_interface_desc_cmd);
3299 install_element (INTERFACE_NODE, &vtysh_no_interface_desc_cmd);
3300 install_element (INTERFACE_NODE, &vtysh_end_all_cmd);
3301 install_element (INTERFACE_NODE, &vtysh_exit_interface_cmd);
3302 install_element (LINK_PARAMS_NODE, &exit_link_params_cmd);
3303 install_element (LINK_PARAMS_NODE, &vtysh_end_all_cmd);
3304 install_element (LINK_PARAMS_NODE, &vtysh_exit_interface_cmd);
3305 install_element (INTERFACE_NODE, &vtysh_quit_interface_cmd);
3306
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
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
3315 install_element (CONFIG_NODE, &router_rip_cmd);
3316 install_element (CONFIG_NODE, &router_ripng_cmd);
3317 install_element (CONFIG_NODE, &router_ospf_cmd);
3318 install_element (CONFIG_NODE, &router_ospf_instance_cmd);
3319 install_element (CONFIG_NODE, &router_ospf6_cmd);
3320 #if defined (HAVE_LDPD)
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);
3328 #endif
3329 install_element (CONFIG_NODE, &router_isis_cmd);
3330 install_element (CONFIG_NODE, &router_bgp_cmd);
3331 install_element (CONFIG_NODE, &router_bgp_asn_cmd);
3332 install_element (CONFIG_NODE, &router_bgp_view_cmd);
3333 install_element (BGP_NODE, &address_family_vpnv4_cmd);
3334 install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
3335 install_element (BGP_NODE, &address_family_vpnv6_cmd);
3336 install_element (BGP_NODE, &address_family_vpnv6_unicast_cmd);
3337 install_element (BGP_NODE, &address_family_encap_cmd);
3338 install_element (BGP_NODE, &address_family_encapv6_cmd);
3339 #if defined(ENABLE_BGP_VNC)
3340 install_element (BGP_NODE, &vnc_defaults_cmd);
3341 install_element (BGP_NODE, &vnc_nve_group_cmd);
3342 #endif
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);
3348 install_element (BGP_NODE, &address_family_ipv6_multicast_cmd);
3349 #endif
3350 install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
3351 install_element (BGP_VPNV6_NODE, &exit_address_family_cmd);
3352 install_element (BGP_ENCAP_NODE, &exit_address_family_cmd);
3353 install_element (BGP_ENCAPV6_NODE, &exit_address_family_cmd);
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);
3357 install_element (BGP_IPV6M_NODE, &exit_address_family_cmd);
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
3363 install_element (CONFIG_NODE, &key_chain_cmd);
3364 install_element (CONFIG_NODE, &vtysh_route_map_cmd);
3365 install_element (CONFIG_NODE, &vtysh_line_vty_cmd);
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);
3370 install_element (CONFIG_NODE, &vtysh_no_interface_cmd);
3371 install_element (CONFIG_NODE, &vtysh_interface_vrf_cmd);
3372 install_element (CONFIG_NODE, &vtysh_no_interface_vrf_cmd);
3373 install_element (INTERFACE_NODE, &vtysh_link_params_cmd);
3374 install_element (ENABLE_NODE, &vtysh_show_running_config_cmd);
3375 install_element (ENABLE_NODE, &vtysh_show_running_config_daemon_cmd);
3376 install_element (ENABLE_NODE, &vtysh_copy_runningconfig_startupconfig_cmd);
3377 install_element (ENABLE_NODE, &vtysh_write_file_cmd);
3378 install_element (ENABLE_NODE, &vtysh_write_cmd);
3379
3380 install_element (CONFIG_NODE, &vtysh_vrf_cmd);
3381 install_element (CONFIG_NODE, &vtysh_no_vrf_cmd);
3382
3383 /* "write terminal" command. */
3384 install_element (ENABLE_NODE, &vtysh_write_terminal_cmd);
3385 install_element (ENABLE_NODE, &vtysh_write_terminal_daemon_cmd);
3386
3387 install_element (CONFIG_NODE, &vtysh_integrated_config_cmd);
3388 install_element (CONFIG_NODE, &no_vtysh_integrated_config_cmd);
3389
3390 /* "write memory" command. */
3391 install_element (ENABLE_NODE, &vtysh_write_memory_cmd);
3392
3393 install_element (VIEW_NODE, &vtysh_terminal_length_cmd);
3394 install_element (VIEW_NODE, &vtysh_terminal_no_length_cmd);
3395 install_element (VIEW_NODE, &vtysh_show_daemons_cmd);
3396
3397 install_element (VIEW_NODE, &vtysh_ping_cmd);
3398 install_element (VIEW_NODE, &vtysh_ping_ip_cmd);
3399 install_element (VIEW_NODE, &vtysh_traceroute_cmd);
3400 install_element (VIEW_NODE, &vtysh_traceroute_ip_cmd);
3401 install_element (VIEW_NODE, &vtysh_ping6_cmd);
3402 install_element (VIEW_NODE, &vtysh_traceroute6_cmd);
3403 #if defined(HAVE_SHELL_ACCESS)
3404 install_element (VIEW_NODE, &vtysh_telnet_cmd);
3405 install_element (VIEW_NODE, &vtysh_telnet_port_cmd);
3406 install_element (VIEW_NODE, &vtysh_ssh_cmd);
3407 #endif
3408 #if defined(HAVE_SHELL_ACCESS)
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);
3412 #endif
3413
3414 install_element (VIEW_NODE, &vtysh_show_memory_cmd);
3415
3416 install_element (VIEW_NODE, &vtysh_show_work_queues_cmd);
3417 install_element (VIEW_NODE, &vtysh_show_work_queues_daemon_cmd);
3418
3419 install_element (VIEW_NODE, &vtysh_show_thread_cmd);
3420
3421 /* Logging */
3422 install_element (VIEW_NODE, &vtysh_show_logging_cmd);
3423 install_element (CONFIG_NODE, &vtysh_log_stdout_cmd);
3424 install_element (CONFIG_NODE, &vtysh_log_stdout_level_cmd);
3425 install_element (CONFIG_NODE, &no_vtysh_log_stdout_cmd);
3426 install_element (CONFIG_NODE, &vtysh_log_file_cmd);
3427 install_element (CONFIG_NODE, &vtysh_log_file_level_cmd);
3428 install_element (CONFIG_NODE, &no_vtysh_log_file_cmd);
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);
3433 install_element (CONFIG_NODE, &vtysh_log_syslog_cmd);
3434 install_element (CONFIG_NODE, &vtysh_log_syslog_level_cmd);
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);
3438 install_element (CONFIG_NODE, &vtysh_log_facility_cmd);
3439 install_element (CONFIG_NODE, &no_vtysh_log_facility_cmd);
3440 install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
3441 install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
3442 install_element (CONFIG_NODE, &vtysh_log_timestamp_precision_cmd);
3443 install_element (CONFIG_NODE, &no_vtysh_log_timestamp_precision_cmd);
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
3454 }