[elbe-devel] [PATCH v4] xmlpreprocess: Add mirrors options preprocess rule

Bastian Germann bage at linutronix.de
Mon Aug 3 17:41:30 CEST 2020


Am 01.08.20 um 17:35 schrieb Olivier Dion:
> When <noauth> is used, emit a warning and add the option 'trusted=yes'
> to all mirrors.  Some binary mirrors contain embedded options in their
> URL.  This is also handled by the preprocessor that will move these
> options out of the URL and create proper option nodes for the mirror.
> 
> For now, the node <noauth> is not removed from the XML because some
> execution paths still use 'prj.has("noauth")'.  In the future, simply
> uncomment after the TODO to get rid of noauth for good.
> 
> Signed-off-by: Olivier Dion <dion at linutronix.de>

Reviewed-by: Bastian Germann <bage at linutronix.de>

> ---
>  elbepack/xmlpreprocess.py | 75 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)
> 
> diff --git a/elbepack/xmlpreprocess.py b/elbepack/xmlpreprocess.py
> index 93fca7b1..fdc037b4 100644
> --- a/elbepack/xmlpreprocess.py
> +++ b/elbepack/xmlpreprocess.py
> @@ -8,6 +8,7 @@
>  from __future__ import print_function
>  
>  import os
> +import re
>  import sys
>  try:
>      from urllib.request import urlopen
> @@ -157,6 +158,78 @@ def preprocess_mirror_replacement(xml):
>          for r in replacements:
>              u.attrib['value'] = u.attrib['value'].replace(r[0], r[1])
>  
> +def preprocess_mirrors(xml):
> +    """Insert a trusted=yes mirror option for all mirrors if <noauth> is
> +    present.  Also convert binary option <binary> [opts] url </binary>
> +    to <option> tags.
> +
> +    """
> +
> +    # global noauth
> +    for node in xml.iterfind(".//noauth"):
> +        print("[WARN] <noauth> is deprecated. "
> +              "Use <option>trusted=yes</option> instead.")
> +
> +        parent = node.getparent()
> +
> +        # Add trusted=yes to primary mirror
> +        poptions = parent.find(".//mirror/options")
> +        if poptions is None:
> +            poptions = etree.Element("options")
> +            parent.find(".//mirror").append(poptions)
> +
> +        ptrusted = etree.Element("option")
> +        ptrusted.text = "trusted=yes"
> +        poptions.append(ptrusted)
> +
> +        # Add trusted=yes to all secondary mirrors
> +        for url in parent.iterfind(".//mirror/url-list/url"):
> +            options = url.find("options")
> +            if options is None:
> +                options = etree.Element("options")
> +                url.append(options)
> +
> +            trusted = etree.Element("option")
> +            trusted.text = "trusted=yes"
> +            options.append(trusted)
> +
> +        # TODO:old - Uncomment the following whenever there's no more
> +        # prj.has("noauth") in Elbe.  When this is done, also remove
> +        # noauth from dbsfed.xsd
> +        #
> +        # parent.remove(node)
> +
> +    preg = re.compile(r".*\[(.*)\](.*)", re.DOTALL)
> +
> +    # binary's and source's options
> +    for path in (".//mirror/url-list/url/binary",
> +                 ".//mirror/url-list/url/source"):
> +
> +        for node in xml.iterfind(path):
> +
> +            # e.g: <binary> [arch=amd64] http://LOCALMACHINE/something </binary>
> +            m = preg.match(node.text)
> +
> +            if not m:
> +                continue
> +
> +            # arch=amd64
> +            opt = m.group(1)
> +
> +            # http://LOCALMACHINE/something
> +            node.text = m.group(2)
> +
> +            # No <options>? Create it
> +            parent  = node.getparent()
> +            options = parent.find("options")
> +            if options is None:
> +                options = etree.Element("options")
> +                parent.append(options)
> +
> +            # Adding subelement <option>
> +            option      = etree.Element("option")
> +            option.text = opt
> +            options.append(option)
>  
>  def xmlpreprocess(fname, output, variants=None, proxy=None):
>  
> @@ -236,6 +309,8 @@ def xmlpreprocess(fname, output, variants=None, proxy=None):
>  
>          preprocess_initvm_ports(xml)
>  
> +        preprocess_mirrors(xml)
> +
>          if schema.validate(xml):
>              # if validation succedes write xml file
>              xml.write(
> 


More information about the elbe-devel mailing list