6e59e1d4c4
Change the estimated time message from '2 à 4 minutes' to 'Encore une à deux minutes' to provide more accurate timing information to users during the FWS installer preparation phase.
158 lines
7.7 KiB
Bash
158 lines
7.7 KiB
Bash
#!/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
|
|
# Payload LiveOS : avec --liveinst (passé par liveinst), Anaconda IGNORE le
|
|
# payload du kickstart (anaconda.py teste opts.liveinst AVANT le type du
|
|
# payload DBus — un « liveimg » dans le ks serait du code mort) et détecte
|
|
# l'image live sur des chemins Fedora/dracut : /dev/mapper/live-base,
|
|
# /dev/mapper/live-osimg-min ou /run/rootfsbase — tous ABSENTS d'archiso →
|
|
# « SourceSetupError: No Live OS image found! » = crash au démarrage
|
|
# (reproduit hors VM dans un chroot de l'airootfs). On expose donc le
|
|
# squashfs archiso (monté ro sur /run/archiso/airootfs) là où Anaconda le
|
|
# cherche : findmnt y résout le loop device → montage → rsync vers la cible.
|
|
if [ -d /run/archiso/airootfs ] && [ ! -e /run/rootfsbase ]; then
|
|
mkdir -p /run/rootfsbase
|
|
mount --bind /run/archiso/airootfs /run/rootfsbase || rmdir /run/rootfsbase
|
|
fi
|
|
|
|
# ÉCRAN D'ATTENTE immédiat : le démarrage d'anaconda peut prendre 2 à
|
|
# 4 minutes (observé en VM VMware : un worker udev se bloque au boot et
|
|
# n'est tué par udevd qu'après 180 s → le « udevadm settle » d'anaconda
|
|
# attend tout ce temps). Sans feedback, l'écran reste bleu et muet et
|
|
# l'utilisateur croit à une panne (« l'installateur ne se lance pas »)
|
|
# alors que TOUT va bien. Le splash pulse pendant la préparation ;
|
|
# anaconda s'ouvre PAR-DESSUS quand il est prêt (openbox donne le focus
|
|
# aux nouvelles fenêtres) et on tue le splash à la sortie de liveinst.
|
|
# tail -f /dev/null : zenity --progress lit stdin — un stdin qui ne se
|
|
# ferme jamais garde la fenêtre ouverte sans consommer de CPU.
|
|
_SPLASH_PID=""
|
|
if command -v zenity >/dev/null 2>&1; then
|
|
tail -f /dev/null | zenity --progress --pulsate --no-cancel \
|
|
--title="FWS" \
|
|
--text="<b>Préparation de l'installateur FWS…</b>\n\nAnalyse du matériel et des disques en cours.\nEncore une à deux minutes, c'est normal." \
|
|
--width=420 2>/dev/null &
|
|
_SPLASH_PID=$!
|
|
fi
|
|
|
|
LIVEINST_LOG=/tmp/fws-liveinst.log
|
|
# Bus D-Bus de SESSION : au démarrage (--liveinst), inhibit_screensaver()
|
|
# de pyanaconda se connecte au bus de session. S'il n'y en a AUCUN (notre
|
|
# startx root minimal n'en garantit pas), Gio lève une GLib.GError que
|
|
# pyanaconda n'attrape PAS (il n'attrape que DBusError) → crash immédiat
|
|
# (2e crash reproduit hors VM). dbus-run-session fournit un bus de session
|
|
# pour toute la durée de l'installateur ; avec un bus présent, l'absence du
|
|
# service ScreenSaver est attrapée (simple warning dans anaconda.log).
|
|
if command -v dbus-run-session >/dev/null 2>&1 && [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
|
|
dbus-run-session -- liveinst >"$LIVEINST_LOG" 2>&1
|
|
else
|
|
liveinst >"$LIVEINST_LOG" 2>&1
|
|
fi
|
|
rc=$?
|
|
|
|
# liveinst terminé (install finie ou échec) : le splash n'a plus de raison
|
|
# d'être — kill du pipeline tail|zenity (pkill -P attrape les deux).
|
|
if [ -n "$_SPLASH_PID" ]; then
|
|
pkill -P "$_SPLASH_PID" 2>/dev/null
|
|
kill "$_SPLASH_PID" 2>/dev/null
|
|
fi
|
|
|
|
# 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 (page GUI fws_recap, avant install) ##########"
|
|
cat /tmp/fws-hw-summary.txt 2>/dev/null || echo "(absent — page récap pas atteinte)"
|
|
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="<b>FWS est installé sur le disque.</b>\n\n1. Clique OK pour <b>éteindre</b> la machine.\n2. <b>Retire l'ISO</b> (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
|