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.
This commit is contained in:
2026-06-17 15:45:15 +02:00
parent 43c1053bd7
commit 92bae9e4a6
11 changed files with 203 additions and 34 deletions
+16 -1
View File
@@ -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 <suzuku295@gmail.com>
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 <aaron@archlinux.org>
* Adam Purkrt <adam@purkrt.net>
+23 -2
View File
@@ -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 <LICENSE>`_).
These are the contribution guidelines for **FWS**. FWS is a fork of `archiso
<https://gitlab.archlinux.org/archlinux/archiso>`_; the build-system parts
derived from archiso retain their original history and authorship (see
`AUTHORS.rst <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 <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
<https://developercertificate.org/>`_:
.. code:: bash
git commit --signoff # adds a "Signed-off-by: Name <email>" trailer
For the full licensing, third-party and trademark picture, see `LICENSING.md
<LICENSING.md>`_, `THIRD-PARTY-LICENSES.md <THIRD-PARTY-LICENSES.md>`_ and
`TRADEMARKS.md <TRADEMARKS.md>`_.
Editorconfig
============
+17 -2
View File
@@ -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.**
+46 -4
View File
@@ -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).
# 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
+7
View File
@@ -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
+4 -7
View File
@@ -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.
                                          
@@ -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
+5
View File
@@ -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
+9 -2
View File
@@ -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
}
+31 -6
View File
@@ -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
}
+38 -7
View File
@@ -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'
)