From 1342117e2582d4393ce0232bffc3969fbecafdb5 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 24 Sep 2026 13:33:49 -0400 Subject: [PATCH] =?UTF-8?q?[FIX]=20cache=20qemu=20:=20ne=20d=C3=A9signer?= =?UTF-8?q?=20un=20faisceau=20que=20s'il=20existe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les variables du cache — PIP_CERT et ses voisines — recevaient le chemin canonique de la famille de paquets, sans que rien ne vérifie qu'il soit là. Une image peut ne pas le porter : sur une Fedora récente, « /etc/pki/tls/certs/ca-bundle.crt » manque alors que le faisceau extrait existe. pip refuse alors TOUT téléchargement, y compris ce qui n'a rien à voir avec le cache, et l'installation s'arrête sur des paquets publics. Le faisceau de la famille est essayé d'abord, les autres connus ensuite ; aucun trouvé n'écrit aucune variable, et pip garde son propre jeu de certificats. Vérifié : la commande produite parcourt les quatre chemins avant de renoncer. --- EN --- The cache variables — PIP_CERT and its neighbours — received the canonical path of the package family, with nothing checking it was there. An image may not carry it: on a recent Fedora, "/etc/pki/tls/certs/ca-bundle.crt" is missing while the extracted bundle exists. pip then refuses EVERY download, including what has nothing to do with the cache, and the install stops on public packages. The family bundle is tried first, the other known ones next; none found writes no variable, and pip keeps its own certificate set. Checked: the produced command walks the four paths before giving up. Assisted-by: Claude Opus 5 --- script/qemu/deploy_qemu.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/script/qemu/deploy_qemu.py b/script/qemu/deploy_qemu.py index 8f6a5c2..aec00af 100755 --- a/script/qemu/deploy_qemu.py +++ b/script/qemu/deploy_qemu.py @@ -3284,6 +3284,18 @@ CACHE_TRUST = { # disparaît alors que la VM garde sa variable. CACHE_ENV_VARS = ("PIP_CERT", "REQUESTS_CA_BUNDLE", "NODE_EXTRA_CA_CERTS") +# Les faisceaux connus, essayés dans cet ordre quand celui de la famille +# manque. Une image ne porte pas toujours le chemin canonique de sa +# distribution : sur une Fedora récente, « /etc/pki/tls/certs/ca-bundle.crt » +# peut ne pas exister alors que le faisceau extrait, lui, est là. Or une +# variable qui vise un fichier ABSENT fait échouer pip sur « Could not find a +# suitable TLS CA certificate bundle » — tout casse, au lieu de rien. +CA_BUNDLE_CANDIDATS = ( + "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", + "/etc/ssl/certs/ca-certificates.crt", + "/etc/ssl/ca-bundle.pem", +) + # Ce qu'une VM déployée l'amont du cache coupé reçoit en plus. L'audit de npm # interroge un service distant qu'aucun cache ne peut rejouer : hors ligne il # échoue à chaque installation sans rien vérifier. La variable reste dans la @@ -3641,10 +3653,15 @@ def cache_commands(args: argparse.Namespace) -> list[str]: return nix_trust_commands() _, commande, faisceau = CACHE_TRUST[famille] commandes = [f"{commande} || true"] + # Le faisceau de la famille d'abord, les autres connus ensuite : aucun + # trouvé, aucune variable écrite, et pip garde alors son propre jeu de + # certificats plutôt que de refuser tout téléchargement. + candidats = " ".join(dict.fromkeys((faisceau,) + CA_BUNDLE_CANDIDATS)) for var in CACHE_ENV_VARS: commandes.append( - f"sh -c 'grep -q ^{var}= /etc/environment" - f" || echo {var}={faisceau} >> /etc/environment'" + f'sh -c \'for f in {candidats}; do [ -r "$f" ] || continue;' + f" grep -q ^{var}= /etc/environment" + f" || echo {var}=$f >> /etc/environment; break; done'" ) gardees = list(CACHE_ENV_VARS) if getattr(args, "offline", False):