# interface_definition.rnc: VyConf reference tree XML grammar # # Copyright (C) 2014. 2017 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 { syntaxVersion*, node* } # interfaceDefinition may contain syntax version attribute lists. syntaxVersion = element syntaxVersion { (componentAttr & versionAttr) } # 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 { (ownerAttr? & nodeNameAttr), (properties? & children? ) } # 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 { (ownerAttr? & nodeNameAttr), (properties? & children ) } # Leaf nodes are terminal configuration nodes that can't have children, # but can have values. # Leaf node may contain one or more valueConstraint tags # If multiple valueConstraint tags are used, they work a logical OR # Leaf nodes can have "multi" attribute that indicated that it can have more than one value # It can also have a default value leafNode = element leafNode { (ownerAttr? & nodeNameAttr), (defaultValue? & properties) } # Default value for leaf node, if applicable # It is used to generate default node state representation defaultValue = element defaultValue { text } # 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 # # Leaf nodes may differ in number of values that can be # associated with them. # By default, a leaf node can have only one value. # "multi" tag means a node can have one or more values, # "valueless" means it can have no values at all. # "hidden" means node visibility can be toggled, eg 'dangerous' commands, # "secret" allows a node to hide its value from unprivileged users. # # "priority" is used to influence node processing order for nodes # with exact same dependencies and in compatibility modes. properties = element properties { help? & constraint? & constraintGroup* & valueHelp* & (element constraintErrorMessage { text })? & completionHelp* & # These are meaningful only for leaf nodes (element valueless { empty })? & (element multi { empty })? & (element hidden { empty })? & (element secret { empty })? & (element priority { text })? & # These are meaningful only for tag nodes (element keepChildOrder { empty })? } componentAttr = attribute component { text } versionAttr = attribute version { text } # All nodes must have "name" attribute nodeNameAttr = attribute name { text } # Ordinary nodes and tag nodes can have "owner" attribute. # Owner is the component that is notified when node changes. ownerAttr = attribute owner { 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 )+ } # Tag and leaf nodes may have constraintGroups on their names and # values (respectively). # When multiple constraints are listed within a group, they work as # logical AND constraintGroup = element constraintGroup { ( (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 } # valueHelp tags contain information about acceptable value format valueHelp = element valueHelp { element format { text } & element description { 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. <list>foo bar baz</list>), # as a configuration path (e.g. <path>interfaces ethernet</path>), # or as a path to a script file that generates the list (e.g. <script>/usr/lib/foo/list-things</script> completionHelp = element completionHelp { (element list { text })* & (element path { text })* & (element script { text })* }