]> git.proxmox.com Git - mirror_frr.git/blame - doc/cli.md
lib: add CLI token for 48-bit mac addresses
[mirror_frr.git] / doc / cli.md
CommitLineData
9b9cdb46
QY
1FRR Command Line Interface
2==========================
3
4Definition Grammar
5------------------
6
7This is a reference for the syntax used when defining new CLI commands. An
8example definition is:
9
4e3e06d6 10```
9b9cdb46
QY
11DEFUN (command_name,
12 command_name_cmd,
13--> "example <command|line [interface]> DEFINITION...",
14 <..doc strings..>)
4e3e06d6 15```
9b9cdb46
QY
16
17The arrowed part is the definition string.
18
19Explicit syntax rules in Flex and Bison may be found in lib/command_lex.l and
20lib/command_parse.y, respectively. If you can read BNF and regex those will be
21more useful than this document.
22
23If the parser is throwing syntax or other errors and you can't figure out why,
24it's unlikely to be a bug in the parser. If the error message is not useful,
25please file a bug for a better error message. If all else fails, read the token
26definitions in the lexer source and the Bison BNF in the parser source.
27
28Characters allowed in each token type:
29
30Tokens
31------
4e3e06d6 32* `WORD` -- A token that begins with +, -, or a lowercase letter. It is
9779e3f1
QY
33 an unchanging part of the command and will only match itself.
34 Example: "show ip bgp", every token is a WORD.
4e3e06d6
DL
35* `IPV4` -- 'A.B.C.D', matches an IPv4 address.
36* `IPV6` -- 'X:X::X:X', matches an IPv6 address.
37* `IPV4_PREFIX` -- 'A.B.C.D/M', matches an IPv4 prefix in CIDR notation.
38* `IPV6_PREFIX` -- 'X:X::X:X/M', matches an IPv6 prefix in CIDR notation.
9779e3f1
QY
39* `MAC` -- 'M:A:C', matches a 48-bit mac address
40* `MAC_PREFIX` -- 'M:A:C/M', matches a 48-bit mac address with a mask
4e3e06d6
DL
41* `VARIABLE` -- Begins with a capital letter. Matches any input.
42* `RANGE` -- Numeric range delimited by parentheses, e.g. (-100 - 100) or
9779e3f1 43 (10-20). Will only match numbers in the range.
9b9cdb46
QY
44
45Rules
46-----
4e3e06d6 47* `<angle|brackets>` -- Contain sequences of tokens separated by pipes and
9b9cdb46 48 provide mutual exclusion. Sequences may contain
4e3e06d6
DL
49 `<mutual|exclusion>` but not as the first token.
50 Disallowed: `"example <<a|b> c|d>"`
51 Allowed: `"example <a c|b c|d>"`
52* `[square brackets]` -- Contains sequences of tokens that are optional (can be
53 omitted). `[<a|b>]` can be shortened to `[a|b]`.
54* `{curly|braces}` -- similar to angle brackets, but instead of mutual
9b9cdb46
QY
55 exclusion, curly braces indicate that one or more of the
56 pipe-separated sequences may be provided in any order.
4e3e06d6 57* `VARIADICS...` -- Any token which accepts input (so anything except WORD)
9b9cdb46
QY
58 and that occurs as the last token of a line may be
59 followed by an ellipsis, which indicates that input
60 matching the token may be repeated an unlimited number
61 of times.
4e3e06d6
DL
62* `$name` -- Specify a variable name for the preceding token. See
63 "Variable Names" below.
9b9cdb46
QY
64
65Some general notes:
66
67* Options are allowed at the beginning of the command. The developer is
68 entreated to use these extremely sparingly. They are most useful for
69 implementing the 'no' form of configuration commands. Please think carefully
70 before using them for anything else. There is usually a better solution, even
71 if it is just separating out the command definition into separate ones.
72
73* The developer should judiciously apply separation of concerns when defining
74 CLI. CLI definitions for two unrelated or vaguely related commands or
75 configuration items should be defined in separate commands. Clarity is
76 preferred over LOC (within reason).
77
4e3e06d6
DL
78Variable Names
79--------------
80The parser tries to fill the "varname" field on each token. This can happen
81either manually or automatically. Manual specifications work by appending
82`"$name"` after the input specifier:
83
84```
85foo bar$cmd WORD$name A.B.C.D$ip
86```
87
88Note that you can also assign variable names to fixed input tokens, this can
89be useful if multiple commands share code. You can also use "$name" after a
90multiple-choice option:
91
92```
93foo bar <A.B.C.D|X:X::X:X>$addr [optionA|optionB]$mode
94```
95
96The variable name is in this case assigned to the last token in each of the
97branches.
98
99Automatic assignment of variable names works by applying the following rules:
100
101- manual names always have priority
102- a "[no]" at the beginning receives "no" as varname on the "no" token
32a71fd8 103- VARIABLE tokens whose text is not "WORD" or "NAME" receive a cleaned lowercase
4e3e06d6
DL
104 version of the token text as varname, e.g. "ROUTE-MAP" becomes "route_map".
105- other variable tokens (i.e. everything except "fixed") receive the text of
106 the preceding fixed token as varname, if one can be found. E.g.:
107 "ip route A.B.C.D/M INTERFACE" assigns "route" to the "A.B.C.D/M" token.
108
109These rules should make it possible to avoid manual varname assignment in 90%
110of the cases.
111
ae56903c
DL
112DEFPY
113-----
114
115`DEFPY(...)` is an enhanced version of `DEFUN()` which is preprocessed by
116` python/clidef.py`. The python script parses the command definition string,
117extracts variable names and types, and generates a C wrapper function that
118parses the variables and passes them on. This means that in the CLI function
119body, you will receive additional parameters with appropriate types.
120
121This is best explained by an example:
122
123```
124DEFPY(func, func_cmd, "[no] foo bar A.B.C.D (0-99)$num", "...help...")
125
126=>
127
128func(self, vty, argc, argv, /* standard CLI arguments */
129
130 const char *no, /* unparsed "no" */
131 struct in_addr bar, /* parsed IP address */
132 const char *bar_str, /* unparsed IP address */
133 long num, /* parsed num */
134 const char *num_str) /* unparsed num */
135```
136
137Note that as documented in the previous section, "bar" is automatically
138applied as variable name for "A.B.C.D". The python code then detects this
139is an IP address argument and generates code to parse it into a
140`struct in_addr`, passing it in `bar`. The raw value is passed in `bar_str`.
141The range/number argument works in the same way with the explicitly given
142variable name.
143
144### Type rules
145
146| Token(s) | Type | Value if omitted by user |
147|--------------------------|-------------|--------------------------|
148| `A.B.C.D` | `struct in_addr` | 0.0.0.0 |
149| `X:X::X:X` | `struct in6_addr` | :: |
150| `A.B.C.D + X:X::X:X` | `const union sockunion *` | NULL |
151| `A.B.C.D/M` | `const struct prefix_ipv4 *` | NULL |
152| `X:X::X:X/M` | `const struct prefix_ipv6 *` | NULL |
153| `A.B.C.D/M + X:X::X:X/M` | `const struct prefix *` | NULL |
154| `(0-9)` | `long` | 0 |
155| `VARIABLE` | `const char *` | NULL |
156| `word` | `const char *` | NULL |
157| _all other_ | `const char *` | NULL |
158
159Note the following details:
160
161* not all parameters are pointers, some are passed as values.
162* when the type is not `const char *`, there will be an extra `_str` argument
163 with type `const char *`.
164* you can give a variable name not only to `VARIABLE` tokens but also to
165 `word` tokens (e.g. constant words). This is useful if some parts of a
166 command are optional. The type will be `const char *`.
167* `[no]` will be passed as `const char *no`.
168* pointers will be NULL when the argument is optional and the user did not
169 use it.
170* if a parameter is not a pointer, but is optional and the user didn't use it,
171 the default value will be passed. Check the `_str` argument if you need to
172 determine whether the parameter was omitted.
173* if the definition contains multiple parameters with the same variable name,
174 they will be collapsed into a single function parameter. The python code
175 will detect if the types are compatible (i.e. IPv4 + IPv6 variantes) and
176 choose a corresponding C type.
177* the standard DEFUN parameters (self, vty, argc, argv) are still present and
178 can be used. A DEFUN can simply be **edited into a DEFPY without further
179 changes and it will still work**; this allows easy forward migration.
180* a file may contain both DEFUN and DEFPY statements.
181
182### Getting a parameter dump
183
184The clidef.py script can be called to get a list of DEFUNs/DEFPYs with
185the parameter name/type list:
186
187```
188lib/clippy python/clidef.py --all-defun --show lib/plist.c > /dev/null
189```
190
191The generated code is printed to stdout, the info dump to stderr. The
192`--all-defun` argument will make it process DEFUN blocks as well as DEFPYs,
193which is useful prior to converting some DEFUNs. **The dump does not list
194the `_str` arguments** to keep the output shorter.
195
196Note that the clidef.py script cannot be run with python directly, it needs
197to be run with _clippy_ since the latter makes the CLI parser available.
198
199### Include & Makefile requirements
200
201A source file that uses DEFPY needs to include the `_clippy.c` file **before
202all DEFPY statements**:
203
204```
205/* GPL header */
206#include ...
207
208...
209
210#include "filename_clippy.c"
211
212DEFPY(...)
213DEFPY(...)
214
215install_element(...)
216```
217
218This dependency needs to be marked in Makefile.am: (there is no ordering
219requirement)
220
221```
222include ../common.am
223
224# ...
225
226# if linked into a LTLIBRARY (.la/.so):
227filename.lo: filename_clippy.c
228
229# if linked into an executable or static library (.a):
230filename.o: filename_clippy.c
231```
232
9b9cdb46
QY
233Doc Strings
234-----------
235Each token in a command definition should be documented with a brief doc
236string that informs a user of the meaning and/or purpose of the subsequent
237command tree. These strings are provided as the last parameter to DEFUN macros,
238concatenated together and separated by an escaped newline ('\n'). These are
239best explained by example.
240
4e3e06d6 241```
9b9cdb46
QY
242DEFUN (config_terminal,
243 config_terminal_cmd,
244 "configure terminal",
245 "Configuration from vty interface\n"
246 "Configuration terminal\n")
4e3e06d6 247```
9b9cdb46
QY
248
249The last parameter is split into two lines for readability. Two newline
250delimited doc strings are present, one for each token in the command. The
251second string documents the functionality of the 'terminal' command in the
252'configure' tree.
253
254Note that the first string, for 'configure' does not contain documentation for
255'terminal'. This is because the CLI is best envisioned as a tree, with tokens
256defining branches. An imaginary 'start' token is the root of every command in a
257CLI node. Each subsequent written token descends into a subtree, so the
258documentation for that token ideally summarizes all the functionality contained
259in the subtree.
260
261A consequence of this structure is that the developer must be careful to use
262the same doc strings when defining multiple commands that are part of the same
263tree. Commands which share prefixes must share the same doc strings for those
264prefixes. On startup the parser will generate warnings if it notices
265inconsistent doc strings. Behavior is undefined; the same token may show up
266twice in completions, with different doc strings, or it may show up once with a
267random doc string. Parser warnings should be heeded and fixed to avoid
268confusing users.
269
270The number of doc strings provided must be equal to the amount of tokens
271present in the command definition, read left to right, ignoring any special
272constructs.
273
274In the examples below, each arrowed token needs a doc string.
275
4e3e06d6 276```
9b9cdb46
QY
277 "show ip bgp"
278 ^ ^ ^
279
280 "command <foo|bar> [example]"
281 ^ ^ ^ ^
4e3e06d6 282```
9b9cdb46
QY
283
284Data Structures
285---------------
286On startup, the CLI parser sequentially parses each command string definition
287and constructs a directed graph with each token forming a node. This graph is
288the basis of the entire CLI system. It is used to match user input in order to
289generate command completions and match commands to functions.
290
291There is one graph per CLI node (not the same as a graph node in the CLI
292graph). The CLI node struct keeps a reference to its graph (see lib/command.h).
293
294While most of the graph maintains the form of a tree, special constructs
295outlined in the Rules section introduce some quirks. <>, [] and {} form
296self-contained 'subgraphs'. Each subgraph is a tree except that all of the
297'leaves' actually share a child node. This helps with minimizing graph size and
298debugging.
299
300As an example, the subgraph generated by <foo|bar> looks like this:
301
302 .
303 .
304 |
305 +----+---+
306 +--- -+ FORK +----+
307 | +--------+ |
308 +--v---+ +--v---+
309 | foo | | bar |
310 +--+---+ +--+---+
311 | +------+ |
312 +------> JOIN <-----+
313 +---+--+
314 |
315 .
316 .
317
318FORK and JOIN nodes are plumbing nodes that don't correspond to user input.
319They're necessary in order to deduplicate these constructs where applicable.
320
321Options follow the same form, except that there is an edge from the FORK node
322to the JOIN node.
323
324Keywords follow the same form, except that there is an edge from JOIN to FORK.
325Because of this the CLI graph cannot be called acyclic. There is special logic
326in the input matching code that keeps a stack of paths already taken through
327the node in order to disallow following the same path more than once.
328
329Variadics are a bit special; they have an edge back to themselves, which allows
330repeating the same input indefinitely.
331
332The leaves of the graph are nodes that have no out edges. These nodes are
333special; their data section does not contain a token, as most nodes do, or
334NULL, as in FORK/JOIN nodes, but instead has a pointer to a cmd_element. All
335paths through the graph that terminate on a leaf are guaranteed to be defined
336by that command. When a user enters a complete command, the command matcher
337tokenizes the input and executes a DFS on the CLI graph. If it is
338simultaneously able to exhaust all input (one input token per graph node), and
339then find exactly one leaf connected to the last node it reaches, then the
340input has matched the corresponding command and the command is executed. If it
341finds more than one node, then the command is ambiguous (more on this in
342deduplication). If it cannot exhaust all input, the command is unknown. If it
343exhausts all input but does not find an edge node, the command is incomplete.
344
345The parser uses an incremental strategy to build the CLI graph for a node. Each
346command is parsed into its own graph, and then this graph is merged into the
347overall graph. During this merge step, the parser makes a best-effort attempt
348to remove duplicate nodes. If it finds a node in the overall graph that is
349equal to a node in the corresponding position in the command graph, it will
350intelligently merge the properties from the node in the command graph into the
351already-existing node. Subgraphs are also checked for isomorphism and merged
352where possible. The definition of whether two nodes are 'equal' is based on the
353equality of some set of token properties; read the parser source for the most
354up-to-date definition of equality.
355
356When the parser is unable to deduplicate some complicated constructs, this
357can result in two identical paths through separate parts of the graph. If
358this occurs and the user enters input that matches these paths, they will
359receive an 'ambiguous command' error and will be unable to execute the command.
360Most of the time the parser can detect and warn about duplicate commands, but
361it will not always be able to do this. Hence care should be taken before
362defining a new command to ensure it is not defined elsewhere.
363
364
365Command handlers
366----------------
367The block that follows a CLI definition is executed when a user enters input
368that matches the definition. Its function signature looks like this:
369
370int (*func) (const struct cmd_element *, struct vty *, int, struct cmd_token *[]);
371
372The first argument is the command definition struct. The last argument is an
373ordered array of tokens that correspond to the path taken through the graph,
374and the argument just prior to that is the length of the array.
375
376The arrangement of the token array has changed from the prior incarnation of
377the CLI system. In the old system, missing arguments were padded with NULLs so
378that the same parts of a command would show up at the same indices regardless
379of what was entered. The new system does not perform such padding and therefore
380it is generally _incorrect_ to assume consistent indices in this array. As a
381simple example:
382
383Command definition:
4e3e06d6 384```
9b9cdb46 385 command [foo] <bar|baz>
4e3e06d6 386```
9b9cdb46
QY
387
388User enters:
4e3e06d6 389```
9b9cdb46 390 command foo bar
4e3e06d6 391```
9b9cdb46
QY
392
393Array:
4e3e06d6 394```
9b9cdb46
QY
395 [0] -> command
396 [1] -> foo
397 [2] -> bar
4e3e06d6 398```
9b9cdb46
QY
399
400User enters:
4e3e06d6 401```
9b9cdb46 402 command baz
4e3e06d6 403```
9b9cdb46
QY
404
405Array:
4e3e06d6 406```
9b9cdb46
QY
407 [0] -> command
408 [1] -> baz
4e3e06d6 409```
9b9cdb46
QY
410
411
412
413Command abbreviation & matching priority
414----------------------------------------
415As in the prior implementation, it is possible for users to elide parts of
416tokens when the CLI matcher does not need them to make an unambiguous match.
417This is best explained by example.
418
419Command definitions:
4e3e06d6 420```
9b9cdb46
QY
421 command dog cow
422 command dog crow
4e3e06d6 423```
9b9cdb46
QY
424
425User input:
4e3e06d6 426```
9b9cdb46
QY
427 c d c -> ambiguous command
428 c d co -> match "command dog cow"
4e3e06d6 429```
9b9cdb46
QY
430
431In the new implementation, this functionality has improved. Where previously
432the parser would stop at the first ambiguous token, it will now look ahead and
433attempt to disambiguate based on tokens later on in the input string.
434
435Command definitions:
4e3e06d6 436```
9b9cdb46
QY
437 show ip bgp A.B.C.D
438 show ipv6 bgp X:X::X:X
4e3e06d6 439```
9b9cdb46
QY
440
441User enters:
4e3e06d6 442```
9b9cdb46
QY
443 s i b 4.3.2.1 -> match "show ip bgp A.B.C.D"
444 s i b ::e0 -> match "show ipv6 bgp X:X::X:X"
4e3e06d6 445```
9b9cdb46
QY
446
447Previously both of these commands would be ambiguous since 'i' does not
448explicitly select either 'ip' or 'ipv6'. However, since the user later provides
449a token that matches only one of the commands (an IPv4 or IPv6 address) the
450parser is able to look ahead and select the appropriate command. This has some
451implications for parsing the argv*[] that is passed to the command handler.
452
453Now consider a command definition such as:
4e3e06d6 454```
9b9cdb46 455 command <foo|VAR>
4e3e06d6 456```
9b9cdb46
QY
457
458'foo' only matches the string 'foo', but 'VAR' matches any input, including
459'foo'. Who wins? In situations like this the matcher will always choose the
460'better' match, so 'foo' will win.
461
462Consider also:
4e3e06d6 463```
9b9cdb46 464 show <ip|ipv6> foo
4e3e06d6 465```
9b9cdb46
QY
466
467User input:
4e3e06d6 468```
9b9cdb46 469 show ip foo
4e3e06d6 470```
9b9cdb46
QY
471
472'ip' partially matches 'ipv6' but exactly matches 'ip', so 'ip' will win.
473
474
475struct cmd_token
476----------------
477
4e3e06d6 478```
9b9cdb46
QY
479/* Command token struct. */
480struct cmd_token
481{
482 enum cmd_token_type type; // token type
483 u_char attr; // token attributes
484 bool allowrepeat; // matcher allowed to match token repetitively?
485
486 char *text; // token text
487 char *desc; // token description
488 long long min, max; // for ranges
489 char *arg; // user input that matches this token
4e3e06d6 490 char *varname; // variable name
9b9cdb46 491};
4e3e06d6 492```
9b9cdb46
QY
493
494This struct is used in the CLI graph to match input against. It is also used to
495pass user input to command handler functions, as it is frequently useful for
496handlers to have access to that information. When a command is matched, the
497sequence of cmd_tokens that form the matching path are duplicated and placed in
498order into argv*[]. Before this happens the ->arg field is set to point at the
499snippet of user input that matched it.
500
501For most nontrivial commands the handler function will need to determine which
502of the possible matching inputs was entered. Previously this was done by
503looking at the first few characters of input. This is now considered an
504anti-pattern and should be avoided. Instead, the ->type or ->text fields for
505this logic. The ->type field can be used when the possible inputs differ in
506type. When the possible types are the same, use the ->text field. This field
507has the full text of the corresponding token in the definition string and using
508it makes for much more readable code. An example is helpful.
509
510Command definition:
4e3e06d6 511```
9b9cdb46 512 command <(1-10)|foo|BAR>
4e3e06d6 513```
9b9cdb46
QY
514
515In this example, the user may enter any one of:
516 * an integer between 1 and 10
517 * "foo"
518 * anything at all
519
520If the user enters "command f", then:
521
4e3e06d6 522```
9b9cdb46
QY
523argv[1]->type == WORD_TKN
524argv[1]->arg == "f"
525argv[1]->text == "foo"
4e3e06d6 526```
9b9cdb46
QY
527
528Range tokens have some special treatment; a token with ->type == RANGE_TKN will
529have the ->min and ->max fields set to the bounding values of the range.
530
531
532Permutations
533------------
534Finally, it is sometimes useful to check all the possible combinations of input
535that would match an arbitrary definition string. There is a tool in tools/
536called 'permutations' that reads CLI definition strings on stdin and prints out
537all matching input permutations. It also dumps a text representation of the
538graph, which is more useful for debugging than anything else. It looks like
539this:
540
4e3e06d6 541```
9b9cdb46
QY
542$ ./permutations "show [ip] bgp [<view|vrf> WORD]"
543
544show ip bgp view WORD
545show ip bgp vrf WORD
546show ip bgp
547show bgp view WORD
548show bgp vrf WORD
549show bgp
4e3e06d6 550```
9b9cdb46
QY
551
552This functionality is also built into VTY/VTYSH; the 'list permutations'
553command will list all possible matching input permutations in the current CLI
554node.