[FIX] cache qemu : ne désigner un faisceau que s'il existe

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
This commit is contained in:
Mathieu Benoit 2026-09-24 13:33:49 -04:00
parent 44bc1b093c
commit 1342117e25

View file

@ -3284,6 +3284,18 @@ CACHE_TRUST = {
# disparaît alors que la VM garde sa variable. # disparaît alors que la VM garde sa variable.
CACHE_ENV_VARS = ("PIP_CERT", "REQUESTS_CA_BUNDLE", "NODE_EXTRA_CA_CERTS") 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 # 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 # 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 # é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() return nix_trust_commands()
_, commande, faisceau = CACHE_TRUST[famille] _, commande, faisceau = CACHE_TRUST[famille]
commandes = [f"{commande} || true"] 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: for var in CACHE_ENV_VARS:
commandes.append( commandes.append(
f"sh -c 'grep -q ^{var}= /etc/environment" f'sh -c \'for f in {candidats}; do [ -r "$f" ] || continue;'
f" || echo {var}={faisceau} >> /etc/environment'" f" grep -q ^{var}= /etc/environment"
f" || echo {var}=$f >> /etc/environment; break; done'"
) )
gardees = list(CACHE_ENV_VARS) gardees = list(CACHE_ENV_VARS)
if getattr(args, "offline", False): if getattr(args, "offline", False):