alpinux.scripts/poste/install.sh
Cédrix 8c9d5ea755 Remettre le proxy APT en session live, que l'arrêt anticipé avait fait sauter
Depuis que la session live est écartée en tête de script, celui-ci s'arrête
avant configuration_apt, seul endroit où auto-apt-proxy était posé. Or c'est
depuis la session live que l'installateur télécharge paquets de langue et
mises à jour : sans le proxy, tout partait sur Internet au lieu de passer par
alpicache.

La pose du proxy devient une fonction, poser_apt_proxy, appelée en live avant
le relevé — seule exception au « rien n'est installé ici » — et reprise telle
quelle par configuration_apt sur le système installé. En live, un échec est
signalé sans arrêter le script : le relevé, qui donne l'heure de départ, passe
avant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 10:48:01 +02:00

487 lines
No EOL
17 KiB
Bash

#!/bin/bash
##################################################
# Fiche matérielle pour le serveur de l'install party
#
# Placée au début, et non à la fin : si un disque faiblit, autant le savoir
# avant d'avoir passé une heure à installer dessus — c'est le moment où l'on
# peut encore en parler à son propriétaire. Et si l'installation s'arrête en
# route, on a tout de même la fiche.
#
# Le relevé est le script voisin du dépôt, lu et versionné comme celui-ci :
# rien n'est téléchargé ni exécuté depuis le réseau. S'il n'est pas là, on
# passe — la machine d'un particulier qui rejoue ce script chez elle ne doit
# rien avoir à faire de tout ceci.
#
# C'est la seconde passe, celle que « sudo » relance, qui l'exécute :
# dmidecode et smartctl demandent les droits d'administration.
##################################################
if [ "$(id -u)" = "0" ] && [ -x "$(dirname "$0")/alpi-fiche.sh" ]; then
"$(dirname "$0")/alpi-fiche.sh" || true
fi
##################################################
# Une session live : relever, et ne rien installer
#
# On lance ce script dès la session live, avant même d'installer : c'est ce
# premier relevé qui donne au serveur l'heure de départ. La durée réelle d'une
# installation est l'écart entre les deux relevés d'une même machine, horodatés
# par le serveur — sans le premier, on ne mesure rien.
#
# Rien n'est installé ici. Le système live vit en mémoire et disparaîtra au
# redémarrage : y poser des paquets coûterait du temps et de la place, sans
# rien laisser. Le script s'arrête donc après le relevé, et se relance après
# l'installation.
#
# Une exception : le proxy APT. L'installateur télécharge lui aussi (paquets de
# langue, mises à jour), et c'est depuis la session live qu'il le fait. Sans
# auto-apt-proxy ici, tout part sur Internet au lieu de passer par alpicache.
# Avant le 26/09, c'est configuration_apt qui s'en chargeait, avant le test de
# session live ; l'arrêt anticipé l'avait fait disparaître.
#
# La détection est celle du relevé, éprouvée le 24/09/2026 : la racine montée
# en overlay ou squashfs, ce qu'aucun système installé ne fait, et « boot=casper »
# sur la ligne de commande du noyau. L'existence de /cdrom n'en fait pas partie :
# l'installateur de Mint en laisse un vide derrière lui, et s'y fier faisait
# prendre des machines installées pour des sessions live.
##################################################
en_session_live() {
findmnt -n -o FSTYPE / 2>/dev/null | grep -qE '^(overlay|aufs|squashfs)$' \
|| grep -qE '(^| )boot=(casper|live)( |$)' /proc/cmdline 2>/dev/null \
|| mountpoint -q /rofs 2>/dev/null \
|| { mountpoint -q /cdrom 2>/dev/null \
&& findmnt -n -o FSTYPE /cdrom 2>/dev/null | grep -qE '^(iso9660|squashfs)$'; }
}
# Partagée avec configuration_apt. Appelée en root, ou via « sudo » en live.
poser_apt_proxy() {
echo -e "==> Configuration de apt-proxy\n"
apt-get update -qq || return 1
DEBIAN_FRONTEND=noninteractive apt-get install -y auto-apt-proxy || return 1
echo 'Acquire::http::ProxyAutoDetect "auto-apt-proxy";' > /etc/apt/apt.conf.d/01proxy
}
if en_session_live; then
echo ""
echo "==> Session live détectée : seul le proxy APT sera installé."
echo ""
if [ "$(id -u)" = "0" ]; then
poser_apt_proxy
else
sudo bash -c "$(declare -f poser_apt_proxy); poser_apt_proxy"
fi || echo " Échec de l'installation d'auto-apt-proxy : l'installateur ira sur Internet."
echo ""
releve="$(dirname "$0")/alpi-fiche.sh"
if [ -x "$releve" ]; then
if [ "$(id -u)" = "0" ]; then
"$releve" --check || true
else
sudo "$releve" --check || true
fi
echo ""
echo "==> Le serveur a noté l'heure de départ de cette installation."
else
echo " Le relevé alpi-fiche.sh n'est pas à côté de ce script : le"
echo " décompte ne démarrera pas. Prenez-le sur le serveur :"
echo " wget http://alpicache.lan/alpi-fiche.sh && chmod +x alpi-fiche.sh"
fi
echo " Relancez ce script après l'installation, sur le système installé."
echo ""
exit 0
fi
# Script de post-installation pour Linux Mint 22.3
# testé le 25/03/2026
#
# utilisation
# wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/install.sh
# && chmod +x install.sh
# && ./install.sh
GREEN=$'\e[32m'
NC=$'\e[0m'
abort() {
echo ""
echo ""
echo "Erreur : $1. Abandon" > /dev/stderr
exit 1
}
config_firefox_fr() {
echo -e "==> Configuration de Firefox en Français par défaut\n"
# Création d'un fichier de préférences globales pour Firefox
mkdir -p /usr/lib/firefox/browser/defaults/preferences
cat <<EOF > /usr/lib/firefox/browser/defaults/preferences/syspref.js
// Forcer la langue en Français
pref("intl.locale.requested", "fr");
// Activer le dictionnaire fr par défaut
pref("spellchecker.dictionary", "fr");
// Langues préférées pour les sites web
pref("intl.accept_languages", "fr, fr-fr, en-us, en");
// Activer les DRM (Netflix/Prime)
pref("media.eme.enabled", true);
EOF
}
config_libreoffice() {
echo -e "==> Vérification du support français LibreOffice\n"
# Le paquet l10n-fr installe l'interface, hunspell-fr installe le dictionnaire ABC
apt install -y libreoffice-l10n-fr hunspell-fr mythes-fr hyphen-fr
}
prepa_restauration_firefox() {
# Si on est en root via sudo, on récupère le vrai utilisateur
local ACTUAL_USER=${SUDO_USER:-$USER}
local ACTUAL_HOME=$(getent passwd "$ACTUAL_USER" | cut -d: -f6)
echo -e "==> Préparation du dossier Firefox pour $ACTUAL_USER\n"
# Création du dossier avec les bons droits
mkdir -p "$ACTUAL_HOME/.mozilla/firefox"
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$ACTUAL_HOME/.mozilla"
echo "RAPPEL : Pour restaurer, copiez votre sauvegarde dans $ACTUAL_HOME/.mozilla/firefox/"
}
microcode() {
echo -e "==> Installation du microcode (Sécurité CPU)\n"
# Détection du fabricant du CPU
CPU_VENDOR=$(grep -m 1 'vendor_id' /proc/cpuinfo | awk '{print $3}')
case "$CPU_VENDOR" in
GenuineIntel)
echo "Processeur Intel détecté..."
apt install -y intel-microcode
;;
AuthenticAMD)
echo "Processeur AMD détecté..."
apt install -y amd64-microcode
;;
*)
echo "Fabricant inconnu ($CPU_VENDOR), saut de l'étape microcode."
;;
esac
}
opti_journald() {
echo -e "==> Optimizing system logs (Max 100MB)..."
# Use a regex that handles both commented and existing uncommented lines
sudo sed -i 's/^#\?SystemMaxUse=.*/SystemMaxUse=100M/' /etc/systemd/journald.conf
# Restart the daemon to apply changes
sudo systemctl restart systemd-journald
# Force immediate cleanup of logs older than the limit
sudo journalctl --vacuum-size=100M
echo -e "✅ Optimization complete.\n"
}
opti_fstab () {
echo -e "==> Optimisation du montage des disques (noatime)\n"
# Remplace relatime par noatime partout dans le fichier.
#
# ATTENTION : sans effet sur une installation Mint 22.3. Le fstab qu'écrit
# l'installateur ne mentionne ni « relatime » ni « noatime » — il s'en remet
# à « defaults », et relatime est le comportement par défaut du noyau. Il n'y
# a donc rien à substituer. Vérifié le 20/09/2026 sur une installation neuve.
# Pour poser réellement noatime, il faudrait ajouter l'option aux lignes
# concernées plutôt que d'en remplacer une qui n'y est pas.
sudo sed -i 's/relatime/noatime/g' /etc/fstab
}
opti_apt() {
# On s'assure d'avoir les droits root
if [[ $EUID -ne 0 ]]; then
echo "Erreur : Ce script doit être exécuté en tant que root (sudo)."
return 1
fi
echo -e "==> Optimisation du gestionnaire de paquets APT\n"
# 1. Supprime les fichiers .deb des paquets qui ne peuvent plus être téléchargés (obsolètes)
apt-get autoclean -y
# 2. Supprime la totalité du cache (ton code original)
apt-get clean
# 3. Supprime les dépendances inutilisées et leurs fichiers de config
apt-get autoremove --purge -y
# 4. Optionnel : Met à jour la liste des paquets pour repartir sur une base propre
# apt-get update
echo -e "\n[Terminé] Le système est plus léger !"
}
modif_systeme() {
configuration_apt
# La session live est écartée en tête de script, avant toute modification :
# ce test-ci arrivait après « configuration_apt », et ne reposait que sur un
# fichier de /cdrom — le signe dont on sait depuis le 24/09 qu'il désigne
# aussi des machines installées.
install_logiciels
config_firefox_fr
config_timeshift_desactive
microcode
opti_journald
opti_fstab
modif_grub
mises_a_jour
config_libreoffice
prepa_restauration_firefox
echo -e "==> Optimisation du Swappiness\n"
sysctl vm.swappiness=10
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.conf
opti_apt
}
config_timeshift_desactive() {
echo -e "==> Désactivation des sauvegardes automatiques Timeshift\n"
# 1. On récupère l'UUID de la partition qui contient /home
# Si /home n'est pas une partition séparée, findmnt remontera à la racine /
HOME_DEV=$(findmnt -n -o SOURCE /home)
HOME_UUID=$(blkid -s UUID -o value "$HOME_DEV")
# 2. On s'assure que le dossier de config existe
mkdir -p /etc/timeshift
# 3. Écriture du JSON avec l'UUID détecté
cat <<EOF > /etc/timeshift/timeshift.json
{
"backup_device_uuid" : "$HOME_UUID",
"parent_uuid" : "",
"do_first_run" : "false",
"btrfs_mode" : "false",
"include_btrfs_home_for_snapshots" : "false",
"include_btrfs_home_for_restore" : "false",
"stop_cron_emails" : "true",
"schedule_monthly" : "false",
"schedule_weekly" : "false",
"schedule_daily" : "false",
"schedule_hourly" : "false",
"schedule_boot" : "false",
"count_monthly" : "0",
"count_weekly" : "0",
"count_daily" : "0",
"count_hourly" : "0",
"count_boot" : "0",
"snapshot_list" : [ ]
}
EOF
echo "Timeshift configuré sur la partition $HOME_DEV (UUID: $HOME_UUID) avec planning désactivé."
}
##########################################################
# Mises à jour et installation des logiciels utilisateur #
##########################################################
# Installation des polices Microsoft. On le fait au début pour pouvoir vite
# accepter l'EULA et pouvoir aller boire un café :-)
# L'astuce d'utiliser DEBIAN_FRONTEND=noninteractive ne marche plus, il faudrait
# préconfigurer debconf pour éviter d'avoir à répondre ici
install_logiciels() {
echo -e "==> Installation des polices Microsoft\n"
# 1. On pré-accepte la licence dans la base de données debconf
echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections
# 2. On installe en forçant le mode non-interactif pour ignorer toute autre question
DEBIAN_FRONTEND=noninteractive apt install -y ttf-mscorefonts-installer || abort "problème lors de l'installation des polices"
# mise à jour du système
echo -e "==> Mise à jour du système\n"
apt update || abort "impossible de récupérer les informations des dépôts"
apt full-upgrade -y || abort "erreur lors de la mise à jour des paquets"
# installation de logiciels utilisateurs indispensables ou juste très utiles
# - backintime-qt pour avoir un bon logiciel de sauvegardes
# - brasero pour graver
# - cheese pour tester la webcam
# - fonts-contarell et fonts-linuxlibertine parce qu'elles sont jolies et complètes
# - keepassxc pour gérer les mots de passe
# - nemo-image-converter pour rapidement réduire des images pour l'envoi par mail
# - pdfarranger pour découper / assembler des PDF
# - verbiste-gnome pour la conjugaison
# - gparted pour organiser le partitionnement des disques
# - vlc pour lire les fichiers audio et vidéos
# - vnstat statisitques utilisation réseau
# - iftop afficher les connexions instantannée
# - numlockx activation du pavé numérique en X11
echo -e "==> Installation des programmes complémentaires\n"
apt install -y \
backintime-qt \
cheese \
fonts-cantarell fonts-linuxlibertine \
nemo-image-converter \
pdfarranger \
verbiste-gnome \
gparted \
vlc \
vnstat \
iftop \
numlockx \
hunspell-fr \
mint-meta-codecs \
tesseract-ocr tesseract-ocr-fra \
shotwell \
puddletag \
stacer \
|| abort "problème lors de l'installation des logiciels utilisateurs"
# Ajout du dépôt au niveau système (accessible à tous)
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
# Installation au niveau système de KeePassXC
flatpak install -y flathub org.keepassxc.KeePassXC
flatpak install -y flathub com.github.tchx84.Flatseal
# Installation de tous les paquets de langue
echo -e "==> Installation du support français pour les programmes déjà installés\n"
apt install -y language-selector-common
apt install -y $(check-language-support -l fr)
echo -e "==> Francisation de Firefox (.deb)\n"
# On installe le paquet de langue officiel des dépôts Mint/Ubuntu
apt install -y firefox-locale-fr || echo "Note: Impossible d'installer le pack FR pour Firefox apt."
# curl -L -o /usr/lib/firefox/distribution/extensions/dictionnaire-francais.xpi https://addons.mozilla.org/fr/firefox/downloads/latest/1750/addon-1750-latest.xpi
# sed -i 's/preferredDictionary =.*/preferredDictionary = fr/' /usr/lib/firefox-*/dictionaries/dictionaries.xml
}
################
# Mises à jour #
################
mises_a_jour() {
echo -e "==> Configuration de dconf\n"
# Configuration de dconf pour permettre de modifier certaines configurations
# par défaut
mkdir -p /etc/dconf/profile
echo -e\
"user-db:user\n"\
"system-db:local" > /etc/dconf/profile/user
mkdir -p /etc/dconf/db/local.d
# Ne pas demander à l'utilisateur l'utilisation de dépôts locaux
echo -e \
"[com/linuxmint/updates]\n"\
"default-repo-is-ok=true" > /etc/dconf/db/local.d/00-alpinux
dconf update
}
# Fonctions Utilisateur (SANS sudo)
personnalisation_utilisateur() {
echo -e "${GREEN}==> Personnalisation de l'environnement (User: $USER)${NC}"
# Cinnamon / Nemo
dconf write /org/nemo/desktop/trash-icon-visible true
dconf write /org/nemo/desktop/home-icon-visible true
dconf write /org/cinnamon/desktop/interface/clock-show-date true
dconf write /org/cinnamon/desktop/interface/first-day-of-week 1
# Note: sudo dconf update n'est pas nécessaire pour les clés utilisateur locales
}
configuration_apt() {
echo -e "==> Mise à jour de la liste des dépots\n"
apt update
# Met à jour les langues pour toutes les applications Flatpak installées
flatpak update -y
poser_apt_proxy || abort "Échec de l'installation d'auto-apt-proxy"
}
###############################################################
# GRUB : sélection automatique de la dernière entrée utilisée #
###############################################################
modif_grub() {
# Rien à faire si c'est déjà en place.
#
# update-grub lance os-prober, qui part sonder toutes les partitions de la
# machine à la recherche d'autres systèmes, puis régénère la configuration
# entière : vingt à trente secondes qu'on ne rattrape pas, et qu'on payait
# jusqu'ici à chaque exécution, y compris quand il n'y avait rien à
# changer. Sur une install party de quinze machines, cela se voit.
if grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
&& grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub; then
echo -e "==> GRUB est déjà configuré, rien à changer\n"
return 0
fi
echo -e "==> Modification de GRUB\n"
# On commente la ligne d'origine, puis on ajoute les nôtres si elles
# manquent. Les ajouter plutôt que les insérer règle deux choses : le
# fichier ne se retrouve plus avec des lignes indentées — GRUB les accepte,
# mais elles trompent la lecture quand on vient déboguer —, et la fonction
# fait toujours son travail lorsque « GRUB_DEFAULT=0 » a disparu, ce qui
# arrive dès qu'un autre outil est passé avant nous.
sed -i 's/^GRUB_DEFAULT=0/#&/' /etc/default/grub
grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
|| echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub \
|| echo 'GRUB_SAVEDEFAULT=true' >> /etc/default/grub
# On met à jour GRUB
update-grub
}
del_itself() {
# On ne supprime que si c'est un fichier physique existant
if [ -f "$0" ]; then
echo -e "\n==> Nettoyage : Suppression du script d'installation..."
rm "$0"
fi
}
##############################
# Auto-destruction du script #
##############################
if [ "$(id -u)" != "0" ]; then
personnalisation_utilisateur
# On relance le script en root pour la partie système
if sudo "$0" "$@"; then
echo -e "\nInstallation terminée avec succès !"
del_itself
else
echo -e "\nErreur lors de l'exécution en root."
exit 1
fi
else
modif_systeme
echo -e "\n${GREEN}Terminé ! Un redémarrage est conseillé.${NC}"
fi