]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
opensuse: Use curl to fetch repomd.xml
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 16 Dec 2023 23:01:56 +0000 (00:01 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 18 Dec 2023 11:19:13 +0000 (12:19 +0100)
urllib.request.urlopen() means we're responsible for catching all
the exceptions and showing a proper error message to the user.
Instead, let's just shell out to curl to fetch the file which can
translate any errors into user friendly error messages for us.

mkosi/distributions/opensuse.py

index cad67dc34a54c817ffe0d310f616e3def0a2727a..bae8fbea0a2a28fe1166a1d29672dbb952098408 100644 (file)
@@ -1,9 +1,10 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 import shutil
-import urllib.request
+import tempfile
 import xml.etree.ElementTree as ElementTree
 from collections.abc import Sequence
+from pathlib import Path
 
 from mkosi.config import Architecture
 from mkosi.distributions import Distribution, DistributionInstaller, PackageType
@@ -11,6 +12,7 @@ from mkosi.installer.dnf import invoke_dnf, setup_dnf
 from mkosi.installer.rpm import RpmRepository
 from mkosi.installer.zypper import invoke_zypper, setup_zypper
 from mkosi.log import die
+from mkosi.run import run
 from mkosi.state import MkosiState
 
 
@@ -119,17 +121,27 @@ class Installer(DistributionInstaller):
 def fetch_gpgurls(repourl: str) -> tuple[str, ...]:
     gpgurls = [f"{repourl}/repodata/repomd.xml.key"]
 
-    with urllib.request.urlopen(f"{repourl}/repodata/repomd.xml") as f:
-        xml = f.read().decode()
-        root = ElementTree.fromstring(xml)
-
-        tags = root.find("{http://linux.duke.edu/metadata/repo}tags")
-        if not tags:
-            die("repomd.xml missing <tags> element")
-
-        for child in tags.iter("{http://linux.duke.edu/metadata/repo}content"):
-            if child.text and child.text.startswith("gpg-pubkey"):
-                gpgkey = child.text.partition("?")[0]
-                gpgurls += [f"{repourl}{gpgkey}"]
+    with tempfile.TemporaryDirectory() as d:
+        run([
+            "curl",
+            "--location",
+            "--output-dir", d,
+            "--remote-name",
+            "--no-progress-meter",
+            "--fail",
+            f"{repourl}/repodata/repomd.xml",
+        ])
+        xml = (Path(d) / "repomd.xml").read_text()
+
+    root = ElementTree.fromstring(xml)
+
+    tags = root.find("{http://linux.duke.edu/metadata/repo}tags")
+    if not tags:
+        die("repomd.xml missing <tags> element")
+
+    for child in tags.iter("{http://linux.duke.edu/metadata/repo}content"):
+        if child.text and child.text.startswith("gpg-pubkey"):
+            gpgkey = child.text.partition("?")[0]
+            gpgurls += [f"{repourl}{gpgkey}"]
 
     return tuple(gpgurls)