]> git.proxmox.com Git - mirror_frr.git/blame - lib/command.h
*: move CLI parent data to cmd_node->parent_node
[mirror_frr.git] / lib / command.h
CommitLineData
718e3744 1/*
2 * Zebra configuration command interface routine
3 * Copyright (C) 1997, 98 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation; either version 2, or (at your
10 * option) any later version.
d0bfb22c 11 *
718e3744 12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
896014f4
DL
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
718e3744 20 */
21
22#ifndef _ZEBRA_COMMAND_H
23#define _ZEBRA_COMMAND_H
24
25#include "vector.h"
26#include "vty.h"
9c42a6eb 27#include "lib/route_types.h"
d0bfb22c 28#include "graph.h"
4a1ab8e4 29#include "memory.h"
274f29b2 30#include "hash.h"
5894e76d 31#include "command_graph.h"
4a1ab8e4 32
5e244469
RW
33#ifdef __cplusplus
34extern "C" {
35#endif
36
70d44c5c 37DECLARE_MTYPE(COMPLETION)
4a1ab8e4 38
63e653a2
LK
39/*
40 * From RFC 1123 (Requirements for Internet Hosts), Section 2.1 on hostnames:
41 * One aspect of host name syntax is hereby changed: the restriction on
42 * the first character is relaxed to allow either a letter or a digit.
43 * Host software MUST support this more liberal syntax.
44 *
45 * Host software MUST handle host names of up to 63 characters and
46 * SHOULD handle host names of up to 255 characters.
47 */
48#define HOSTNAME_LEN 255
49
718e3744 50/* Host configuration variable */
d62a17ae 51struct host {
52 /* Host name of this router. */
53 char *name;
718e3744 54
6f9d219a 55 /* Domainname of this router */
419cd5a0
MK
56 char *domainname;
57
d62a17ae 58 /* Password for vty interface. */
59 char *password;
60 char *password_encrypt;
718e3744 61
d62a17ae 62 /* Enable password */
63 char *enable;
64 char *enable_encrypt;
718e3744 65
d62a17ae 66 /* System wide terminal lines. */
67 int lines;
718e3744 68
d62a17ae 69 /* Log filename. */
70 char *logfile;
718e3744 71
d62a17ae 72 /* config file name of this host */
73 char *config;
74 int noconfig;
718e3744 75
d62a17ae 76 /* Flags for services */
77 int advanced;
78 int encrypt;
718e3744 79
d62a17ae 80 /* Banner configuration. */
19d61463 81 char *motd;
d62a17ae 82 char *motdfile;
718e3744 83};
84
cf6c83e7 85/* List of CLI nodes. Please remember to update the name array in command.c. */
d62a17ae 86enum node_type {
9f36abf9
PZ
87 AUTH_NODE, /* Authentication mode of vty interface. */
88 VIEW_NODE, /* View node. Default mode of vty interface. */
89 AUTH_ENABLE_NODE, /* Authentication mode for change enable. */
90 ENABLE_NODE, /* Enable node. */
91 CONFIG_NODE, /* Config node. Default mode of config file. */
9f36abf9
PZ
92 DEBUG_NODE, /* Debug node. */
93 VRF_DEBUG_NODE, /* Vrf Debug node. */
1c2facd1 94 NORTHBOUND_DEBUG_NODE, /* Northbound Debug node. */
9f36abf9 95 DEBUG_VNC_NODE, /* Debug VNC node. */
e3ab8170 96 RMAP_DEBUG_NODE, /* Route-map debug node */
fe9e7b71 97 RESOLVER_DEBUG_NODE, /* Resolver debug node */
9f36abf9
PZ
98 AAA_NODE, /* AAA node. */
99 KEYCHAIN_NODE, /* Key-chain node. */
100 KEYCHAIN_KEY_NODE, /* Key-chain key node. */
9f46cc36 101 IP_NODE, /* Static ip route node. */
9f36abf9
PZ
102 VRF_NODE, /* VRF mode node. */
103 INTERFACE_NODE, /* Interface mode node. */
104 NH_GROUP_NODE, /* Nexthop-Group mode node. */
105 ZEBRA_NODE, /* zebra connection node. */
106 TABLE_NODE, /* rtm_table selection node. */
107 RIP_NODE, /* RIP protocol mode node. */
108 RIPNG_NODE, /* RIPng protocol mode node. */
109 BABEL_NODE, /* BABEL protocol mode node. */
110 EIGRP_NODE, /* EIGRP protocol mode node. */
111 BGP_NODE, /* BGP protocol mode which includes BGP4+ */
112 BGP_VPNV4_NODE, /* BGP MPLS-VPN PE exchange. */
113 BGP_VPNV6_NODE, /* BGP MPLS-VPN PE exchange. */
114 BGP_IPV4_NODE, /* BGP IPv4 unicast address family. */
115 BGP_IPV4M_NODE, /* BGP IPv4 multicast address family. */
116 BGP_IPV4L_NODE, /* BGP IPv4 labeled unicast address family. */
117 BGP_IPV6_NODE, /* BGP IPv6 address family */
118 BGP_IPV6M_NODE, /* BGP IPv6 multicast address family. */
119 BGP_IPV6L_NODE, /* BGP IPv6 labeled unicast address family. */
120 BGP_VRF_POLICY_NODE, /* BGP VRF policy */
121 BGP_VNC_DEFAULTS_NODE, /* BGP VNC nve defaults */
122 BGP_VNC_NVE_GROUP_NODE, /* BGP VNC nve group */
123 BGP_VNC_L2_GROUP_NODE, /* BGP VNC L2 group */
124 RFP_DEFAULTS_NODE, /* RFP defaults node */
125 BGP_EVPN_NODE, /* BGP EVPN node. */
9f36abf9
PZ
126 OSPF_NODE, /* OSPF protocol mode */
127 OSPF6_NODE, /* OSPF protocol for IPv6 mode */
128 LDP_NODE, /* LDP protocol mode */
129 LDP_IPV4_NODE, /* LDP IPv4 address family */
130 LDP_IPV6_NODE, /* LDP IPv6 address family */
131 LDP_IPV4_IFACE_NODE, /* LDP IPv4 Interface */
132 LDP_IPV6_IFACE_NODE, /* LDP IPv6 Interface */
133 LDP_L2VPN_NODE, /* LDP L2VPN node */
134 LDP_PSEUDOWIRE_NODE, /* LDP Pseudowire node */
135 ISIS_NODE, /* ISIS protocol mode */
9f36abf9
PZ
136 ACCESS_NODE, /* Access list node. */
137 PREFIX_NODE, /* Prefix list node. */
138 ACCESS_IPV6_NODE, /* Access list node. */
139 ACCESS_MAC_NODE, /* MAC access list node*/
140 PREFIX_IPV6_NODE, /* Prefix list node. */
141 AS_LIST_NODE, /* AS list node. */
142 COMMUNITY_LIST_NODE, /* Community list node. */
143 RMAP_NODE, /* Route map node. */
e5c83d9b 144 PBRMAP_NODE, /* PBR map node. */
9f36abf9
PZ
145 SMUX_NODE, /* SNMP configuration node. */
146 DUMP_NODE, /* Packet dump node. */
147 FORWARDING_NODE, /* IP forwarding node. */
148 PROTOCOL_NODE, /* protocol filtering node */
149 MPLS_NODE, /* MPLS config node */
150 PW_NODE, /* Pseudowire config node */
151 VTY_NODE, /* Vty node. */
152 LINK_PARAMS_NODE, /* Link-parameters node */
153 BGP_EVPN_VNI_NODE, /* BGP EVPN VNI */
996c9314
LB
154 RPKI_NODE, /* RPKI node for configuration of RPKI cache server
155 connections.*/
7c40bf39 156 BGP_FLOWSPECV4_NODE, /* BGP IPv4 FLOWSPEC Address-Family */
157 BGP_FLOWSPECV6_NODE, /* BGP IPv6 FLOWSPEC Address-Family */
c2f29cf3
RZ
158 BFD_NODE, /* BFD protocol mode. */
159 BFD_PEER_NODE, /* BFD peer configuration mode. */
7c0cbd0e 160 OPENFABRIC_NODE, /* OpenFabric router configuration node */
f828842a 161 VRRP_NODE, /* VRRP node */
ed18356f 162 BMP_NODE, /* BMP config under router bgp */
996c9314 163 NODE_TYPE_MAX, /* maximum */
718e3744 164};
165
cf6c83e7 166extern vector cmdvec;
26fbe472 167extern const struct message tokennames[];
154e9ca1 168extern const char *const node_names[];
a83a5331 169
718e3744 170/* Node which has some commands and prompt string and configuration
171 function pointer . */
d62a17ae 172struct cmd_node {
173 /* Node index. */
174 enum node_type node;
24389580 175 enum node_type parent_node;
718e3744 176
d62a17ae 177 /* Prompt character at vty interface. */
178 const char *prompt;
718e3744 179
d62a17ae 180 /* Node's configuration write function */
612c2c15 181 int (*config_write)(struct vty *);
718e3744 182
d62a17ae 183 /* Node's command graph */
184 struct graph *cmdgraph;
d0bfb22c 185
d62a17ae 186 /* Vector of this node's command list. */
187 vector cmd_vector;
274f29b2 188
d62a17ae 189 /* Hashed index of command node list, for de-dupping primarily */
190 struct hash *cmd_hash;
718e3744 191};
192
718e3744 193/* Return value of the commands. */
194#define CMD_SUCCESS 0
195#define CMD_WARNING 1
196#define CMD_ERR_NO_MATCH 2
197#define CMD_ERR_AMBIGUOUS 3
198#define CMD_ERR_INCOMPLETE 4
199#define CMD_ERR_EXEED_ARGC_MAX 5
200#define CMD_ERR_NOTHING_TODO 6
201#define CMD_COMPLETE_FULL_MATCH 7
202#define CMD_COMPLETE_MATCH 8
203#define CMD_COMPLETE_LIST_MATCH 9
204#define CMD_SUCCESS_DAEMON 10
1db63918 205#define CMD_ERR_NO_FILE 11
95c4aff2 206#define CMD_SUSPEND 12
f1a05de9 207#define CMD_WARNING_CONFIG_FAILED 13
a3d826f0 208#define CMD_NOT_MY_INSTANCE 14
718e3744 209
210/* Argc max counts. */
09f6d019 211#define CMD_ARGC_MAX 256
718e3744 212
213/* Turn off these macros when uisng cpp with extract.pl */
d0bfb22c 214#ifndef VTYSH_EXTRACT_PL
718e3744 215
406d6716 216/* helper defines for end-user DEFUN* macros */
d62a17ae 217#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
154e9ca1 218 static const struct cmd_element cmdname = { \
d62a17ae 219 .string = cmdstr, \
220 .func = funcname, \
221 .doc = helpstr, \
222 .attr = attrs, \
223 .daemon = dnum, \
224 .name = #cmdname, \
225 };
226
227#define DEFUN_CMD_FUNC_DECL(funcname) \
228 static int funcname(const struct cmd_element *, struct vty *, int, \
229 struct cmd_token *[]);
230
231#define DEFUN_CMD_FUNC_TEXT(funcname) \
232 static int funcname(const struct cmd_element *self \
233 __attribute__((unused)), \
234 struct vty *vty __attribute__((unused)), \
235 int argc __attribute__((unused)), \
236 struct cmd_token *argv[] __attribute__((unused)))
237
238#define DEFPY(funcname, cmdname, cmdstr, helpstr) \
239 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
240 funcdecl_##funcname
241
26d19c83
RW
242#define DEFPY_NOSH(funcname, cmdname, cmdstr, helpstr) \
243 DEFPY(funcname, cmdname, cmdstr, helpstr)
244
e31f4dbe
QY
245#define DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
246 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
247 funcdecl_##funcname
248
249#define DEFPY_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
250 DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
251
d62a17ae 252#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
253 DEFUN_CMD_FUNC_DECL(funcname) \
254 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
255 DEFUN_CMD_FUNC_TEXT(funcname)
256
257#define DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
258 DEFUN_CMD_FUNC_DECL(funcname) \
259 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
260 DEFUN_CMD_FUNC_TEXT(funcname)
261
262#define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
263 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
264
718e3744 265/* DEFUN_NOSH for commands that vtysh should ignore */
d62a17ae 266#define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \
267 DEFUN(funcname, cmdname, cmdstr, helpstr)
718e3744 268
269/* DEFSH for vtysh. */
d62a17ae 270#define DEFSH(daemon, cmdname, cmdstr, helpstr) \
271 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon)
718e3744 272
d62a17ae 273#define DEFSH_HIDDEN(daemon, cmdname, cmdstr, helpstr) \
274 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
275 daemon)
abaaab4e 276
718e3744 277/* DEFUN + DEFSH */
d62a17ae 278#define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
279 DEFUN_CMD_FUNC_DECL(funcname) \
280 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
281 DEFUN_CMD_FUNC_TEXT(funcname)
718e3744 282
274a4a44 283/* DEFUN + DEFSH with attributes */
d62a17ae 284#define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
285 DEFUN_CMD_FUNC_DECL(funcname) \
286 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
287 DEFUN_CMD_FUNC_TEXT(funcname)
274a4a44 288
d62a17ae 289#define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
290 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
291 CMD_ATTR_HIDDEN)
274a4a44 292
d62a17ae 293#define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
294 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
295 CMD_ATTR_DEPRECATED)
274a4a44 296
718e3744 297/* ALIAS macro which define existing command's alias. */
d62a17ae 298#define ALIAS(funcname, cmdname, cmdstr, helpstr) \
299 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
406d6716 300
d62a17ae 301#define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
302 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
406d6716 303
d62a17ae 304#define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
305 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
306 0)
406d6716 307
d62a17ae 308#define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
309 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
310 CMD_ATTR_DEPRECATED, 0)
718e3744 311
d62a17ae 312#define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
313 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
274a4a44 314
d62a17ae 315#define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
316 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
317 daemon)
274a4a44 318
d62a17ae 319#define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
320 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
321 CMD_ATTR_DEPRECATED, daemon)
274a4a44 322
5578a14d 323#else /* VTYSH_EXTRACT_PL */
d62a17ae 324#define DEFPY(funcname, cmdname, cmdstr, helpstr) \
325 DEFUN(funcname, cmdname, cmdstr, helpstr)
e31f4dbe 326
26d19c83
RW
327#define DEFPY_NOSH(funcname, cmdname, cmdstr, helpstr) \
328 DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr)
329
e31f4dbe
QY
330#define DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
331 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr)
7f9adc7c
DS
332
333#define DEFPY_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
334 DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr)
718e3744 335#endif /* VTYSH_EXTRACT_PL */
336
337/* Some macroes */
ba6d273b
DS
338
339/*
340 * Sometimes #defines create maximum values that
341 * need to have strings created from them that
342 * allow the parser to match against them.
343 * These macros allow that.
344 */
345#define CMD_CREATE_STR(s) CMD_CREATE_STR_HELPER(s)
346#define CMD_CREATE_STR_HELPER(s) #s
6319fd63 347#define CMD_RANGE_STR(a,s) "(" CMD_CREATE_STR(a) "-" CMD_CREATE_STR(s) ")"
ba6d273b 348
718e3744 349/* Common descriptions. */
350#define SHOW_STR "Show running system information\n"
351#define IP_STR "IP information\n"
352#define IPV6_STR "IPv6 information\n"
353#define NO_STR "Negate a command or set its defaults\n"
9c42a6eb 354#define REDIST_STR "Redistribute information from another routing protocol\n"
718e3744 355#define CLEAR_STR "Reset functions\n"
356#define RIP_STR "RIP information\n"
7f57883e 357#define EIGRP_STR "EIGRP information\n"
718e3744 358#define BGP_STR "BGP information\n"
e0bce756
DS
359#define BGP_SOFT_STR "Soft reconfig inbound and outbound updates\n"
360#define BGP_SOFT_IN_STR "Send route-refresh unless using 'soft-reconfiguration inbound'\n"
361#define BGP_SOFT_OUT_STR "Resend all outbound updates\n"
362#define BGP_SOFT_RSCLIENT_RIB_STR "Soft reconfig for rsclient RIB\n"
718e3744 363#define OSPF_STR "OSPF information\n"
364#define NEIGHBOR_STR "Specify neighbor router\n"
ef7eec74 365#define DEBUG_STR "Debugging functions\n"
718e3744 366#define UNDEBUG_STR "Disable debugging functions (see also 'debug')\n"
367#define ROUTER_STR "Enable a routing process\n"
368#define AS_STR "AS number\n"
377e3565 369#define MAC_STR "MAC address\n"
718e3744 370#define MBGP_STR "MBGP information\n"
371#define MATCH_STR "Match values from routing table\n"
372#define SET_STR "Set values in destination routing protocol\n"
373#define OUT_STR "Filter outgoing routing updates\n"
374#define IN_STR "Filter incoming routing updates\n"
375#define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)\n"
376#define OSPF6_NUMBER_STR "Specify by number\n"
0437e105 377#define INTERFACE_STR "Interface information\n"
718e3744 378#define IFNAME_STR "Interface name(e.g. ep0)\n"
379#define IP6_STR "IPv6 Information\n"
380#define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6\n"
d0bfb22c 381#define OSPF6_INSTANCE_STR "(1-65535) Instance ID\n"
98cfd06b 382#define SECONDS_STR "Seconds\n"
718e3744 383#define ROUTE_STR "Routing Table\n"
384#define PREFIX_LIST_STR "Build a prefix list\n"
d62a17ae 385#define OSPF6_DUMP_TYPE_LIST \
386 "<neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr>"
9e867fe6 387#define AREA_TAG_STR "[area tag]\n"
d0bfb22c
QY
388#define COMMUNITY_AANN_STR "Community number where AA and NN are (0-65535)\n"
389#define COMMUNITY_VAL_STR "Community number in AA:NN format (where AA and NN are (0-65535)) or local-AS|no-advertise|no-export|internet or additive\n"
16f1b9ee
OD
390#define MPLS_TE_STR "MPLS-TE specific commands\n"
391#define LINK_PARAMS_STR "Configure interface link parameters\n"
392#define OSPF_RI_STR "OSPF Router Information specific commands\n"
393#define PCE_STR "PCE Router Information specific commands\n"
7758e3f3 394#define MPLS_STR "MPLS information\n"
cf9b9f77 395#define SR_STR "Segment-Routing specific commands\n"
dff13b6f 396#define WATCHFRR_STR "watchfrr information\n"
41e7fb80 397#define ZEBRA_STR "Zebra information\n"
f73126c3 398#define FILTER_LOG_STR "Filter Logs\n"
718e3744 399
093e3f23 400#define CMD_VNI_RANGE "(1-16777215)"
718e3744 401#define CONF_BACKUP_EXT ".sav"
402
4911ca9c
PM
403/* Command warnings. */
404#define NO_PASSWD_CMD_WARNING \
405 "Please be aware that removing the password is a security risk and you should think twice about this command.\n"
406
718e3744 407/* IPv4 only machine should not accept IPv6 address for peer's IP
408 address. So we replace VTY command string like below. */
718e3744 409#define NEIGHBOR_ADDR_STR "Neighbor address\nIPv6 address\n"
a80beece
DS
410#define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor IPv6 address\nInterface name or neighbor tag\n"
411#define NEIGHBOR_ADDR_STR3 "Neighbor address\nIPv6 address\nInterface name\n"
718e3744 412
898d21a4 413/* Daemons lists */
db9a7cf7 414#define DAEMONS_STR \
984fd961 415 "For the zebra daemon\nFor the rip daemon\nFor the ripng daemon\nFor the ospf daemon\nFor the ospfv6 daemon\nFor the bgp daemon\nFor the isis daemon\nFor the pbr daemon\nFor the fabricd daemon\nFor the pim daemon\nFor the static daemon\nFor the sharpd daemon\nFor the vrrpd daemon\nFor the ldpd daemon\n"
db9a7cf7 416#define DAEMONS_LIST \
984fd961 417 "<zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|pbrd|fabricd|pimd|staticd|sharpd|vrrpd|ldpd>"
db9a7cf7 418
b0965c44 419/* Graceful Restart cli help strings */
b0965c44 420#define GR_CMD "Global Graceful Restart command\n"
421#define NO_GR_CMD "Undo Global Graceful Restart command\n"
422#define GR "Global Graceful Restart - GR Mode\n"
423#define GR_DISABLE "Global Graceful Restart - Disable Mode\n"
424#define NO_GR_DISABLE "Undo Global Graceful Restart - Disable Mode\n"
425#define GR_DEBUG "Graceful Restart - Enable Debug Logs\n"
426#define GR_SHOW "Graceful Restart - Show command for Global and all neighbor mode\n"
427#define GR_NEIGHBOR_CMD "Graceful Restart command for a neighbor\n"
428#define NO_GR_NEIGHBOR_CMD "Undo Graceful Restart command for a neighbor\n"
429#define GR_NEIGHBOR_DISABLE_CMD "Graceful Restart Disable command for a neighbor\n"
430#define NO_GR_NEIGHBOR_DISABLE_CMD "Undo Graceful Restart Disable command for a neighbor\n"
431#define GR_NEIGHBOR_HELPER_CMD "Graceful Restart Helper command for a neighbor\n"
432#define NO_GR_NEIGHBOR_HELPER_CMD "Undo Graceful Restart Helper command for a neighbor\n"
433
718e3744 434/* Prototypes. */
612c2c15 435extern void install_node(struct cmd_node *node);
d62a17ae 436extern void install_default(enum node_type);
154e9ca1 437extern void install_element(enum node_type, const struct cmd_element *);
718e3744 438
de8f7a39
DL
439/* known issue with uninstall_element: changes to cmd_token->attr (i.e.
440 * deprecated/hidden) are not reversed. */
154e9ca1 441extern void uninstall_element(enum node_type, const struct cmd_element *);
de8f7a39 442
f6834d4c 443/* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
444 string with a space between each element (allocated using
445 XMALLOC(MTYPE_TMP)). Returns NULL if shift >= argc. */
d62a17ae 446extern char *argv_concat(struct cmd_token **argv, int argc, int shift);
b286ddb0
DS
447
448/*
449 * It is preferred that you set the index initial value
450 * to a 0. This way in the future if you modify the
451 * cli then there is no need to modify the initial
452 * value of the index
453 */
d62a17ae 454extern int argv_find(struct cmd_token **argv, int argc, const char *text,
455 int *index);
456
457extern vector cmd_make_strvec(const char *);
458extern void cmd_free_strvec(vector);
459extern vector cmd_describe_command(vector, struct vty *, int *status);
460extern char **cmd_complete_command(vector, struct vty *, int *status);
461extern const char *cmd_prompt(enum node_type);
462extern int command_config_read_one_line(struct vty *vty,
463 const struct cmd_element **,
7ab57d19 464 uint32_t line_num, int use_config_node);
d62a17ae 465extern int config_from_file(struct vty *, FILE *, unsigned int *line_num);
466extern enum node_type node_parent(enum node_type);
01e24c4a
QY
467/*
468 * Execute command under the given vty context.
469 *
470 * vty
471 * The vty context to execute under.
472 *
473 * cmd
474 * The command string to execute.
475 *
476 * matched
477 * If non-null and a match was found, the address of the matched command is
478 * stored here. No action otherwise.
479 *
480 * vtysh
481 * Whether or not this is being called from vtysh. If this is nonzero,
482 * XXX: then what?
483 *
484 * Returns:
485 * XXX: what does it return
486 */
487extern int cmd_execute(struct vty *vty, const char *cmd,
488 const struct cmd_element **matched, int vtysh);
d62a17ae 489extern int cmd_execute_command(vector, struct vty *,
490 const struct cmd_element **, int);
491extern int cmd_execute_command_strict(vector, struct vty *,
492 const struct cmd_element **);
493extern void cmd_init(int);
494extern void cmd_terminate(void);
495extern void cmd_exit(struct vty *vty);
496extern int cmd_list_cmds(struct vty *vty, int do_permute);
497
6b3ee3a0 498extern int cmd_domainname_set(const char *domainname);
d62a17ae 499extern int cmd_hostname_set(const char *hostname);
6b3ee3a0
MK
500extern const char *cmd_hostname_get(void);
501extern const char *cmd_domainname_get(void);
bff9c3e9 502
af2567b6 503/* NOT safe for general use; call this only if DEV_BUILD! */
d62a17ae 504extern void grammar_sandbox_init(void);
af2567b6 505
d62a17ae 506extern vector completions_to_vec(struct list *completions);
2ab40270 507
718e3744 508/* Export typical functions. */
d62a17ae 509extern const char *host_config_get(void);
510extern void host_config_set(const char *);
6590f2c3 511
d62a17ae 512extern void print_version(const char *);
86228fde 513
d62a17ae 514extern int cmd_banner_motd_file(const char *);
19d61463 515extern void cmd_banner_motd_line(const char *line);
7cfc61d3 516
86228fde 517/* struct host global, ick */
d0bfb22c
QY
518extern struct host host;
519
70d44c5c 520struct cmd_variable_handler {
d62a17ae 521 const char *tokenname, *varname;
522 void (*completions)(vector out, struct cmd_token *token);
70d44c5c
DL
523};
524
d62a17ae 525extern void cmd_variable_complete(struct cmd_token *token, const char *arg,
526 vector comps);
527extern void
528cmd_variable_handler_register(const struct cmd_variable_handler *cvh);
529extern char *cmd_variable_comp2str(vector comps, unsigned short cols);
228da428 530
e9b4e74a 531extern void command_setup_early_logging(const char *dest, const char *level);
5e244469
RW
532
533#ifdef __cplusplus
534}
535#endif
536
718e3744 537#endif /* _ZEBRA_COMMAND_H */