1 /* Virtual terminal interface shell.
2 * Copyright (C) 2000 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
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
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.
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
27 #include <sys/resource.h>
30 #include <readline/readline.h>
31 #include <readline/history.h>
41 #include "vtysh/vtysh.h"
43 #include "bgpd/bgp_vty.h"
47 DEFINE_MTYPE_STATIC(MVTYSH
, VTYSH_CMD
, "Vtysh cmd copy")
52 /* VTY shell pager name. */
53 char *vtysh_pager_name
= NULL
;
55 /* VTY shell client structure. */
62 struct vtysh_client
*next
;
65 struct vtysh_client vtysh_client
[] =
67 { .fd
= -1, .name
= "zebra", .flag
= VTYSH_ZEBRA
, .path
= ZEBRA_VTYSH_PATH
, .next
= NULL
},
68 { .fd
= -1, .name
= "ripd", .flag
= VTYSH_RIPD
, .path
= RIP_VTYSH_PATH
, .next
= NULL
},
69 { .fd
= -1, .name
= "ripngd", .flag
= VTYSH_RIPNGD
, .path
= RIPNG_VTYSH_PATH
, .next
= NULL
},
70 { .fd
= -1, .name
= "ospfd", .flag
= VTYSH_OSPFD
, .path
= OSPF_VTYSH_PATH
, .next
= NULL
},
71 { .fd
= -1, .name
= "ospf6d", .flag
= VTYSH_OSPF6D
, .path
= OSPF6_VTYSH_PATH
, .next
= NULL
},
72 { .fd
= -1, .name
= "ldpd", .flag
= VTYSH_LDPD
, .path
= LDP_VTYSH_PATH
, .next
= NULL
},
73 { .fd
= -1, .name
= "bgpd", .flag
= VTYSH_BGPD
, .path
= BGP_VTYSH_PATH
, .next
= NULL
},
74 { .fd
= -1, .name
= "isisd", .flag
= VTYSH_ISISD
, .path
= ISIS_VTYSH_PATH
, .next
= NULL
},
75 { .fd
= -1, .name
= "pimd", .flag
= VTYSH_PIMD
, .path
= PIM_VTYSH_PATH
, .next
= NULL
},
76 { .fd
= -1, .name
= "watchfrr", .flag
= VTYSH_WATCHFRR
, .path
= WATCHFRR_VTYSH_PATH
, .next
= NULL
},
79 enum vtysh_write_integrated vtysh_write_integrated
= WRITE_INTEGRATED_UNSPECIFIED
;
82 vclient_close (struct vtysh_client
*vclient
)
87 "Warning: closing connection to %s because of an I/O error!\n",
94 /* Return true if str begins with prefix, else return false */
96 begins_with(const char *str
, const char *prefix
)
100 size_t lenstr
= strlen(str
);
101 size_t lenprefix
= strlen(prefix
);
102 if (lenprefix
> lenstr
)
104 return strncmp(str
, prefix
, lenprefix
) == 0;
107 /* NB: multiplexed function:
108 * if fp == NULL, this calls vtysh_config_parse_line
109 * if fp != NULL, this prints lines to fp
112 vtysh_client_run (struct vtysh_client
*vclient
, const char *line
, FILE *fp
)
116 char *buf
= stackbuf
;
117 size_t bufsz
= sizeof(stackbuf
);
118 char *bufvalid
, *end
= NULL
;
119 char terminator
[3] = {0, 0, 0};
124 ret
= write (vclient
->fd
, line
, strlen (line
) + 1);
131 ssize_t nread
= read (vclient
->fd
, bufvalid
, buf
+ bufsz
- bufvalid
);
133 if (nread
< 0 && (errno
== EINTR
|| errno
== EAGAIN
))
138 fprintf (stderr
, "vtysh: error reading from %s: %s (%d)",
139 vclient
->name
, safe_strerror(errno
), errno
);
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 */
150 ret
= end
[sizeof(terminator
)];
152 while (bufvalid
> buf
&& (end
> buf
|| !end
))
154 size_t textlen
= (end
? end
: bufvalid
) - buf
;
155 char *eol
= memchr (buf
, '\n', textlen
);
160 /* no line break, end of input, no text left before end
161 * => don't insert an empty line at the end */
164 /* no line break, end of input, but some text left */
167 /* continue reading */
170 /* eol is at a line end now, either \n => \0 or \0\0\0 */
171 assert(eol
&& eol
<= bufvalid
);
179 vtysh_config_parse_line (buf
);
185 memmove (buf
, eol
, bufvalid
- eol
);
186 bufvalid
-= eol
- buf
;
191 if (bufvalid
== buf
+ bufsz
)
197 new = XMALLOC (MTYPE_TMP
, bufsz
);
198 memcpy (new, stackbuf
, sizeof(stackbuf
));
201 new = XREALLOC (MTYPE_TMP
, buf
, bufsz
);
203 bufvalid
= bufvalid
- buf
+ new;
205 /* if end != NULL, we won't be reading more data... */
206 assert (end
== NULL
);
213 vclient_close (vclient
);
217 XFREE (MTYPE_TMP
, buf
);
222 vtysh_client_run_all (struct vtysh_client
*head_client
, const char *line
,
223 int continue_on_err
, FILE *fp
)
225 struct vtysh_client
*client
;
226 int rc
, rc_all
= CMD_SUCCESS
;
228 for (client
= head_client
; client
; client
= client
->next
)
230 rc
= vtysh_client_run(client
, line
, fp
);
231 if (rc
!= CMD_SUCCESS
)
233 if (!continue_on_err
)
242 vtysh_client_execute (struct vtysh_client
*head_client
, const char *line
,
245 return vtysh_client_run_all (head_client
, line
, 0, fp
);
249 vtysh_client_config (struct vtysh_client
*head_client
, char *line
)
251 vtysh_client_run_all (head_client
, line
, 1, NULL
);
255 vtysh_pager_init (void)
259 pager_defined
= getenv ("VTYSH_PAGER");
262 vtysh_pager_name
= strdup (pager_defined
);
264 vtysh_pager_name
= strdup ("more");
267 /* Command execution over the vty interface. */
269 vtysh_execute_func (const char *line
, int pager
)
274 struct cmd_element
*cmd
;
278 int saved_ret
, saved_node
;
280 /* Split readline string up into the vector. */
281 vline
= cmd_make_strvec (line
);
286 saved_ret
= ret
= cmd_execute_command (vline
, vty
, &cmd
, 1);
287 saved_node
= vty
->node
;
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
292 while (ret
!= CMD_SUCCESS
&& ret
!= CMD_SUCCESS_DAEMON
&& ret
!= CMD_WARNING
293 && vty
->node
> CONFIG_NODE
)
295 vty
->node
= node_parent(vty
->node
);
296 ret
= cmd_execute_command (vline
, vty
, &cmd
, 1);
300 vty
->node
= saved_node
;
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
)
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
)
313 vtysh_execute("exit-address-family");
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))
319 vtysh_execute("exit-vnc");
321 else if ((saved_node
== KEYCHAIN_KEY_NODE
) && (tried
== 1))
323 vtysh_execute("exit");
327 vtysh_execute ("end");
328 vtysh_execute ("configure terminal");
331 /* If command didn't succeed in any node, continue with return value from
338 cmd_free_strvec (vline
);
344 if (vty
->type
== VTY_FILE
)
345 fprintf (stdout
,"Warning...\n");
347 case CMD_ERR_AMBIGUOUS
:
348 fprintf (stdout
,"%% Ambiguous command.\n");
350 case CMD_ERR_NO_MATCH
:
351 fprintf (stdout
,"%% Unknown command.\n");
353 case CMD_ERR_INCOMPLETE
:
354 fprintf (stdout
,"%% Command incomplete.\n");
356 case CMD_SUCCESS_DAEMON
:
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))
363 fp
= popen (vtysh_pager_name
, "w");
366 perror ("popen failed for pager");
375 if (! strcmp(cmd
->string
,"configure terminal"))
377 for (i
= 0; i
< array_size(vtysh_client
); i
++)
379 cmd_stat
= vtysh_client_execute(&vtysh_client
[i
], line
, fp
);
380 if (cmd_stat
== CMD_WARNING
)
387 vline
= cmd_make_strvec (line
);
391 if (pager
&& vtysh_pager_name
&& fp
&& closepager
)
393 if (pclose (fp
) == -1)
395 perror ("pclose failed for pager");
402 ret
= cmd_execute_command (vline
, vty
, &cmd
, 1);
403 cmd_free_strvec (vline
);
404 if (ret
!= CMD_SUCCESS_DAEMON
)
410 (*cmd
->func
) (cmd
, vty
, 0, NULL
);
415 cmd_stat
= CMD_SUCCESS
;
416 for (i
= 0; i
< array_size(vtysh_client
); i
++)
418 if (cmd
->daemon
& vtysh_client
[i
].flag
)
420 cmd_stat
= vtysh_client_execute(&vtysh_client
[i
], line
, fp
);
421 if (cmd_stat
!= CMD_SUCCESS
)
425 if (cmd_stat
!= CMD_SUCCESS
)
429 (*cmd
->func
) (cmd
, vty
, 0, NULL
);
432 if (pager
&& vtysh_pager_name
&& fp
&& closepager
)
434 if (pclose (fp
) == -1)
436 perror ("pclose failed for pager");
444 vtysh_execute_no_pager (const char *line
)
446 return vtysh_execute_func (line
, 0);
450 vtysh_execute (const char *line
)
452 return vtysh_execute_func (line
, 1);
467 while (end
>= s
&& isspace(*end
))
471 while (*s
&& isspace(*s
))
478 vtysh_mark_file (const char *filename
)
485 struct cmd_element
*cmd
;
486 int saved_ret
, prev_node
;
488 char *vty_buf_copy
= NULL
;
489 char *vty_buf_trimmed
= NULL
;
491 if (strncmp("-", filename
, 1) == 0)
494 confp
= fopen (filename
, "r");
498 fprintf (stderr
, "%% Can't open config file %s due to '%s'.\n",
499 filename
, safe_strerror (errno
));
500 return (CMD_ERR_NO_FILE
);
504 vty
->fd
= 0; /* stdout */
505 vty
->type
= VTY_TERM
;
506 vty
->node
= CONFIG_NODE
;
508 vtysh_execute_no_pager ("enable");
509 vtysh_execute_no_pager ("configure terminal");
510 vty_buf_copy
= XCALLOC (MTYPE_VTYSH_CMD
, VTY_BUFSIZ
);
512 while (fgets (vty
->buf
, VTY_BUFSIZ
, confp
))
516 strcpy(vty_buf_copy
, vty
->buf
);
517 vty_buf_trimmed
= trim(vty_buf_copy
);
519 if (vty_buf_trimmed
[0] == '!' || vty_buf_trimmed
[0] == '#')
521 fprintf(stdout
, "%s", vty
->buf
);
525 /* Split readline string up into the vector. */
526 vline
= cmd_make_strvec (vty
->buf
);
530 fprintf(stdout
, "%s", vty
->buf
);
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)
540 prev_node
= vty
->node
;
541 saved_ret
= ret
= cmd_execute_command_strict (vline
, vty
, &cmd
);
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
546 while (ret
!= CMD_SUCCESS
&& ret
!= CMD_SUCCESS_DAEMON
&& ret
!= CMD_WARNING
547 && vty
->node
> CONFIG_NODE
)
549 vty
->node
= node_parent(vty
->node
);
550 ret
= cmd_execute_command_strict (vline
, vty
, &cmd
);
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
)
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
)
563 fprintf(stdout
, "exit-address-family\n");
565 else if ((prev_node
== KEYCHAIN_KEY_NODE
) && (tried
== 1))
567 fprintf(stdout
, "exit\n");
571 fprintf(stdout
, "end\n");
574 /* If command didn't succeed in any node, continue with return value from
579 vty
->node
= prev_node
;
582 cmd_free_strvec (vline
);
586 if (vty
->type
== VTY_FILE
)
587 fprintf (stderr
,"line %d: Warning...: %s\n", lineno
, vty
->buf
);
590 XFREE(MTYPE_VTYSH_CMD
, vty_buf_copy
);
592 case CMD_ERR_AMBIGUOUS
:
593 fprintf (stderr
,"line %d: %% Ambiguous command: %s\n", lineno
, vty
->buf
);
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
);
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
);
608 XFREE(MTYPE_VTYSH_CMD
, vty_buf_copy
);
609 return CMD_ERR_INCOMPLETE
;
611 fprintf(stdout
, "%s", vty
->buf
);
613 case CMD_SUCCESS_DAEMON
:
616 int cmd_stat
= CMD_SUCCESS
;
618 fprintf(stdout
, "%s", vty
->buf
);
619 for (i
= 0; i
< array_size(vtysh_client
); i
++)
621 if (cmd
->daemon
& vtysh_client
[i
].flag
)
623 cmd_stat
= vtysh_client_execute (&vtysh_client
[i
],
625 if (cmd_stat
!= CMD_SUCCESS
)
629 if (cmd_stat
!= CMD_SUCCESS
)
633 (*cmd
->func
) (cmd
, vty
, 0, NULL
);
637 /* This is the end */
638 fprintf(stdout
, "end\n");
640 XFREE(MTYPE_VTYSH_CMD
, vty_buf_copy
);
648 /* Configration make from file. */
650 vtysh_config_from_file (struct vty
*vty
, FILE *fp
)
653 struct cmd_element
*cmd
;
655 int retcode
= CMD_SUCCESS
;
657 while (fgets (vty
->buf
, VTY_BUFSIZ
, fp
))
661 ret
= command_config_read_one_line (vty
, &cmd
, 1);
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 */
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 */
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 */
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 */
682 case CMD_SUCCESS_DAEMON
:
685 int cmd_stat
= CMD_SUCCESS
;
687 for (i
= 0; i
< array_size(vtysh_client
); i
++)
689 if (cmd
->daemon
& vtysh_client
[i
].flag
)
691 cmd_stat
= vtysh_client_execute (&vtysh_client
[i
],
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
701 if (cmd_stat
!= CMD_SUCCESS
&& cmd_stat
!= CMD_WARNING
)
703 fprintf (stderr
, "line %d: Failure to communicate[%d] to %s, line: %s\n",
704 lineno
, cmd_stat
, vtysh_client
[i
].name
, vty
->buf
);
709 if (cmd_stat
!= CMD_SUCCESS
)
713 (*cmd
->func
) (cmd
, vty
, 0, NULL
);
721 /* We don't care about the point of the cursor when '?' is typed. */
723 vtysh_rl_describe (void)
730 struct cmd_token
*token
;
732 vline
= cmd_make_strvec (rl_line_buffer
);
734 /* In case of '> ?'. */
737 vline
= vector_init (1);
738 vector_set (vline
, NULL
);
741 if (rl_end
&& isspace ((int) rl_line_buffer
[rl_end
- 1]))
742 vector_set (vline
, NULL
);
744 describe
= cmd_describe_command (vline
, vty
, &ret
);
746 fprintf (stdout
,"\n");
748 /* Ambiguous and no match error. */
751 case CMD_ERR_AMBIGUOUS
:
752 cmd_free_strvec (vline
);
753 fprintf (stdout
,"%% Ambiguous command.\n");
757 case CMD_ERR_NO_MATCH
:
758 cmd_free_strvec (vline
);
759 fprintf (stdout
,"%% There is no matched command.\n");
765 /* Get width of command string. */
767 for (i
= 0; i
< vector_active (describe
); i
++)
768 if ((token
= vector_slot (describe
, i
)) != NULL
)
772 if (token
->cmd
[0] == '\0')
775 len
= strlen (token
->cmd
);
776 if (token
->cmd
[0] == '.')
783 for (i
= 0; i
< vector_active (describe
); i
++)
784 if ((token
= vector_slot (describe
, i
)) != NULL
)
786 if (token
->cmd
[0] == '\0')
790 fprintf (stdout
," %-s\n",
791 token
->cmd
[0] == '.' ? token
->cmd
+ 1 : token
->cmd
);
793 fprintf (stdout
," %-*s %s\n",
795 token
->cmd
[0] == '.' ? token
->cmd
+ 1 : token
->cmd
,
799 cmd_free_strvec (vline
);
800 vector_free (describe
);
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. */
813 command_generator (const char *text
, int state
)
816 static char **matched
= NULL
;
817 static int index
= 0;
824 if (vty
->node
== AUTH_NODE
|| vty
->node
== AUTH_ENABLE_NODE
)
827 vline
= cmd_make_strvec (rl_line_buffer
);
831 if (rl_end
&& isspace ((int) rl_line_buffer
[rl_end
- 1]))
832 vector_set (vline
, NULL
);
835 vector_only_index_free (matched
);
836 matched
= cmd_complete_command (vline
, vty
, &complete_status
);
837 cmd_free_strvec (vline
);
840 if (matched
&& matched
[index
])
841 return matched
[index
++];
847 new_completion (char *text
, int start
, int end
)
851 matches
= rl_completion_matches (text
, command_generator
);
856 if (complete_status
!= CMD_COMPLETE_FULL_MATCH
)
857 /* only append a space on full match */
858 rl_completion_append_character
= '\0';
864 /* Vty node structures. */
865 static struct cmd_node bgp_node
=
868 "%s(config-router)# ",
871 static struct cmd_node rip_node
=
874 "%s(config-router)# ",
877 static struct cmd_node isis_node
=
880 "%s(config-router)# ",
883 static struct cmd_node interface_node
=
889 static struct cmd_node ns_node
=
892 "%s(config-logical-router)# ",
895 static struct cmd_node vrf_node
=
901 static struct cmd_node rmap_node
=
904 "%s(config-route-map)# "
907 static struct cmd_node zebra_node
=
910 "%s(config-router)# "
913 static struct cmd_node bgp_vpnv4_node
=
916 "%s(config-router-af)# "
919 static struct cmd_node bgp_vpnv6_node
=
922 "%s(config-router-af)# "
925 static struct cmd_node bgp_encap_node
=
928 "%s(config-router-af)# "
931 static struct cmd_node bgp_encapv6_node
=
934 "%s(config-router-af)# "
937 static struct cmd_node bgp_ipv4_node
=
940 "%s(config-router-af)# "
943 static struct cmd_node bgp_ipv4m_node
=
946 "%s(config-router-af)# "
949 static struct cmd_node bgp_ipv6_node
=
952 "%s(config-router-af)# "
955 static struct cmd_node bgp_ipv6m_node
=
958 "%s(config-router-af)# "
961 static struct cmd_node bgp_vnc_defaults_node
=
963 BGP_VNC_DEFAULTS_NODE
,
964 "%s(config-router-vnc-defaults)# "
967 static struct cmd_node bgp_vnc_nve_group_node
=
969 BGP_VNC_NVE_GROUP_NODE
,
970 "%s(config-router-vnc-nve-group)# "
973 static struct cmd_node bgp_vnc_l2_group_node
=
975 BGP_VNC_L2_GROUP_NODE
,
976 "%s(config-router-vnc-l2-group)# "
979 static struct cmd_node ospf_node
=
982 "%s(config-router)# "
985 static struct cmd_node ripng_node
=
988 "%s(config-router)# "
991 static struct cmd_node ospf6_node
=
997 static struct cmd_node ldp_node
=
1003 static struct cmd_node ldp_ipv4_node
=
1006 "%s(config-ldp-af)# "
1009 static struct cmd_node ldp_ipv6_node
=
1012 "%s(config-ldp-af)# "
1015 static struct cmd_node ldp_ipv4_iface_node
=
1017 LDP_IPV4_IFACE_NODE
,
1018 "%s(config-ldp-af-if)# "
1021 static struct cmd_node ldp_ipv6_iface_node
=
1023 LDP_IPV6_IFACE_NODE
,
1024 "%s(config-ldp-af-if)# "
1027 static struct cmd_node ldp_l2vpn_node
=
1030 "%s(config-l2vpn)# "
1033 static struct cmd_node ldp_pseudowire_node
=
1035 LDP_PSEUDOWIRE_NODE
,
1036 "%s(config-l2vpn-pw)# "
1039 static struct cmd_node keychain_node
=
1042 "%s(config-keychain)# "
1045 static struct cmd_node keychain_key_node
=
1048 "%s(config-keychain-key)# "
1051 struct cmd_node link_params_node
=
1054 "%s(config-link-params)# ",
1057 /* Defined in lib/vty.c */
1058 extern struct cmd_node vty_node
;
1060 /* When '^Z' is received from vty, move down to the enable mode. */
1068 /* Nothing to do. */
1071 vty
->node
= ENABLE_NODE
;
1077 DEFUNSH (VTYSH_REALLYALL
,
1081 "End current mode and change to enable mode\n")
1083 return vtysh_end ();
1086 DEFUNSH (VTYSH_BGPD
,
1089 "router bgp " CMD_AS_RANGE
,
1094 vty
->node
= BGP_NODE
;
1098 ALIAS_SH (VTYSH_BGPD
,
1105 ALIAS_SH (VTYSH_BGPD
,
1107 router_bgp_view_cmd
,
1108 "router bgp " CMD_AS_RANGE
" (view|vrf) WORD",
1112 "BGP view\nBGP VRF\n"
1115 DEFUNSH (VTYSH_BGPD
,
1116 address_family_vpnv4
,
1117 address_family_vpnv4_cmd
,
1118 "address-family vpnv4",
1119 "Enter Address Family command mode\n"
1122 vty
->node
= BGP_VPNV4_NODE
;
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"
1132 "Address Family Modifier\n")
1134 vty
->node
= BGP_VPNV4_NODE
;
1138 DEFUNSH (VTYSH_BGPD
,
1139 address_family_vpnv6
,
1140 address_family_vpnv6_cmd
,
1141 "address-family vpnv6",
1142 "Enter Address Family command mode\n"
1145 vty
->node
= BGP_VPNV6_NODE
;
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"
1155 "Address Family Modifier\n")
1157 vty
->node
= BGP_VPNV6_NODE
;
1161 DEFUNSH (VTYSH_BGPD
,
1162 address_family_encap
,
1163 address_family_encap_cmd
,
1164 "address-family encap",
1165 "Enter Address Family command mode\n"
1168 vty
->node
= BGP_ENCAP_NODE
;
1172 DEFUNSH (VTYSH_BGPD
,
1173 address_family_encapv4
,
1174 address_family_encapv4_cmd
,
1175 "address-family encapv4",
1176 "Enter Address Family command mode\n"
1179 vty
->node
= BGP_ENCAP_NODE
;
1183 DEFUNSH (VTYSH_BGPD
,
1184 address_family_encapv6
,
1185 address_family_encapv6_cmd
,
1186 "address-family encapv6",
1187 "Enter Address Family command mode\n"
1190 vty
->node
= BGP_ENCAPV6_NODE
;
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"
1200 "Address Family Modifier\n")
1202 vty
->node
= BGP_IPV4_NODE
;
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"
1212 "Address Family Modifier\n")
1214 vty
->node
= BGP_IPV4M_NODE
;
1218 DEFUNSH (VTYSH_BGPD
,
1219 address_family_ipv4_encap
,
1220 address_family_ipv4_encap_cmd
,
1221 "address-family ipv4 encap",
1222 "Enter Address Family command mode\n"
1224 "Address Family Modifier\n")
1226 vty
->node
= BGP_ENCAP_NODE
;
1230 DEFUNSH (VTYSH_BGPD
,
1231 address_family_ipv4_vpn
,
1232 address_family_ipv4_vpn_cmd
,
1233 "address-family ipv4 vpn",
1234 "Enter Address Family command mode\n"
1236 "Address Family Modifier\n")
1238 vty
->node
= BGP_VPNV4_NODE
;
1243 DEFUNSH (VTYSH_BGPD
,
1244 address_family_ipv6
,
1245 address_family_ipv6_cmd
,
1246 "address-family ipv6",
1247 "Enter Address Family command mode\n"
1250 vty
->node
= BGP_IPV6_NODE
;
1254 DEFUNSH (VTYSH_BGPD
,
1255 address_family_ipv6_unicast
,
1256 address_family_ipv6_unicast_cmd
,
1257 "address-family ipv6 unicast",
1258 "Enter Address Family command mode\n"
1260 "Address Family Modifier\n")
1262 vty
->node
= BGP_IPV6_NODE
;
1266 DEFUNSH (VTYSH_BGPD
,
1267 address_family_ipv6_multicast
,
1268 address_family_ipv6_multicast_cmd
,
1269 "address-family ipv6 multicast",
1270 "Enter Address Family command mode\n"
1272 "Address Family Modifier\n")
1274 vty
->node
= BGP_IPV6M_NODE
;
1278 DEFUNSH (VTYSH_BGPD
,
1279 address_family_ipv6_encap
,
1280 address_family_ipv6_encap_cmd
,
1281 "address-family ipv6 encap",
1282 "Enter Address Family command mode\n"
1284 "Address Family Modifier\n")
1286 vty
->node
= BGP_ENCAPV6_NODE
;
1290 DEFUNSH (VTYSH_BGPD
,
1291 address_family_ipv6_vpn
,
1292 address_family_ipv6_vpn_cmd
,
1293 "address-family ipv6 vpn",
1294 "Enter Address Family command mode\n"
1296 "Address Family Modifier\n")
1298 vty
->node
= BGP_VPNV6_NODE
;
1302 #if defined (ENABLE_BGP_VNC)
1303 DEFUNSH (VTYSH_BGPD
,
1307 "VNC/RFP related configuration\n"
1308 "Configure default NVE group\n")
1310 vty
->node
= BGP_VNC_DEFAULTS_NODE
;
1314 DEFUNSH (VTYSH_BGPD
,
1317 "vnc nve-group NAME",
1318 "VNC/RFP related configuration\n"
1319 "Configure a NVE group\n"
1322 vty
->node
= BGP_VNC_NVE_GROUP_NODE
;
1326 DEFUNSH (VTYSH_BGPD
,
1329 "vnc l2-group NAME",
1330 "VNC/RFP related configuration\n"
1331 "Configure a L2 group\n"
1334 vty
->node
= BGP_VNC_L2_GROUP_NODE
;
1339 DEFUNSH (VTYSH_RIPD
,
1343 "Authentication key management\n"
1344 "Key-chain management\n"
1347 vty
->node
= KEYCHAIN_NODE
;
1351 DEFUNSH (VTYSH_RIPD
,
1354 "key <0-2147483647>",
1356 "Key identifier number\n")
1358 vty
->node
= KEYCHAIN_KEY_NODE
;
1362 DEFUNSH (VTYSH_RIPD
,
1369 vty
->node
= RIP_NODE
;
1373 DEFUNSH (VTYSH_RIPNGD
,
1380 vty
->node
= RIPNG_NODE
;
1384 DEFUNSH (VTYSH_OSPFD
,
1388 "Enable a routing process\n"
1389 "Start OSPF configuration\n")
1391 vty
->node
= OSPF_NODE
;
1395 ALIAS_SH (VTYSH_OSPFD
,
1397 router_ospf_instance_cmd
,
1398 "router ospf <1-65535>",
1399 "Enable a routing process\n"
1400 "Start OSPF configuration\n"
1403 DEFUNSH (VTYSH_OSPF6D
,
1410 vty
->node
= OSPF6_NODE
;
1414 #if defined (HAVE_LDPD)
1415 DEFUNSH (VTYSH_LDPD
,
1419 "Global MPLS configuration subcommands\n"
1420 "Label Distribution Protocol\n")
1422 vty
->node
= LDP_NODE
;
1426 DEFUNSH (VTYSH_LDPD
,
1427 ldp_address_family_ipv4
,
1428 ldp_address_family_ipv4_cmd
,
1429 "address-family ipv4",
1430 "Configure Address Family and its parameters\n"
1433 vty
->node
= LDP_IPV4_NODE
;
1437 DEFUNSH (VTYSH_LDPD
,
1438 ldp_address_family_ipv6
,
1439 ldp_address_family_ipv6_cmd
,
1440 "address-family ipv6",
1441 "Configure Address Family and its parameters\n"
1444 vty
->node
= LDP_IPV6_NODE
;
1448 DEFUNSH (VTYSH_LDPD
,
1449 ldp_interface_ifname
,
1450 ldp_interface_ifname_cmd
,
1452 "Enable LDP on an interface and enter interface submode\n"
1453 "Interface's name\n")
1458 vty
->node
= LDP_IPV4_IFACE_NODE
;
1461 vty
->node
= LDP_IPV6_IFACE_NODE
;
1470 DEFUNSH (VTYSH_LDPD
,
1471 ldp_l2vpn_word_type_vpls
,
1472 ldp_l2vpn_word_type_vpls_cmd
,
1473 "l2vpn WORD type vpls",
1474 "Configure l2vpn commands\n"
1477 "Virtual Private LAN Service\n")
1479 vty
->node
= LDP_L2VPN_NODE
;
1483 DEFUNSH (VTYSH_LDPD
,
1484 ldp_member_pseudowire_ifname
,
1485 ldp_member_pseudowire_ifname_cmd
,
1486 "member pseudowire IFNAME",
1487 "L2VPN member configuration\n"
1488 "Pseudowire interface\n"
1489 "Interface's name\n")
1491 vty
->node
= LDP_PSEUDOWIRE_NODE
;
1496 DEFUNSH (VTYSH_ISISD
,
1502 "ISO Routing area tag")
1504 vty
->node
= ISIS_NODE
;
1508 DEFUNSH (VTYSH_RMAP
,
1510 vtysh_route_map_cmd
,
1511 "route-map WORD (deny|permit) <1-65535>",
1512 "Create route-map or enter route-map command mode\n"
1514 "Route map denies set operations\n"
1515 "Route map permits set operations\n"
1516 "Sequence to insert to/delete from existing route-map entry\n")
1518 vty
->node
= RMAP_NODE
;
1526 "Configure a terminal line\n"
1527 "Virtual terminal\n")
1529 vty
->node
= VTY_NODE
;
1533 DEFUNSH (VTYSH_REALLYALL
,
1537 "Turn on privileged mode command\n")
1539 vty
->node
= ENABLE_NODE
;
1543 DEFUNSH (VTYSH_REALLYALL
,
1547 "Turn off privileged mode command\n")
1549 if (vty
->node
== ENABLE_NODE
)
1550 vty
->node
= VIEW_NODE
;
1554 DEFUNSH (VTYSH_REALLYALL
,
1555 vtysh_config_terminal
,
1556 vtysh_config_terminal_cmd
,
1557 "configure terminal",
1558 "Configuration from vty interface\n"
1559 "Configuration terminal\n")
1561 vty
->node
= CONFIG_NODE
;
1566 vtysh_exit (struct vty
*vty
)
1575 vty
->node
= ENABLE_NODE
;
1577 case INTERFACE_NODE
:
1587 case LDP_L2VPN_NODE
:
1593 vtysh_execute("end");
1594 vtysh_execute("configure terminal");
1595 vty
->node
= CONFIG_NODE
;
1597 case BGP_VPNV4_NODE
:
1598 case BGP_VPNV6_NODE
:
1599 case BGP_ENCAP_NODE
:
1600 case BGP_ENCAPV6_NODE
:
1602 case BGP_IPV4M_NODE
:
1604 case BGP_IPV6M_NODE
:
1605 case BGP_VNC_DEFAULTS_NODE
:
1606 case BGP_VNC_NVE_GROUP_NODE
:
1607 case BGP_VNC_L2_GROUP_NODE
:
1608 vty
->node
= BGP_NODE
;
1612 vty
->node
= LDP_NODE
;
1614 case LDP_IPV4_IFACE_NODE
:
1615 vty
->node
= LDP_IPV4_NODE
;
1617 case LDP_IPV6_IFACE_NODE
:
1618 vty
->node
= LDP_IPV6_NODE
;
1620 case LDP_PSEUDOWIRE_NODE
:
1621 vty
->node
= LDP_L2VPN_NODE
;
1623 case KEYCHAIN_KEY_NODE
:
1624 vty
->node
= KEYCHAIN_NODE
;
1626 case LINK_PARAMS_NODE
:
1627 vty
->node
= INTERFACE_NODE
;
1635 DEFUNSH (VTYSH_REALLYALL
,
1639 "Exit current mode and down to previous mode\n")
1641 return vtysh_exit (vty
);
1644 ALIAS (vtysh_exit_all
,
1647 "Exit current mode and down to previous mode\n")
1649 DEFUNSH (VTYSH_BGPD
,
1650 exit_address_family
,
1651 exit_address_family_cmd
,
1652 "exit-address-family",
1653 "Exit from Address Family configuration mode\n")
1655 if (vty
->node
== BGP_IPV4_NODE
1656 || vty
->node
== BGP_IPV4M_NODE
1657 || vty
->node
== BGP_VPNV4_NODE
1658 || vty
->node
== BGP_VPNV6_NODE
1659 || vty
->node
== BGP_ENCAP_NODE
1660 || vty
->node
== BGP_ENCAPV6_NODE
1661 || vty
->node
== BGP_IPV6_NODE
1662 || vty
->node
== BGP_IPV6M_NODE
)
1663 vty
->node
= BGP_NODE
;
1667 DEFUNSH (VTYSH_BGPD
,
1669 exit_vnc_config_cmd
,
1671 "Exit from VNC configuration mode\n")
1673 if (vty
->node
== BGP_VNC_DEFAULTS_NODE
1674 || vty
->node
== BGP_VNC_NVE_GROUP_NODE
1675 || vty
->node
== BGP_VNC_L2_GROUP_NODE
)
1676 vty
->node
= BGP_NODE
;
1680 DEFUNSH (VTYSH_ZEBRA
,
1682 vtysh_exit_zebra_cmd
,
1684 "Exit current mode and down to previous mode\n")
1686 return vtysh_exit (vty
);
1689 ALIAS (vtysh_exit_zebra
,
1690 vtysh_quit_zebra_cmd
,
1692 "Exit current mode and down to previous mode\n")
1694 DEFUNSH (VTYSH_RIPD
,
1696 vtysh_exit_ripd_cmd
,
1698 "Exit current mode and down to previous mode\n")
1700 return vtysh_exit (vty
);
1703 ALIAS (vtysh_exit_ripd
,
1704 vtysh_quit_ripd_cmd
,
1706 "Exit current mode and down to previous mode\n")
1708 DEFUNSH (VTYSH_RIPNGD
,
1710 vtysh_exit_ripngd_cmd
,
1712 "Exit current mode and down to previous mode\n")
1714 return vtysh_exit (vty
);
1717 ALIAS (vtysh_exit_ripngd
,
1718 vtysh_quit_ripngd_cmd
,
1720 "Exit current mode and down to previous mode\n")
1722 DEFUNSH (VTYSH_RMAP
,
1724 vtysh_exit_rmap_cmd
,
1726 "Exit current mode and down to previous mode\n")
1728 return vtysh_exit (vty
);
1731 ALIAS (vtysh_exit_rmap
,
1732 vtysh_quit_rmap_cmd
,
1734 "Exit current mode and down to previous mode\n")
1736 DEFUNSH (VTYSH_BGPD
,
1738 vtysh_exit_bgpd_cmd
,
1740 "Exit current mode and down to previous mode\n")
1742 return vtysh_exit (vty
);
1745 ALIAS (vtysh_exit_bgpd
,
1746 vtysh_quit_bgpd_cmd
,
1748 "Exit current mode and down to previous mode\n")
1750 DEFUNSH (VTYSH_OSPFD
,
1752 vtysh_exit_ospfd_cmd
,
1754 "Exit current mode and down to previous mode\n")
1756 return vtysh_exit (vty
);
1759 ALIAS (vtysh_exit_ospfd
,
1760 vtysh_quit_ospfd_cmd
,
1762 "Exit current mode and down to previous mode\n")
1764 DEFUNSH (VTYSH_OSPF6D
,
1766 vtysh_exit_ospf6d_cmd
,
1768 "Exit current mode and down to previous mode\n")
1770 return vtysh_exit (vty
);
1773 ALIAS (vtysh_exit_ospf6d
,
1774 vtysh_quit_ospf6d_cmd
,
1776 "Exit current mode and down to previous mode\n")
1778 #if defined (HAVE_LDPD)
1779 DEFUNSH (VTYSH_LDPD
,
1781 vtysh_exit_ldpd_cmd
,
1783 "Exit current mode and down to previous mode\n")
1785 return vtysh_exit (vty
);
1788 ALIAS (vtysh_exit_ldpd
,
1789 vtysh_quit_ldpd_cmd
,
1791 "Exit current mode and down to previous mode\n")
1794 DEFUNSH (VTYSH_ISISD
,
1796 vtysh_exit_isisd_cmd
,
1798 "Exit current mode and down to previous mode\n")
1800 return vtysh_exit (vty
);
1803 ALIAS (vtysh_exit_isisd
,
1804 vtysh_quit_isisd_cmd
,
1806 "Exit current mode and down to previous mode\n")
1809 vtysh_exit_line_vty
,
1810 vtysh_exit_line_vty_cmd
,
1812 "Exit current mode and down to previous mode\n")
1814 return vtysh_exit (vty
);
1817 ALIAS (vtysh_exit_line_vty
,
1818 vtysh_quit_line_vty_cmd
,
1820 "Exit current mode and down to previous mode\n")
1822 DEFUNSH (VTYSH_INTERFACE
,
1824 vtysh_interface_cmd
,
1826 "Select an interface to configure\n"
1827 "Interface's name\n")
1829 vty
->node
= INTERFACE_NODE
;
1833 ALIAS_SH (VTYSH_ZEBRA
,
1835 vtysh_interface_vrf_cmd
,
1836 "interface IFNAME " VRF_CMD_STR
,
1837 "Select an interface to configure\n"
1838 "Interface's name\n"
1841 /* TODO Implement "no interface command in isisd. */
1842 DEFSH (VTYSH_ZEBRA
|VTYSH_RIPD
|VTYSH_RIPNGD
|VTYSH_OSPFD
|VTYSH_OSPF6D
|VTYSH_LDPD
,
1843 vtysh_no_interface_cmd
,
1844 "no interface IFNAME",
1846 "Delete a pseudo interface's configuration\n"
1847 "Interface's name\n")
1850 vtysh_no_interface_vrf_cmd
,
1851 "no interface IFNAME " VRF_CMD_STR
,
1853 "Delete a pseudo interface's configuration\n"
1854 "Interface's name\n"
1860 "logical-router <1-65535 ns NAME",
1861 "Enable a logical-router\n"
1862 "Specify the logical-router indentifier\n"
1864 "The file name in " NS_RUN_DIR
", or a full pathname\n")
1866 vty
->node
= NS_NODE
;
1874 "Select a VRF to configure\n"
1877 vty
->node
= VRF_NODE
;
1885 "Delete a pseudo vrf's configuration\n"
1892 "Exit current mode and down to previous mode\n")
1894 return vtysh_exit (vty
);
1897 ALIAS (vtysh_exit_ns
,
1900 "Exit current mode and down to previous mode\n")
1906 "Exit current mode and down to previous mode\n")
1908 return vtysh_exit (vty
);
1911 ALIAS (vtysh_exit_vrf
,
1914 "Exit current mode and down to previous mode\n")
1916 /* TODO Implement interface description commands in ripngd, ospf6d
1918 DEFSH (VTYSH_ZEBRA
|VTYSH_RIPD
|VTYSH_OSPFD
|VTYSH_LDPD
,
1919 vtysh_interface_desc_cmd
,
1920 "description .LINE",
1921 "Interface specific description\n"
1922 "Characters describing this interface\n")
1924 DEFSH (VTYSH_ZEBRA
|VTYSH_RIPD
|VTYSH_OSPFD
,
1925 vtysh_no_interface_desc_cmd
,
1928 "Interface specific description\n")
1930 DEFUNSH (VTYSH_INTERFACE
,
1931 vtysh_exit_interface
,
1932 vtysh_exit_interface_cmd
,
1934 "Exit current mode and down to previous mode\n")
1936 return vtysh_exit (vty
);
1939 ALIAS (vtysh_exit_interface
,
1940 vtysh_quit_interface_cmd
,
1942 "Exit current mode and down to previous mode\n")
1944 DEFUN (vtysh_show_thread
,
1945 vtysh_show_thread_cmd
,
1946 "show thread cpu [FILTER]",
1948 "Thread information\n"
1949 "Thread CPU usage\n"
1950 "Display filter (rwtexb)\n")
1953 int ret
= CMD_SUCCESS
;
1956 sprintf(line
, "show thread cpu %s\n", (argc
== 1) ? argv
[0] : "");
1957 for (i
= 0; i
< array_size(vtysh_client
); i
++)
1958 if ( vtysh_client
[i
].fd
>= 0 )
1960 fprintf (stdout
, "Thread statistics for %s:\n",
1961 vtysh_client
[i
].name
);
1962 ret
= vtysh_client_execute (&vtysh_client
[i
], line
, stdout
);
1963 fprintf (stdout
,"\n");
1968 DEFUN (vtysh_show_work_queues
,
1969 vtysh_show_work_queues_cmd
,
1972 "Work Queue information\n")
1975 int ret
= CMD_SUCCESS
;
1976 char line
[] = "show work-queues\n";
1978 for (i
= 0; i
< array_size(vtysh_client
); i
++)
1979 if ( vtysh_client
[i
].fd
>= 0 )
1981 fprintf (stdout
, "Work queue statistics for %s:\n",
1982 vtysh_client
[i
].name
);
1983 ret
= vtysh_client_execute (&vtysh_client
[i
], line
, stdout
);
1984 fprintf (stdout
,"\n");
1990 DEFUN (vtysh_show_work_queues_daemon
,
1991 vtysh_show_work_queues_daemon_cmd
,
1992 "show work-queues (zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd)",
1994 "Work Queue information\n"
1995 "For the zebra daemon\n"
1996 "For the rip daemon\n"
1997 "For the ripng daemon\n"
1998 "For the ospf daemon\n"
1999 "For the ospfv6 daemon\n"
2000 "For the bgp daemon\n"
2001 "For the isis daemon\n")
2004 int ret
= CMD_SUCCESS
;
2006 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2008 if (begins_with(vtysh_client
[i
].name
, argv
[0]))
2012 ret
= vtysh_client_execute(&vtysh_client
[i
], "show work-queues\n", stdout
);
2017 DEFUNSH (VTYSH_ZEBRA
,
2019 vtysh_link_params_cmd
,
2024 vty
->node
= LINK_PARAMS_NODE
;
2028 DEFUNSH (VTYSH_ZEBRA
,
2030 exit_link_params_cmd
,
2032 "Exit from Link Params configuration node\n")
2034 if (vty
->node
== LINK_PARAMS_NODE
)
2035 vty
->node
= INTERFACE_NODE
;
2040 DEFUN (vtysh_show_memory
,
2041 vtysh_show_memory_cmd
,
2044 "Memory statistics\n")
2047 int ret
= CMD_SUCCESS
;
2048 char line
[] = "show memory\n";
2050 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2051 if ( vtysh_client
[i
].fd
>= 0 )
2053 fprintf (stdout
, "Memory statistics for %s:\n",
2054 vtysh_client
[i
].name
);
2055 ret
= vtysh_client_execute (&vtysh_client
[i
], line
, stdout
);
2056 fprintf (stdout
,"\n");
2062 /* Logging commands. */
2063 DEFUN (vtysh_show_logging
,
2064 vtysh_show_logging_cmd
,
2067 "Show current logging configuration\n")
2070 int ret
= CMD_SUCCESS
;
2071 char line
[] = "show logging\n";
2073 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2074 if ( vtysh_client
[i
].fd
>= 0 )
2076 fprintf (stdout
,"Logging configuration for %s:\n",
2077 vtysh_client
[i
].name
);
2078 ret
= vtysh_client_execute (&vtysh_client
[i
], line
, stdout
);
2079 fprintf (stdout
,"\n");
2087 vtysh_log_stdout_cmd
,
2090 "Set stdout logging level\n")
2096 vtysh_log_stdout_level
,
2097 vtysh_log_stdout_level_cmd
,
2098 "log stdout "LOG_LEVELS
,
2100 "Set stdout logging level\n"
2107 no_vtysh_log_stdout
,
2108 no_vtysh_log_stdout_cmd
,
2109 "no log stdout [LEVEL]",
2112 "Cancel logging to stdout\n"
2121 "log file FILENAME",
2124 "Logging filename\n")
2130 vtysh_log_file_level
,
2131 vtysh_log_file_level_cmd
,
2132 "log file FILENAME "LOG_LEVELS
,
2135 "Logging filename\n"
2143 no_vtysh_log_file_cmd
,
2144 "no log file [FILENAME]",
2147 "Cancel logging to file\n"
2148 "Logging file name\n")
2153 ALIAS_SH (VTYSH_ALL
,
2155 no_vtysh_log_file_level_cmd
,
2156 "no log file FILENAME LEVEL",
2159 "Cancel logging to file\n"
2160 "Logging file name\n"
2165 vtysh_log_monitor_cmd
,
2168 "Set terminal line (monitor) logging level\n")
2174 vtysh_log_monitor_level
,
2175 vtysh_log_monitor_level_cmd
,
2176 "log monitor "LOG_LEVELS
,
2178 "Set terminal line (monitor) logging level\n"
2185 no_vtysh_log_monitor
,
2186 no_vtysh_log_monitor_cmd
,
2187 "no log monitor [LEVEL]",
2190 "Disable terminal line (monitor) logging\n"
2198 vtysh_log_syslog_cmd
,
2201 "Set syslog logging level\n")
2207 vtysh_log_syslog_level
,
2208 vtysh_log_syslog_level_cmd
,
2209 "log syslog "LOG_LEVELS
,
2211 "Set syslog logging level\n"
2218 no_vtysh_log_syslog
,
2219 no_vtysh_log_syslog_cmd
,
2220 "no log syslog [LEVEL]",
2223 "Cancel logging to syslog\n"
2231 vtysh_log_facility_cmd
,
2232 "log facility "LOG_FACILITIES
,
2234 "Facility parameter for syslog messages\n"
2242 no_vtysh_log_facility
,
2243 no_vtysh_log_facility_cmd
,
2244 "no log facility [FACILITY]",
2247 "Reset syslog facility to default (daemon)\n"
2248 "Syslog facility\n")
2254 DEFUNSH_DEPRECATED (VTYSH_ALL
,
2257 "log trap "LOG_LEVELS
,
2259 "(Deprecated) Set logging level and default for all destinations\n"
2266 DEFUNSH_DEPRECATED (VTYSH_ALL
,
2268 no_vtysh_log_trap_cmd
,
2269 "no log trap [LEVEL]",
2272 "Permit all logging information\n"
2279 vtysh_log_record_priority
,
2280 vtysh_log_record_priority_cmd
,
2281 "log record-priority",
2283 "Log the priority of the message within the message\n")
2289 no_vtysh_log_record_priority
,
2290 no_vtysh_log_record_priority_cmd
,
2291 "no log record-priority",
2294 "Do not log the priority of the message within the message\n")
2300 vtysh_log_timestamp_precision
,
2301 vtysh_log_timestamp_precision_cmd
,
2302 "log timestamp precision <0-6>",
2304 "Timestamp configuration\n"
2305 "Set the timestamp precision\n"
2306 "Number of subsecond digits\n")
2312 no_vtysh_log_timestamp_precision
,
2313 no_vtysh_log_timestamp_precision_cmd
,
2314 "no log timestamp precision",
2317 "Timestamp configuration\n"
2318 "Reset the timestamp precision to the default value of 0\n")
2324 vtysh_service_password_encrypt
,
2325 vtysh_service_password_encrypt_cmd
,
2326 "service password-encryption",
2327 "Set up miscellaneous service\n"
2328 "Enable encrypted passwords\n")
2334 no_vtysh_service_password_encrypt
,
2335 no_vtysh_service_password_encrypt_cmd
,
2336 "no service password-encryption",
2338 "Set up miscellaneous service\n"
2339 "Enable encrypted passwords\n")
2345 vtysh_config_password
,
2347 "password (8|) WORD",
2348 "Assign the terminal connection password\n"
2349 "Specifies a HIDDEN password will follow\n"
2351 "The HIDDEN line password string\n")
2357 vtysh_password_text
,
2358 vtysh_password_text_cmd
,
2360 "Assign the terminal connection password\n"
2361 "The UNENCRYPTED (cleartext) line password\n")
2367 vtysh_config_enable_password
,
2368 vtysh_enable_password_cmd
,
2369 "enable password (8|) WORD",
2370 "Modify enable password parameters\n"
2371 "Assign the privileged level password\n"
2372 "Specifies a HIDDEN password will follow\n"
2374 "The HIDDEN 'enable' password string\n")
2380 vtysh_enable_password_text
,
2381 vtysh_enable_password_text_cmd
,
2382 "enable password LINE",
2383 "Modify enable password parameters\n"
2384 "Assign the privileged level password\n"
2385 "The UNENCRYPTED (cleartext) 'enable' password\n")
2391 no_vtysh_config_enable_password
,
2392 no_vtysh_enable_password_cmd
,
2393 "no enable password",
2395 "Modify enable password parameters\n"
2396 "Assign the privileged level password\n")
2401 DEFUN (vtysh_write_terminal
,
2402 vtysh_write_terminal_cmd
,
2404 "Write running configuration to memory, network, or terminal\n"
2405 "Write to terminal\n")
2408 char line
[] = "write terminal\n";
2411 if (vtysh_pager_name
)
2413 fp
= popen (vtysh_pager_name
, "w");
2423 vty_out (vty
, "Building configuration...%s", VTY_NEWLINE
);
2424 vty_out (vty
, "%sCurrent configuration:%s", VTY_NEWLINE
,
2426 vty_out (vty
, "!%s", VTY_NEWLINE
);
2428 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2429 if ((argc
< 1 ) || (begins_with(vtysh_client
[i
].name
, argv
[0])))
2430 vtysh_client_config (&vtysh_client
[i
], line
);
2432 /* Integrate vtysh specific configuration. */
2433 vtysh_config_write ();
2435 vtysh_config_dump (fp
);
2437 if (vtysh_pager_name
&& fp
)
2440 if (pclose (fp
) == -1)
2448 vty_out (vty
, "end%s", VTY_NEWLINE
);
2453 DEFUN (vtysh_write_terminal_daemon
,
2454 vtysh_write_terminal_daemon_cmd
,
2455 "write terminal (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
2456 "Write running configuration to memory, network, or terminal\n"
2457 "Write to terminal\n"
2458 "For the zebra daemon\n"
2459 "For the rip daemon\n"
2460 "For the ripng daemon\n"
2461 "For the ospf daemon\n"
2462 "For the ospfv6 daemon\n"
2463 "For the ldp daemon\n"
2464 "For the bgp daemon\n"
2465 "For the isis daemon\n"
2466 "For the pim daemon\n")
2469 int ret
= CMD_SUCCESS
;
2471 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2473 if (begins_with(vtysh_client
[i
].name
, argv
[0]))
2477 if (i
== array_size(vtysh_client
))
2478 return CMD_ERR_NO_MATCH
;
2480 ret
= vtysh_client_execute(&vtysh_client
[i
], "show running-config\n", stdout
);
2485 DEFUN (vtysh_integrated_config
,
2486 vtysh_integrated_config_cmd
,
2487 "service integrated-vtysh-config",
2488 "Set up miscellaneous service\n"
2489 "Write configuration into integrated file\n")
2491 vtysh_write_integrated
= WRITE_INTEGRATED_YES
;
2495 DEFUN (no_vtysh_integrated_config
,
2496 no_vtysh_integrated_config_cmd
,
2497 "no service integrated-vtysh-config",
2499 "Set up miscellaneous service\n"
2500 "Write configuration into integrated file\n")
2502 vtysh_write_integrated
= WRITE_INTEGRATED_NO
;
2507 backup_config_file (const char *fbackup
)
2509 char *integrate_sav
= NULL
;
2511 integrate_sav
= malloc (strlen (fbackup
) +
2512 strlen (CONF_BACKUP_EXT
) + 1);
2513 strcpy (integrate_sav
, fbackup
);
2514 strcat (integrate_sav
, CONF_BACKUP_EXT
);
2516 /* Move current configuration file to backup config file. */
2517 unlink (integrate_sav
);
2518 rename (fbackup
, integrate_sav
);
2519 free (integrate_sav
);
2523 vtysh_write_config_integrated(void)
2526 char line
[] = "write terminal\n";
2529 struct passwd
*pwentry
;
2530 struct group
*grentry
;
2536 fprintf (stdout
,"Building Configuration...\n");
2538 backup_config_file(quagga_config
);
2539 fp
= fopen (quagga_config
, "w");
2542 fprintf (stdout
,"%% Error: failed to open configuration file %s: %s\n",
2543 quagga_config
, safe_strerror(errno
));
2548 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2549 vtysh_client_config (&vtysh_client
[i
], line
);
2551 vtysh_config_write ();
2552 vtysh_config_dump (fp
);
2554 if (fchmod (fd
, CONFIGFILE_MASK
) != 0)
2556 printf ("%% Warning: can't chmod configuration file %s: %s\n",
2557 quagga_config
, safe_strerror(errno
));
2561 pwentry
= getpwnam (FRR_USER
);
2563 uid
= pwentry
->pw_uid
;
2566 printf ("%% Warning: could not look up user \"%s\"\n", FRR_USER
);
2570 grentry
= getgrnam (FRR_GROUP
);
2572 gid
= grentry
->gr_gid
;
2575 printf ("%% Warning: could not look up group \"%s\"\n", FRR_GROUP
);
2579 if (!fstat (fd
, &st
))
2581 if (st
.st_uid
== uid
)
2583 if (st
.st_gid
== gid
)
2585 if ((uid
!= (uid_t
)-1 || gid
!= (gid_t
)-1) && fchown (fd
, uid
, gid
))
2587 printf ("%% Warning: can't chown configuration file %s: %s\n",
2588 quagga_config
, safe_strerror(errno
));
2594 printf ("%% Warning: stat() failed on %s: %s\n",
2595 quagga_config
, safe_strerror(errno
));
2601 printf ("Integrated configuration saved to %s\n", quagga_config
);
2609 static bool want_config_integrated(void)
2613 switch (vtysh_write_integrated
)
2615 case WRITE_INTEGRATED_UNSPECIFIED
:
2616 if (stat(quagga_config
, &s
) && errno
== ENOENT
)
2619 case WRITE_INTEGRATED_NO
:
2621 case WRITE_INTEGRATED_YES
:
2627 DEFUN (vtysh_write_memory
,
2628 vtysh_write_memory_cmd
,
2630 "Write running configuration to memory, network, or terminal\n"
2631 "Write configuration to the file (same as write file)\n")
2633 int ret
= CMD_SUCCESS
;
2634 char line
[] = "write memory\n";
2637 fprintf (stdout
, "Note: this version of vtysh never writes vtysh.conf\n");
2639 /* If integrated frr.conf explicitely set. */
2640 if (want_config_integrated())
2643 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2644 if (vtysh_client
[i
].flag
== VTYSH_WATCHFRR
)
2646 if (i
< array_size(vtysh_client
) && vtysh_client
[i
].fd
!= -1)
2647 ret
= vtysh_client_execute (&vtysh_client
[i
], "write integrated", stdout
);
2649 if (ret
!= CMD_SUCCESS
)
2651 printf("\nWarning: attempting direct configuration write without "
2652 "watchfrr.\nFile permissions and ownership may be "
2653 "incorrect, or write may fail.\n\n");
2654 ret
= vtysh_write_config_integrated();
2659 fprintf (stdout
,"Building Configuration...\n");
2661 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2662 ret
= vtysh_client_execute (&vtysh_client
[i
], line
, stdout
);
2667 ALIAS (vtysh_write_memory
,
2668 vtysh_copy_runningconfig_startupconfig_cmd
,
2669 "copy running-config startup-config",
2670 "Copy from one file to another\n"
2671 "Copy from current system configuration\n"
2672 "Copy to startup configuration\n")
2674 ALIAS (vtysh_write_memory
,
2675 vtysh_write_file_cmd
,
2677 "Write running configuration to memory, network, or terminal\n"
2678 "Write configuration to the file (same as write memory)\n")
2680 ALIAS (vtysh_write_memory
,
2683 "Write running configuration to memory, network, or terminal\n")
2685 ALIAS (vtysh_write_terminal
,
2686 vtysh_show_running_config_cmd
,
2687 "show running-config",
2689 "Current operating configuration\n")
2691 ALIAS (vtysh_write_terminal
,
2692 vtysh_show_running_config_daemon_cmd
,
2693 "show running-config (zebra|ripd|ripngd|ospfd|ospf6d|ldpd|bgpd|isisd|pimd)",
2695 "Current operating configuration\n"
2696 "For the zebra daemon\n"
2697 "For the rip daemon\n"
2698 "For the ripng daemon\n"
2699 "For the ospf daemon\n"
2700 "For the ospfv6 daemon\n"
2701 "For the ldp daemon\n"
2702 "For the bgp daemon\n"
2703 "For the isis daemon\n"
2704 "For the pim daemon\n")
2706 DEFUN (vtysh_terminal_length
,
2707 vtysh_terminal_length_cmd
,
2708 "terminal length <0-512>",
2709 "Set terminal line parameters\n"
2710 "Set number of lines on a screen\n"
2711 "Number of lines on screen (0 for no pausing)\n")
2714 char *endptr
= NULL
;
2715 char default_pager
[10];
2717 lines
= strtol (argv
[0], &endptr
, 10);
2718 if (lines
< 0 || lines
> 512 || *endptr
!= '\0')
2720 vty_out (vty
, "length is malformed%s", VTY_NEWLINE
);
2724 if (vtysh_pager_name
)
2726 free (vtysh_pager_name
);
2727 vtysh_pager_name
= NULL
;
2732 snprintf(default_pager
, 10, "more -%i", lines
);
2733 vtysh_pager_name
= strdup (default_pager
);
2739 DEFUN (vtysh_terminal_no_length
,
2740 vtysh_terminal_no_length_cmd
,
2741 "terminal no length",
2742 "Set terminal line parameters\n"
2744 "Set number of lines on a screen\n")
2746 if (vtysh_pager_name
)
2748 free (vtysh_pager_name
);
2749 vtysh_pager_name
= NULL
;
2756 DEFUN (vtysh_show_daemons
,
2757 vtysh_show_daemons_cmd
,
2760 "Show list of running daemons\n")
2764 for (i
= 0; i
< array_size(vtysh_client
); i
++)
2765 if ( vtysh_client
[i
].fd
>= 0 )
2766 vty_out(vty
, " %s", vtysh_client
[i
].name
);
2767 vty_out(vty
, "%s", VTY_NEWLINE
);
2772 /* Execute command in child process. */
2774 execute_command (const char *command
, int argc
, const char *arg1
,
2785 /* Failure of fork(). */
2786 fprintf (stderr
, "Can't fork: %s\n", safe_strerror (errno
));
2791 /* This is child process. */
2795 execlp (command
, command
, (const char *)NULL
);
2798 execlp (command
, command
, arg1
, (const char *)NULL
);
2801 execlp (command
, command
, arg1
, arg2
, (const char *)NULL
);
2805 /* When execlp suceed, this part is not executed. */
2806 fprintf (stderr
, "Can't execute %s: %s\n", command
, safe_strerror (errno
));
2811 /* This is parent. */
2813 wait4 (pid
, &status
, 0, NULL
);
2821 "Send echo messages\n"
2822 "Ping destination address or hostname\n")
2824 execute_command ("ping", 1, argv
[0], NULL
);
2831 "Send echo messages\n"
2833 "Ping destination address or hostname\n")
2835 DEFUN (vtysh_traceroute
,
2836 vtysh_traceroute_cmd
,
2838 "Trace route to destination\n"
2839 "Trace route to destination address or hostname\n")
2841 execute_command ("traceroute", 1, argv
[0], NULL
);
2845 ALIAS (vtysh_traceroute
,
2846 vtysh_traceroute_ip_cmd
,
2847 "traceroute ip WORD",
2848 "Trace route to destination\n"
2850 "Trace route to destination address or hostname\n")
2855 "Send echo messages\n"
2857 "Ping destination address or hostname\n")
2859 execute_command ("ping6", 1, argv
[0], NULL
);
2863 DEFUN (vtysh_traceroute6
,
2864 vtysh_traceroute6_cmd
,
2865 "traceroute ipv6 WORD",
2866 "Trace route to destination\n"
2868 "Trace route to destination address or hostname\n")
2870 execute_command ("traceroute6", 1, argv
[0], NULL
);
2874 #if defined(HAVE_SHELL_ACCESS)
2875 DEFUN (vtysh_telnet
,
2878 "Open a telnet connection\n"
2879 "IP address or hostname of a remote system\n")
2881 execute_command ("telnet", 1, argv
[0], NULL
);
2885 DEFUN (vtysh_telnet_port
,
2886 vtysh_telnet_port_cmd
,
2888 "Open a telnet connection\n"
2889 "IP address or hostname of a remote system\n"
2890 "TCP Port number\n")
2892 execute_command ("telnet", 2, argv
[0], argv
[1]);
2899 "Open an ssh connection\n"
2902 execute_command ("ssh", 1, argv
[0], NULL
);
2906 DEFUN (vtysh_start_shell
,
2907 vtysh_start_shell_cmd
,
2909 "Start UNIX shell\n")
2911 execute_command ("sh", 0, NULL
, NULL
);
2915 DEFUN (vtysh_start_bash
,
2916 vtysh_start_bash_cmd
,
2918 "Start UNIX shell\n"
2921 execute_command ("bash", 0, NULL
, NULL
);
2925 DEFUN (vtysh_start_zsh
,
2926 vtysh_start_zsh_cmd
,
2928 "Start UNIX shell\n"
2931 execute_command ("zsh", 0, NULL
, NULL
);
2937 vtysh_install_default (enum node_type node
)
2939 install_element (node
, &config_list_cmd
);
2942 /* Making connection to protocol daemon. */
2944 vtysh_connect (struct vtysh_client
*vclient
)
2948 struct sockaddr_un addr
;
2950 char path
[MAXPATHLEN
];
2952 if (vty_sock_path
== NULL
)
2953 strlcpy (path
, vclient
->path
, sizeof (path
));
2955 /* Different path for VTY Socket specified
2956 overriding the default path, but keep the filename */
2957 strlcpy (path
, vty_sock_path
, sizeof (path
));
2959 if (strrchr (vclient
->path
, '/') != NULL
)
2960 strlcat (path
, strrchr (vclient
->path
, '/'), sizeof (path
));
2963 * vclient->path configured as relative path during config? Should
2964 * really never happen for sensible config
2966 strlcat (path
, "/", sizeof (path
));
2967 strlcat (path
, vclient
->path
, sizeof (path
));
2970 path
[sizeof(path
)-1] = '\0';
2972 /* Stat socket to see if we have permission to access it. */
2973 ret
= stat (path
, &s_stat
);
2974 if (ret
< 0 && errno
!= ENOENT
)
2976 fprintf (stderr
, "vtysh_connect(%s): stat = %s\n",
2977 path
, safe_strerror(errno
));
2983 if (! S_ISSOCK(s_stat
.st_mode
))
2985 fprintf (stderr
, "vtysh_connect(%s): Not a socket\n",
2992 sock
= socket (AF_UNIX
, SOCK_STREAM
, 0);
2996 fprintf(stderr
, "vtysh_connect(%s): socket = %s\n", path
,
2997 safe_strerror(errno
));
3002 memset (&addr
, 0, sizeof (struct sockaddr_un
));
3003 addr
.sun_family
= AF_UNIX
;
3004 strlcpy (addr
.sun_path
, path
, sizeof (addr
.sun_path
));
3005 #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
3006 len
= addr
.sun_len
= SUN_LEN(&addr
);
3008 len
= sizeof (addr
.sun_family
) + strlen (addr
.sun_path
);
3009 #endif /* HAVE_STRUCT_SOCKADDR_UN_SUN_LEN */
3011 ret
= connect (sock
, (struct sockaddr
*) &addr
, len
);
3015 fprintf(stderr
, "vtysh_connect(%s): connect = %s\n", path
,
3016 safe_strerror(errno
));
3026 /* Return true if str ends with suffix, else return false */
3028 ends_with(const char *str
, const char *suffix
)
3030 if (!str
|| !suffix
)
3032 size_t lenstr
= strlen(str
);
3033 size_t lensuffix
= strlen(suffix
);
3034 if (lensuffix
> lenstr
)
3036 return strncmp(str
+ lenstr
- lensuffix
, suffix
, lensuffix
) == 0;
3040 vtysh_client_sorted_insert (struct vtysh_client
*head_client
,
3041 struct vtysh_client
*client
)
3043 struct vtysh_client
*prev_node
, *current_node
;
3045 prev_node
= head_client
;
3046 current_node
= head_client
->next
;
3047 while (current_node
)
3049 if (strcmp(current_node
->path
, client
->path
) > 0)
3052 prev_node
= current_node
;
3053 current_node
= current_node
->next
;
3055 client
->next
= current_node
;
3056 prev_node
->next
= client
;
3059 #define MAXIMUM_INSTANCES 10
3062 vtysh_update_all_insances(struct vtysh_client
* head_client
)
3064 struct vtysh_client
*client
;
3066 char vty_dir
[MAXPATHLEN
];
3068 struct dirent
*file
;
3071 if (head_client
->flag
!= VTYSH_OSPFD
) return;
3073 if (vty_sock_path
== NULL
)
3074 /* ls DAEMON_VTY_DIR and look for all files ending in .vty */
3075 strlcpy(vty_dir
, DAEMON_VTY_DIR
"/", MAXPATHLEN
);
3078 /* ls vty_sock_dir and look for all files ending in .vty */
3079 strlcpy(vty_dir
, vty_sock_path
, MAXPATHLEN
);
3080 strlcat(vty_dir
, "/", MAXPATHLEN
);
3082 dir
= opendir(vty_dir
);
3085 while ((file
= readdir(dir
)) != NULL
)
3087 if (begins_with(file
->d_name
, "ospfd-") && ends_with(file
->d_name
, ".vty"))
3089 if (n
== MAXIMUM_INSTANCES
)
3092 "Parsing %s, client limit(%d) reached!\n",
3096 client
= (struct vtysh_client
*) malloc(sizeof(struct vtysh_client
));
3098 client
->name
= "ospfd";
3099 client
->flag
= VTYSH_OSPFD
;
3100 ptr
= (char *) malloc(100);
3101 sprintf(ptr
, "%s%s", vty_dir
, file
->d_name
);
3102 client
->path
= (const char *)ptr
;
3103 client
->next
= NULL
;
3104 vtysh_client_sorted_insert(head_client
, client
);
3113 vtysh_connect_all_instances (struct vtysh_client
*head_client
)
3115 struct vtysh_client
*client
;
3118 vtysh_update_all_insances(head_client
);
3120 client
= head_client
->next
;
3123 if (vtysh_connect(client
) == 0)
3125 client
= client
->next
;
3132 vtysh_connect_all(const char *daemon_name
)
3138 for (i
= 0; i
< array_size(vtysh_client
); i
++)
3140 if (!daemon_name
|| !strcmp(daemon_name
, vtysh_client
[i
].name
))
3143 if (vtysh_connect(&vtysh_client
[i
]) == 0)
3146 rc
+= vtysh_connect_all_instances(&vtysh_client
[i
]);
3150 fprintf(stderr
, "Error: no daemons match name %s!\n", daemon_name
);
3154 /* To disable readline's filename completion. */
3156 vtysh_completion_entry_function (const char *ignore
, int invoking_key
)
3162 vtysh_readline_init (void)
3164 /* readline related settings. */
3165 rl_bind_key ('?', (rl_command_func_t
*) vtysh_rl_describe
);
3166 rl_completion_entry_function
= vtysh_completion_entry_function
;
3167 rl_attempted_completion_function
= (rl_completion_func_t
*)new_completion
;
3173 static struct utsname names
;
3174 static char buf
[100];
3175 const char*hostname
;
3176 extern struct host host
;
3178 hostname
= host
.name
;
3182 if (!names
.nodename
[0])
3184 hostname
= names
.nodename
;
3187 snprintf (buf
, sizeof buf
, cmd_prompt (vty
->node
), hostname
);
3193 vtysh_init_vty (void)
3195 /* Make vty structure. */
3197 vty
->type
= VTY_SHELL
;
3198 vty
->node
= VIEW_NODE
;
3200 /* Initialize commands. */
3203 /* Install nodes. */
3204 install_node (&bgp_node
, NULL
);
3205 install_node (&rip_node
, NULL
);
3206 install_node (&interface_node
, NULL
);
3207 install_node (&link_params_node
, NULL
);
3208 install_node (&ns_node
, NULL
);
3209 install_node (&vrf_node
, NULL
);
3210 install_node (&rmap_node
, NULL
);
3211 install_node (&zebra_node
, NULL
);
3212 install_node (&bgp_vpnv4_node
, NULL
);
3213 install_node (&bgp_vpnv6_node
, NULL
);
3214 install_node (&bgp_encap_node
, NULL
);
3215 install_node (&bgp_encapv6_node
, NULL
);
3216 install_node (&bgp_ipv4_node
, NULL
);
3217 install_node (&bgp_ipv4m_node
, NULL
);
3218 install_node (&bgp_ipv6_node
, NULL
);
3219 install_node (&bgp_ipv6m_node
, NULL
);
3220 install_node (&bgp_vnc_defaults_node
, NULL
);
3221 install_node (&bgp_vnc_nve_group_node
, NULL
);
3222 install_node (&bgp_vnc_l2_group_node
, NULL
);
3223 install_node (&ospf_node
, NULL
);
3224 install_node (&ripng_node
, NULL
);
3225 install_node (&ospf6_node
, NULL
);
3226 install_node (&ldp_node
, NULL
);
3227 install_node (&ldp_ipv4_node
, NULL
);
3228 install_node (&ldp_ipv6_node
, NULL
);
3229 install_node (&ldp_ipv4_iface_node
, NULL
);
3230 install_node (&ldp_ipv6_iface_node
, NULL
);
3231 install_node (&ldp_l2vpn_node
, NULL
);
3232 install_node (&ldp_pseudowire_node
, NULL
);
3233 install_node (&keychain_node
, NULL
);
3234 install_node (&keychain_key_node
, NULL
);
3235 install_node (&isis_node
, NULL
);
3236 install_node (&vty_node
, NULL
);
3238 vtysh_install_default (VIEW_NODE
);
3239 vtysh_install_default (CONFIG_NODE
);
3240 vtysh_install_default (BGP_NODE
);
3241 vtysh_install_default (RIP_NODE
);
3242 vtysh_install_default (INTERFACE_NODE
);
3243 vtysh_install_default (LINK_PARAMS_NODE
);
3244 vtysh_install_default (NS_NODE
);
3245 vtysh_install_default (VRF_NODE
);
3246 vtysh_install_default (RMAP_NODE
);
3247 vtysh_install_default (ZEBRA_NODE
);
3248 vtysh_install_default (BGP_VPNV4_NODE
);
3249 vtysh_install_default (BGP_VPNV6_NODE
);
3250 vtysh_install_default (BGP_ENCAP_NODE
);
3251 vtysh_install_default (BGP_ENCAPV6_NODE
);
3252 vtysh_install_default (BGP_IPV4_NODE
);
3253 vtysh_install_default (BGP_IPV4M_NODE
);
3254 vtysh_install_default (BGP_IPV6_NODE
);
3255 vtysh_install_default (BGP_IPV6M_NODE
);
3257 vtysh_install_default (BGP_VNC_DEFAULTS_NODE
);
3258 vtysh_install_default (BGP_VNC_NVE_GROUP_NODE
);
3259 vtysh_install_default (BGP_VNC_L2_GROUP_NODE
);
3261 vtysh_install_default (OSPF_NODE
);
3262 vtysh_install_default (RIPNG_NODE
);
3263 vtysh_install_default (OSPF6_NODE
);
3264 vtysh_install_default (LDP_NODE
);
3265 vtysh_install_default (LDP_IPV4_NODE
);
3266 vtysh_install_default (LDP_IPV6_NODE
);
3267 vtysh_install_default (LDP_IPV4_IFACE_NODE
);
3268 vtysh_install_default (LDP_IPV6_IFACE_NODE
);
3269 vtysh_install_default (LDP_L2VPN_NODE
);
3270 vtysh_install_default (LDP_PSEUDOWIRE_NODE
);
3271 vtysh_install_default (ISIS_NODE
);
3272 vtysh_install_default (KEYCHAIN_NODE
);
3273 vtysh_install_default (KEYCHAIN_KEY_NODE
);
3274 vtysh_install_default (VTY_NODE
);
3276 install_element (VIEW_NODE
, &vtysh_enable_cmd
);
3277 install_element (ENABLE_NODE
, &vtysh_config_terminal_cmd
);
3278 install_element (ENABLE_NODE
, &vtysh_disable_cmd
);
3280 /* "exit" command. */
3281 install_element (VIEW_NODE
, &vtysh_exit_all_cmd
);
3282 install_element (VIEW_NODE
, &vtysh_quit_all_cmd
);
3283 install_element (CONFIG_NODE
, &vtysh_exit_all_cmd
);
3284 /* install_element (CONFIG_NODE, &vtysh_quit_all_cmd); */
3285 install_element (RIP_NODE
, &vtysh_exit_ripd_cmd
);
3286 install_element (RIP_NODE
, &vtysh_quit_ripd_cmd
);
3287 install_element (RIPNG_NODE
, &vtysh_exit_ripngd_cmd
);
3288 install_element (RIPNG_NODE
, &vtysh_quit_ripngd_cmd
);
3289 install_element (OSPF_NODE
, &vtysh_exit_ospfd_cmd
);
3290 install_element (OSPF_NODE
, &vtysh_quit_ospfd_cmd
);
3291 install_element (OSPF6_NODE
, &vtysh_exit_ospf6d_cmd
);
3292 install_element (OSPF6_NODE
, &vtysh_quit_ospf6d_cmd
);
3293 #if defined (HAVE_LDPD)
3294 install_element (LDP_NODE
, &vtysh_exit_ldpd_cmd
);
3295 install_element (LDP_NODE
, &vtysh_quit_ldpd_cmd
);
3296 install_element (LDP_IPV4_NODE
, &vtysh_exit_ldpd_cmd
);
3297 install_element (LDP_IPV4_NODE
, &vtysh_quit_ldpd_cmd
);
3298 install_element (LDP_IPV6_NODE
, &vtysh_exit_ldpd_cmd
);
3299 install_element (LDP_IPV6_NODE
, &vtysh_quit_ldpd_cmd
);
3300 install_element (LDP_IPV4_IFACE_NODE
, &vtysh_exit_ldpd_cmd
);
3301 install_element (LDP_IPV4_IFACE_NODE
, &vtysh_quit_ldpd_cmd
);
3302 install_element (LDP_IPV6_IFACE_NODE
, &vtysh_exit_ldpd_cmd
);
3303 install_element (LDP_IPV6_IFACE_NODE
, &vtysh_quit_ldpd_cmd
);
3304 install_element (LDP_L2VPN_NODE
, &vtysh_exit_ldpd_cmd
);
3305 install_element (LDP_L2VPN_NODE
, &vtysh_quit_ldpd_cmd
);
3306 install_element (LDP_PSEUDOWIRE_NODE
, &vtysh_exit_ldpd_cmd
);
3307 install_element (LDP_PSEUDOWIRE_NODE
, &vtysh_quit_ldpd_cmd
);
3309 install_element (BGP_NODE
, &vtysh_exit_bgpd_cmd
);
3310 install_element (BGP_NODE
, &vtysh_quit_bgpd_cmd
);
3311 install_element (BGP_VPNV4_NODE
, &vtysh_exit_bgpd_cmd
);
3312 install_element (BGP_VPNV4_NODE
, &vtysh_quit_bgpd_cmd
);
3313 install_element (BGP_VPNV6_NODE
, &vtysh_exit_bgpd_cmd
);
3314 install_element (BGP_VPNV6_NODE
, &vtysh_quit_bgpd_cmd
);
3315 install_element (BGP_ENCAP_NODE
, &vtysh_exit_bgpd_cmd
);
3316 install_element (BGP_ENCAP_NODE
, &vtysh_quit_bgpd_cmd
);
3317 install_element (BGP_ENCAPV6_NODE
, &vtysh_exit_bgpd_cmd
);
3318 install_element (BGP_ENCAPV6_NODE
, &vtysh_quit_bgpd_cmd
);
3319 install_element (BGP_IPV4_NODE
, &vtysh_exit_bgpd_cmd
);
3320 install_element (BGP_IPV4_NODE
, &vtysh_quit_bgpd_cmd
);
3321 install_element (BGP_IPV4M_NODE
, &vtysh_exit_bgpd_cmd
);
3322 install_element (BGP_IPV4M_NODE
, &vtysh_quit_bgpd_cmd
);
3323 install_element (BGP_IPV6_NODE
, &vtysh_exit_bgpd_cmd
);
3324 install_element (BGP_IPV6_NODE
, &vtysh_quit_bgpd_cmd
);
3325 install_element (BGP_IPV6M_NODE
, &vtysh_exit_bgpd_cmd
);
3326 install_element (BGP_IPV6M_NODE
, &vtysh_quit_bgpd_cmd
);
3327 #if defined (ENABLE_BGP_VNC)
3328 install_element (BGP_VNC_DEFAULTS_NODE
, &vtysh_exit_bgpd_cmd
);
3329 install_element (BGP_VNC_DEFAULTS_NODE
, &vtysh_quit_bgpd_cmd
);
3330 install_element (BGP_VNC_NVE_GROUP_NODE
, &vtysh_exit_bgpd_cmd
);
3331 install_element (BGP_VNC_NVE_GROUP_NODE
, &vtysh_quit_bgpd_cmd
);
3332 install_element (BGP_VNC_L2_GROUP_NODE
, &vtysh_exit_bgpd_cmd
);
3333 install_element (BGP_VNC_L2_GROUP_NODE
, &vtysh_quit_bgpd_cmd
);
3335 install_element (ISIS_NODE
, &vtysh_exit_isisd_cmd
);
3336 install_element (ISIS_NODE
, &vtysh_quit_isisd_cmd
);
3337 install_element (KEYCHAIN_NODE
, &vtysh_exit_ripd_cmd
);
3338 install_element (KEYCHAIN_NODE
, &vtysh_quit_ripd_cmd
);
3339 install_element (KEYCHAIN_KEY_NODE
, &vtysh_exit_ripd_cmd
);
3340 install_element (KEYCHAIN_KEY_NODE
, &vtysh_quit_ripd_cmd
);
3341 install_element (RMAP_NODE
, &vtysh_exit_rmap_cmd
);
3342 install_element (RMAP_NODE
, &vtysh_quit_rmap_cmd
);
3343 install_element (VTY_NODE
, &vtysh_exit_line_vty_cmd
);
3344 install_element (VTY_NODE
, &vtysh_quit_line_vty_cmd
);
3346 /* "end" command. */
3347 install_element (CONFIG_NODE
, &vtysh_end_all_cmd
);
3348 install_element (ENABLE_NODE
, &vtysh_end_all_cmd
);
3349 install_element (RIP_NODE
, &vtysh_end_all_cmd
);
3350 install_element (RIPNG_NODE
, &vtysh_end_all_cmd
);
3351 install_element (OSPF_NODE
, &vtysh_end_all_cmd
);
3352 install_element (OSPF6_NODE
, &vtysh_end_all_cmd
);
3353 install_element (LDP_NODE
, &vtysh_end_all_cmd
);
3354 install_element (LDP_IPV4_NODE
, &vtysh_end_all_cmd
);
3355 install_element (LDP_IPV6_NODE
, &vtysh_end_all_cmd
);
3356 install_element (LDP_IPV4_IFACE_NODE
, &vtysh_end_all_cmd
);
3357 install_element (LDP_IPV6_IFACE_NODE
, &vtysh_end_all_cmd
);
3358 install_element (LDP_L2VPN_NODE
, &vtysh_end_all_cmd
);
3359 install_element (LDP_PSEUDOWIRE_NODE
, &vtysh_end_all_cmd
);
3360 install_element (BGP_NODE
, &vtysh_end_all_cmd
);
3361 install_element (BGP_IPV4_NODE
, &vtysh_end_all_cmd
);
3362 install_element (BGP_IPV4M_NODE
, &vtysh_end_all_cmd
);
3363 install_element (BGP_VPNV4_NODE
, &vtysh_end_all_cmd
);
3364 install_element (BGP_VPNV6_NODE
, &vtysh_end_all_cmd
);
3365 install_element (BGP_ENCAP_NODE
, &vtysh_end_all_cmd
);
3366 install_element (BGP_ENCAPV6_NODE
, &vtysh_end_all_cmd
);
3367 install_element (BGP_IPV6_NODE
, &vtysh_end_all_cmd
);
3368 install_element (BGP_IPV6M_NODE
, &vtysh_end_all_cmd
);
3369 install_element (BGP_VNC_DEFAULTS_NODE
, &vtysh_end_all_cmd
);
3370 install_element (BGP_VNC_NVE_GROUP_NODE
, &vtysh_end_all_cmd
);
3371 install_element (BGP_VNC_L2_GROUP_NODE
, &vtysh_end_all_cmd
);
3372 install_element (ISIS_NODE
, &vtysh_end_all_cmd
);
3373 install_element (KEYCHAIN_NODE
, &vtysh_end_all_cmd
);
3374 install_element (KEYCHAIN_KEY_NODE
, &vtysh_end_all_cmd
);
3375 install_element (RMAP_NODE
, &vtysh_end_all_cmd
);
3376 install_element (VTY_NODE
, &vtysh_end_all_cmd
);
3378 install_element (INTERFACE_NODE
, &vtysh_interface_desc_cmd
);
3379 install_element (INTERFACE_NODE
, &vtysh_no_interface_desc_cmd
);
3380 install_element (INTERFACE_NODE
, &vtysh_end_all_cmd
);
3381 install_element (INTERFACE_NODE
, &vtysh_exit_interface_cmd
);
3382 install_element (LINK_PARAMS_NODE
, &exit_link_params_cmd
);
3383 install_element (LINK_PARAMS_NODE
, &vtysh_end_all_cmd
);
3384 install_element (LINK_PARAMS_NODE
, &vtysh_exit_interface_cmd
);
3385 install_element (INTERFACE_NODE
, &vtysh_quit_interface_cmd
);
3387 install_element (NS_NODE
, &vtysh_end_all_cmd
);
3388 install_element (NS_NODE
, &vtysh_exit_ns_cmd
);
3389 install_element (NS_NODE
, &vtysh_quit_ns_cmd
);
3391 install_element (VRF_NODE
, &vtysh_end_all_cmd
);
3392 install_element (VRF_NODE
, &vtysh_exit_vrf_cmd
);
3393 install_element (VRF_NODE
, &vtysh_quit_vrf_cmd
);
3395 install_element (CONFIG_NODE
, &router_rip_cmd
);
3396 install_element (CONFIG_NODE
, &router_ripng_cmd
);
3397 install_element (CONFIG_NODE
, &router_ospf_cmd
);
3398 install_element (CONFIG_NODE
, &router_ospf_instance_cmd
);
3399 install_element (CONFIG_NODE
, &router_ospf6_cmd
);
3400 #if defined (HAVE_LDPD)
3401 install_element (CONFIG_NODE
, &ldp_mpls_ldp_cmd
);
3402 install_element (LDP_NODE
, &ldp_address_family_ipv4_cmd
);
3403 install_element (LDP_NODE
, &ldp_address_family_ipv6_cmd
);
3404 install_element (LDP_IPV4_NODE
, &ldp_interface_ifname_cmd
);
3405 install_element (LDP_IPV6_NODE
, &ldp_interface_ifname_cmd
);
3406 install_element (CONFIG_NODE
, &ldp_l2vpn_word_type_vpls_cmd
);
3407 install_element (LDP_L2VPN_NODE
, &ldp_member_pseudowire_ifname_cmd
);
3409 install_element (CONFIG_NODE
, &router_isis_cmd
);
3410 install_element (CONFIG_NODE
, &router_bgp_cmd
);
3411 install_element (CONFIG_NODE
, &router_bgp_asn_cmd
);
3412 install_element (CONFIG_NODE
, &router_bgp_view_cmd
);
3413 install_element (BGP_NODE
, &address_family_vpnv4_cmd
);
3414 install_element (BGP_NODE
, &address_family_vpnv4_unicast_cmd
);
3415 install_element (BGP_NODE
, &address_family_vpnv6_cmd
);
3416 install_element (BGP_NODE
, &address_family_vpnv6_unicast_cmd
);
3417 install_element (BGP_NODE
, &address_family_encap_cmd
);
3418 install_element (BGP_NODE
, &address_family_encapv6_cmd
);
3419 #if defined(ENABLE_BGP_VNC)
3420 install_element (BGP_NODE
, &vnc_defaults_cmd
);
3421 install_element (BGP_NODE
, &vnc_nve_group_cmd
);
3423 install_element (BGP_NODE
, &address_family_ipv4_unicast_cmd
);
3424 install_element (BGP_NODE
, &address_family_ipv4_multicast_cmd
);
3425 install_element (BGP_NODE
, &address_family_ipv4_encap_cmd
);
3426 install_element (BGP_NODE
, &address_family_ipv4_vpn_cmd
);
3427 install_element (BGP_NODE
, &address_family_ipv6_cmd
);
3428 install_element (BGP_NODE
, &address_family_ipv6_unicast_cmd
);
3429 install_element (BGP_NODE
, &address_family_ipv6_multicast_cmd
);
3430 install_element (BGP_NODE
, &address_family_ipv6_encap_cmd
);
3431 install_element (BGP_NODE
, &address_family_ipv6_vpn_cmd
);
3432 install_element (BGP_VPNV4_NODE
, &exit_address_family_cmd
);
3433 install_element (BGP_VPNV6_NODE
, &exit_address_family_cmd
);
3434 install_element (BGP_ENCAP_NODE
, &exit_address_family_cmd
);
3435 install_element (BGP_ENCAPV6_NODE
, &exit_address_family_cmd
);
3436 install_element (BGP_IPV4_NODE
, &exit_address_family_cmd
);
3437 install_element (BGP_IPV4M_NODE
, &exit_address_family_cmd
);
3438 install_element (BGP_IPV6_NODE
, &exit_address_family_cmd
);
3439 install_element (BGP_IPV6M_NODE
, &exit_address_family_cmd
);
3441 install_element (BGP_VNC_DEFAULTS_NODE
, &exit_vnc_config_cmd
);
3442 install_element (BGP_VNC_NVE_GROUP_NODE
, &exit_vnc_config_cmd
);
3443 install_element (BGP_VNC_L2_GROUP_NODE
, &exit_vnc_config_cmd
);
3445 install_element (CONFIG_NODE
, &key_chain_cmd
);
3446 install_element (CONFIG_NODE
, &vtysh_route_map_cmd
);
3447 install_element (CONFIG_NODE
, &vtysh_line_vty_cmd
);
3448 install_element (KEYCHAIN_NODE
, &key_cmd
);
3449 install_element (KEYCHAIN_NODE
, &key_chain_cmd
);
3450 install_element (KEYCHAIN_KEY_NODE
, &key_chain_cmd
);
3451 install_element (CONFIG_NODE
, &vtysh_interface_cmd
);
3452 install_element (CONFIG_NODE
, &vtysh_no_interface_cmd
);
3453 install_element (CONFIG_NODE
, &vtysh_interface_vrf_cmd
);
3454 install_element (CONFIG_NODE
, &vtysh_no_interface_vrf_cmd
);
3455 install_element (INTERFACE_NODE
, &vtysh_link_params_cmd
);
3456 install_element (ENABLE_NODE
, &vtysh_show_running_config_cmd
);
3457 install_element (ENABLE_NODE
, &vtysh_show_running_config_daemon_cmd
);
3458 install_element (ENABLE_NODE
, &vtysh_copy_runningconfig_startupconfig_cmd
);
3459 install_element (ENABLE_NODE
, &vtysh_write_file_cmd
);
3460 install_element (ENABLE_NODE
, &vtysh_write_cmd
);
3462 install_element (CONFIG_NODE
, &vtysh_vrf_cmd
);
3463 install_element (CONFIG_NODE
, &vtysh_no_vrf_cmd
);
3465 /* "write terminal" command. */
3466 install_element (ENABLE_NODE
, &vtysh_write_terminal_cmd
);
3467 install_element (ENABLE_NODE
, &vtysh_write_terminal_daemon_cmd
);
3469 install_element (CONFIG_NODE
, &vtysh_integrated_config_cmd
);
3470 install_element (CONFIG_NODE
, &no_vtysh_integrated_config_cmd
);
3472 /* "write memory" command. */
3473 install_element (ENABLE_NODE
, &vtysh_write_memory_cmd
);
3475 install_element (VIEW_NODE
, &vtysh_terminal_length_cmd
);
3476 install_element (VIEW_NODE
, &vtysh_terminal_no_length_cmd
);
3477 install_element (VIEW_NODE
, &vtysh_show_daemons_cmd
);
3479 install_element (VIEW_NODE
, &vtysh_ping_cmd
);
3480 install_element (VIEW_NODE
, &vtysh_ping_ip_cmd
);
3481 install_element (VIEW_NODE
, &vtysh_traceroute_cmd
);
3482 install_element (VIEW_NODE
, &vtysh_traceroute_ip_cmd
);
3483 install_element (VIEW_NODE
, &vtysh_ping6_cmd
);
3484 install_element (VIEW_NODE
, &vtysh_traceroute6_cmd
);
3485 #if defined(HAVE_SHELL_ACCESS)
3486 install_element (VIEW_NODE
, &vtysh_telnet_cmd
);
3487 install_element (VIEW_NODE
, &vtysh_telnet_port_cmd
);
3488 install_element (VIEW_NODE
, &vtysh_ssh_cmd
);
3490 #if defined(HAVE_SHELL_ACCESS)
3491 install_element (ENABLE_NODE
, &vtysh_start_shell_cmd
);
3492 install_element (ENABLE_NODE
, &vtysh_start_bash_cmd
);
3493 install_element (ENABLE_NODE
, &vtysh_start_zsh_cmd
);
3496 install_element (VIEW_NODE
, &vtysh_show_memory_cmd
);
3498 install_element (VIEW_NODE
, &vtysh_show_work_queues_cmd
);
3499 install_element (VIEW_NODE
, &vtysh_show_work_queues_daemon_cmd
);
3501 install_element (VIEW_NODE
, &vtysh_show_thread_cmd
);
3504 install_element (VIEW_NODE
, &vtysh_show_logging_cmd
);
3505 install_element (CONFIG_NODE
, &vtysh_log_stdout_cmd
);
3506 install_element (CONFIG_NODE
, &vtysh_log_stdout_level_cmd
);
3507 install_element (CONFIG_NODE
, &no_vtysh_log_stdout_cmd
);
3508 install_element (CONFIG_NODE
, &vtysh_log_file_cmd
);
3509 install_element (CONFIG_NODE
, &vtysh_log_file_level_cmd
);
3510 install_element (CONFIG_NODE
, &no_vtysh_log_file_cmd
);
3511 install_element (CONFIG_NODE
, &no_vtysh_log_file_level_cmd
);
3512 install_element (CONFIG_NODE
, &vtysh_log_monitor_cmd
);
3513 install_element (CONFIG_NODE
, &vtysh_log_monitor_level_cmd
);
3514 install_element (CONFIG_NODE
, &no_vtysh_log_monitor_cmd
);
3515 install_element (CONFIG_NODE
, &vtysh_log_syslog_cmd
);
3516 install_element (CONFIG_NODE
, &vtysh_log_syslog_level_cmd
);
3517 install_element (CONFIG_NODE
, &no_vtysh_log_syslog_cmd
);
3518 install_element (CONFIG_NODE
, &vtysh_log_trap_cmd
);
3519 install_element (CONFIG_NODE
, &no_vtysh_log_trap_cmd
);
3520 install_element (CONFIG_NODE
, &vtysh_log_facility_cmd
);
3521 install_element (CONFIG_NODE
, &no_vtysh_log_facility_cmd
);
3522 install_element (CONFIG_NODE
, &vtysh_log_record_priority_cmd
);
3523 install_element (CONFIG_NODE
, &no_vtysh_log_record_priority_cmd
);
3524 install_element (CONFIG_NODE
, &vtysh_log_timestamp_precision_cmd
);
3525 install_element (CONFIG_NODE
, &no_vtysh_log_timestamp_precision_cmd
);
3527 install_element (CONFIG_NODE
, &vtysh_service_password_encrypt_cmd
);
3528 install_element (CONFIG_NODE
, &no_vtysh_service_password_encrypt_cmd
);
3530 install_element (CONFIG_NODE
, &vtysh_password_cmd
);
3531 install_element (CONFIG_NODE
, &vtysh_password_text_cmd
);
3532 install_element (CONFIG_NODE
, &vtysh_enable_password_cmd
);
3533 install_element (CONFIG_NODE
, &vtysh_enable_password_text_cmd
);
3534 install_element (CONFIG_NODE
, &no_vtysh_enable_password_cmd
);