#!/bin/sh
# Lancé par startx (cf. /root/.zprofile), uniquement dans le live FWS.
if [ ! -d /run/archiso ]; then
exit 0
fi
xsetroot -solid "#1a1a2e"
# 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
# Chantier D : RÉCAPITULATIF matériel AVANT de lancer l'installateur.
# fws-hw-detect est la MÊME source de vérité que le %post du kickstart
# (mode --env) → ce que cet écran annonce = ce que l'install appliquera
# (drivers GPU, guest tools de l'hyperviseur, effacement des disques…).
# « Éteindre » est le seul moyen propre d'annuler : on ne rend jamais la
# main à startx (cf. plus bas), et liveinst n'a pas encore touché au disque.
# Tout est best-effort : sans script ou sans zenity, on installe comme avant.
if command -v fws-hw-detect >/dev/null 2>&1; then
fws-hw-detect --text >/tmp/fws-hw-summary.txt 2>/dev/null || true
if command -v zenity >/dev/null 2>&1 && [ -s /tmp/fws-hw-summary.txt ]; then
if ! zenity --text-info --title="FWS — Récapitulatif avant installation" \
--filename=/tmp/fws-hw-summary.txt \
--ok-label="Lancer l'installateur" --cancel-label="Éteindre" \
--width=800 --height=700 2>/dev/null; then
systemctl poweroff
exit 0
fi
fi
fi
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é).
# Log du %post chrooté (grub-install / mkinitcpio) = CE qui rend le disque
# bootable. Le kickstart en copie une version dans le LIVE
# (/tmp/fws-post-chroot.log, via un %post --nochroot final, cible encore
# montée → fiable). SECOURS si absent : on réactive le LVM (pvscan/vgscan
# rescannent les PV qu'Anaconda a désactivés) et on remonte le disque pour
# le lire.
if [ ! -s /tmp/fws-post-chroot.log ]; then
pvscan --cache >/dev/null 2>&1 || true
vgscan --mknodes >/dev/null 2>&1 || true
vgchange -ay >/dev/null 2>&1 || true
udevadm settle --timeout=10 >/dev/null 2>&1 || true
mkdir -p /run/fws-installed
for _dev in /dev/mapper/*-root /dev/mapper/* /dev/sd*[0-9] /dev/vd*[0-9] /dev/nvme*n*p*; do
[ -b "$_dev" ] || continue
mount -o ro "$_dev" /run/fws-installed 2>/dev/null || continue
if [ -f /run/fws-installed/var/log/fws-post.log ]; then
cp -f /run/fws-installed/var/log/fws-post.log /tmp/fws-post-chroot.log 2>/dev/null
umount /run/fws-installed 2>/dev/null || true
break
fi
umount /run/fws-installed 2>/dev/null || true
done
fi
DBG=/tmp/fws-debug.txt
{
echo "===== liveinst sorti (code $rc) — logs Anaconda ====="
echo
echo "########## sortie liveinst (stdout+stderr) ##########"
cat "$LIVEINST_LOG" 2>/dev/null
echo
echo "########## %post chrooté = grub-install / mkinitcpio ##########"
echo "########## >>> C'EST CE BLOC QUI DIT SI LE DISQUE VA BOOTER <<< ##########"
cat /tmp/fws-post-chroot.log 2>/dev/null || echo "(log introuvable)"
echo
echo "########## %post --nochroot (/tmp/fws-post-nochroot.log) ##########"
cat /tmp/fws-post-nochroot.log 2>/dev/null || echo "(absent)"
echo
echo "########## Récapitulatif matériel montré avant l'install ##########"
cat /tmp/fws-hw-summary.txt 2>/dev/null || echo "(absent)"
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
# Succès d'install = les DEUX étapes qui rendent le disque bootable ont
# réussi dans le %post : mkinitcpio (« Initcpio image generation successful »)
# ET grub-install (« Installation finished. No error reported. »). Si oui →
# on montre un écran de RÉUSSITE et on éteint (l'utilisateur retire l'ISO puis
# rallume sur FWS). Sinon → on affiche tous les logs de debug (comportement
# debug). Les lignes cosmétiques (load_policy, warnings GTK…) n'influent PAS
# sur cette détection : on ne regarde que le log du %post.
if grep -q 'Initcpio image generation successful' /tmp/fws-post-chroot.log 2>/dev/null \
&& grep -q 'Installation finished. No error reported.' /tmp/fws-post-chroot.log 2>/dev/null; then
if command -v zenity >/dev/null 2>&1; then
zenity --info --width=480 --title="FWS — installation réussie ✅" \
--text="FWS est installé sur le disque.\n\n1. Clique OK pour éteindre la machine.\n2. Retire l'ISO (lecteur CD/DVD).\n3. Rallume → FWS démarre." \
2>/dev/null
fi
systemctl poweroff
else
# Échec (ou install non terminée) : on montre les logs pour diagnostiquer.
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"
fi
else
echo "[FWS] Anaconda absent de l'ISO — à builder (setup-aur.sh) + ajouter à packages.x86_64." >&2
exec openbox
fi