# interface_definition.rnc: VyConf reference tree XML grammar # # Copyright (C) 2014. 2017 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. "interfaces ethernet eth0" or "user jrandomhacker") # Tag nodes may contain node and leafNode elements, and also nameConstraint tags # They must not contain other tag nodes tagNode = element tagNode { nodeNameAttr, (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 children = element children { (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 meaninful 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), # or as a path to a script file that generates the list (e.g. completionHelp = element completionHelp { (element list { text })* & (element path { text })* & (element script { text })* }