From 92bae9e4a62defbeb1033c298e4914b1c82ae878 Mon Sep 17 00:00:00 2001 From: nocode Date: Wed, 17 Jun 2026 15:45:15 +0200 Subject: [PATCH] feat(anaconda): integrate anaconda installer with openbox and add licensing documentation Add Anaconda installer integration to FWS live environment: - Implement Anaconda launcher in .xinitrc with comprehensive error logging and debugging support - Add anaconda and anaconda-widgets packages to baseline and releng ISO configs - Fix anaconda-widgets PKGBUILD: replace gladeui with glib2-devel, disable Glade module - Update anaconda PKGBUILD with improved dependencies and build configuration - Add python-blivet PKGBUILD with detailed dependency documentation Enhance documentation and branding: - Expand AUTHORS.rst to clarify FWS vs archiso authorship and licensing - Update CONTRIBUTING.rst with inbound=outbound licensing policy and DCO requirements - Extend README.md with comprehensive legal basis table and licensing checklist - Remove Arch Linux references from MOTD and update to FWS GitHub project page - Fix fastfetch.sh to avoid read-only variable conflict in zsh - Add xterm to packages for installer debugging All changes maintain GPL-3.0-or-later compliance and improve GPL offer transparency. --- AUTHORS.rst | 17 +++++- CONTRIBUTING.rst | 25 ++++++++- README.md | 19 ++++++- configs/baseline/airootfs/root/.xinitrc | 52 +++++++++++++++++-- configs/baseline/packages.x86_64 | 7 +++ configs/releng/airootfs/etc/motd | 11 ++-- .../airootfs/etc/profile.d/fastfetch.sh | 8 ++- configs/releng/packages.x86_64 | 5 ++ pkgbuilds/anaconda-widgets/PKGBUILD | 11 +++- pkgbuilds/anaconda/PKGBUILD | 37 ++++++++++--- pkgbuilds/python-blivet/PKGBUILD | 45 +++++++++++++--- 11 files changed, 203 insertions(+), 34 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 3f264bd..a302b77 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -1,7 +1,22 @@ -=============== +======= +Authors +======= + +FWS +=== + +FWS is a fork of archiso. The FWS-specific work (build chain, installer +integration, package recipes under ``pkgbuilds/``) is © the FWS contributors, +distributed under ``GPL-3.0-or-later`` (see ``COPYRIGHT.md``). + +* FWS contributors + Archiso Authors =============== +The build system (``mkarchiso``, profiles, man pages) derives from archiso and +retains the authorship of its original contributors: + * 2hexed <2hexed@protonmail.com> * Aaron Griffin * Adam Purkrt diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index ba8bf4a..345b77b 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -2,8 +2,29 @@ Contributing ============ -These are the contribution guidelines for archiso. -All contributions fall under the terms of the GPL-3.0-or-later (see `LICENSE `_). +These are the contribution guidelines for **FWS**. FWS is a fork of `archiso +`_; the build-system parts +derived from archiso retain their original history and authorship (see +`AUTHORS.rst `_). + +Licensing of contributions (inbound = outbound) +=============================================== + +All contributions are accepted under the **same license as the project**, +``GPL-3.0-or-later`` (see `LICENSE `_). By submitting a contribution you +agree that it is licensed under ``GPL-3.0-or-later`` and that you have the right +to submit it under that license. + +Sign off every commit to certify the `Developer Certificate of Origin 1.1 +`_: + + .. code:: bash + + git commit --signoff # adds a "Signed-off-by: Name " trailer + +For the full licensing, third-party and trademark picture, see `LICENSING.md +`_, `THIRD-PARTY-LICENSES.md `_ and +`TRADEMARKS.md `_. Editorconfig ============ diff --git a/README.md b/README.md index e4e17a7..17396b9 100644 --- a/README.md +++ b/README.md @@ -278,6 +278,21 @@ cat ~/.local/share/hyprland/hyprland.log FWS est un fork de **[archiso](https://gitlab.archlinux.org/archlinux/archiso)** (Arch Linux), redistribué sous les termes de la **GPL-3.0-or-later**. -Voir [LICENSE](LICENSE) pour le texte complet, et [AUTHORS.rst](AUTHORS.rst) pour la liste des auteurs originaux d'archiso. - Les modifications spécifiques à FWS (scripts `build.sh`, `setup-aur.sh`, overlay `configs/baseline/`, intégration de l'installateur + Xorg autostart, chaîne de build WSL) sont également distribuées sous GPL-3.0-or-later. + +### Base légale complète + +| Document | Objet | +|---|---| +| [LICENSE](LICENSE) | Texte intégral GPL-3.0-or-later | +| [COPYRIGHT.md](COPYRIGHT.md) | Droits d'auteur du dépôt & périmètre | +| [LICENSING.md](LICENSING.md) | Politique de licences, **offre écrite GPL (sources)**, checklist release | +| [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md) | Inventaire des logiciels tiers (Anaconda, deps…) & **analyse de compatibilité** | +| [TRADEMARKS.md](TRADEMARKS.md) | Marques & **non-affiliation** (Arch, Red Hat, Fedora, Anaconda, Windows…) | +| [NOTICE](NOTICE) | Attributions Apache/MIT/BSD | +| [AUTHORS.rst](AUTHORS.rst) | Auteurs FWS + auteurs originaux d'archiso | +| [CONTRIBUTING.rst](CONTRIBUTING.rst) | Contribuer (inbound = outbound, DCO) | + +> ✅ **Déjà réglé** : offre écrite GPL (URL dépôt + contact), `os-release` FWS (le live ne s'annonce plus « Arch Linux », via hook pacman) et `motd` (plus de lien `archlinux.org`). +> +> ⚠️ **Reste avant diffusion publique** (détail dans [LICENSING.md](LICENSING.md) §6) : **rendre le dépôt public** (sinon l'offre GPL n'est pas opposable), retirer le branding Red Hat/Fedora de l'UI Anaconda lors de la migration, et **trancher sur `python-iso639`** (AGPL-3.0-only). **Ces documents ne sont pas un avis juridique.** diff --git a/configs/baseline/airootfs/root/.xinitrc b/configs/baseline/airootfs/root/.xinitrc index 90ce31d..c71d957 100644 --- a/configs/baseline/airootfs/root/.xinitrc +++ b/configs/baseline/airootfs/root/.xinitrc @@ -6,8 +6,50 @@ fi xsetroot -solid "#1a1a2e" -# TODO (chantier C) : lancer l'installateur graphique Anaconda dans cette session. -# Calamares a été retiré (commit 05ae9c3) et son remplacement Anaconda n'est pas -# encore câblé. En attendant, on lance Openbox au premier plan : le serveur X a -# ainsi un client (sinon startx rendrait la main et X se fermerait aussitôt). -exec openbox +# Openbox en arrière-plan : gestionnaire de fenêtres pour l'installateur. +openbox & +_OB_PID=$! + +# Chantier C : lance l'installateur Anaconda en mode live s'il est présent. +# « liveinst » re-exécute anaconda (ici on est déjà root → pas de pkexec/polkit). +# +# DEBUG (premier run réel) : on CAPTURE stdout+stderr — un plantage d'import +# précoce de Python n'apparaît QUE là, pas dans /tmp/anaconda.log — et, si +# liveinst quitte en erreur, on regroupe tous les logs Anaconda et on les AFFICHE +# (zenity) au lieu de laisser startx rendre la main → .zprofile relancerait X en +# boucle (symptôme « fond bleu qui clignote/reboote »). On NE rend jamais la main +# à startx : on reste sur Openbox pour lire les logs / rebooter proprement. +if command -v liveinst >/dev/null 2>&1; then + LIVEINST_LOG=/tmp/fws-liveinst.log + liveinst >"$LIVEINST_LOG" 2>&1 + rc=$? + + # ATTENTION : liveinst NE propage PAS le code de sortie d'anaconda — il + # enchaîne son propre nettoyage et sort souvent 0 même quand anaconda a + # planté. On ne se fie donc PAS à $rc : en phase debug on regroupe TOUS les + # logs et on les affiche systématiquement (zenity). Le traceback Python d'un + # crash d'import précoce n'est QUE dans $LIVEINST_LOG (stderr capturé). + DBG=/tmp/fws-debug.txt + { + echo "===== liveinst sorti (code $rc) — logs Anaconda =====" + echo + echo "########## sortie liveinst (stdout+stderr) ##########" + cat "$LIVEINST_LOG" 2>/dev/null + for f in /tmp/anaconda.log /tmp/syslog /tmp/program.log \ + /tmp/storage.log /tmp/dbus.log /tmp/packaging.log /tmp/X.log; do + echo + echo "########## $f ##########" + tail -n 200 "$f" 2>/dev/null || echo "(absent)" + done + } >"$DBG" 2>&1 + + if command -v zenity >/dev/null 2>&1; then + zenity --text-info --title="FWS — logs Anaconda (sortie $rc)" \ + --filename="$DBG" --width=1100 --height=720 2>/dev/null & + fi + + wait "$_OB_PID" +else + echo "[FWS] Anaconda absent de l'ISO — à builder (setup-aur.sh) + ajouter à packages.x86_64." >&2 + exec openbox +fi diff --git a/configs/baseline/packages.x86_64 b/configs/baseline/packages.x86_64 index fefdc76..bcf670f 100644 --- a/configs/baseline/packages.x86_64 +++ b/configs/baseline/packages.x86_64 @@ -93,6 +93,8 @@ xorg-xrandr xorg-xsetroot openbox ttf-dejavu +# Terminal X : debug de l'installateur + entrée « Terminals » du menu Openbox. +xterm # --- Agents VM (pratique pour tester l'ISO) --- qemu-guest-agent @@ -101,3 +103,8 @@ open-vm-tools # --- FWS (fws-local) --- winboat-bin + +# --- Installateur Anaconda (fws-local) --- +# 'anaconda' tire automatiquement anaconda-widgets + toutes ses dépendances +# (python-blivet, pykickstart, libreport, gtk3, NetworkManager…). +anaconda diff --git a/configs/releng/airootfs/etc/motd b/configs/releng/airootfs/etc/motd index 6b5ef01..4ee1ee5 100644 --- a/configs/releng/airootfs/etc/motd +++ b/configs/releng/airootfs/etc/motd @@ -1,11 +1,8 @@ -To install FWS follow the installation guide: -https://wiki.archlinux.org/title/Installation_guide +Welcome to FWS live media. + +To install FWS, see the project page: +https://github.com/You-re-like-Windows-a-bitch/fws For Wi-Fi, authenticate to the wireless network using the iwctl utility. For mobile broadband (WWAN) modems, connect with the mmcli utility. Ethernet, WLAN and WWAN interfaces using DHCP should work automatically. - -After connecting to the internet, the installation guide can be accessed -via the convenience script Installation_guide. - -                                           diff --git a/configs/releng/airootfs/etc/profile.d/fastfetch.sh b/configs/releng/airootfs/etc/profile.d/fastfetch.sh index 217559f..c058a2e 100644 --- a/configs/releng/airootfs/etc/profile.d/fastfetch.sh +++ b/configs/releng/airootfs/etc/profile.d/fastfetch.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash -status=$? -if [ "${status}" -eq 0 ]; then +# NB : ce fichier est SOURCÉ par le shell de login (zsh sur le live), pas exécuté +# → le shebang est ignoré. En zsh « status » est une variable spéciale EN LECTURE +# SEULE (alias de $?) : s'y affecter casse (« read-only variable: status »). +# On utilise donc un autre nom. +_fastfetch_rc=$? +if [ "${_fastfetch_rc}" -eq 0 ]; then fastfetch fi diff --git a/configs/releng/packages.x86_64 b/configs/releng/packages.x86_64 index 1e4ba04..5334d22 100644 --- a/configs/releng/packages.x86_64 +++ b/configs/releng/packages.x86_64 @@ -100,3 +100,8 @@ open-vm-tools # --- FWS (fws-local) --- winboat-bin + +# --- Installateur Anaconda (fws-local) --- +# 'anaconda' tire automatiquement anaconda-widgets + toutes ses dépendances +# (python-blivet, pykickstart, libreport, gtk3, NetworkManager…). +anaconda diff --git a/pkgbuilds/anaconda-widgets/PKGBUILD b/pkgbuilds/anaconda-widgets/PKGBUILD index 6d3cb24..f2fd008 100644 --- a/pkgbuilds/anaconda-widgets/PKGBUILD +++ b/pkgbuilds/anaconda-widgets/PKGBUILD @@ -13,18 +13,25 @@ arch=('x86_64') url="https://github.com/rhinstaller/anaconda" license=('GPL-2.0-or-later') depends=('gtk3' 'glib2' 'pango' 'gdk-pixbuf2' 'python-gobject') +# NB : pas de 'glade' — on désactive le module Glade (catalogue pour le designer, +# inutile au runtime). Sur Arch le paquet s'appelle 'glade' (pas 'gladeui'). +# glib2-devel : fournit gdbus-codegen / glib-mkenums / glib-genmarshal (outils +# de codegen GLib, scindés de glib2 sur Arch). Indispensable au build des widgets. makedepends=('autoconf' 'automake' 'libtool' 'gettext' 'intltool' - 'gobject-introspection' 'gtk-doc' 'gladeui' 'python') + 'gobject-introspection' 'gtk-doc' 'glib2-devel' 'python') source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz") sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed') _srcdir="anaconda-anaconda-$pkgver" build() { cd "$srcdir/$_srcdir/widgets" + # Glade désactivé : le flag doit être posé À LA FOIS pour autoreconf (variable + # d'env lue par m4 dans configure.ac) ET pour configure (--disable-glade). + export ANACONDA_DISABLE_GLADE=yes # autogen.sh : autoreconf -vfi + copie /usr/share/gettext/gettext.h dans src/. ./autogen.sh ./configure --prefix=/usr --libdir=/usr/lib \ - --disable-static --disable-gtk-doc --enable-introspection + --disable-static --disable-gtk-doc --disable-glade --enable-introspection make } diff --git a/pkgbuilds/anaconda/PKGBUILD b/pkgbuilds/anaconda/PKGBUILD index 22d7b62..9bff920 100644 --- a/pkgbuilds/anaconda/PKGBUILD +++ b/pkgbuilds/anaconda/PKGBUILD @@ -25,7 +25,7 @@ # ============================================================================ pkgname=anaconda pkgver=45.8 -pkgrel=1 +pkgrel=2 pkgdesc="The Anaconda installer (porté sur Arch pour FWS, payload liveimg)" arch=('x86_64') url="https://github.com/rhinstaller/anaconda" @@ -47,10 +47,11 @@ depends=( 'networkmanager' 'kbd' 'chrony' 'systemd' 'dbus' 'openssh' 'grub' 'libpwquality' 'python-systemd' 'python-xkbregistry' 'cracklib' ) +# NB : pas de 'glade' — module Glade désactivé au build (cf. build()). makedepends=( 'autoconf' 'automake' 'libtool' 'gettext' 'intltool' 'gtk-doc' - 'gobject-introspection' 'gladeui' 'python' 'gdk-pixbuf2' 'libxml2' - 'desktop-file-utils' 'glib2' 'libarchive' 'rpm-tools' + 'gobject-introspection' 'python' 'gdk-pixbuf2' 'libxml2' + 'desktop-file-utils' 'glib2-devel' 'libarchive' 'rpm-tools' ) source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz") sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed') @@ -58,11 +59,14 @@ _srcdir="anaconda-anaconda-$pkgver" build() { cd "$srcdir/$_srcdir" + # Glade désactivé (catalogue designer, inutile au runtime) → pas de dép glade. + # La variable d'env doit être posée AVANT autogen.sh (lue par m4 à l'autoreconf) + # EN PLUS du flag --disable-glade au configure. + export ANACONDA_DISABLE_GLADE=yes # autogen.sh : autoreconf -vfi racine + (cd widgets && ./autogen.sh). ./autogen.sh - # --disable-glade : pas de catalogue Glade (outil de design, inutile au run). # ANACONDA_RELEASE=1 : release réelle, pas la date de création du tarball. - ANACONDA_DISABLE_GLADE=yes ./configure \ + ./configure \ --prefix=/usr --libdir=/usr/lib --sysconfdir=/etc \ --disable-glade --disable-gtk-doc ANACONDA_RELEASE=1 make @@ -78,9 +82,30 @@ package() { "$pkgdir/usr/share/anaconda/post-scripts" # Fichiers widgets : fournis par le paquet anaconda-widgets → on les retire - # ici (le build principal recompile widgets/ via AC_CONFIG_SUBDIRS). + # ici (le build principal recompile widgets/ via AC_CONFIG_SUBDIRS) pour + # éviter le conflit de fichiers à l'install. On enlève TOUT l'empreinte + # widgets : lib, typelib, pkgconfig, headers, .gir, doc, override gi. rm -f "$pkgdir"/usr/lib/libAnacondaWidgets.so* rm -f "$pkgdir"/usr/lib/girepository-*/AnacondaWidgets*.typelib rm -f "$pkgdir"/usr/lib/pkgconfig/AnacondaWidgets.pc + rm -rf "$pkgdir"/usr/include/AnacondaWidgets + rm -f "$pkgdir"/usr/share/gir-1.0/AnacondaWidgets*.gir + rm -rf "$pkgdir"/usr/share/gtk-doc/html/AnacondaWidgets rm -f "$pkgdir"/usr/lib/python*/site-packages/gi/overrides/AnacondaWidgets* + + # interactive-defaults.ks : FWS le fournit via l'overlay airootfs + # (configs/*/airootfs/usr/share/anaconda/) avec le payload liveimg. mkarchiso + # copie l'overlay AVANT pacstrap → si le paquet livrait aussi ce fichier, pacman + # planterait (« exists in filesystem »). On retire donc la version amont : le + # fichier de l'overlay reste la seule à ce chemin, et anaconda le lit au runtime. + rm -f "$pkgdir"/usr/share/anaconda/interactive-defaults.ks + + # usr-merge Arch : /usr/sbin est un LIEN → /usr/bin. Anaconda installe dans + # /usr/sbin (vrai dossier sur Fedora) → conflit avec le paquet 'filesystem'. + # On rapatrie le contenu dans /usr/bin et on supprime le dossier sbin. + if [ -d "$pkgdir/usr/sbin" ] && [ ! -L "$pkgdir/usr/sbin" ]; then + install -d "$pkgdir/usr/bin" + cp -aT "$pkgdir/usr/sbin" "$pkgdir/usr/bin" + rm -rf "$pkgdir/usr/sbin" + fi } diff --git a/pkgbuilds/python-blivet/PKGBUILD b/pkgbuilds/python-blivet/PKGBUILD index 63fc69e..f6f82d9 100644 --- a/pkgbuilds/python-blivet/PKGBUILD +++ b/pkgbuilds/python-blivet/PKGBUILD @@ -2,23 +2,52 @@ # Dépendance de l'installateur Anaconda (rhinstaller) — couche d'abstraction # de gestion du stockage (partitions, LVM, LUKS, RAID). # -# VENDORISÉ depuis l'AUR (python-blivet) avec UNE seule modification FWS : -# retrait de 'libselinux' des depends. Arch n'est pas SELinux et blivet importe -# selinux en try/except (blivet/util.py + flags.py → HAVE_SELINUX/self.selinux -# = False si absent), donc il fonctionne sans. Ça évite de tirer toute la pile -# SELinux (libselinux/libsepol) de l'AUR juste pour une fonctionnalité inutile -# sur FWS. Tout le reste est identique à l'amont. +# VENDORISÉ depuis l'AUR (python-blivet) avec DEUX modifications FWS : +# +# 1. Retrait de 'libselinux' des depends. Arch n'est pas SELinux et blivet +# importe selinux en try/except (blivet/util.py + flags.py → +# HAVE_SELINUX/self.selinux = False si absent), donc il fonctionne sans. +# Ça évite de tirer toute la pile SELinux (libselinux/libsepol) de l'AUR +# juste pour une fonctionnalité inutile sur FWS. +# +# 2. depends COMPLÉTÉS. L'AUR ne déclare QUE 'libblockdev' → sur une vraie ISO +# blivet crashe à l'import. Il lui faut en plus : +# - python-libblockdev : l'OVERRIDE GObject-introspection +# (gi/overrides/BlockDev.py) qui définit les helpers (plugin_specs_from_names) +# ET les alias d'enum (DMTech.MAP, LoopTech, MDTech…) qu'utilise blivet. +# SANS lui : « AttributeError: 'gi.repository.BlockDev' object has no +# attribute 'plugin_specs_from_names' » puis « DMTech has no attribute MAP ». +# C'est LA pièce maîtresse (les symboles n'existent QUE dans cet override, +# pas dans le typelib ni l'amont libblockdev). +# - les 11 sous-paquets plugins libblockdev-* (sur Arch ils sont SÉPARÉS du +# cœur 'libblockdev') : sinon « failed to load module lvm: libbd_lvm.so.3 ». +# - libbytesize : fournit le module Python 'bytesize' (blivet/size.py). +# - python-dasbus : importé en dur (blivet/util.py). +# +# Tout le reste (code source) est identique à l'amont. _py='python' _pkg="blivet" pkgname="python-${_pkg}" pkgver=3.13.2 _tag="${_pkg}-${pkgver}" -pkgrel=1 +pkgrel=4 pkgdesc="A DBus service and python module for management of the system storage configuration (dépendance Anaconda)" arch=('any') license=('LGPL-2.1-only') depends=( 'libblockdev' + # Override GI (gi/overrides/BlockDev.py) : helpers + alias d'enum exigés par + # blivet. ABSENT du paquet 'libblockdev' → paquet séparé. Pièce maîtresse. + "${_py}-libblockdev" + # Plugins libblockdev : sous-paquets SÉPARÉS sur Arch (le cœur 'libblockdev' + # ne fournit PAS les libbd_*.so.3). blivet les charge à l'import via + # try_reinit() ; sans eux : « failed to load module lvm: libbd_lvm.so.3 ». + 'libblockdev-lvm' 'libblockdev-btrfs' 'libblockdev-swap' 'libblockdev-loop' + 'libblockdev-crypto' 'libblockdev-mpath' 'libblockdev-dm' 'libblockdev-mdraid' + 'libblockdev-part' 'libblockdev-fs' 'libblockdev-nvme' + # libbytesize fournit le module Python 'bytesize' (blivet/size.py: + # « from bytesize import bytesize ») — sinon ModuleNotFoundError. + 'libbytesize' 'lsof' 'multipath-tools' 'parted' @@ -27,6 +56,8 @@ depends=( "${_py}-pyparted" "${_py}-pyudev" "${_py}-gobject" + # blivet importe dasbus en dur (blivet/util.py: from dasbus.connection ...). + "${_py}-dasbus" 'systemd-libs' 'util-linux' )