fix(Calamares): Installater will ask the desktop env before the calamares install
- The installer is still W.I.P
This commit is contained in:
@@ -1,31 +1,128 @@
|
||||
#!/bin/bash
|
||||
|
||||
export MSYS_NO_PATHCONV=1
|
||||
# ============================================================
|
||||
# FWS — Build de l'ISO via mkarchiso (archiso)
|
||||
#
|
||||
# Fonctionne sur :
|
||||
# - Windows 10 / 11 (Git Bash → bascule auto dans WSL Arch)
|
||||
# - Arch Linux natif (exécution directe)
|
||||
# - WSL Arch lancé directement (exécution directe)
|
||||
#
|
||||
# Nom de la distro WSL : "Arch" par défaut, ou $ARCH_WSL_DISTRO,
|
||||
# ou auto-détecté parmi les noms courants.
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
trap 'echo -e "\e[31mErreur lors de l execution (build.sh).\e[0m"; exit 1' ERR
|
||||
trap 'rc=$?; echo -e "\e[31mÉchec (build.sh) ligne $LINENO, code $rc.\e[0m" >&2; exit $rc' ERR
|
||||
|
||||
DISTRO_NAME="Arch"
|
||||
DISTRO_NAME="${ARCH_WSL_DISTRO:-Arch}"
|
||||
|
||||
if [ -n "$WSL_DISTRO_NAME" ]; then
|
||||
echo -e "\e[36mBuild exécuté depuis WSL ($WSL_DISTRO_NAME) en tant que root...\e[0m"
|
||||
IN_WSL=1
|
||||
else
|
||||
echo -e "\e[36mLancement du processus de build dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
||||
# ============================================================
|
||||
# Bascule Git Bash (Windows 10/11) → WSL si besoin
|
||||
# ============================================================
|
||||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || -n "$WINDIR" ]]; then
|
||||
echo -e "\e[36mGit Bash détecté — bascule dans WSL ($DISTRO_NAME)...\e[0m"
|
||||
export MSYS_NO_PATHCONV=1
|
||||
export MSYS2_ARG_CONV_EXCL="*"
|
||||
|
||||
# WSL doit être présent (sinon message clair plutôt que command not found).
|
||||
command -v wsl.exe >/dev/null 2>&1 || {
|
||||
echo -e "\e[31mWSL introuvable. Installe WSL2 puis une distro Arch :\e[0m" >&2
|
||||
echo " 1) PowerShell admin : wsl --install" >&2
|
||||
echo " 2) Installe Arch (ArchWSL, ou 'wsl --install -d archlinux') puis relance." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Choix de la distro Arch : override $ARCH_WSL_DISTRO, sinon nom exact,
|
||||
# sinon 1re distro « arch » réellement joignable. On énumère via
|
||||
# `wsl -l -q` (sortie UTF-16LE → on retire NUL/CR) au lieu d'une liste
|
||||
# figée, mais on garde la sonde « echo ok » (une distro listée peut
|
||||
# être en cours d'install / cassée).
|
||||
pick_arch_distro() {
|
||||
wsl.exe -d "$DISTRO_NAME" -u root -- echo ok >/dev/null 2>&1 && return 0
|
||||
local d distros=()
|
||||
mapfile -t distros < <(wsl.exe -l -q 2>/dev/null | tr -d '\0\r' | sed 's/[[:space:]]*$//;/^$/d')
|
||||
for d in "${distros[@]}"; do
|
||||
[[ "$d" == "$DISTRO_NAME" ]] || continue
|
||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
||||
done
|
||||
for d in "${distros[@]}"; do
|
||||
[[ "$d" =~ [Aa][Rr][Cc][Hh] ]] || continue
|
||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
||||
done
|
||||
return 1
|
||||
}
|
||||
if ! pick_arch_distro; then
|
||||
echo -e "\e[31mAucune distribution WSL Arch joignable.\e[0m" >&2
|
||||
echo "Distros WSL installées :" >&2
|
||||
wsl.exe -l -v 2>/dev/null | tr -d '\0' >&2 || true
|
||||
echo "" >&2
|
||||
echo "Installe Arch dans WSL puis relance :" >&2
|
||||
echo " - ArchWSL (yuk7) — s'enregistre sous 'Arch' : https://github.com/yuk7/ArchWSL/releases/latest" >&2
|
||||
echo " - ou image officielle : wsl --install -d archlinux (nom 'archlinux')" >&2
|
||||
echo "Distro sous un autre nom ? export ARCH_WSL_DISTRO=<nom> (cf. 'wsl -l -v' ci-dessus)." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\e[36m==> Distro WSL : $DISTRO_NAME\e[0m"
|
||||
|
||||
# Traduit le dossier du script en chemin WSL.
|
||||
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
||||
SCRIPT_PATH_WSL=$(MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- \
|
||||
wslpath "$(echo "$SCRIPT_DIR_WIN" | sed 's|/|\\\\|g')/build.sh" \
|
||||
2>/dev/null | tr -d '\r\n')
|
||||
[ -n "$SCRIPT_PATH_WSL" ] || {
|
||||
echo -e "\e[31mTraduction du chemin vers WSL échouée (wslpath). Vérifie ARCH_WSL_DISTRO ($DISTRO_NAME).\e[0m" >&2
|
||||
exit 1
|
||||
}
|
||||
wsl.exe -d "$DISTRO_NAME" -u root -- test -f "$SCRIPT_PATH_WSL" || {
|
||||
echo -e "\e[31mScript introuvable dans WSL : $SCRIPT_PATH_WSL\e[0m" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Relance ce même script dans WSL, en root, depuis son vrai chemin
|
||||
# (BASH_SOURCE → WORK_DIR correct). Les fins de ligne sont garanties LF
|
||||
# par .gitattributes (*.sh text eol=lf) ; le profil copié est en plus
|
||||
# passé à dos2unix plus loin.
|
||||
echo "==> Script à exécuter dans WSL : $SCRIPT_PATH_WSL"
|
||||
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash "$SCRIPT_PATH_WSL"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -z "$IN_WSL" ]; then
|
||||
# ── Depuis Git Bash ──────────────────────────────────────
|
||||
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
||||
WORK_DIR_WSL=$(MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- \
|
||||
wslpath "$(echo "$SCRIPT_DIR_WIN" | sed 's|/|\\\\|g')" 2>/dev/null | tr -d '\r\n')
|
||||
# ============================================================
|
||||
# Exécution native (Arch Linux bare-metal OU dans WSL)
|
||||
# ============================================================
|
||||
command -v pacman >/dev/null \
|
||||
|| { echo -e "\e[31mpacman introuvable — lance ce script depuis Arch / WSL.\e[0m"; exit 1; }
|
||||
|
||||
echo "==> Dossier de travail WSL : $WORK_DIR_WSL"
|
||||
# mkarchiso exige root. Sur Arch natif on s'élève (sudo de préférence,
|
||||
# sinon su) ; depuis la bascule Git Bash on est déjà root (-u root).
|
||||
# $0 est cité pour gérer les chemins à espaces (ex. "1. FWS").
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
exec sudo bash "$0" "$@"
|
||||
else
|
||||
exec su -c "bash \"$0\"" root
|
||||
fi
|
||||
fi
|
||||
|
||||
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash << EOF
|
||||
set -e
|
||||
WORK_DIR="${WORK_DIR_WSL}"
|
||||
echo "==> Dossier de travail : \$WORK_DIR"
|
||||
if grep -qi 'microsoft\|wsl' /proc/version 2>/dev/null; then
|
||||
echo -e "\e[36mBuild exécuté dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
||||
IS_WSL=1
|
||||
else
|
||||
echo -e "\e[36mBuild exécuté sur Arch Linux natif en tant que root...\e[0m"
|
||||
IS_WSL=0
|
||||
fi
|
||||
|
||||
# Le dossier de travail = dossier qui contient ce script (gère les
|
||||
# espaces du chemin, ex. "1. FWS").
|
||||
WORK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
echo "==> Dossier de travail : $WORK_DIR"
|
||||
|
||||
# pacman ≥ 7 sandboxe les ops FS via landlock, non supporté par le
|
||||
# kernel WSL → désactivation. Idempotent, sans effet sur Arch natif.
|
||||
if [ "$IS_WSL" -eq 1 ] && ! grep -qE '^[[:space:]]*DisableSandbox' /etc/pacman.conf; then
|
||||
sed -i '/^\[options\]/a DisableSandbox' /etc/pacman.conf
|
||||
echo "==> WSL détecté → DisableSandbox ajouté à /etc/pacman.conf"
|
||||
fi
|
||||
|
||||
echo "==> Mise à jour des miroirs et installation de archiso..."
|
||||
pacman -Sy --noconfirm reflector || true
|
||||
@@ -37,18 +134,18 @@ rm -rf /tmp/fws-build
|
||||
mkdir -p /tmp/fws-build/releng
|
||||
|
||||
# Copie configs/releng/ en base
|
||||
if [ -d "\$WORK_DIR/configs/releng" ]; then
|
||||
cp -ar "\$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
||||
if [ -d "$WORK_DIR/configs/releng" ]; then
|
||||
cp -ar "$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
||||
echo "==> configs/releng/ copié"
|
||||
fi
|
||||
|
||||
# Fusionne configs/baseline/ par dessus (priorité aux fichiers baseline)
|
||||
if [ -d "\$WORK_DIR/configs/baseline" ]; then
|
||||
cp -ar "\$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
||||
if [ -d "$WORK_DIR/configs/baseline" ]; then
|
||||
cp -ar "$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
||||
echo "==> configs/baseline/ fusionné (prioritaire)"
|
||||
fi
|
||||
|
||||
echo "==> Activation de NetworkManager.service sur le live (symlink réel WSL)..."
|
||||
echo "==> Activation de NetworkManager.service sur le live (symlink réel)..."
|
||||
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
||||
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
||||
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
||||
@@ -58,18 +155,18 @@ ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (au
|
||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
||||
|
||||
# Copie le repo local (calamares + winboat-bin)
|
||||
if ls "\$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
||||
if ls "$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
||||
echo "==> Copie du repo local Calamares..."
|
||||
mkdir -p /tmp/fws-build/local-repo
|
||||
cp -a "\$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
||||
cp -a "$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
||||
|
||||
echo "==> Injection [fws-local] dans pacman.conf..."
|
||||
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
||||
PACMAN_TMP=\$(mktemp)
|
||||
PACMAN_TMP=$(mktemp)
|
||||
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
||||
> "\$PACMAN_TMP"
|
||||
cat /tmp/fws-build/releng/pacman.conf >> "\$PACMAN_TMP"
|
||||
mv "\$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
||||
> "$PACMAN_TMP"
|
||||
cat /tmp/fws-build/releng/pacman.conf >> "$PACMAN_TMP"
|
||||
mv "$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
||||
|
||||
echo "==> Vérification pacman.conf :"
|
||||
head -5 /tmp/fws-build/releng/pacman.conf
|
||||
@@ -82,83 +179,31 @@ pacman -S --needed --noconfirm dos2unix
|
||||
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
||||
|
||||
echo "==> Lancement de mkarchiso..."
|
||||
mkdir -p "\$WORK_DIR/out"
|
||||
chmod -f 777 "\$WORK_DIR/out/"FWS-*.iso 2>/dev/null || true
|
||||
rm -f "\$WORK_DIR/out/"FWS-*.iso 2>/dev/null || true
|
||||
mkarchiso -v -w /tmp/fws-build/work -o "\$WORK_DIR/out" /tmp/fws-build/releng
|
||||
mkdir -p "$WORK_DIR/out"
|
||||
# mkarchiso fait un « rm » interne de l'ISO cible avant de la (ré)écrire ; si
|
||||
# une ISO du même nom est VERROUILLÉE par Windows (VM encore ouverte dessus,
|
||||
# ISO montée, antivirus), ce rm échoue et tout le build casse à la toute fin.
|
||||
# Parade : mkarchiso écrit dans un dossier de staging neuf, puis on déplace
|
||||
# l'ISO. Si la cible est verrouillée, on bascule sur un nom horodaté → le
|
||||
# build réussit quand même au lieu de tout perdre.
|
||||
STAGE="$WORK_DIR/out/.staging-$$"
|
||||
rm -rf "$STAGE"; mkdir -p "$STAGE"
|
||||
mkarchiso -v -w /tmp/fws-build/work -o "$STAGE" /tmp/fws-build/releng
|
||||
|
||||
NEW_ISO="$(ls -1 "$STAGE/"*.iso 2>/dev/null | head -1)"
|
||||
[ -n "$NEW_ISO" ] || { echo -e "\e[31mAucune ISO produite par mkarchiso.\e[0m" >&2; exit 1; }
|
||||
DEST="$WORK_DIR/out/$(basename "$NEW_ISO")"
|
||||
if { chmod -f 666 "$DEST" 2>/dev/null; rm -f "$DEST" 2>/dev/null; } && mv -f "$NEW_ISO" "$DEST" 2>/dev/null; then
|
||||
FINAL="$DEST"
|
||||
else
|
||||
FINAL="$WORK_DIR/out/$(basename "${NEW_ISO%.iso}")-$(date +%H%M%S).iso"
|
||||
echo -e "\e[33m[!] '$DEST' est verrouillée (une VM l'utilise ?). Écriture sous un nom unique.\e[0m" >&2
|
||||
mv -f "$NEW_ISO" "$FINAL"
|
||||
fi
|
||||
rm -rf "$STAGE" 2>/dev/null || true
|
||||
|
||||
echo "==> Nettoyage..."
|
||||
rm -rf /tmp/fws-build/work
|
||||
|
||||
echo "==> Build terminé ! ISO dans \$WORK_DIR/out"
|
||||
EOF
|
||||
|
||||
else
|
||||
# ── Déjà dans WSL ────────────────────────────────────────
|
||||
WORK_DIR="$PWD"
|
||||
echo "==> Dossier de travail : $WORK_DIR"
|
||||
|
||||
echo "==> Mise à jour et installation de archiso..."
|
||||
pacman -Sy --noconfirm reflector || true
|
||||
reflector --verbose --latest 10 --sort rate --save /etc/pacman.d/mirrorlist || true
|
||||
pacman -Sy --noconfirm archiso
|
||||
|
||||
echo "==> Préparation de l'environnement de build..."
|
||||
rm -rf /tmp/fws-build
|
||||
mkdir -p /tmp/fws-build/releng
|
||||
|
||||
if [ -d "$WORK_DIR/configs/releng" ]; then
|
||||
cp -ar "$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
||||
echo "==> configs/releng/ copié"
|
||||
fi
|
||||
|
||||
if [ -d "$WORK_DIR/configs/baseline" ]; then
|
||||
cp -ar "$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
||||
echo "==> configs/baseline/ fusionné (prioritaire)"
|
||||
fi
|
||||
|
||||
echo "==> Activation de NetworkManager.service sur le live (symlink réel)..."
|
||||
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
||||
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
||||
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
||||
|
||||
echo "==> Vérification des services systemd..."
|
||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (aucun service)"
|
||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
||||
|
||||
if ls "$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
||||
echo "==> Copie du repo local Calamares..."
|
||||
mkdir -p /tmp/fws-build/local-repo
|
||||
cp -a "$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
||||
|
||||
echo "==> Injection [fws-local] dans pacman.conf..."
|
||||
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
||||
PACMAN_TMP=$(mktemp)
|
||||
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
||||
> "$PACMAN_TMP"
|
||||
cat /tmp/fws-build/releng/pacman.conf >> "$PACMAN_TMP"
|
||||
mv "$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
||||
|
||||
echo "==> Vérification pacman.conf :"
|
||||
head -5 /tmp/fws-build/releng/pacman.conf
|
||||
else
|
||||
echo "==> Aucun repo local détecté."
|
||||
fi
|
||||
|
||||
echo "==> Correction des retours à la ligne Windows (dos2unix)..."
|
||||
pacman -S --needed --noconfirm dos2unix
|
||||
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
||||
|
||||
echo "==> Lancement de mkarchiso..."
|
||||
mkdir -p "$WORK_DIR/out"
|
||||
chmod -f 777 "$WORK_DIR/out/"FWS-*.iso 2>/dev/null || true
|
||||
rm -f "$WORK_DIR/out/"FWS-*.iso 2>/dev/null || true
|
||||
mkarchiso -v -w /tmp/fws-build/work -o "$WORK_DIR/out" /tmp/fws-build/releng
|
||||
|
||||
echo "==> Nettoyage..."
|
||||
rm -rf /tmp/fws-build/work
|
||||
|
||||
echo "==> Build terminé ! L'ISO se trouve dans '$WORK_DIR/out'."
|
||||
fi
|
||||
|
||||
echo -e "\e[32mScript de build terminé avec succès.\e[0m"
|
||||
echo "==> Build terminé ! ISO : $FINAL"
|
||||
echo -e "\e[32mScript de build terminé avec succès.\e[0m"
|
||||
|
||||
Reference in New Issue
Block a user