[elbe-devel] [PATCH v2 3/6] pbuilder: Handle mirror's options

Olivier Dion dion at linutronix.de
Tue Jul 21 17:13:03 CEST 2020


This is still a big mess, but I think it's more readable now.

get_apt_mirrors_and_keys() will return a tuple where the first element is a
a list of mirrors to write to /etc/apt/sources.list and the second element is a
list of GPG keys to import by apt.

Signed-off-by: Olivier Dion <dion at linutronix.de>
---
 elbepack/pbuilder.py | 100 +++++++++++++++++++++++++------------------
 1 file changed, 59 insertions(+), 41 deletions(-)

diff --git a/elbepack/pbuilder.py b/elbepack/pbuilder.py
index fe90f3d1..3c0f1c1b 100644
--- a/elbepack/pbuilder.py
+++ b/elbepack/pbuilder.py
@@ -12,6 +12,8 @@ try:
 except ImportError:
     from urllib2 import urlopen
 
+from elbepack.filesystem import Filesystem
+
 def pbuilder_write_config(builddir, xml, noccache):
     distname = xml.prj.text('suite')
     pbuilderrc_fname = os.path.join(builddir, "pbuilderrc")
@@ -126,22 +128,13 @@ def pbuilder_write_apt_conf(builddir, xml):
     fp.write('Aptitude::CmdLine::Ignore-Trust-Violations "true";\n')
     fp.close()
 
-
-def mirror_script_add_key_text(mirror, key_text):
-    mirror += "cat << EOF | apt-key add -\n"
-    mirror += key_text + "\n"
-    mirror += "EOF\n"
-
-    return mirror
-
-
-def mirror_script_add_key_url(mirror, key_url):
+def mirror_script_add_key_url(key_url):
     key_url = key_url.replace("LOCALMACHINE", "10.0.2.2")
     key_conn = urlopen(key_url, None, 10)
     key_text = key_conn.read()
     key_conn.close()
 
-    return mirror_script_add_key_text(mirror, key_text)
+    return key_text
 
 
 def pbuilder_write_repo_hook(builddir, xml, cross):
@@ -154,50 +147,75 @@ def pbuilder_write_repo_hook(builddir, xml, cross):
     with open(os.path.join(pbuilder_hook_dir, "H10elbe_apt_update"), "w") as f:
         f.write("#!/bin/sh\napt update\n")
 
-    fp = open(os.path.join(pbuilder_hook_dir, "G10elbe_apt_sources"), "w")
+    with open(os.path.join(pbuilder_hook_dir, "G10elbe_apt_sources"), "w") as f:
+
+        mirrors, keys = get_apt_mirrors_and_keys(builddir, xml, cross)
+
+        f.write("#!/bin/sh\n")
+
+        # cat reads from stdin (-) and redirect (>) to
+        # /etc/apt/sources.list
+        f.write("cat -> /etc/apt/sources.list <<EOF\n%s\nEOF\n" %
+                '\n'.join(mirrors).replace("LOCALMACHINE", "10.0.2.2"))
+
+        for key in keys:
+            f.write("cat << EOF | apt-key add -\n%s\nEOF\n" % key)
+
+        f.write("apt-get update\n")
+
+def get_apt_mirrors_and_keys(builddir, xml, _cross):
 
     if xml.prj is None:
-        return "# No Project"
+        return (["# No Project"], [])
 
     if not xml.prj.has("mirror") and not xml.prj.has("mirror/cdrom"):
-        return "# no mirrors configured"
+        return (["# No mirrors configured"], [])
 
-    mirror = "#!/bin/sh\n"
+    suite = xml.prj.text("suite")
 
-    mirror += 'echo "deb http://127.0.0.1:8080' + builddir + '/repo ' + \
-        xml.prj.text("suite") + ' main" > /etc/apt/sources.list\n'
+    local_http = "deb http://127.0.0.1:8080%s/repo %s main" % (builddir, suite)
 
-    mirror = mirror_script_add_key_url(
-        mirror,
-        'http://127.0.0.1:8080' +
-        builddir +
-        '/repo/repo.pub')
+    mirrors = [local_http]
+    keys    = [Filesystem(builddir).read_file("repo/repo.pub")]
 
     if xml.prj.has("mirror/primary_host"):
-        mirror += 'echo "deb ' + xml.get_primary_mirror(None) + ' ' + \
-                  xml.prj.text("suite") + ' main" >> /etc/apt/sources.list\n'
+
+        if xml.prj.has("mirror/options"):
+            poptions = "[ %s ]" % ' '.join([opt.et.text.strip(' \t\n')
+                                            for opt
+                                            in xml.prj.all("mirror/options/option")])
+        else:
+            poptions = ""
+
+        pmirror = xml.get_primary_mirror(None)
+        suite   = xml.prj.text("suite")
+
+        mirrors.append("deb %s %s %s main" % (poptions, pmirror, suite))
 
         if xml.prj.has("mirror/url-list"):
-            noauth = ""
-            if xml.prj.has("noauth"):
-                noauth = "[trusted=yes] "
+
             for url in xml.prj.node("mirror/url-list"):
+
+                if url.has("options"):
+                    options = "[ %s ]" % ' '.join([opt.et.text.strip(' \t\n')
+                                                   for opt
+                                                   in url.all("options/option")])
+                else:
+                    options = ""
+
                 if url.has("binary"):
-                    mirror += 'echo "deb ' + noauth + \
-                              url.text("binary").strip() + \
-                              '" >> /etc/apt/sources.list\n'
-                if url.has("raw-key") and not xml.prj.has("noauth"):
-                    key = "\n".join(line.strip(" \t") for line in url.text('raw-key').splitlines()[1:-1])
-                    mirror = mirror_script_add_key_text(mirror, key)
+                    bin_url = url.text("binary").strip()
+                    mirrors.append("deb %s %s" % (options, bin_url))
 
-    if xml.prj.has("mirror/cdrom"):
-        mirror += 'echo "deb copy:///cdrom/targetrepo %s main added" >> ' \
-                  '/etc/apt/sources.list' % (xml.prj.text("suite"))
+                if url.has("raw-key") and not "noauth" in options:
 
-    mirror += 'apt-get update\n'
-    mirror = mirror.replace("LOCALMACHINE", "10.0.2.2")
+                    key = "\n".join(line.strip(" \t")
+                                    for line
+                                    in url.text('raw-key').splitlines()[1:-1])
 
-    fp.write(mirror)
-    fp.close()
+                    keys.append(key)
+
+    if xml.prj.has("mirror/cdrom"):
+        mirrors.append("deb copy:///cdrom/targetrepo %s main added" % suite)
 
-    return ""
+    return (mirrors, keys)
-- 
2.27.0



More information about the elbe-devel mailing list