1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# interface_definition.rnc: VyConf reference tree XML grammar
#
# Copyright (C) 2014-2025 VyOS maintainers and contributors <maintainers@vyos.net>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
# USA
# The language of this file is compact form RELAX-NG
# http://relaxng.org/compact-tutorial-20030326.htm
# (unless converted to XML, then just RELAX-NG :)
# Interface definition starts with interfaceDefinition tag that may contain node tags
start = element interfaceDefinition
{
(node | tagNode)*
}
# node tag may contain node, leafNode, or tagNode tags
# Those are intermediate configuration nodes that may only contain
# other nodes and must not have values
node = element node
{
nodeNameAttr,
(properties? & children? & command?)
}
# Tag nodes are containers for nodes without predefined names, like network interfaces
# or user names (e.g. "show interfaces ethernet ethX").
# Operational mode tag nodes can be parents to other tag nodes,
# like in "ping <host> count <packets>".
#
# Some commands can be called either with or without arguments,
# like "show interfaces ethernet eth0" (show info for eth0 only)
# or "show interfaces ethernet" (show info about all ethernet interfaces).
# That case is handled using the <standalone> element
tagNode = element tagNode
{
nodeNameAttr,
(properties? & standalone? & children? & command?)
}
# The <standalone> element is only used inside tag nodes
# to define their behavior when they are called without arguments
# It can provide a help string and a command.
# Everything else is handled in the <tagNode> itself.
standalone = element standalone
{
help & command
}
# Virtual tag nodes provide a way to add a variable argument
# to a command that also needs fixed arguments,
# like "show ip route" that can take "show ip route bgp"
# or a network and arguments after it, like "show ip route 10.0.0.0/8 longer-prefixes"
virtualTagNode = element virtualTagNode
{
(properties? & children? & command?)
}
# Leaf nodes are terminal configuration nodes that can't have children,
# but can have values.
leafNode = element leafNode
{
nodeNameAttr,
(command & properties)
}
# Normal and tag nodes may have children: nodes, leaf nodes, or tag nodes.
# There can only be one virtual tag node child, though.
children = element children
{
(virtualTagNode? & (node | tagNode | leafNode)*) |
(node | tagNode | leafNode)+
}
# Nodes may have properties
# For simplicity, any property is allowed in any node,
# but whether they are used or not is implementation-defined
properties = element properties
{
help? &
completionHelp*
}
# All nodes must have "name" attribute
nodeNameAttr = attribute name
{
text
}
# help tags contains brief description of the purpose of the node
help = element help
{
text
}
command = element command
{
text
}
# completionHelp tags contain information about allowed values of a node that is used for generating
# tab completion in the CLI frontend and drop-down lists in GUI frontends
# It is only meaningful for leaf nodes
# Allowed values can be given as a fixed list of values (e.g. <list>foo bar baz</list>),
# as a configuration path (e.g. <path>interfaces ethernet</path>),
# as a path to a script file that generates the list (e.g. <script>/usr/lib/foo/list-things</script>,
# or to enable built-in image path completion (<imagePath/>).
completionHelp = element completionHelp
{
(element list { text })* &
(element path { text })* &
(element script { text })* &
(element imagePath { empty })?
}
|