diff options
Diffstat (limited to 'scripts/build-command-op-templates')
| -rwxr-xr-x | scripts/build-command-op-templates | 62 | 
1 files changed, 58 insertions, 4 deletions
| diff --git a/scripts/build-command-op-templates b/scripts/build-command-op-templates index d203fdcef..94bbd1d07 100755 --- a/scripts/build-command-op-templates +++ b/scripts/build-command-op-templates @@ -3,7 +3,7 @@  #    build-command-template: converts new style command definitions in XML  #      to the old style (bunch of dirs and node.def's) command templates  # -#    Copyright (C) 2017-2024 VyOS maintainers <maintainers@vyos.net> +#    Copyright VyOS maintainers and contributors <maintainers@vyos.io>  #  #    This library is free software; you can redistribute it and/or  #    modify it under the terms of the GNU Lesser General Public @@ -30,6 +30,8 @@ import functools  from lxml import etree as ET  from textwrap import fill +debug = True +  # Defaults  validator_dir = "/opt/vyatta/libexec/validators"  default_constraint_err_msg = "Invalid value" @@ -116,7 +118,7 @@ def get_properties(p):              if comptype is not None:                  props["comp_type"] = "imagefiles"                  comp_exprs.append("echo -n \"<imagefiles>\"") -            comp_help = " && ".join(comp_exprs) +            comp_help = " ; ".join(comp_exprs)              props["comp_help"] = comp_help      except: @@ -124,6 +126,26 @@ def get_properties(p):      return props +def get_standalone(s): +    standalone = {} + +    if s is None: +        return {} + +    # Get the help string +    try: +        standalone["help"] = s.find("help").text +    except: +        standalone["help"] = "No help available" + +    # Get the command -- it's required by the schema +    try: +        standalone["command"] = s.find("command") +    except: +        raise AssertionError("Found a <standalone> node without <command>") + +    return standalone +  def make_node_def(props, command):      # XXX: replace with a template processor if it grows @@ -150,19 +172,27 @@ def process_node(n, tmpl_dir):      my_tmpl_dir = copy.copy(tmpl_dir)      props_elem = n.find("properties") +    standalone_elem = n.find("standalone")      children = n.find("children")      command = n.find("command")      name = n.get("name")      node_type = n.tag -    my_tmpl_dir.append(name) +    if name: +        my_tmpl_dir.append(name) +    else: +        # Virtual tag nodes have no names, +        # that's a normal situation. +        # In that case we create subdirs at the current level. +        pass      if debug:          print(f"Name of the node: {name};\n Created directory: ", end="")      os.makedirs(make_path(my_tmpl_dir), exist_ok=True)      props = get_properties(props_elem) +    standalone = get_standalone(standalone_elem)      nodedef_path = os.path.join(make_path(my_tmpl_dir), "node.def")      if node_type == "node": @@ -189,7 +219,10 @@ def process_node(n, tmpl_dir):          # does not exist at all.          if not os.path.exists(nodedef_path) or os.path.getsize(nodedef_path) == 0:              with open(nodedef_path, "w") as f: -                f.write('help: {0}\n'.format(props['help'])) +                if standalone: +                    f.write(make_node_def(standalone, standalone["command"])) +                else: +                    f.write('help: {0}\n'.format(props['help']))          # Create the inner node.tag part          my_tmpl_dir.append("node.tag") @@ -209,6 +242,27 @@ def process_node(n, tmpl_dir):              inner_nodes = children.iterfind("*")              for inner_n in inner_nodes:                  process_node(inner_n, my_tmpl_dir) +    elif node_type == "virtualTagNode": +        # The outer structure is already created + +        # Create the inner node.tag part +        my_tmpl_dir.append("node.tag") +        os.makedirs(make_path(my_tmpl_dir), exist_ok=True) +        if debug: +            print("Created path for the virtualTagNode: {}".format(make_path(my_tmpl_dir)), end="") + +        # Not sure if we want partially defined tag nodes, write the file unconditionally +        nodedef_path = os.path.join(make_path(my_tmpl_dir), "node.def") +        # Only create the "node.def" file if it exists but is empty, or if it +        # does not exist at all. +        if not os.path.exists(nodedef_path) or os.path.getsize(nodedef_path) == 0: +            with open(nodedef_path, "w") as f: +                f.write(make_node_def(props, command)) + +        if children is not None: +            inner_nodes = children.iterfind("*") +            for inner_n in inner_nodes: +                process_node(inner_n, my_tmpl_dir)      elif node_type == "leafNode":          # This is a leaf node          if debug: | 
