From ff98a1e1863c460c07ada2a83d0d054bd58ede18 Mon Sep 17 00:00:00 2001 From: nocode Date: Wed, 24 Jun 2026 19:02:31 +0200 Subject: [PATCH] fix(anaconda): improve desktop environment setup and system configuration - Fix XFCE display manager: replace lightdm-gtk-greeter with sddm for consistency - Add SDDM numlock initialization for KDE, XFCE, and Hyprland - Configure X11 keyboard layout from kickstart or locale via langtable to ensure correct SDDM login keyboard - Enable wheel group sudo access and add all human users to wheel group - Apply FWS branding to os-release, lsb-release, and GRUB configuration - Remove inappropriate live system motd file - Fix DNS resolution: configure systemd-resolved stub resolver with NetworkManager integration to prevent "Limited Connectivity" on first boot - Reformat case statement for better readability --- .../share/anaconda/interactive-defaults.ks | 95 +++++++++++++++++-- 1 file changed, 88 insertions(+), 7 deletions(-) diff --git a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks index 34e01cd..54f2b19 100644 --- a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks +++ b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks @@ -210,10 +210,10 @@ DESK="cli" [ -f /tmp/fws-desktop ] && DESK="$(tr -d '[:space:]' < /tmp/fws-desktop)" DM="" case "$DESK" in - kde) PKGS="plasma-meta sddm konsole dolphin"; DM="sddm" ;; - gnome) PKGS="gnome gdm"; DM="gdm" ;; - xfce) PKGS="xfce4 xfce4-goodies lightdm lightdm-gtk-greeter"; DM="lightdm" ;; - hyprland) PKGS="hyprland kitty wofi waybar sddm"; DM="sddm" ;; + 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" ;; cli|*) PKGS="" ;; esac # Navigateur de base ajouté DÈS QU'un bureau est choisi (jamais en CLI). @@ -224,11 +224,80 @@ 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. + if [ "$DM" = "sddm" ]; then + install -d /etc/sddm.conf.d + printf '[General]\nNumlock=on\n' > /etc/sddm.conf.d/10-fws.conf + fi else echo "[FWS] Bureau '$DESK' non installé (réseau ?) — à refaire après le 1er boot." fi fi +# --- Clavier X11 (SDDM + sessions graphiques) -------------------------------- +# SDDM et les sessions X/Wayland (kwin lit aussi ce fichier) prennent leur +# disposition de /etc/X11/xorg.conf.d/00-keyboard.conf. Anaconda passe par localed +# qui ne l'écrit pas fiablement sur la CIBLE → écran SDDM en QWERTY US → le mot de +# passe (tapé sur le clavier choisi, ex. suisse QWERTZ) ne correspond pas. On +# l'écrit donc nous-mêmes, depuis la disposition X CHOISIE (kickstart généré), +# sinon dérivée de la locale via langtable. Cohérent avec le clavier du GUI. +XKB="$(sed -n "s/.*--xlayouts=//p" /root/anaconda-ks.cfg 2>/dev/null | head -1)" +XKB="${XKB#[\'\"]}"; XKB="${XKB%%[\'\"]*}"; XKB="${XKB%%,*}" # 1re dispo, ex. « ch (fr) » +if [ -z "$XKB" ]; then + _loc="$(. /etc/locale.conf 2>/dev/null; printf '%s' "${LANG%%.*}")" # fr_CH + _lng="${_loc%%_*}"; _terr="${_loc#*_}"; [ "$_terr" = "$_loc" ] && _terr="" + [ -n "$_terr" ] && XKB="$(python3 -c "import langtable; k=langtable.list_keyboards(languageId='$_lng', territoryId='$_terr'); print(k[0] if k else '')" 2>/dev/null)" +fi +if [ -n "$XKB" ]; then + XL="${XKB%%(*}"; XL="${XL%% *}" # ch + case "$XKB" in *'('*')') XV="${XKB#*(}"; XV="${XV%)}" ;; *) XV="" ;; esac # fr + install -d /etc/X11/xorg.conf.d + cat > /etc/X11/xorg.conf.d/00-keyboard.conf < /etc/sudoers.d/10-fws-wheel +chmod 440 /etc/sudoers.d/10-fws-wheel +while IFS=: read -r _u _x _uid _rest; do + if [ "$_uid" -ge 1000 ] && [ "$_uid" -le 60000 ]; then + usermod -aG wheel "$_u" 2>/dev/null || true + fi +done < /etc/passwd + +# --- 4ter) Branding FWS sur le système installé ------------------------------- +# Le hook os-release du build n'est PAS sur la cible et « pacman -S » a pu +# remettre l'os-release d'Arch → d'où « Arch Linux » au menu GRUB, le logo Arch +# sur l'écran de connexion (GDM lit os-release LOGO) et le nom « Arch ». On FORCE +# donc l'os-release FWS (+ lsb-release + GRUB_DISTRIBUTOR), on RÉGÉNÈRE le menu +# GRUB (10_linux lit le NAME d'os-release), et on retire le motd « live ». +if [ -f /usr/local/share/fws/os-release ]; then + cp -f /usr/local/share/fws/os-release /usr/lib/os-release + ln -sf ../usr/lib/os-release /etc/os-release +fi +if [ -f /etc/lsb-release ]; then + sed -i 's/^DISTRIB_ID=.*/DISTRIB_ID=FWS/; s/^DISTRIB_DESCRIPTION=.*/DISTRIB_DESCRIPTION="FWS Linux"/' \ + /etc/lsb-release +fi +if grep -q '^GRUB_DISTRIBUTOR=' /etc/default/grub 2>/dev/null; then + sed -i 's/^GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR="FWS"/' /etc/default/grub +else + echo 'GRUB_DISTRIBUTOR="FWS"' >> /etc/default/grub +fi +grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null || true +# motd « live » (texte inadapté + codes ANSI bruts affichés crus par GDM). +rm -f /etc/motd + # --- 5) Sécurité : verrouiller root s'il est resté SANS mot de passe ---------- # L'airootfs live a souvent un root sans mot de passe ; si l'utilisateur n'en a # pas défini dans le GUI, on verrouille plutôt que de laisser le compte ouvert. @@ -236,9 +305,21 @@ if passwd -S root 2>/dev/null | grep -qE '\bNP\b'; then passwd -l root || true fi -# --- 6) Le resolv.conf du live ne doit pas rester figé ----------------------- -# NetworkManager (activé sur le système installé) régénère /etc/resolv.conf. -rm -f /tmp/fws-desktop /etc/resolv.conf 2>/dev/null || true +# --- 6) DNS du système installé : NetworkManager + systemd-resolved ---------- +# Le live utilise systemd-resolved (/etc/resolv.conf → stub 127.0.0.53). L'ANCIEN +# « rm /etc/resolv.conf » comptait sur NM pour recréer le fichier — MAIS avec +# systemd-resolved actif, NM ne réécrit PAS resolv.conf (il pousse les DNS vers +# resolved). Sans le lien, la résolution est MORTE → « Limited Connectivity » / +# Firefox « Server Not Found » (le réseau marche, le DNS non). Fix robuste : +# - resolv.conf → stub systemd-resolved, +# - service systemd-resolved activé, +# - on FORCE NM à utiliser resolved (dns=systemd-resolved) → il lui fournit les +# DNS DHCP, la résolution marche dès le 1er boot. +rm -f /tmp/fws-desktop 2>/dev/null || true +ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf +systemctl enable systemd-resolved.service 2>/dev/null || true +install -d /etc/NetworkManager/conf.d +printf '[main]\ndns=systemd-resolved\n' > /etc/NetworkManager/conf.d/dns.conf %end