# interface_definition.rnc: VyConf reference tree XML grammar # # Copyright VyOS maintainers and contributors # # 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 count ". # # 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 element tagNode = element tagNode { nodeNameAttr, (properties? & standalone? & children? & command?) } # The 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 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* & constraint? & (element constraintErrorMessage { text })? } # All nodes must have "name" attribute nodeNameAttr = attribute name { text } # Tag and leaf nodes may have constraints on their names and values # (respectively). # When multiple constraints are listed, they work as logical OR constraint = element constraint { ( (element regex { text }) | validator )+ } # A constraint may also use an external validator rather than regex validator = element validator { ( (attribute name { text }) & (attribute argument { text })? ), empty } # 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. foo bar baz), # as a configuration path (e.g. interfaces ethernet), # as a path to a script file that generates the list (e.g. , # or to enable built-in image path completion (). completionHelp = element completionHelp { (element list { text })* & (element path { text })* & (element script { text })* & (element imagePath { empty })? }