[elbe-devel] [PATCH 1/3] Extend debootstrap configuration

Daniel Braunwarth daniel.braunwarth at kuka.com
Thu Sep 9 14:02:15 CEST 2021


This patch improves the debootstrap configuration. The currently used
configuration has two drawbacks:

1. One can only inlcude additional packages into debootstrap, if a
    variant is used.
2. There is no possibility to exclude packages from debootstrap.

This patch eliminates these drawbacks.

A possible new configuration looks like:

<debootstrap>
    <variant>minbase</variant>
    <include>ca-certificates</inlcude>
    <exlucde>systemd-timesyncd</exclude>
</debootstrap>

Signed-off-by: Daniel Braunwarth <daniel.braunwarth at kuka.com>
---
 elbepack/rfs.py          | 29 ++++++++-------
 elbepack/validate.py     | 48 ++++++++++++------------
 schema/dbsfed.xsd        | 80 +++++++++++++++++++++-------------------
 tests/pbuilder-amd64.xml |  4 +-
 4 files changed, 85 insertions(+), 76 deletions(-)

diff --git a/elbepack/rfs.py b/elbepack/rfs.py
index c4d44d4e0..96ab97fde 100644
--- a/elbepack/rfs.py
+++ b/elbepack/rfs.py
@@ -185,19 +185,22 @@ class BuildEnv:
 
         host_arch = get_command_out("dpkg --print-architecture").strip().decode()
 
-        includepkgs = None
-        strapcmd  = 'debootstrap '
-        if self.xml.has("target/debootstrapvariant"):
-            bootstrapvariant = self.xml.text("target/debootstrapvariant")
-            includepkgs = self.xml.node("target/debootstrapvariant").et.get("includepkgs")
-            strapcmd += '--variant="%s" ' % bootstrapvariant
-
-        if includepkgs and not "gnupg" in includepkgs.split(','):
-            includepkgs += ",gnupg"
-        if not includepkgs:
-            includepkgs = "gnupg"
-
-        strapcmd += ' --include="%s"' % includepkgs
+        strapcmd  = "debootstrap"
+
+        # Should we use a special bootstrap variant?
+        if self.xml.has("target/debootstrap/variant"):
+            strapcmd += " --variant=%s" % self.xml.text("target/debootstrap/variant")
+
+        # Should we include additional packages into bootstrap?
+        includepkgs = "gnupg"  # These are the packages which are included in any case
+        if self.xml.has("target/debootstrap/include"):
+            includepkgs += ", %s" % self.xml.text("target/debootstrap/include")
+        strapcmd += " --include=\"%s\"" % includepkgs
+
+        # Should we exclude some packages from bootstrap?
+        if self.xml.has("target/debootstrap/exclude"):
+            strapcmd += " --exclude=\"%s\"" % self.xml.text("target/debootstrap/exclude")
+
         keyring = ''
 
         if not self.xml.is_cross(host_arch):
diff --git a/elbepack/validate.py b/elbepack/validate.py
index e4dc7e7a2..366432c7e 100644
--- a/elbepack/validate.py
+++ b/elbepack/validate.py
@@ -62,32 +62,32 @@ def validate_xml(fname):
 def validate_xml_content(xml):
     errors = []
 
-    dbsv = xml.find("/target/debootstrapvariant")
-
-    if (dbsv is not None and "minbase" in dbsv.text
-            and "gnupg" not in dbsv.get("includepkgs", "")
-            and xml.find("/project/mirror/url-list/url/key") is not None):
-
-        errors.append("\nThe XML contains a custom mirror key. "
-                      "Use debootstrapvariant's attribute includepkgs "
-                      "to make gnupg available in debootstrap.\n")
-
-    primary_proto = xml.findtext("/project/mirror/primary_proto", "")
-    https = (primary_proto.lower() == "https")
-
-    if (not https
-        and (dbsv is None
-             or ("apt-transport-https" not in dbsv.get("includepkgs", "")
-             and "ca-certificates" not in dbsv.get("includepkgs", "")))):
+    # Check if https can be safely used
+    #
+    # If apt-transport-https or ca-certificates is included in bootstrap,
+    # we are probably fine
+    bootstrap_include = xml.findtext("/target/debootstrap/include", "")
+    if ("apt-transport-https" not in bootstrap_include
+        and "ca-certificates" not in bootstrap_include):
+
+        # Check if primary mirror is using https
+        primary_proto = xml.findtext("/project/mirror/primary_proto", "")
+        is_primary_proto_https = (primary_proto.lower() == "https")
+
+        # Check if any additional mirror is using https
+        has_https_urls = False
         for url in xml.findall("/project/mirror/url-list/url"):
-            b = url.findtext("binary", "")
-            s = url.findtext("source", "")
+            b = url.findtext("binary", "").lower()
+            s = url.findtext("source", "").lower()
             if b.startswith("https") or s.startswith("https"):
-                errors.append("\nThe XML contains an HTTPS mirror. "
-                              "Use debootstrapvariant's attribute includepkgs "
-                              "to make apt-transport-https (stretch and older) "
-                              "or ca-certificates (buster and newer) available "
-                              "in debootstrap.\n")
+                has_https_urls = True
                 break
 
+        if is_primary_proto_https or has_https_urls:
+            errors.append("\nThe XML contains an HTTPS mirror. "
+                         "Use debootstrap/include "
+                         "to make apt-transport-https (stretch and older) "
+                         "or ca-certificates (buster and newer) available "
+                         "in debootstrap.\n")
+
     return errors
diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
index 149a41afb..61eb6e231 100644
--- a/schema/dbsfed.xsd
+++ b/schema/dbsfed.xsd
@@ -979,18 +979,10 @@
           </documentation>
         </annotation>
       </element>
-      <element name="debootstrapvariant" type="rfs:debootstrapvarianttype" minOccurs="0" maxOccurs="1">
+      <element name="debootstrap" type="rfs:debootstrap" minOccurs="0" maxOccurs="1">
         <annotation>
           <documentation>
-	    Name of the bootstrap script variant to use. Currently, the
-	    variants supported are minbase, which only includes essential
-	    packages and apt; buildd, which installs the buildessential
-	    packages into TARGET; and fakechroot, which installs the packages
-	    without root privileges. The default, with no --variant=X
-	    argument, is to create a base Debian installation in TARGET.
-            Some documentation mentioned the variant scratchbox too, but this
-	    variant is not supported by the debootstrap used and therefore
-	    not allowed.
+            Bootstrap configuration
           </documentation>
         </annotation>
       </element>
@@ -1099,40 +1091,52 @@
     <attribute ref="xml:base"/>
   </complexType>
 
-  <complexType name="debootstrapvarianttype">
+  <complexType name="debootstrap">
     <annotation>
       <documentation>
-        Enhanced restriction type specifying debootstrap variants.
+        Container for debootstrap configuration.
       </documentation>
     </annotation>
-    <simpleContent>
-      <extension base="rfs:debootstrapvarianttype_restriction">
-        <attribute name="includepkgs" type="string" use="optional">
-          <annotation>
-            <documentation>
-              A comma-separated list of additional packages at debootstrap runtime.
-            </documentation>
-          </annotation>
-        </attribute>
-      </extension>
-    </simpleContent>
+    <all>
+      <element name="variant" minOccurs="0" maxOccurs="1">
+        <annotation>
+          <documentation>
+            Name  of  the  bootstrap  script  variant to use.
+            The following variants are supported:
+            * minbase: required packages and apt.
+            * buildd: build-essential packages.
+            * fakechroot: installs the packages without root privileges.
+          </documentation>
+        </annotation>
+        <simpleType>
+          <restriction base="string">
+            <enumeration value="minbase" />
+            <enumeration value="buildd" />
+            <enumeration value="fakechroot" />
+          </restriction>
+        </simpleType>
+      </element>
+      <element name="include" type="string" minOccurs="0" maxOccurs="1">
+        <annotation>
+          <documentation>
+            Comma separated list of packages which will be added to download and
+            extract lists.
+          </documentation>
+        </annotation>
+      </element>
+      <element name="exclude" type="string" minOccurs="0" maxOccurs="1">
+        <annotation>
+          <documentation>
+            Comma separated list of packages which will be removed from download
+            and extract lists.
+            WARNING: you can and probably will exclude essential packages, be
+            careful using this option.
+          </documentation>
+        </annotation>
+      </element>
+    </all>
   </complexType>
 
-  <simpleType name="debootstrapvarianttype_restriction">
-    <annotation>
-      <documentation>
-	Restriction type specifying debootstrap variants.
-        Supported debootstrap variants are minbase, buildd and fakechroot.
-	The variant scratchbox is not supported by th used debootstrap.
-      </documentation>
-    </annotation>
-    <restriction base="string">
-      <enumeration value="minbase" />
-      <enumeration value="buildd" />
-      <enumeration value="fakechroot" />
-    </restriction>
-  </simpleType>
-
   <complexType name="ubi_type">
     <annotation>
       <documentation>
diff --git a/tests/pbuilder-amd64.xml b/tests/pbuilder-amd64.xml
index 6008b0199..aa602b38b 100644
--- a/tests/pbuilder-amd64.xml
+++ b/tests/pbuilder-amd64.xml
@@ -25,7 +25,9 @@
 		<hostname>amd64-buster</hostname>
 		<domain>elbe-ci</domain>
 		<console>ttyO0,115200</console>
-		<debootstrapvariant>minbase</debootstrapvariant>
+		<debootstrap>
+			<variant>minbase</variant>
+		</debootstrap>
 		<passwd>foo</passwd>
 
 		<!-- generate a pbuilder environment (before image will be built) -->
-- 
2.33.0



More information about the elbe-devel mailing list