From d8e67fe861fd358db72d3ed51b519774230c1ac3 Mon Sep 17 00:00:00 2001 From: nocode Date: Fri, 3 Jul 2026 23:59:09 +0200 Subject: [PATCH] refactor(anaconda): clarify payload mechanism and enhance desktop environment configurations Update interactive-defaults.ks kickstart file with: - Clarified documentation on LiveOS payload detection and mounting via /run/rootfsbase bind-mount instead of direct liveimg directive - Added comprehensive comments explaining why liveimg directive is intentionally omitted and how anaconda --liveinst handles payload creation - Enhanced XFCE and Hyprland package sets with noto-fonts for proper TTF rendering and additional tools (thunar, hyprlock, grim, slurp, wl-clipboard, playerctl) - Implemented SDDM theme configuration with FWS theme support and accent colors per desktop environment (teal for XFCE, Catppuccin blue for Hyprland, Breeze blue for KDE) - Added GDM (GNOME) configuration via dconf with welcome banner, clock enhancements, and numlock settings - Expanded Waybar configuration installation for Hyprland with config and style files - Added comprehensive documentation for greeter customization and Hyprland VM compatibility - Included details about FWS recap spoke (standalone GUI summary screen) replacing zenity-based pre-install approach --- .../share/anaconda/interactive-defaults.ks | 127 ++++++++++++++---- 1 file changed, 102 insertions(+), 25 deletions(-) diff --git a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks index e973570..5ad44c3 100644 --- a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks +++ b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks @@ -5,33 +5,36 @@ # lancée en mode interactif (chemin fixe codé en dur dans Anaconda : # /usr/share/anaconda/interactive-defaults.ks). Aucun inst.ks= n'est requis. # -# RÔLE : empêcher Anaconda d'installer Fedora. +# RÔLE : finaliser une install « copie du live » (surtout pas Fedora). # ---------------------------------------------------------------------------- -# Sans payload défini, Anaconda utilise DNF → des RPM depuis les dépôts -# Fedora = il installe Fedora. Anaconda n'a AUCUN backend pacman. La seule -# façon de poser FWS/Arch est le payload « liveimg » : il recopie une image -# de système de fichiers (ici le squashfs du live = FWS) sur le disque, puis -# on finalise nous-mêmes (grub, mkinitcpio, bureau) en %post. C'est le modèle -# « Sabayon » : le système installé EST une copie du live. +# Anaconda n'a AUCUN backend pacman ; son payload par défaut (DNF) poserait +# des RPM Fedora. Ici le payload est LiveOS, imposé par « anaconda --liveinst » +# (cf. bloc « Source d'installation » ci-dessous) : il recopie le squashfs du +# live (= FWS) sur le disque, puis on finalise nous-mêmes (grub, mkinitcpio, +# bureau) en %post. C'est le modèle « Sabayon » : le système installé EST une +# copie du live. # # L'utilisateur garde la main dans le GUI sur tout ce qui N'EST PAS fixé ici : # partitionnement, fuseau, clavier, langue, création d'utilisateur, mot de # passe root, etc. # ============================================================================ -# --- Source d'installation : l'image du live (FWS), surtout pas Fedora ------- -# Squashfs archiso sur le média booté : -# /run/archiso/bootmnt///airootfs.sfs -# install_dir=fws, arch=x86_64, airootfs_image_type=squashfs (cf. profiledef.sh). -# Anaconda loop-monte ce .sfs et rsync son contenu vers la cible. +# --- Source d'installation : le payload LiveOS (surtout pas Fedora/DNF) ------ +# AUCUNE directive de payload ici, et c'est VOULU. liveinst lance +# « anaconda --liveinst » et anaconda.py teste opts.liveinst AVANT le type du +# payload DBus → il crée TOUJOURS un payload LiveOS et IGNORE tout payload du +# kickstart (un « liveimg » ici serait du code mort — vérifié dans +# pyanaconda/anaconda.py, propriété payload, et reproduit hors VM). # -# ⚠ À VALIDER sur ISO réelle : certaines versions d'Anaconda attendent une -# structure « LiveOS/rootfs.img » à l'intérieur du squashfs (format Fedora -# Live) et non un squashfs « plat » comme celui d'archiso. Si l'install -# échoue à monter la source, basculer sur un tarball de rootfs dédié : -# liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/fws-rootfs.tar.gz -# (un build-rootfs.sh produirait alors ce tar via pacstrap). -liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/airootfs.sfs +# Le payload LiveOS détecte l'image live via /dev/mapper/live-base ou +# /run/rootfsbase (chemins Fedora/dracut, absents d'archiso → c'était le crash +# « SourceSetupError: No Live OS image found! » au démarrage). Le .xinitrc du +# live bind-monte donc /run/archiso/airootfs (squashfs FWS, ro) sur +# /run/rootfsbase AVANT de lancer liveinst : Anaconda monte le loop device et +# rsync son contenu vers la cible = le système installé EST une copie du live, +# puis on finalise en %post (grub, mkinitcpio, bureau, matériel). +# DNF/libdnf5 n'est jamais importé : le module DNF n'est chargé QUE si le +# payload actif est DNF (import lazy dans modules/payloads/payload/factory.py). # --- Disque : repartir d'un disque PROPRE, même s'il a déjà servi ------------ # Sans ça, une réinstallation sur un disque déjà partitionné (typiquement une @@ -69,9 +72,21 @@ clearpart --all --initlabel --disklabel=msdos # partitionnement (auto ou manuel) car la plateforme l'impose. bootloader --disabled -# Pas de section %packages : le payload liveimg n'installe aucun paquet +# Pas de section %packages : le payload LiveOS n'installe aucun paquet # (il copie une image). Toute installation de paquets se fait en %post. +# --- Récapitulatif avant installation : PAGE GUI dédiée (pas de %pre-install) - +# L'écran « RÉCAPITULATIF AVANT INSTALLATION » est une standalone spoke +# Anaconda (overlay airootfs : pyanaconda/ui/gui/spokes/fws_recap.py, +# postForHub=SummaryHub, priority -10) intercalée ENTRE le hub et l'écran de +# progression : l'utilisateur clique « Commencer l'installation », voit le +# récap (bureau choisi, hostname, disques, GPU, réseau — AUCUNE écriture +# disque à ce stade), et l'installation ne démarre qu'à son clic « Lancer +# l'installation ». L'ancien récap zenity en %pre-install a été abandonné : +# le module scripts tourne avec LC_ALL=C et un env X incertain (zenity 4 +# refuse les libellés UTF-8 en locale C → rc=255 pris pour « Annuler » → +# poweroff en plein install au 1er test réel). + # ============================================================================ # %post --nochroot — s'exécute dans le LIVE, la cible montée sous /mnt/sysroot @@ -250,8 +265,13 @@ DM="" case "$DESK" in kde) PKGS="plasma-meta sddm konsole dolphin"; DM="sddm" ;; gnome) PKGS="gnome gdm"; DM="gdm" ;; - xfce) PKGS="xfce4 xfce4-goodies sddm"; DM="sddm" ;; - hyprland) PKGS="hyprland kitty wofi waybar sddm"; DM="sddm" ;; + # noto-fonts : KDE l'a via plasma-meta et GNOME a cantarell, mais XFCE et + # Hyprland ne garantissent AUCUNE police TTF → greeter SDDM/apps illisibles. + # Hyprland : la stack des raccourcis FWS (mêmes touches que la config + # i3/sway maison) — thunar (Super+E), hyprlock (Super+L), grim+slurp+ + # wl-clipboard (captures), playerctl (touches multimédia). + xfce) PKGS="xfce4 xfce4-goodies sddm noto-fonts"; DM="sddm" ;; + hyprland) PKGS="hyprland kitty wofi waybar sddm noto-fonts thunar hyprlock grim slurp wl-clipboard playerctl"; DM="sddm" ;; cli|*) PKGS="" ;; esac # Navigateur de base ajouté DÈS QU'un bureau est choisi (jamais en CLI). @@ -262,10 +282,60 @@ if [ -n "$PKGS" ]; then if pacman -Sy --noconfirm $PKGS; then [ -n "$DM" ] && systemctl enable "$DM" || true systemctl set-default graphical.target || true - # SDDM (KDE / XFCE / Hyprland) : pavé numérique allumé au login. + # SDDM (KDE / XFCE / Hyprland) : pavé numérique + écran de connexion FWS. + # Le thème « fws » (livré par l'airootfs → recopié par le payload dans + # /usr/share/sddm/themes/fws) est en pur QtQuick/Controls Basic : + # qt6-declarative, dépendance de sddm, suffit → même écran soigné pour + # les 3 DE SANS paquet de thème supplémentaire (Breeze n'existe qu'avec + # plasma). Accent adapté au bureau via theme.conf.user (mécanisme de + # surcharge standard de SDDM, lu par-dessus theme.conf du thème). if [ "$DM" = "sddm" ]; then install -d /etc/sddm.conf.d - printf '[General]\nNumlock=on\n' > /etc/sddm.conf.d/10-fws.conf + cat > /etc/sddm.conf.d/10-fws.conf <<'SDDMEOF' +[General] +Numlock=on + +[Theme] +Current=fws +SDDMEOF + case "$DESK" in + xfce) _ACCENT="#16a085" ;; # sarcelle (assorti à XFCE) + hyprland) _ACCENT="#89b4fa" ;; # bleu Catppuccin (assorti à Hyprland) + *) _ACCENT="#3daee9" ;; # bleu Breeze (KDE, défaut) + esac + if [ -d /usr/share/sddm/themes/fws ]; then + printf '[General]\naccent=%s\n' "$_ACCENT" \ + > /usr/share/sddm/themes/fws/theme.conf.user + else + echo "[FWS] thème SDDM fws introuvable — thème par défaut conservé" + sed -i '/^Current=fws$/d' /etc/sddm.conf.d/10-fws.conf + fi + fi + # GDM (GNOME) : « la même chose » autant que possible — le greeter de + # GDM EST GNOME Shell, il ne se thème pas comme SDDM. On passe par + # dconf (base système « gdm ») : bannière d'accueil FWS, horloge avec + # date complète, pavé numérique allumé — même confort qu'avec SDDM. + if [ "$DM" = "gdm" ]; then + install -d /etc/dconf/profile /etc/dconf/db/gdm.d + cat > /etc/dconf/profile/gdm <<'GDMEOF' +user-db:user +system-db:gdm +file-db:/usr/share/gdm/greeter-dconf-defaults +GDMEOF + cat > /etc/dconf/db/gdm.d/10-fws <<'GDMEOF' +[org/gnome/login-screen] +banner-message-enable=true +banner-message-text='Bienvenue sur FWS' + +[org/gnome/desktop/interface] +clock-show-date=true +clock-show-weekday=true + +[org/gnome/desktop/peripherals/keyboard] +numlock-state=true +remember-numlock-state=false +GDMEOF + dconf update || echo "[FWS] dconf update a échoué (bannière GDM à refaire)" fi # Hyprland en VM : sur GPU virtuel (VMware/VirtualBox) le compositeur # crashe au lancement → SDDM « remet au login ». On le lance via un @@ -317,11 +387,18 @@ if [ "$DESK" = "hyprland" ] && [ -f /usr/local/share/fws/hyprland.conf.tmpl ]; t sed -e "s/__KB_LAYOUT__/${XL:-us}/" -e "s/__KB_VARIANT__/${XV}/" \ /usr/local/share/fws/hyprland.conf.tmpl > /tmp/fws-hyprland.conf install -Dm644 /tmp/fws-hyprland.conf /etc/skel/.config/hypr/hyprland.conf + # Waybar FWS : barre assortie + bouton « ⌨ Raccourcis » (fws-hypr-keys, + # aussi sur SUPER+K) qui liste les binds RÉELS chargés par Hyprland + # (hyprctl binds -j) — les descriptions viennent des bindd de la config. + install -Dm644 /usr/local/share/fws/waybar-config.json /etc/skel/.config/waybar/config + install -Dm644 /usr/local/share/fws/waybar-style.css /etc/skel/.config/waybar/style.css while IFS=: read -r _u _x _uid _g _gec _home _sh; do [ "$_uid" -ge 1000 ] && [ "$_uid" -le 60000 ] && [ -d "$_home" ] || continue install -Dm644 /tmp/fws-hyprland.conf "$_home/.config/hypr/hyprland.conf" + install -Dm644 /usr/local/share/fws/waybar-config.json "$_home/.config/waybar/config" + install -Dm644 /usr/local/share/fws/waybar-style.css "$_home/.config/waybar/style.css" chown "$_u": "$_home/.config" 2>/dev/null || true - chown -R "$_u": "$_home/.config/hypr" 2>/dev/null || true + chown -R "$_u": "$_home/.config/hypr" "$_home/.config/waybar" 2>/dev/null || true done < /etc/passwd rm -f /tmp/fws-hyprland.conf fi