#!/bin/bash set -euo pipefail fws_first_user() { awk -F: '$3 >= 1000 && $1 != "nobody" { print $1; exit }' /etc/passwd } FWS_LOG=/var/log/fws-desktop-init.log # Paquets communs à TOUS les bureaux graphiques. La cible de base n'installe # rien de tout ça (packages.conf ne fait que des « remove »), donc chaque # bureau doit les tirer explicitement : audio (PipeWire), applet réseau NM, # accès volumes (gvfs), dossiers utilisateur, trousseau, polices (dont emoji). # (Xfce a déjà sa propre liste complète et n'utilise pas ce tableau.) FWS_BASE_PACKAGES=( pipewire pipewire-alsa pipewire-pulse wireplumber pavucontrol networkmanager network-manager-applet gvfs gvfs-mtp gvfs-gphoto2 gvfs-smb xdg-user-dirs xdg-user-dirs-gtk xdg-utils gnome-keyring libsecret polkit noto-fonts noto-fonts-emoji ttf-dejavu ttf-liberation ) fws_install_packages() { # NE PAS faire « pacman -Sy » : rafraîchir les bases sans # upgrader le système (partial upgrade) provoque des « conflicting # files » / dépendances cassées → pacman sort en code 1. # # 1) Rafraîchit d'abord archlinux-keyring (seule exception admise au # partial upgrade) : son hook relance pacman-key --populate et évite # les erreurs de signature dans le chroot. pacman -Sy --noconfirm --needed archlinux-keyring 2>&1 | tee -a "$FWS_LOG" || true # 2) -Syu COMPLET. On désactive CheckSpace à la volée via une conf # temporaire (process substitution) : le calcul d'espace est non # fiable pendant une install en chroot et peut faire échouer pacman. # La conf du système installé (/etc/pacman.conf) reste intacte. # --noconfirm sélectionne le provider par défaut (ex. # qt6-multimedia-ffmpeg) sans bloquer sur une saisie. if ! pacman --config <(sed 's/^[[:space:]]*CheckSpace/#CheckSpace/' /etc/pacman.conf) \ -Syu --noconfirm --needed "$@" 2>&1 | tee -a "$FWS_LOG"; then # Surface l'erreur réelle (sinon noyée/tronquée dans la boîte # Calamares). Tout est aussi conservé dans $FWS_LOG sur la cible. echo "" >&2 echo "######## ÉCHEC pacman — log complet : $FWS_LOG (système installé) ########" >&2 echo "######## Lignes d'erreur détectées : ########" >&2 grep -iE "error|conflicting|exists in filesystem|no space|impossible|introuvable|failed" \ "$FWS_LOG" | tail -n 25 >&2 echo "#########################################################################" >&2 return 1 fi } fws_enable_services() { for service in "$@"; do systemctl enable "$service" >/dev/null 2>&1 || true done } fws_disable_services() { for service in "$@"; do systemctl disable "$service" >/dev/null 2>&1 || true done } fws_set_graphical_default() { # Système installé : démarrer en mode graphique (lance le display manager). # Idempotent ; le défaut systemd est déjà graphical.target mais on le rend # explicite pour ne dépendre d'aucun héritage du squashfs archiso. systemctl set-default graphical.target >/dev/null 2>&1 || true } fws_write_lightdm_config() { local user_name="$1" local session_name="$2" if [ -z "$user_name" ]; then return 0 fi mkdir -p /etc/lightdm/lightdm.conf.d printf '[Seat:*]\nautologin-user=%s\nautologin-user-timeout=0\nuser-session=%s\nautologin-session=%s\ngreeter-hide-users=true\nallow-guest=false\n' "$user_name" "$session_name" "$session_name" > /etc/lightdm/lightdm.conf.d/50-fws.conf } fws_write_sddm_config() { local user_name="$1" local session_name="$2" if [ -z "$user_name" ]; then return 0 fi mkdir -p /etc/sddm.conf.d printf '[Autologin]\nUser=%s\nSession=%s.desktop\nRelogin=false\n' "$user_name" "$session_name" > /etc/sddm.conf.d/50-fws.conf }