From fb3a6500649e029c9b19066ff63d34b99ff59fe3 Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:43:52 +0200 Subject: [PATCH 1/8] feat(sources): add support for Ubuntu 26.04 (Resolute) and Debian 13 (Trixie) sources --- backend/services/package_index_apt.py | 230 ++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) diff --git a/backend/services/package_index_apt.py b/backend/services/package_index_apt.py index 8d038bb..816da4c 100755 --- a/backend/services/package_index_apt.py +++ b/backend/services/package_index_apt.py @@ -126,6 +126,44 @@ "arch": "amd64", "security": True, }, + # ── Ubuntu 26.04 Resolute ──────────────────────────────────────────────── + # Publiée le 2026-04-23 (Release: "Suite: resolute / Version: 26.04", sans + # Valid-Until — contrairement à "stonking" 26.10 encore en développement, + # volontairement absente d'ici comme le sont les autres releases interim). + { + "id": "ubuntu-resolute", + "label": "Ubuntu 26.04 (Resolute) main", + "url": "https://archive.ubuntu.com/ubuntu/dists/resolute/main/binary-amd64/Packages.gz", + "distro": "resolute", + "component": "main", + "arch": "amd64", + }, + { + "id": "ubuntu-resolute-universe", + "label": "Ubuntu 26.04 (Resolute) universe", + "url": "https://archive.ubuntu.com/ubuntu/dists/resolute/universe/binary-amd64/Packages.gz", + "distro": "resolute", + "component": "universe", + "arch": "amd64", + }, + { + "id": "ubuntu-resolute-updates", + "label": "Ubuntu 26.04 Updates (main)", + "url": "https://archive.ubuntu.com/ubuntu/dists/resolute-updates/main/binary-amd64/Packages.gz", + "distro": "resolute-updates", + "component": "main", + "arch": "amd64", + "security": True, + }, + { + "id": "ubuntu-resolute-updates-universe", + "label": "Ubuntu 26.04 Updates (universe)", + "url": "https://archive.ubuntu.com/ubuntu/dists/resolute-updates/universe/binary-amd64/Packages.gz", + "distro": "resolute-updates", + "component": "universe", + "arch": "amd64", + "security": True, + }, # ── Debian 12 Bookworm ─────────────────────────────────────────────────── { "id": "debian-bookworm", @@ -151,6 +189,52 @@ "component": "non-free", "arch": "amd64", }, + { + # Composant introduit par Debian 12 (firmware non libre sorti de + # non-free pour être installable par défaut) — il manquait ici. + "id": "debian-bookworm-non-free-firmware", + "label": "Debian 12 (Bookworm) non-free-firmware", + "url": "https://deb.debian.org/debian/dists/bookworm/non-free-firmware/binary-amd64/Packages.gz", + "distro": "bookworm", + "component": "non-free-firmware", + "arch": "amd64", + }, + # ── Debian 13 Trixie ───────────────────────────────────────────────────── + # Stable depuis le 2025-08-09 (Release courante : "Debian 13.6", Suite: + # stable). Composants annoncés par le Release : main contrib + # non-free-firmware non-free. + { + "id": "debian-trixie", + "label": "Debian 13 (Trixie) main", + "url": "https://deb.debian.org/debian/dists/trixie/main/binary-amd64/Packages.gz", + "distro": "trixie", + "component": "main", + "arch": "amd64", + }, + { + "id": "debian-trixie-contrib", + "label": "Debian 13 (Trixie) contrib", + "url": "https://deb.debian.org/debian/dists/trixie/contrib/binary-amd64/Packages.gz", + "distro": "trixie", + "component": "contrib", + "arch": "amd64", + }, + { + "id": "debian-trixie-non-free", + "label": "Debian 13 (Trixie) non-free", + "url": "https://deb.debian.org/debian/dists/trixie/non-free/binary-amd64/Packages.gz", + "distro": "trixie", + "component": "non-free", + "arch": "amd64", + }, + { + "id": "debian-trixie-non-free-firmware", + "label": "Debian 13 (Trixie) non-free-firmware", + "url": "https://deb.debian.org/debian/dists/trixie/non-free-firmware/binary-amd64/Packages.gz", + "distro": "trixie", + "component": "non-free-firmware", + "arch": "amd64", + }, # ── Sources de sécurité ────────────────────────────────────────────────── { "id": "ubuntu-jammy-security", @@ -206,6 +290,24 @@ "arch": "amd64", "security": True, }, + { + "id": "ubuntu-resolute-security", + "label": "Ubuntu 26.04 Security", + "url": "https://security.ubuntu.com/ubuntu/dists/resolute-security/main/binary-amd64/Packages.gz", + "distro": "resolute", + "component": "main", + "arch": "amd64", + "security": True, + }, + { + "id": "ubuntu-resolute-security-universe", + "label": "Ubuntu 26.04 Security (universe)", + "url": "https://security.ubuntu.com/ubuntu/dists/resolute-security/universe/binary-amd64/Packages.gz", + "distro": "resolute", + "component": "universe", + "arch": "amd64", + "security": True, + }, { "id": "debian-bookworm-security", "label": "Debian 12 Security", @@ -224,6 +326,24 @@ "arch": "amd64", "security": True, }, + { + "id": "debian-trixie-security", + "label": "Debian 13 Security", + "url": "https://security.debian.org/debian-security/dists/trixie-security/main/binary-amd64/Packages.xz", + "distro": "trixie", + "component": "main", + "arch": "amd64", + "security": True, + }, + { + "id": "debian-trixie-updates", + "label": "Debian 13 Updates", + "url": "https://deb.debian.org/debian/dists/trixie-updates/main/binary-amd64/Packages.xz", + "distro": "trixie-updates", + "component": "main", + "arch": "amd64", + "security": True, + }, # ── arm64 ──────────────────────────────────────────────────────────────── # Ubuntu arm64 n'est PAS servi par archive.ubuntu.com/security.ubuntu.com # (confirmé en direct : 404 sur les trois) — c'est un mirroir séparé, @@ -334,6 +454,40 @@ "arch": "arm64", "security": True, }, + { + "id": "ubuntu-resolute-arm64", + "label": "Ubuntu 26.04 (Resolute) main [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute/main/binary-arm64/Packages.gz", + "distro": "resolute", + "component": "main", + "arch": "arm64", + }, + { + "id": "ubuntu-resolute-universe-arm64", + "label": "Ubuntu 26.04 (Resolute) universe [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute/universe/binary-arm64/Packages.gz", + "distro": "resolute", + "component": "universe", + "arch": "arm64", + }, + { + "id": "ubuntu-resolute-updates-arm64", + "label": "Ubuntu 26.04 Updates (main) [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute-updates/main/binary-arm64/Packages.gz", + "distro": "resolute-updates", + "component": "main", + "arch": "arm64", + "security": True, + }, + { + "id": "ubuntu-resolute-updates-universe-arm64", + "label": "Ubuntu 26.04 Updates (universe) [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute-updates/universe/binary-arm64/Packages.gz", + "distro": "resolute-updates", + "component": "universe", + "arch": "arm64", + "security": True, + }, { "id": "debian-bookworm-arm64", "label": "Debian 12 (Bookworm) main [arm64]", @@ -358,6 +512,46 @@ "component": "non-free", "arch": "arm64", }, + { + "id": "debian-bookworm-non-free-firmware-arm64", + "label": "Debian 12 (Bookworm) non-free-firmware [arm64]", + "url": "https://deb.debian.org/debian/dists/bookworm/non-free-firmware/binary-arm64/Packages.gz", + "distro": "bookworm", + "component": "non-free-firmware", + "arch": "arm64", + }, + { + "id": "debian-trixie-arm64", + "label": "Debian 13 (Trixie) main [arm64]", + "url": "https://deb.debian.org/debian/dists/trixie/main/binary-arm64/Packages.gz", + "distro": "trixie", + "component": "main", + "arch": "arm64", + }, + { + "id": "debian-trixie-contrib-arm64", + "label": "Debian 13 (Trixie) contrib [arm64]", + "url": "https://deb.debian.org/debian/dists/trixie/contrib/binary-arm64/Packages.gz", + "distro": "trixie", + "component": "contrib", + "arch": "arm64", + }, + { + "id": "debian-trixie-non-free-arm64", + "label": "Debian 13 (Trixie) non-free [arm64]", + "url": "https://deb.debian.org/debian/dists/trixie/non-free/binary-arm64/Packages.gz", + "distro": "trixie", + "component": "non-free", + "arch": "arm64", + }, + { + "id": "debian-trixie-non-free-firmware-arm64", + "label": "Debian 13 (Trixie) non-free-firmware [arm64]", + "url": "https://deb.debian.org/debian/dists/trixie/non-free-firmware/binary-arm64/Packages.gz", + "distro": "trixie", + "component": "non-free-firmware", + "arch": "arm64", + }, { "id": "ubuntu-jammy-security-arm64", "label": "Ubuntu 22.04 Security [arm64]", @@ -412,6 +606,24 @@ "arch": "arm64", "security": True, }, + { + "id": "ubuntu-resolute-security-arm64", + "label": "Ubuntu 26.04 Security [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute-security/main/binary-arm64/Packages.gz", + "distro": "resolute", + "component": "main", + "arch": "arm64", + "security": True, + }, + { + "id": "ubuntu-resolute-security-universe-arm64", + "label": "Ubuntu 26.04 Security (universe) [arm64]", + "url": "https://ports.ubuntu.com/ubuntu-ports/dists/resolute-security/universe/binary-arm64/Packages.gz", + "distro": "resolute", + "component": "universe", + "arch": "arm64", + "security": True, + }, { "id": "debian-bookworm-security-arm64", "label": "Debian 12 Security [arm64]", @@ -430,6 +642,24 @@ "arch": "arm64", "security": True, }, + { + "id": "debian-trixie-security-arm64", + "label": "Debian 13 Security [arm64]", + "url": "https://security.debian.org/debian-security/dists/trixie-security/main/binary-arm64/Packages.xz", + "distro": "trixie", + "component": "main", + "arch": "arm64", + "security": True, + }, + { + "id": "debian-trixie-updates-arm64", + "label": "Debian 13 Updates [arm64]", + "url": "https://deb.debian.org/debian/dists/trixie-updates/main/binary-arm64/Packages.xz", + "distro": "trixie-updates", + "component": "main", + "arch": "arm64", + "security": True, + }, ] From 26a7e923e451159ed638787934e6ed9b8b0e2b4c Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:49:48 +0200 Subject: [PATCH 2/8] feat(sources): add support for CentOS Stream 10, Oracle Linux 10, and Fedora 43/44 sources --- backend/services/package_index_rpm.py | 182 ++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) diff --git a/backend/services/package_index_rpm.py b/backend/services/package_index_rpm.py index 9323c3a..d987613 100644 --- a/backend/services/package_index_rpm.py +++ b/backend/services/package_index_rpm.py @@ -242,6 +242,28 @@ "security": False, "format": "rpm", }, + # ── CentOS Stream 10 ─────────────────────────────────────────────────────── + # Même remarque que Stream 9 : rolling release, pas d'updateinfo.xml.gz. + { + "id": "centos-stream10-baseos", + "label": "CentOS Stream 10 — BaseOS", + "repomd_url": "https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/repodata/repomd.xml", + "distro": "centos-stream10", + "arch": "x86_64", + "component": "baseos", + "security": False, + "format": "rpm", + }, + { + "id": "centos-stream10-appstream", + "label": "CentOS Stream 10 — AppStream", + "repomd_url": "https://mirror.stream.centos.org/10-stream/AppStream/x86_64/os/repodata/repomd.xml", + "distro": "centos-stream10", + "arch": "x86_64", + "component": "appstream", + "security": False, + "format": "rpm", + }, # ── Oracle Linux 8 ───────────────────────────────────────────────────────── { "id": "oraclelinux8-baseos", @@ -284,6 +306,28 @@ "security": True, "format": "rpm", }, + # ── Oracle Linux 10 ──────────────────────────────────────────────────────── + # Même quirk que OL8/OL9 : /latest/ présent sur baseos, absent sur appstream. + { + "id": "oraclelinux10-baseos", + "label": "Oracle Linux 10 — BaseOS", + "repomd_url": "https://yum.oracle.com/repo/OracleLinux/OL10/baseos/latest/x86_64/repodata/repomd.xml", + "distro": "oraclelinux10", + "arch": "x86_64", + "component": "baseos", + "security": True, + "format": "rpm", + }, + { + "id": "oraclelinux10-appstream", + "label": "Oracle Linux 10 — AppStream", + "repomd_url": "https://yum.oracle.com/repo/OracleLinux/OL10/appstream/x86_64/repodata/repomd.xml", + "distro": "oraclelinux10", + "arch": "x86_64", + "component": "appstream", + "security": True, + "format": "rpm", + }, # ── Fedora 42 ────────────────────────────────────────────────────────────── # Fedora 42 est EOL (cycle de support Fedora ~13 mois ; superseded par 43/44). # dl.fedoraproject.org ne sert plus que les versions activement maintenues — @@ -314,6 +358,54 @@ "security": True, "format": "rpm", }, + # ── Fedora 43 / 44 ───────────────────────────────────────────────────────── + # Les deux releases actuellement maintenues (Fedora supporte N et N-1). + # Contrairement à Fedora 42 ci-dessus, elles sont encore servies par + # dl.fedoraproject.org — elles devront migrer vers + # archives.fedoraproject.org à leur EOL, comme 42 l'a fait. + # Chaque release a son propre codename "distro" : partager "fedora" + # mélangerait les paquets de 42/43/44 dans un même inventaire et + # fausserait le rapprochement CVE (grype --distro fedora:NN). + { + "id": "fedora43", + "label": "Fedora 43 — Everything", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/releases/43/Everything/x86_64/os/repodata/repomd.xml", + "distro": "fedora43", + "arch": "x86_64", + "component": "everything", + "security": False, + "format": "rpm", + }, + { + "id": "fedora43-updates", + "label": "Fedora 43 — Updates", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/updates/43/Everything/x86_64/repodata/repomd.xml", + "distro": "fedora43", + "arch": "x86_64", + "component": "updates", + "security": True, + "format": "rpm", + }, + { + "id": "fedora44", + "label": "Fedora 44 — Everything", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/releases/44/Everything/x86_64/os/repodata/repomd.xml", + "distro": "fedora44", + "arch": "x86_64", + "component": "everything", + "security": False, + "format": "rpm", + }, + { + "id": "fedora44-updates", + "label": "Fedora 44 — Updates", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/updates/44/Everything/x86_64/repodata/repomd.xml", + "distro": "fedora44", + "arch": "x86_64", + "component": "updates", + "security": True, + "format": "rpm", + }, # ── EPEL (Extra Packages for Enterprise Linux) ───────────────────────────── { "id": "epel8", @@ -335,6 +427,18 @@ "security": False, "format": "rpm", }, + { + # EPEL 10 est publié sous /epel/10/ (pas de sous-répertoire 10.0/10.1 — + # confirmé en direct : 404 sur les deux). + "id": "epel10", + "label": "EPEL 10 — Extra Packages", + "repomd_url": "https://dl.fedoraproject.org/pub/epel/10/Everything/x86_64/repodata/repomd.xml", + "distro": "almalinux10", + "arch": "x86_64", + "component": "epel", + "security": False, + "format": "rpm", + }, # ── openSUSE Leap 15.6 ───────────────────────────────────────────────────── { "id": "opensuse-leap-15.6-oss", @@ -356,6 +460,30 @@ "security": True, "format": "rpm", }, + # ── openSUSE Leap 16.0 ───────────────────────────────────────────────────── + # Leap est passé de 15.6 directement à 16.0 : il n'existe AUCUN 15.7 sur + # download.opensuse.org (confirmé en direct — le listing de + # /distribution/leap/ enchaîne 15.6 puis 16.0/16.1). + # Deux différences structurelles avec la série 15.x, d'où l'entrée unique + # ci-dessous là où 15.6 en a quatre : + # - le dépôt est multi-architecture (aarch64, ppc64le, s390x, x86_64 + # sous un même repomd) : /ports/aarch64/ s'arrête à 15.6, il n'y a donc + # pas d'entrée aarch64 séparée — l'arch réelle de chaque paquet vient + # de primary.xml, pas du champ "arch" de la source. + # - aucun dépôt d'updates publié : /update/leap/16.0/ renvoie 404, les + # correctifs Leap 16 ne transitent plus par ce chemin. + # 16.1 est volontairement absente : encore en développement à ce jour + # (Build41.1 face au Build178.139 de 16.0). + { + "id": "opensuse-leap-16.0-oss", + "label": "openSUSE Leap 16.0 — OSS", + "repomd_url": "https://download.opensuse.org/distribution/leap/16.0/repo/oss/repodata/repomd.xml", + "distro": "opensuse-leap-16.0", + "arch": "x86_64", + "component": "oss", + "security": False, + "format": "rpm", + }, # ── openSUSE Tumbleweed ───────────────────────────────────────────────────── { "id": "opensuse-tumbleweed-oss", @@ -480,6 +608,18 @@ "repomd_url": "https://mirror.stream.centos.org/9-stream/AppStream/aarch64/os/repodata/repomd.xml", "distro": "centos-stream9", "arch": "aarch64", "component": "appstream", "security": False, "format": "rpm", }, + { + "id": "centos-stream10-baseos-aarch64", + "label": "CentOS Stream 10 — BaseOS [aarch64]", + "repomd_url": "https://mirror.stream.centos.org/10-stream/BaseOS/aarch64/os/repodata/repomd.xml", + "distro": "centos-stream10", "arch": "aarch64", "component": "baseos", "security": False, "format": "rpm", + }, + { + "id": "centos-stream10-appstream-aarch64", + "label": "CentOS Stream 10 — AppStream [aarch64]", + "repomd_url": "https://mirror.stream.centos.org/10-stream/AppStream/aarch64/os/repodata/repomd.xml", + "distro": "centos-stream10", "arch": "aarch64", "component": "appstream", "security": False, "format": "rpm", + }, # Oracle Linux : "baseos" garde le segment /latest/ sur aarch64, mais # "appstream" ne l'a PAS (confirmé en direct : 404 avec /latest/, 200 sans) # — quirk propre au mirroir Oracle, pas une incohérence à corriger. @@ -507,6 +647,18 @@ "repomd_url": "https://yum.oracle.com/repo/OracleLinux/OL9/appstream/aarch64/repodata/repomd.xml", "distro": "oraclelinux9", "arch": "aarch64", "component": "appstream", "security": True, "format": "rpm", }, + { + "id": "oraclelinux10-baseos-aarch64", + "label": "Oracle Linux 10 — BaseOS [aarch64]", + "repomd_url": "https://yum.oracle.com/repo/OracleLinux/OL10/baseos/latest/aarch64/repodata/repomd.xml", + "distro": "oraclelinux10", "arch": "aarch64", "component": "baseos", "security": True, "format": "rpm", + }, + { + "id": "oraclelinux10-appstream-aarch64", + "label": "Oracle Linux 10 — AppStream [aarch64]", + "repomd_url": "https://yum.oracle.com/repo/OracleLinux/OL10/appstream/aarch64/repodata/repomd.xml", + "distro": "oraclelinux10", "arch": "aarch64", "component": "appstream", "security": True, "format": "rpm", + }, { "id": "fedora42-aarch64", "label": "Fedora 42 — Everything [aarch64]", @@ -519,6 +671,30 @@ "repomd_url": "https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/42/Everything/aarch64/repodata/repomd.xml", "distro": "fedora", "arch": "aarch64", "component": "updates", "security": True, "format": "rpm", }, + { + "id": "fedora43-aarch64", + "label": "Fedora 43 — Everything [aarch64]", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/releases/43/Everything/aarch64/os/repodata/repomd.xml", + "distro": "fedora43", "arch": "aarch64", "component": "everything", "security": False, "format": "rpm", + }, + { + "id": "fedora43-updates-aarch64", + "label": "Fedora 43 — Updates [aarch64]", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/updates/43/Everything/aarch64/repodata/repomd.xml", + "distro": "fedora43", "arch": "aarch64", "component": "updates", "security": True, "format": "rpm", + }, + { + "id": "fedora44-aarch64", + "label": "Fedora 44 — Everything [aarch64]", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/releases/44/Everything/aarch64/os/repodata/repomd.xml", + "distro": "fedora44", "arch": "aarch64", "component": "everything", "security": False, "format": "rpm", + }, + { + "id": "fedora44-updates-aarch64", + "label": "Fedora 44 — Updates [aarch64]", + "repomd_url": "https://dl.fedoraproject.org/pub/fedora/linux/updates/44/Everything/aarch64/repodata/repomd.xml", + "distro": "fedora44", "arch": "aarch64", "component": "updates", "security": True, "format": "rpm", + }, { "id": "epel8-aarch64", "label": "EPEL 8 — Extra Packages [aarch64]", @@ -531,6 +707,12 @@ "repomd_url": "https://dl.fedoraproject.org/pub/epel/9/Everything/aarch64/repodata/repomd.xml", "distro": "rocky9", "arch": "aarch64", "component": "epel", "security": False, "format": "rpm", }, + { + "id": "epel10-aarch64", + "label": "EPEL 10 — Extra Packages [aarch64]", + "repomd_url": "https://dl.fedoraproject.org/pub/epel/10/Everything/aarch64/repodata/repomd.xml", + "distro": "almalinux10", "arch": "aarch64", "component": "epel", "security": False, "format": "rpm", + }, # openSUSE aarch64 est servi sous un préfixe /ports/aarch64/ dédié # (confirmé en direct), pas un simple swap x86_64->aarch64 dans l'URL. { From 4846fdfeadd712fce63ad27fe51ffe354f7ff71a Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:51:20 +0200 Subject: [PATCH 3/8] feat(sources): add support for Alpine 3.22, 3.23, and 3.24 sources for x86_64 and aarch64 --- backend/services/package_index_apk.py | 101 +++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/backend/services/package_index_apk.py b/backend/services/package_index_apk.py index 58a050f..e35b6ab 100644 --- a/backend/services/package_index_apk.py +++ b/backend/services/package_index_apk.py @@ -62,7 +62,70 @@ _ALPINE_CDN = "https://dl-cdn.alpinelinux.org/alpine" DEFAULT_SOURCES = [ - # ── Alpine 3.21 (LTS actuelle) ──────────────────────────────────────────── + # ── Alpine 3.24 (branche stable actuelle) ───────────────────────────────── + { + "id": "alpine3.24-main", + "label": "Alpine 3.24 — main", + "apkindex_url": f"{_ALPINE_CDN}/v3.24/main/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.24", + "arch": "x86_64", + "component": "main", + "format": "apk", + "security": False, + }, + { + "id": "alpine3.24-community", + "label": "Alpine 3.24 — community", + "apkindex_url": f"{_ALPINE_CDN}/v3.24/community/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.24", + "arch": "x86_64", + "component": "community", + "format": "apk", + "security": False, + }, + # ── Alpine 3.23 ─────────────────────────────────────────────────────────── + { + "id": "alpine3.23-main", + "label": "Alpine 3.23 — main", + "apkindex_url": f"{_ALPINE_CDN}/v3.23/main/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.23", + "arch": "x86_64", + "component": "main", + "format": "apk", + "security": False, + }, + { + "id": "alpine3.23-community", + "label": "Alpine 3.23 — community", + "apkindex_url": f"{_ALPINE_CDN}/v3.23/community/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.23", + "arch": "x86_64", + "component": "community", + "format": "apk", + "security": False, + }, + # ── Alpine 3.22 ─────────────────────────────────────────────────────────── + { + "id": "alpine3.22-main", + "label": "Alpine 3.22 — main", + "apkindex_url": f"{_ALPINE_CDN}/v3.22/main/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.22", + "arch": "x86_64", + "component": "main", + "format": "apk", + "security": False, + }, + { + "id": "alpine3.22-community", + "label": "Alpine 3.22 — community", + "apkindex_url": f"{_ALPINE_CDN}/v3.22/community/x86_64/APKINDEX.tar.gz", + "distro": "alpine3.22", + "arch": "x86_64", + "component": "community", + "format": "apk", + "security": False, + }, + # ── Alpine 3.21 ─────────────────────────────────────────────────────────── { "id": "alpine3.21-main", "label": "Alpine 3.21 — main", @@ -151,6 +214,42 @@ # signe aarch64 avec une clé RSA DIFFÉRENTE de x86_64 (confirmé en direct # sur les 8 sources : alpine-devel@...-616ae350.rsa.pub, pas -6165ee59) — # voir scripts/gen-apk-keys.sh, cette seconde clé y est déjà déclarée. + { + "id": "alpine3.24-main-aarch64", + "label": "Alpine 3.24 — main [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.24/main/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.24", "arch": "aarch64", "component": "main", "format": "apk", "security": False, + }, + { + "id": "alpine3.24-community-aarch64", + "label": "Alpine 3.24 — community [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.24/community/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.24", "arch": "aarch64", "component": "community", "format": "apk", "security": False, + }, + { + "id": "alpine3.23-main-aarch64", + "label": "Alpine 3.23 — main [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.23/main/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.23", "arch": "aarch64", "component": "main", "format": "apk", "security": False, + }, + { + "id": "alpine3.23-community-aarch64", + "label": "Alpine 3.23 — community [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.23/community/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.23", "arch": "aarch64", "component": "community", "format": "apk", "security": False, + }, + { + "id": "alpine3.22-main-aarch64", + "label": "Alpine 3.22 — main [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.22/main/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.22", "arch": "aarch64", "component": "main", "format": "apk", "security": False, + }, + { + "id": "alpine3.22-community-aarch64", + "label": "Alpine 3.22 — community [aarch64]", + "apkindex_url": f"{_ALPINE_CDN}/v3.22/community/aarch64/APKINDEX.tar.gz", + "distro": "alpine3.22", "arch": "aarch64", "component": "community", "format": "apk", "security": False, + }, { "id": "alpine3.21-main-aarch64", "label": "Alpine 3.21 — main [aarch64]", From 5a6bb5103c1e0e93e8def590428acdbfda62fb21 Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:54:20 +0200 Subject: [PATCH 4/8] feat(keys): enhance keyring generation for Ubuntu and add support for Debian Trixie --- .../upstream-archive-keyring.gpg | Bin 25918 -> 41601 bytes scripts/gen-upstream-keyring.sh | 39 +++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/backend/security-keys/upstream-archive-keyring.gpg b/backend/security-keys/upstream-archive-keyring.gpg index b45a54d16d9cfa2f26efb9296eb6457ac079b8a2..af0d4294a087369c10eb689d14f052afeb7ccbc4 100644 GIT binary patch delta 19028 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 HWO_LOF)Mhr delta 4222 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 E2R{{$-v9sr diff --git a/scripts/gen-upstream-keyring.sh b/scripts/gen-upstream-keyring.sh index 8ba3a7c..6a42711 100755 --- a/scripts/gen-upstream-keyring.sh +++ b/scripts/gen-upstream-keyring.sh @@ -36,12 +36,30 @@ trap 'rm -rf "$WORK_DIR"' EXIT mkdir -p "$OUT_DIR" rm -f "$OUT_FILE" -echo "== Clés Ubuntu (paquet ubuntu-keyring, déjà installé sur Ubuntu) ==" -if [ ! -f /usr/share/keyrings/ubuntu-archive-keyring.gpg ]; then - sudo apt-get update -y && sudo apt-get install -y ubuntu-keyring +echo "== Clés Ubuntu (paquet ubuntu-keyring) ==" +# Sur une machine Ubuntu le trousseau est déjà là ; ailleurs (ou sans apt) on +# récupère le paquet officiel exactement comme on le fait plus bas pour Debian, +# afin que ce script reste rejouable depuis n'importe quel poste. +UBUNTU_KEYRING=/usr/share/keyrings/ubuntu-archive-keyring.gpg +if [ ! -f "$UBUNTU_KEYRING" ]; then + if command -v apt-get >/dev/null 2>&1; then + sudo apt-get update -y && sudo apt-get install -y ubuntu-keyring + else + echo " (apt indisponible — téléchargement direct depuis archive.ubuntu.com)" + UBUNTU_KEYRING_DEB="$( + curl -sSL https://archive.ubuntu.com/ubuntu/pool/main/u/ubuntu-keyring/ \ + | grep -oE 'ubuntu-keyring_[0-9.]+_all\.deb' | sort -uV | tail -1 + )" + mkdir -p "$WORK_DIR/ubuntu" + curl -sSL -o "$WORK_DIR/ubuntu/ubuntu-keyring.deb" \ + "https://archive.ubuntu.com/ubuntu/pool/main/u/ubuntu-keyring/$UBUNTU_KEYRING_DEB" + # Extrait dans son propre sous-dossier : le paquet Debian plus bas est + # dépaqueté dans $WORK_DIR et écraserait sinon les mêmes data.tar.* + ( cd "$WORK_DIR/ubuntu" && ar x ubuntu-keyring.deb && tar xf data.tar.* ) + UBUNTU_KEYRING="$WORK_DIR/ubuntu/usr/share/keyrings/ubuntu-archive-keyring.gpg" + fi fi -gpg --no-default-keyring --keyring "$OUT_FILE" \ - --import /usr/share/keyrings/ubuntu-archive-keyring.gpg +gpg --no-default-keyring --keyring "$OUT_FILE" --import "$UBUNTU_KEYRING" echo "== Clés Debian (paquet debian-archive-keyring, téléchargé direct depuis ftp.debian.org) ==" DEBIAN_KEYRING_DEB_URL="$( @@ -54,9 +72,20 @@ curl -sSL -o "$WORK_DIR/debian-archive-keyring.deb" \ # Une clé par release Debian activement synchronisée dans DEFAULT_SOURCES — # ajouter une ligne ici pour chaque nouvelle distro Debian ajoutée au projet. +# Note trixie : son InRelease est aujourd'hui encore co-signé par les clés +# bookworm, donc la vérification passerait même sans les clés trixie — mais +# uniquement par accident de transition. Debian retirera cette co-signature, +# et la vérification étant fail-closed, trixie cesserait alors de se +# synchroniser. Les trois clés trixie sont donc importées dès maintenant +# (-stable en plus des deux -automatic : c'est la troisième signature portée +# par l'InRelease de trixie). for key in \ debian-archive-bookworm-automatic \ debian-archive-bookworm-security-automatic \ + debian-archive-bookworm-stable \ + debian-archive-trixie-automatic \ + debian-archive-trixie-security-automatic \ + debian-archive-trixie-stable \ ; do gpg --no-default-keyring --keyring "$OUT_FILE" \ --import "$WORK_DIR/usr/share/keyrings/${key}.gpg" From 16295d6a6a458de47c7d0a3bdda66897a548d1bf Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Mon, 10 Aug 2026 00:07:33 +0200 Subject: [PATCH 5/8] feat(sources): add support for AlmaLinux 10, Rocky Linux 10, CentOS Stream 10, Oracle Linux 10, and update sources for Ubuntu 26.04 (Resolute) and Debian 13 (Trixie) --- backend/entrypoint.sh | 6 +- backend/routers/distributions_router.py | 5 + backend/routers/scan_router.py | 32 +++++-- backend/services/distributions_apk.py | 3 + backend/services/distributions_apt.py | 27 +++++- backend/services/distributions_rpm.py | 120 ++++++++++++++++++++++-- backend/services/settings.py | 41 +++++++- backend/services/validator_apk.py | 6 +- backend/services/validator_apt.py | 2 + backend/services/validator_rpm.py | 12 ++- 10 files changed, 234 insertions(+), 20 deletions(-) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 178335b..db2115e 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -82,8 +82,10 @@ done # (Docker crée les bind-mounts manquants en root:root, appuser ne peut pas écrire) # REPO_BASE peut valoir /repos (mode rpm seul) ou /repos/rpm (mode both) RPM_REPO_BASE="${REPO_BASE:-/repos}" -for DISTRO in almalinux8 almalinux9 rocky8 rocky9 centos-stream9 oraclelinux8 \ - oraclelinux9 fedora opensuse-leap-15.5 opensuse-leap-15.6 \ +for DISTRO in almalinux8 almalinux9 almalinux10 rocky8 rocky9 rocky10 \ + centos-stream9 centos-stream10 oraclelinux8 oraclelinux9 \ + oraclelinux10 fedora fedora43 fedora44 \ + opensuse-leap-15.5 opensuse-leap-15.6 opensuse-leap-16.0 \ opensuse-leap opensuse-tumbleweed; do for ARCH in x86_64 aarch64 noarch; do mkdir -p "${RPM_REPO_BASE}/${DISTRO}/${ARCH}/repodata" 2>/dev/null || true diff --git a/backend/routers/distributions_router.py b/backend/routers/distributions_router.py index cf49dac..8211f7d 100755 --- a/backend/routers/distributions_router.py +++ b/backend/routers/distributions_router.py @@ -160,12 +160,17 @@ def migrate( "jammy": {"label": "Ubuntu 22.04 LTS"}, "noble": {"label": "Ubuntu 24.04 LTS"}, "focal": {"label": "Ubuntu 20.04 LTS"}, + "resolute": {"label": "Ubuntu 26.04 LTS"}, "bookworm": {"label": "Debian 12"}, + "trixie": {"label": "Debian 13"}, # Alpine Linux (APK — inventaire et CVE uniquement, pas de dépôt reprepro) "alpine3.18": {"label": "Alpine Linux 3.18", "pkg_type": "apk"}, "alpine3.19": {"label": "Alpine Linux 3.19", "pkg_type": "apk"}, "alpine3.20": {"label": "Alpine Linux 3.20", "pkg_type": "apk"}, "alpine3.21": {"label": "Alpine Linux 3.21", "pkg_type": "apk"}, + "alpine3.22": {"label": "Alpine Linux 3.22", "pkg_type": "apk"}, + "alpine3.23": {"label": "Alpine Linux 3.23", "pkg_type": "apk"}, + "alpine3.24": {"label": "Alpine Linux 3.24", "pkg_type": "apk"}, } diff --git a/backend/routers/scan_router.py b/backend/routers/scan_router.py index dc19d80..b04870f 100644 --- a/backend/routers/scan_router.py +++ b/backend/routers/scan_router.py @@ -73,16 +73,32 @@ def rescan_package( "jammy": "ubuntu:22.04", "noble": "ubuntu:24.04", "focal": "ubuntu:20.04", + "resolute": "ubuntu:26.04", "bookworm": "debian:12", + "trixie": "debian:13", # RPM - "almalinux8": "almalinux:8", - "almalinux9": "almalinux:9", - "rocky8": "rockylinux:8", - "rocky9": "rockylinux:9", - "centos-stream9": "centos:9", - "oraclelinux8": "oraclelinux:8", - "oraclelinux9": "oraclelinux:9", - "fedora42": "fedora:42", + "almalinux8": "almalinux:8", + "almalinux9": "almalinux:9", + "almalinux10": "almalinux:10", + "rocky8": "rockylinux:8", + "rocky9": "rockylinux:9", + "rocky10": "rockylinux:10", + "centos-stream9": "centos:9", + "centos-stream10": "centos:10", + "oraclelinux8": "oraclelinux:8", + "oraclelinux9": "oraclelinux:9", + "oraclelinux10": "oraclelinux:10", + "fedora": "fedora:42", + "fedora42": "fedora:42", + "fedora43": "fedora:43", + "fedora44": "fedora:44", + "opensuse-leap-15.6": "opensuse/leap:15.6", + "opensuse-leap-16.0": "opensuse/leap:16.0", + # APK + "alpine3.21": "alpine:3.21", + "alpine3.22": "alpine:3.22", + "alpine3.23": "alpine:3.23", + "alpine3.24": "alpine:3.24", } grype_distro = _DISTRO_MAP.get(distribution, distribution) diff --git a/backend/services/distributions_apk.py b/backend/services/distributions_apk.py index a0f2941..11ffefa 100644 --- a/backend/services/distributions_apk.py +++ b/backend/services/distributions_apk.py @@ -37,6 +37,9 @@ {"codename": "alpine3.19", "name": "Alpine Linux 3.19", "arch": ["x86_64", "aarch64"]}, {"codename": "alpine3.20", "name": "Alpine Linux 3.20", "arch": ["x86_64", "aarch64"]}, {"codename": "alpine3.21", "name": "Alpine Linux 3.21", "arch": ["x86_64", "aarch64"]}, + {"codename": "alpine3.22", "name": "Alpine Linux 3.22", "arch": ["x86_64", "aarch64"]}, + {"codename": "alpine3.23", "name": "Alpine Linux 3.23", "arch": ["x86_64", "aarch64"]}, + {"codename": "alpine3.24", "name": "Alpine Linux 3.24", "arch": ["x86_64", "aarch64"]}, ] VALID_APK_CODENAMES: set[str] = {d["codename"] for d in APK_DISTRIBUTIONS} diff --git a/backend/services/distributions_apt.py b/backend/services/distributions_apt.py index 9825c20..a288d52 100755 --- a/backend/services/distributions_apt.py +++ b/backend/services/distributions_apt.py @@ -1,6 +1,6 @@ """ Gestion des distributions reprepro (enterprise). -Distributions fixes : jammy, noble, focal, bookworm. +Distributions fixes : focal, jammy, noble, resolute, bookworm, trixie. reprepro est exécuté directement dans le container backend (installé dans l'image). Les volumes repos/conf, repos/dists, repos/db et repos/pool sont partagés. """ @@ -36,11 +36,27 @@ "badge": "ESM", "color": "gray", }, + { + "codename": "resolute", + "name": "Ubuntu 26.04 LTS", + "full_name": "Ubuntu 26.04 LTS — Resolute Raccoon", + "os": "ubuntu", + "badge": "LTS", + "color": "purple", + }, { "codename": "bookworm", "name": "Debian 12", "full_name": "Debian 12 — Bookworm", "os": "debian", + "badge": "Oldstable", + "color": "red", + }, + { + "codename": "trixie", + "name": "Debian 13", + "full_name": "Debian 13 — Trixie", + "os": "debian", "badge": "Stable", "color": "red", }, @@ -52,6 +68,9 @@ {"codename": "alpine3.19", "name": "Alpine Linux 3.19", "os": "alpine", "pkg_type": "apk"}, {"codename": "alpine3.20", "name": "Alpine Linux 3.20", "os": "alpine", "pkg_type": "apk"}, {"codename": "alpine3.21", "name": "Alpine Linux 3.21", "os": "alpine", "pkg_type": "apk"}, + {"codename": "alpine3.22", "name": "Alpine Linux 3.22", "os": "alpine", "pkg_type": "apk"}, + {"codename": "alpine3.23", "name": "Alpine Linux 3.23", "os": "alpine", "pkg_type": "apk"}, + {"codename": "alpine3.24", "name": "Alpine Linux 3.24", "os": "alpine", "pkg_type": "apk"}, ] VALID_CODENAMES = ( @@ -64,11 +83,17 @@ "ubuntu-jammy-updates": "jammy", "ubuntu-noble": "noble", "ubuntu-focal": "focal", + "ubuntu-resolute": "resolute", + "ubuntu-resolute-updates": "resolute", "debian-bookworm": "bookworm", + "debian-trixie": "trixie", + "debian-trixie-updates": "trixie", "ubuntu-jammy-security": "jammy", "ubuntu-noble-security": "noble", "ubuntu-focal-security": "focal", + "ubuntu-resolute-security": "resolute", "debian-bookworm-security": "bookworm", + "debian-trixie-security": "trixie", } diff --git a/backend/services/distributions_rpm.py b/backend/services/distributions_rpm.py index f8c7f31..3fd4632 100644 --- a/backend/services/distributions_rpm.py +++ b/backend/services/distributions_rpm.py @@ -1,7 +1,8 @@ """ Gestion des distributions RPM (createrepo_c). -Distributions : AlmaLinux 8, Rocky Linux 8, CentOS Stream 9, Oracle Linux 8, - Fedora, openSUSE Leap 15.5/15.6/Leap/Tumbleweed. +Distributions : AlmaLinux 8/9/10, Rocky Linux 8/9/10, CentOS Stream 9/10, + Oracle Linux 8/9/10, Fedora 42/43/44, + openSUSE Leap 15.6/16.0/Tumbleweed. createrepo_c est exécuté directement dans le container backend. """ import os @@ -37,6 +38,17 @@ "package_manager": "dnf", "grype_distro": "almalinux:9", }, + { + "codename": "almalinux10", + "name": "AlmaLinux 10", + "full_name": "AlmaLinux 10 — Purple Lion", + "os": "almalinux", + "version": "10", + "badge": "RHEL-compat", + "color": "blue", + "package_manager": "dnf", + "grype_distro": "almalinux:10", + }, { "codename": "rocky8", "name": "Rocky Linux 8", @@ -59,6 +71,17 @@ "package_manager": "dnf", "grype_distro": "rockylinux:9", }, + { + "codename": "rocky10", + "name": "Rocky Linux 10", + "full_name": "Rocky Linux 10 — Red Quartz", + "os": "rocky", + "version": "10", + "badge": "RHEL-compat", + "color": "green", + "package_manager": "dnf", + "grype_distro": "rockylinux:10", + }, { "codename": "centos-stream9", "name": "CentOS Stream 9", @@ -70,6 +93,17 @@ "package_manager": "dnf", "grype_distro": "centos:9", }, + { + "codename": "centos-stream10", + "name": "CentOS Stream 10", + "full_name": "CentOS Stream 10", + "os": "centos", + "version": "10", + "badge": "Upstream RHEL", + "color": "purple", + "package_manager": "dnf", + "grype_distro": "centos:10", + }, { "codename": "oraclelinux8", "name": "Oracle Linux 8", @@ -81,17 +115,65 @@ "package_manager": "dnf", "grype_distro": "oraclelinux:8", }, + { + "codename": "oraclelinux9", + "name": "Oracle Linux 9", + "full_name": "Oracle Linux 9 — Red Tiger", + "os": "oraclelinux", + "version": "9", + "badge": "RHEL-compat", + "color": "red", + "package_manager": "dnf", + "grype_distro": "oraclelinux:9", + }, + { + "codename": "oraclelinux10", + "name": "Oracle Linux 10", + "full_name": "Oracle Linux 10", + "os": "oraclelinux", + "version": "10", + "badge": "RHEL-compat", + "color": "red", + "package_manager": "dnf", + "grype_distro": "oraclelinux:10", + }, # ── Fedora ──────────────────────────────────────────────────────────────── + # "fedora" (sans suffixe) désigne historiquement Fedora 42, désormais EOL. + # Les releases suivantes ont chacune leur codename versionné : partager un + # seul codename mélangerait leurs paquets et fausserait le --distro passé + # à Grype. { "codename": "fedora", - "name": "Fedora", - "full_name": "Fedora 42", + "name": "Fedora 42", + "full_name": "Fedora 42 (EOL)", "os": "fedora", "version": "42", + "badge": "EOL", + "color": "gray", + "package_manager": "dnf", + "grype_distro": "fedora:42", + }, + { + "codename": "fedora43", + "name": "Fedora 43", + "full_name": "Fedora 43", + "os": "fedora", + "version": "43", "badge": "Upstream", "color": "blue", "package_manager": "dnf", - "grype_distro": "fedora:42", + "grype_distro": "fedora:43", + }, + { + "codename": "fedora44", + "name": "Fedora 44", + "full_name": "Fedora 44", + "os": "fedora", + "version": "44", + "badge": "Upstream", + "color": "blue", + "package_manager": "dnf", + "grype_distro": "fedora:44", }, # ── openSUSE ────────────────────────────────────────────────────────────── { @@ -105,6 +187,17 @@ "package_manager": "zypper", "grype_distro": "opensuse/leap:15.6", }, + { + "codename": "opensuse-leap-16.0", + "name": "openSUSE Leap 16.0", + "full_name": "openSUSE Leap 16.0", + "os": "opensuse", + "version": "16.0", + "badge": "SUSE-stable", + "color": "teal", + "package_manager": "zypper", + "grype_distro": "opensuse/leap:16.0", + }, { "codename": "opensuse-tumbleweed", "name": "openSUSE Tumbleweed", @@ -130,26 +223,41 @@ "almalinux8-extras": "almalinux8", "almalinux9-baseos": "almalinux9", "almalinux9-appstream": "almalinux9", + "almalinux10-baseos": "almalinux10", + "almalinux10-appstream": "almalinux10", # Rocky Linux "rocky8-baseos": "rocky8", "rocky8-appstream": "rocky8", "rocky9-baseos": "rocky9", "rocky9-appstream": "rocky9", + "rocky10-baseos": "rocky10", + "rocky10-appstream": "rocky10", # CentOS Stream "centos-stream9-baseos": "centos-stream9", "centos-stream9-appstream": "centos-stream9", + "centos-stream10-baseos": "centos-stream10", + "centos-stream10-appstream": "centos-stream10", # Oracle Linux "oraclelinux8-baseos": "oraclelinux8", "oraclelinux8-appstream": "oraclelinux8", - "oraclelinux9-baseos": "oraclelinux8", # pas de distro oraclelinux9 encore + "oraclelinux9-baseos": "oraclelinux9", + "oraclelinux9-appstream": "oraclelinux9", + "oraclelinux10-baseos": "oraclelinux10", + "oraclelinux10-appstream": "oraclelinux10", # Fedora + EPEL "fedora42": "fedora", "fedora42-updates": "fedora", + "fedora43": "fedora43", + "fedora43-updates": "fedora43", + "fedora44": "fedora44", + "fedora44-updates": "fedora44", "epel8": "almalinux8", "epel9": "rocky9", + "epel10": "almalinux10", # openSUSE "opensuse-leap-15.6-oss": "opensuse-leap-15.6", "opensuse-leap-15.6-updates": "opensuse-leap-15.6", + "opensuse-leap-16.0-oss": "opensuse-leap-16.0", "opensuse-tumbleweed-oss": "opensuse-tumbleweed", } diff --git a/backend/services/settings.py b/backend/services/settings.py index 5d24fa6..a54ad48 100644 --- a/backend/services/settings.py +++ b/backend/services/settings.py @@ -62,17 +62,32 @@ # Ubuntu 20.04 Focal "ubuntu-focal": True, "ubuntu-focal-universe": True, + # Ubuntu 26.04 Resolute + "ubuntu-resolute": True, + "ubuntu-resolute-universe": True, + "ubuntu-resolute-updates": True, + "ubuntu-resolute-updates-universe": True, # Debian 12 Bookworm "debian-bookworm": True, "debian-bookworm-contrib": True, "debian-bookworm-non-free": False, # désactivé par défaut (non-free) + "debian-bookworm-non-free-firmware": False, # idem : firmware non libre + # Debian 13 Trixie + "debian-trixie": True, + "debian-trixie-contrib": True, + "debian-trixie-non-free": False, # désactivé par défaut (non-free) + "debian-trixie-non-free-firmware": False, # idem : firmware non libre + "debian-trixie-updates": True, # Sources de sécurité "ubuntu-jammy-security": True, "ubuntu-jammy-security-universe": True, "ubuntu-noble-security": True, "ubuntu-noble-security-universe": True, "ubuntu-focal-security": True, + "ubuntu-resolute-security": True, + "ubuntu-resolute-security-universe": True, "debian-bookworm-security": True, + "debian-trixie-security": True, } _RPM_SOURCES: dict = { @@ -82,32 +97,56 @@ "almalinux8-extras": True, "almalinux9-baseos": True, "almalinux9-appstream": True, + "almalinux10-baseos": True, + "almalinux10-appstream": True, # ── Rocky Linux ──────────────────────────────────────────────────────────── "rocky8-baseos": True, "rocky8-appstream": True, "rocky9-baseos": True, "rocky9-appstream": True, + "rocky10-baseos": True, + "rocky10-appstream": True, # ── CentOS Stream ────────────────────────────────────────────────────────── "centos-stream9-baseos": True, "centos-stream9-appstream": True, + "centos-stream10-baseos": True, + "centos-stream10-appstream": True, # ── Oracle Linux ─────────────────────────────────────────────────────────── "oraclelinux8-baseos": True, "oraclelinux8-appstream": True, "oraclelinux9-baseos": True, - # ── Fedora ───────────────────────────────────────────────────────────────── + "oraclelinux9-appstream": True, + "oraclelinux10-baseos": True, + "oraclelinux10-appstream": True, + # ── Fedora (42 est EOL — laissée activée pour ne pas perdre l'existant) ──── "fedora42": True, "fedora42-updates": True, + "fedora43": True, + "fedora43-updates": True, + "fedora44": True, + "fedora44-updates": True, # ── EPEL (désactivé par défaut — volumineuse) ────────────────────────────── "epel8": False, "epel9": False, + "epel10": False, # ── openSUSE ─────────────────────────────────────────────────────────────── "opensuse-leap-15.6-oss": True, "opensuse-leap-15.6-updates": True, + "opensuse-leap-16.0-oss": True, "opensuse-tumbleweed-oss": True, } _APK_SOURCES: dict = { + # ── Alpine 3.24 ──────────────────────────────────────────────────────────── + "alpine3.24-main": True, + "alpine3.24-community": True, + # ── Alpine 3.23 ──────────────────────────────────────────────────────────── + "alpine3.23-main": True, + "alpine3.23-community": True, + # ── Alpine 3.22 ──────────────────────────────────────────────────────────── + "alpine3.22-main": True, + "alpine3.22-community": True, # ── Alpine 3.21 ──────────────────────────────────────────────────────────── "alpine3.21-main": True, "alpine3.21-community": True, diff --git a/backend/services/validator_apk.py b/backend/services/validator_apk.py index 4def713..684d2b8 100644 --- a/backend/services/validator_apk.py +++ b/backend/services/validator_apk.py @@ -44,7 +44,11 @@ "alpine3.19": "alpine:3.19", "alpine3.20": "alpine:3.20", "alpine3.21": "alpine:3.21", - "alpine": "alpine:3.21", + "alpine3.22": "alpine:3.22", + "alpine3.23": "alpine:3.23", + "alpine3.24": "alpine:3.24", + # Repli quand aucune version n'est précisée : la branche stable courante. + "alpine": "alpine:3.24", } # ── Étape 1 : Format ────────────────────────────────────────────────────────── diff --git a/backend/services/validator_apt.py b/backend/services/validator_apt.py index bd89a73..c71222f 100755 --- a/backend/services/validator_apt.py +++ b/backend/services/validator_apt.py @@ -35,9 +35,11 @@ def _extract_cvss(vuln: dict) -> float | None: "focal": "ubuntu:20.04", "jammy": "ubuntu:22.04", "noble": "ubuntu:24.04", + "resolute": "ubuntu:26.04", "buster": "debian:10", "bullseye": "debian:11", "bookworm": "debian:12", + "trixie": "debian:13", } diff --git a/backend/services/validator_rpm.py b/backend/services/validator_rpm.py index 2cda562..ca7692a 100644 --- a/backend/services/validator_rpm.py +++ b/backend/services/validator_rpm.py @@ -33,12 +33,22 @@ # Correspondance codename RPM → chaîne distro Grype _DISTRO_MAP: dict[str, str] = { "almalinux8": "almalinux:8", + "almalinux9": "almalinux:9", + "almalinux10": "almalinux:10", "rocky8": "rockylinux:8", + "rocky9": "rockylinux:9", + "rocky10": "rockylinux:10", "centos-stream9": "centos:9", + "centos-stream10": "centos:10", "oraclelinux8": "oraclelinux:8", - "fedora": "fedora:latest", + "oraclelinux9": "oraclelinux:9", + "oraclelinux10": "oraclelinux:10", + "fedora": "fedora:42", + "fedora43": "fedora:43", + "fedora44": "fedora:44", "opensuse-leap-15.5": "opensuse/leap:15.5", "opensuse-leap-15.6": "opensuse/leap:15.6", + "opensuse-leap-16.0": "opensuse/leap:16.0", "opensuse-leap": "opensuse/leap:latest", "opensuse-tumbleweed": "opensuse/tumbleweed:latest", } From 212f60ee62623e93628da8de260af699a8de22ff Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Mon, 10 Aug 2026 07:49:02 +0200 Subject: [PATCH 6/8] feat(sources): add support for Ubuntu 26.04 (Resolute), Debian 13 (Trixie), AlmaLinux 10, Rocky Linux 10, CentOS Stream 10, and update sources for Fedora 43/44 and Alpine 3.22-3.24 --- frontend/src/components/PackageList.js | 24 +++++++++++++++- frontend/src/components/UploadForm.js | 2 ++ frontend/src/pages/ClientSetupPage.js | 14 +++++++++- frontend/src/pages/DockerfilePage.js | 9 ++++-- frontend/src/pages/ImportPage.js | 28 +++++++++++++++++-- frontend/src/pages/PromotionsPage.js | 2 ++ frontend/src/pages/SettingsPage.js | 38 ++++++++++++++++++++++---- 7 files changed, 106 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/PackageList.js b/frontend/src/components/PackageList.js index 467069c..5227fb4 100755 --- a/frontend/src/components/PackageList.js +++ b/frontend/src/components/PackageList.js @@ -685,27 +685,41 @@ const DISTRIB_COLORS = { jammy: "bg-orange-100 text-orange-700", noble: "bg-green-100 text-green-700", focal: "bg-gray-100 text-gray-600", + resolute: "bg-purple-100 text-purple-700", + trixie: "bg-red-100 text-red-700", bookworm: "bg-red-100 text-red-700", bullseye: "bg-red-100 text-red-600", buster: "bg-red-50 text-red-500", // RPM — AlmaLinux almalinux8: "bg-blue-100 text-blue-700", almalinux9: "bg-blue-100 text-blue-700", + almalinux10: "bg-blue-100 text-blue-700", // RPM — Rocky Linux rocky8: "bg-emerald-100 text-emerald-700", rocky9: "bg-emerald-100 text-emerald-700", + rocky10: "bg-emerald-100 text-emerald-700", // RPM — CentOS Stream "centos-stream9": "bg-purple-100 text-purple-700", + "centos-stream10": "bg-purple-100 text-purple-700", "centos-stream8": "bg-purple-100 text-purple-600", // RPM — Oracle Linux oraclelinux8: "bg-red-100 text-red-800", oraclelinux9: "bg-red-100 text-red-800", + oraclelinux10: "bg-red-100 text-red-800", // RPM — Fedora fedora: "bg-indigo-100 text-indigo-700", fedora42: "bg-indigo-100 text-indigo-700", + fedora43: "bg-indigo-100 text-indigo-700", + fedora44: "bg-indigo-100 text-indigo-700", // RPM — openSUSE "opensuse-leap-15.6": "bg-teal-100 text-teal-700", + "opensuse-leap-16.0": "bg-teal-100 text-teal-700", "opensuse-tumbleweed": "bg-teal-100 text-teal-600", + // APK — Alpine + "alpine3.21": "bg-sky-100 text-sky-700", + "alpine3.22": "bg-sky-100 text-sky-700", + "alpine3.23": "bg-sky-100 text-sky-700", + "alpine3.24": "bg-sky-100 text-sky-700", }; // Fallback statique si l'API distributions n'est pas disponible @@ -715,16 +729,24 @@ const DISTRIB_TABS_FALLBACK = [ { id: "jammy", label: "Jammy 22.04", group: "apt" }, { id: "noble", label: "Noble 24.04", group: "apt" }, { id: "focal", label: "Focal 20.04", group: "apt" }, + { id: "resolute", label: "Resolute 26.04", group: "apt" }, + { id: "trixie", label: "Trixie 13", group: "apt" }, { id: "bookworm", label: "Bookworm 12", group: "apt" }, // RPM — RHEL family + { id: "almalinux10", label: "AlmaLinux 10", group: "rpm" }, { id: "almalinux9", label: "AlmaLinux 9", group: "rpm" }, { id: "almalinux8", label: "AlmaLinux 8", group: "rpm" }, + { id: "rocky10", label: "Rocky 10", group: "rpm" }, { id: "rocky9", label: "Rocky 9", group: "rpm" }, { id: "rocky8", label: "Rocky 8", group: "rpm" }, + { id: "centos-stream10", label: "CentOS Stream 10", group: "rpm" }, { id: "centos-stream9", label: "CentOS Stream 9", group: "rpm" }, + { id: "oraclelinux10", label: "Oracle Linux 10", group: "rpm" }, { id: "oraclelinux9", label: "Oracle Linux 9", group: "rpm" }, - { id: "fedora42", label: "Fedora 42", group: "rpm" }, + { id: "fedora44", label: "Fedora 44", group: "rpm" }, + { id: "fedora43", label: "Fedora 43", group: "rpm" }, // RPM — openSUSE + { id: "opensuse-leap-16.0", label: "Leap 16.0", group: "zypper" }, { id: "opensuse-leap-15.6", label: "Leap 15.6", group: "zypper" }, { id: "opensuse-tumbleweed", label: "Tumbleweed", group: "zypper" }, ]; diff --git a/frontend/src/components/UploadForm.js b/frontend/src/components/UploadForm.js index 33d3255..d91ff5b 100755 --- a/frontend/src/components/UploadForm.js +++ b/frontend/src/components/UploadForm.js @@ -239,6 +239,8 @@ export default function UploadForm() { { codename: "jammy", name: "Ubuntu 22.04 LTS (Jammy)", format: "deb" }, { codename: "noble", name: "Ubuntu 24.04 LTS (Noble)", format: "deb" }, { codename: "focal", name: "Ubuntu 20.04 LTS (Focal)", format: "deb" }, + { codename: "resolute", name: "Ubuntu 26.04 LTS (Resolute)", format: "deb" }, + { codename: "trixie", name: "Debian 13 (Trixie)", format: "deb" }, { codename: "bookworm", name: "Debian 12 (Bookworm)", format: "deb" }, ]); }); diff --git a/frontend/src/pages/ClientSetupPage.js b/frontend/src/pages/ClientSetupPage.js index 11c2c87..a393bff 100755 --- a/frontend/src/pages/ClientSetupPage.js +++ b/frontend/src/pages/ClientSetupPage.js @@ -841,21 +841,33 @@ const DISTROS = [ // APT (Debian/Ubuntu) { id: "jammy", label: "Ubuntu 22.04 (Jammy)", family: "apt" }, { id: "noble", label: "Ubuntu 24.04 (Noble)", family: "apt" }, + { id: "resolute", label: "Ubuntu 26.04 (Resolute)", family: "apt" }, + { id: "trixie", label: "Debian 13 (Trixie)", family: "apt" }, { id: "bookworm", label: "Debian 12 (Bookworm)", family: "apt" }, { id: "bullseye", label: "Debian 11 (Bullseye)", family: "apt" }, // RPM — DNF (RHEL family) + { id: "almalinux10", label: "AlmaLinux 10", family: "dnf" }, { id: "almalinux9", label: "AlmaLinux 9", family: "dnf" }, { id: "almalinux8", label: "AlmaLinux 8", family: "dnf" }, + { id: "rocky10", label: "Rocky Linux 10", family: "dnf" }, { id: "rocky9", label: "Rocky Linux 9", family: "dnf" }, { id: "rocky8", label: "Rocky Linux 8", family: "dnf" }, + { id: "centos-stream10", label: "CentOS Stream 10", family: "dnf" }, { id: "centos-stream9", label: "CentOS Stream 9", family: "dnf" }, + { id: "oraclelinux10", label: "Oracle Linux 10", family: "dnf" }, { id: "oraclelinux9", label: "Oracle Linux 9", family: "dnf" }, { id: "oraclelinux8", label: "Oracle Linux 8", family: "dnf" }, - { id: "fedora", label: "Fedora", family: "dnf" }, + { id: "fedora44", label: "Fedora 44", family: "dnf" }, + { id: "fedora43", label: "Fedora 43", family: "dnf" }, + { id: "fedora", label: "Fedora 42 (EOL)", family: "dnf" }, // RPM — Zypper (openSUSE) + { id: "opensuse-leap-16.0", label: "openSUSE Leap 16.0", family: "zypper" }, { id: "opensuse-leap-15.6", label: "openSUSE Leap 15.6", family: "zypper" }, { id: "opensuse-tumbleweed", label: "openSUSE Tumbleweed", family: "zypper" }, // APK — Alpine Linux + { id: "alpine3.24", label: "Alpine Linux 3.24", family: "apk" }, + { id: "alpine3.23", label: "Alpine Linux 3.23", family: "apk" }, + { id: "alpine3.22", label: "Alpine Linux 3.22", family: "apk" }, { id: "alpine3.21", label: "Alpine Linux 3.21", family: "apk" }, { id: "alpine3.20", label: "Alpine Linux 3.20", family: "apk" }, { id: "alpine3.19", label: "Alpine Linux 3.19", family: "apk" }, diff --git a/frontend/src/pages/DockerfilePage.js b/frontend/src/pages/DockerfilePage.js index 18eac85..4103c1f 100644 --- a/frontend/src/pages/DockerfilePage.js +++ b/frontend/src/pages/DockerfilePage.js @@ -25,6 +25,8 @@ const DISTRIBUTION_GROUPS = [ { codename: "jammy", label: "Ubuntu 22.04 LTS (Jammy)" }, { codename: "noble", label: "Ubuntu 24.04 (Noble)" }, { codename: "focal", label: "Ubuntu 20.04 LTS (Focal)" }, + { codename: "resolute", label: "Ubuntu 26.04 LTS (Resolute)" }, + { codename: "trixie", label: "Debian 13 (Trixie)" }, { codename: "bookworm", label: "Debian 12 (Bookworm)" }, { codename: "bullseye", label: "Debian 11 (Bullseye)" }, ], @@ -33,10 +35,11 @@ const DISTRIBUTION_GROUPS = [ group: "RPM — RHEL / AlmaLinux / Rocky / Fedora", pm: "rpm", items: [ + { codename: "el10", label: "RHEL / AlmaLinux / Rocky 10" }, { codename: "el9", label: "RHEL / AlmaLinux / Rocky 9" }, { codename: "el8", label: "RHEL / AlmaLinux / Rocky 8" }, - { codename: "fc41", label: "Fedora 41" }, - { codename: "fc40", label: "Fedora 40" }, + { codename: "fc44", label: "Fedora 44" }, + { codename: "fc43", label: "Fedora 43" }, ], }, { @@ -101,9 +104,11 @@ function detectBaseImage(content) { distribution = `fc${ver}`; } else { const aptCodenames = { + "resolute": "resolute", "26.04": "resolute", "noble": "noble", "24.04": "noble", "jammy": "jammy", "22.04": "jammy", "focal": "focal", "20.04": "focal", + "trixie": "trixie", "bookworm": "bookworm", "bullseye": "bullseye", "buster": "buster", }; for (const [key, codename] of Object.entries(aptCodenames)) { diff --git a/frontend/src/pages/ImportPage.js b/frontend/src/pages/ImportPage.js index 2355940..1db87e8 100755 --- a/frontend/src/pages/ImportPage.js +++ b/frontend/src/pages/ImportPage.js @@ -239,19 +239,31 @@ const DISTRIBUTIONS = [ { codename: "jammy", label: "Jammy 22.04 (LTS)", format: "deb" }, { codename: "noble", label: "Noble 24.04", format: "deb" }, { codename: "focal", label: "Focal 20.04", format: "deb" }, + { codename: "resolute", label: "Resolute 26.04 (LTS)", format: "deb" }, + { codename: "trixie", label: "Trixie 13", format: "deb" }, { codename: "bookworm", label: "Bookworm 12", format: "deb" }, // RPM — RHEL family + { codename: "almalinux10", label: "AlmaLinux 10", format: "rpm" }, { codename: "almalinux9", label: "AlmaLinux 9", format: "rpm" }, { codename: "almalinux8", label: "AlmaLinux 8", format: "rpm" }, + { codename: "rocky10", label: "Rocky 10", format: "rpm" }, { codename: "rocky9", label: "Rocky 9", format: "rpm" }, { codename: "rocky8", label: "Rocky 8", format: "rpm" }, + { codename: "centos-stream10", label: "CentOS Stream 10", format: "rpm" }, { codename: "centos-stream9", label: "CentOS Stream 9", format: "rpm" }, + { codename: "oraclelinux10", label: "Oracle Linux 10", format: "rpm" }, { codename: "oraclelinux9", label: "Oracle Linux 9", format: "rpm" }, - { codename: "fedora", label: "Fedora", format: "rpm" }, + { codename: "fedora44", label: "Fedora 44", format: "rpm" }, + { codename: "fedora43", label: "Fedora 43", format: "rpm" }, + { codename: "fedora", label: "Fedora 42 (EOL)", format: "rpm" }, // RPM — openSUSE + { codename: "opensuse-leap-16.0", label: "openSUSE Leap 16.0", format: "rpm" }, { codename: "opensuse-leap-15.6", label: "openSUSE Leap 15.6", format: "rpm" }, { codename: "opensuse-tumbleweed", label: "openSUSE Tumbleweed", format: "rpm" }, // APK — Alpine Linux + { codename: "alpine3.24", label: "Alpine 3.24", format: "apk" }, + { codename: "alpine3.23", label: "Alpine 3.23", format: "apk" }, + { codename: "alpine3.22", label: "Alpine 3.22", format: "apk" }, { codename: "alpine3.21", label: "Alpine 3.21", format: "apk" }, { codename: "alpine3.20", label: "Alpine 3.20", format: "apk" }, { codename: "alpine3.19", label: "Alpine 3.19", format: "apk" }, @@ -263,24 +275,36 @@ function guessDistrib(distro) { // APT if (distro.startsWith("focal")) return "focal"; if (distro.startsWith("noble")) return "noble"; + if (distro.startsWith("resolute")) return "resolute"; + if (distro.startsWith("trixie")) return "trixie"; if (distro.startsWith("bookworm")) return "bookworm"; if (distro.startsWith("jammy")) return "jammy"; // RPM + if (distro.includes("almalinux10")) return "almalinux10"; if (distro.includes("almalinux9")) return "almalinux9"; if (distro.includes("almalinux8")) return "almalinux8"; + if (distro.includes("rocky10")) return "rocky10"; if (distro.includes("rocky9")) return "rocky9"; if (distro.includes("rocky8")) return "rocky8"; + if (distro.includes("centos") && distro.includes("10")) return "centos-stream10"; if (distro.includes("centos")) return "centos-stream9"; + if (distro.includes("oracle") && distro.includes("10")) return "oraclelinux10"; if (distro.includes("oracle") && distro.includes("9")) return "oraclelinux9"; + if (distro.includes("fedora44")) return "fedora44"; + if (distro.includes("fedora43")) return "fedora43"; if (distro.includes("fedora")) return "fedora"; if (distro.includes("tumbleweed")) return "opensuse-tumbleweed"; + if (distro.includes("leap") && distro.includes("16")) return "opensuse-leap-16.0"; if (distro.includes("leap")) return "opensuse-leap-15.6"; // APK — Alpine + if (distro.includes("alpine3.24")) return "alpine3.24"; + if (distro.includes("alpine3.23")) return "alpine3.23"; + if (distro.includes("alpine3.22")) return "alpine3.22"; if (distro.includes("alpine3.21")) return "alpine3.21"; if (distro.includes("alpine3.20")) return "alpine3.20"; if (distro.includes("alpine3.19")) return "alpine3.19"; if (distro.includes("alpine3.18")) return "alpine3.18"; - if (distro.includes("alpine")) return "alpine3.21"; + if (distro.includes("alpine")) return "alpine3.24"; return "jammy"; } diff --git a/frontend/src/pages/PromotionsPage.js b/frontend/src/pages/PromotionsPage.js index 816c183..dd5605d 100644 --- a/frontend/src/pages/PromotionsPage.js +++ b/frontend/src/pages/PromotionsPage.js @@ -37,6 +37,8 @@ const DIST_COLORS = { jammy: { bg: "#EFF6FF", text: "#1D4ED8", border: "#BFDBFE" }, noble: { bg: "#F0FDF4", text: "#15803D", border: "#BBF7D0" }, focal: { bg: "#FFF7ED", text: "#C2410C", border: "#FED7AA" }, + resolute: { bg: "#F5F3FF", text: "#6D28D9", border: "#DDD6FE" }, + trixie: { bg: "#FEF2F2", text: "#B91C1C", border: "#FECACA" }, bookworm: { bg: "#FDF4FF", text: "#7E22CE", border: "#E9D5FF" }, bullseye: { bg: "#FEF9C3", text: "#854D0E", border: "#FEF08A" }, }; diff --git a/frontend/src/pages/SettingsPage.js b/frontend/src/pages/SettingsPage.js index 44debcc..53275a3 100644 --- a/frontend/src/pages/SettingsPage.js +++ b/frontend/src/pages/SettingsPage.js @@ -28,32 +28,54 @@ const SOURCE_META = { "ubuntu-jammy-updates": { label: "Ubuntu 22.04 (Jammy) — updates", security: false, format: "deb" }, "ubuntu-noble": { label: "Ubuntu 24.04 (Noble) — base", security: false, format: "deb" }, "ubuntu-focal": { label: "Ubuntu 20.04 (Focal) — base", security: false, format: "deb" }, + "ubuntu-resolute": { label: "Ubuntu 26.04 (Resolute) — base", security: false, format: "deb" }, + "ubuntu-resolute-updates": { label: "Ubuntu 26.04 (Resolute) — updates", security: true, format: "deb" }, "debian-bookworm": { label: "Debian 12 (Bookworm) — base", security: false, format: "deb" }, + "debian-trixie": { label: "Debian 13 (Trixie) — base", security: false, format: "deb" }, + "debian-trixie-contrib": { label: "Debian 13 (Trixie) — contrib", security: false, format: "deb" }, + "debian-trixie-updates": { label: "Debian 13 (Trixie) — updates", security: true, format: "deb" }, "ubuntu-jammy-security": { label: "Ubuntu 22.04 Security", security: true, format: "deb" }, "ubuntu-noble-security": { label: "Ubuntu 24.04 Security", security: true, format: "deb" }, "ubuntu-focal-security": { label: "Ubuntu 20.04 Security", security: true, format: "deb" }, + "ubuntu-resolute-security": { label: "Ubuntu 26.04 Security", security: true, format: "deb" }, "debian-bookworm-security": { label: "Debian 12 Security", security: true, format: "deb" }, + "debian-trixie-security": { label: "Debian 13 Security", security: true, format: "deb" }, // ── RPM (RHEL / Fedora / openSUSE) ─────────────────────────────────────── "almalinux8-baseos": { label: "AlmaLinux 8 — BaseOS", security: false, format: "rpm" }, "almalinux8-appstream": { label: "AlmaLinux 8 — AppStream", security: false, format: "rpm" }, "almalinux8-extras": { label: "AlmaLinux 8 — Extras", security: false, format: "rpm" }, "almalinux9-baseos": { label: "AlmaLinux 9 — BaseOS", security: false, format: "rpm" }, "almalinux9-appstream": { label: "AlmaLinux 9 — AppStream", security: false, format: "rpm" }, + "almalinux10-baseos": { label: "AlmaLinux 10 — BaseOS", security: false, format: "rpm" }, + "almalinux10-appstream": { label: "AlmaLinux 10 — AppStream", security: false, format: "rpm" }, "rocky8-baseos": { label: "Rocky Linux 8 — BaseOS", security: false, format: "rpm" }, "rocky8-appstream": { label: "Rocky Linux 8 — AppStream", security: false, format: "rpm" }, "rocky9-baseos": { label: "Rocky Linux 9 — BaseOS", security: false, format: "rpm" }, "rocky9-appstream": { label: "Rocky Linux 9 — AppStream", security: false, format: "rpm" }, + "rocky10-baseos": { label: "Rocky Linux 10 — BaseOS", security: false, format: "rpm" }, + "rocky10-appstream": { label: "Rocky Linux 10 — AppStream", security: false, format: "rpm" }, "centos-stream9-baseos": { label: "CentOS Stream 9 — BaseOS", security: false, format: "rpm" }, "centos-stream9-appstream": { label: "CentOS Stream 9 — AppStream", security: false, format: "rpm" }, + "centos-stream10-baseos": { label: "CentOS Stream 10 — BaseOS", security: false, format: "rpm" }, + "centos-stream10-appstream":{ label: "CentOS Stream 10 — AppStream", security: false, format: "rpm" }, "oraclelinux8-baseos": { label: "Oracle Linux 8 — BaseOS", security: false, format: "rpm" }, "oraclelinux8-appstream": { label: "Oracle Linux 8 — AppStream", security: false, format: "rpm" }, "oraclelinux9-baseos": { label: "Oracle Linux 9 — BaseOS", security: false, format: "rpm" }, - "fedora42": { label: "Fedora 42", security: false, format: "rpm" }, - "fedora42-updates": { label: "Fedora 42 — Updates", security: false, format: "rpm" }, + "oraclelinux9-appstream": { label: "Oracle Linux 9 — AppStream", security: false, format: "rpm" }, + "oraclelinux10-baseos": { label: "Oracle Linux 10 — BaseOS", security: false, format: "rpm" }, + "oraclelinux10-appstream": { label: "Oracle Linux 10 — AppStream", security: false, format: "rpm" }, + "fedora42": { label: "Fedora 42 (EOL)", security: false, format: "rpm" }, + "fedora42-updates": { label: "Fedora 42 — Updates (EOL)", security: false, format: "rpm" }, + "fedora43": { label: "Fedora 43", security: false, format: "rpm" }, + "fedora43-updates": { label: "Fedora 43 — Updates", security: true, format: "rpm" }, + "fedora44": { label: "Fedora 44", security: false, format: "rpm" }, + "fedora44-updates": { label: "Fedora 44 — Updates", security: true, format: "rpm" }, "epel8": { label: "EPEL 8 (extras RHEL 8)", security: false, format: "rpm" }, "epel9": { label: "EPEL 9 (extras RHEL 9)", security: false, format: "rpm" }, + "epel10": { label: "EPEL 10 (extras RHEL 10)", security: false, format: "rpm" }, "opensuse-leap-15.6-oss": { label: "openSUSE Leap 15.6 — OSS", security: false, format: "rpm" }, "opensuse-leap-15.6-updates":{ label: "openSUSE Leap 15.6 — Updates", security: false, format: "rpm" }, + "opensuse-leap-16.0-oss": { label: "openSUSE Leap 16.0 — OSS", security: false, format: "rpm" }, "opensuse-tumbleweed-oss": { label: "openSUSE Tumbleweed — OSS", security: false, format: "rpm" }, // ── APK (Alpine Linux) ─────────────────────────────────────────────────── "alpine3.18-main": { label: "Alpine 3.18 — main", security: false, format: "apk" }, @@ -64,6 +86,12 @@ const SOURCE_META = { "alpine3.20-community": { label: "Alpine 3.20 — community", security: false, format: "apk" }, "alpine3.21-main": { label: "Alpine 3.21 — main", security: false, format: "apk" }, "alpine3.21-community": { label: "Alpine 3.21 — community", security: false, format: "apk" }, + "alpine3.22-main": { label: "Alpine 3.22 — main", security: false, format: "apk" }, + "alpine3.22-community": { label: "Alpine 3.22 — community", security: false, format: "apk" }, + "alpine3.23-main": { label: "Alpine 3.23 — main", security: false, format: "apk" }, + "alpine3.23-community": { label: "Alpine 3.23 — community", security: false, format: "apk" }, + "alpine3.24-main": { label: "Alpine 3.24 — main", security: false, format: "apk" }, + "alpine3.24-community": { label: "Alpine 3.24 — community", security: false, format: "apk" }, }; // ─── Composants utilitaires ─────────────────────────────────────────────────── @@ -1534,7 +1562,7 @@ services: context: . args: RPM_REPO_URL: "${RPM_REPO_URL}" - RPM_DISTRO: "almalinux9" # almalinux8/9 | rocky8/9 | centos-stream9 | fedora + RPM_DISTRO: "almalinux9" # almalinux8/9/10 | rocky8/9/10 | centos-stream9/10 | fedora43/44 # Dockerfile correspondant : # FROM almalinux:9 @@ -1556,7 +1584,7 @@ services: context: . args: APK_REPO_URL: "${REPO_URL}" - ALPINE_VERSION: "alpine3.21" # alpine3.18 | alpine3.19 | alpine3.20 | alpine3.21 + ALPINE_VERSION: "alpine3.24" # alpine3.18 → alpine3.24 # Dockerfile correspondant : # FROM alpine:3.21 @@ -1614,7 +1642,7 @@ services: image: alpine:3.21 environment: <<: *repod-env - ALPINE_VERSION: "alpine3.21" + ALPINE_VERSION: "alpine3.24" command: | sh -c " echo $$APK_REPO_URL/apk/$$ALPINE_VERSION/main >> /etc/apk/repositories From 557c9657482aec0c90b5dfbbb3bd86edd2325257 Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:08:55 +0200 Subject: [PATCH 7/8] fix(frontend): update axios dependency and correct package version --- frontend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a2e7576..9386b7d 100755 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,15 +1,15 @@ { "name": "apt-repo-manager", - "version": "2.0.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "apt-repo-manager", - "version": "2.0.0", + "version": "1.0.0", "license": "AGPL-3.0-only", "dependencies": { - "axios": "^1.3.4", + "axios": "^1.7.9", "react": "^18.2.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", From 870a83f64c624ca2a1566d6af143874f3bd85a0d Mon Sep 17 00:00:00 2001 From: TiotBenjy <66011955+TiotBenjy@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:38:20 +0200 Subject: [PATCH 8/8] feat(tests): add dynamic configuration writing for APT distributions and enhance completeness checks --- backend/tests/test_arch_disambiguation.py | 56 ++++++++++++++--------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/backend/tests/test_arch_disambiguation.py b/backend/tests/test_arch_disambiguation.py index aca27ac..839287c 100644 --- a/backend/tests/test_arch_disambiguation.py +++ b/backend/tests/test_arch_disambiguation.py @@ -203,37 +203,51 @@ class TestDistributionsConfSelfHeal: répare tout seul au prochain redémarrage plutôt que de rester bloqué en amd64-only indéfiniment.""" + @staticmethod + def _write_conf(conf_dir, architectures: str) -> None: + """ + Écrit un conf/distributions listant TOUTES les distributions APT + connues, avec la ligne Architectures fournie. + + Le contenu est dérivé de _DIST_META plutôt que codé en dur : ces deux + tests portent sur la ligne Architectures, pas sur la liste des + distributions — les figer ici ferait échouer le test "complet" à + chaque ajout d'une distro (trixie, resolute…) alors que le code se + comporte correctement. + """ + from routers.distributions_router import _DIST_META + + blocks = [ + f"Origin: Repod\nLabel: {meta['label']}\nCodename: {codename}\n" + f"Architectures: {architectures}\nComponents: main\n" + for codename, meta in _DIST_META.items() + if meta.get("pkg_type") != "apk" + ] + (conf_dir / "distributions").write_text("\n".join(blocks)) + def test_amd64_only_conf_is_incomplete(self, tmp_path): from routers.distributions_router import _distributions_conf_is_complete - conf_dir = tmp_path - (conf_dir / "distributions").write_text( - "Origin: Repod\nLabel: Ubuntu 22.04 LTS\nCodename: jammy\n" - "Architectures: amd64\nComponents: main\n\n" - "Origin: Repod\nLabel: Ubuntu 24.04 LTS\nCodename: noble\n" - "Architectures: amd64\nComponents: main\n\n" - "Origin: Repod\nLabel: Ubuntu 20.04 LTS\nCodename: focal\n" - "Architectures: amd64\nComponents: main\n\n" - "Origin: Repod\nLabel: Debian 12\nCodename: bookworm\n" - "Architectures: amd64\nComponents: main\n" - ) - assert _distributions_conf_is_complete(conf_dir) is False + self._write_conf(tmp_path, "amd64") + assert _distributions_conf_is_complete(tmp_path) is False def test_amd64_and_arm64_conf_is_complete(self, tmp_path): from routers.distributions_router import _distributions_conf_is_complete - conf_dir = tmp_path - (conf_dir / "distributions").write_text( + self._write_conf(tmp_path, "amd64 arm64") + assert _distributions_conf_is_complete(tmp_path) is True + + def test_missing_distribution_is_incomplete(self, tmp_path): + """Une distro APT connue absente du fichier doit déclencher la + régénération — c'est ce qui fait apparaître trixie/resolute sur un + déploiement initialisé avant leur ajout.""" + from routers.distributions_router import _distributions_conf_is_complete + + (tmp_path / "distributions").write_text( "Origin: Repod\nLabel: Ubuntu 22.04 LTS\nCodename: jammy\n" - "Architectures: amd64 arm64\nComponents: main\n\n" - "Origin: Repod\nLabel: Ubuntu 24.04 LTS\nCodename: noble\n" - "Architectures: amd64 arm64\nComponents: main\n\n" - "Origin: Repod\nLabel: Ubuntu 20.04 LTS\nCodename: focal\n" - "Architectures: amd64 arm64\nComponents: main\n\n" - "Origin: Repod\nLabel: Debian 12\nCodename: bookworm\n" "Architectures: amd64 arm64\nComponents: main\n" ) - assert _distributions_conf_is_complete(conf_dir) is True + assert _distributions_conf_is_complete(tmp_path) is False def test_missing_file_is_incomplete(self, tmp_path): from routers.distributions_router import _distributions_conf_is_complete