alpinux.scripts/poste/install.sh
Cédrix 4b56a7967d Lancer install.sh dès la session live, pour que le décompte démarre
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 relevé en session live, il n'y a pas
d'heure de départ, et la seule chose qu'on mesure est la post-installation.
D'où la consigne : on lance install.sh dès le live.

Encore fallait-il qu'il s'y arrête. Il le faisait, mais mal, et le détail
comptait :

- la détection ne reposait que sur /cdrom/preseed/linuxmint.seed, le signe dont
  le relevé a démontré le 24/09 qu'il désigne aussi des machines installées —
  et s'il manque sur l'ISO du jour, c'est l'inverse qui se produit : le script
  installe des paquets dans un système vivant en mémoire, qui disparaîtra au
  redémarrage ;
- elle n'intervenait qu'au milieu de modif_systeme, après configuration_apt,
  donc après une première modification ;
- lancé sans sudo, il passait d'abord par personnalisation_utilisateur, puis la
  sortie en « exit 0 » de la relance était lue comme une réussite : le script
  annonçait « Installation terminée avec succès » et se supprimait lui-même.

La session live est donc écartée en tête de fichier, avant quoi que ce soit,
avec la détection éprouvée du relevé : racine en overlay ou squashfs, et
boot=casper sur la ligne du noyau. Le script lance le relevé — avec --check,
pour que le verdict s'affiche et qu'on ait le temps de le lire — dit que rien
n'a été installé et que le serveur a noté l'heure de départ, puis s'arrête sans
se supprimer.

Les cinq situations sont vérifiées, dont le piège du 24/09 : un /cdrom monté en
ext4 sur une machine installée reste une machine installée.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BssvzfDMeXVoUQHEcnavW7
2026-09-26 00:13:36 +02:00

470 lines
No EOL
16 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.
#
# 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)$'; }
}
if en_session_live; then
echo ""
echo "==> Session live détectée : rien ne sera installé."
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
# Configuration de apt-proxy
echo -e "==> Configuration de apt-proxy\n"
apt install -y auto-apt-proxy || abort "Échec de l'installation d'auto-apt-proxy"
echo 'Acquire::http::ProxyAutoDetect "auto-apt-proxy";' > /etc/apt/apt.conf.d/01proxy
}
###############################################################
# 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