#!/bin/bash function log() { echo "[POSTINSTALL] $1" } function ensure_user_folder_present() { local folder_path="$1" if [[ -d "$folder_path" ]]; then log "Dossier $folder_path déjà présent." return 0 fi log "Création du dossier $folder_path..." if ! mkdir --parent "$folder_path"; then log "Impossible de créer le dossier $folder_path." return 1 fi log "Dossier $folder_path créé avec succès." } function is_installed() { pacman -Q "$1" >/dev/null 2>&1 } function is_global_git_configuration_set() { test ! -z "$(git config --global "$1")" } function is_global_root_git_configuration_set() { test ! -z "$(sudo git config --global "$1")" } function ensure_git_configuration_set() { ensure_package_is_installed git if is_global_git_configuration_set "$1"; then log "Configuration Git pour $1 déjà présente." else if log "Configuration Git pour $1 manquante, configuration en cours..." && read -rp "Valeur pour $1 : " CONFIGURATION_VALUE && git config --global "$1" "$CONFIGURATION_VALUE"; then log "Configuration pour $1 installée." else log "Impossible de configurer $1 pour Git." return 1 fi fi } function ensure_root_git_configuration_set() { ensure_package_is_installed git if is_global_root_git_configuration_set "$1"; then log "Configuration administrateur Git pour $1 déjà présente." else if log "Configuration administrateur Git pour $1 manquante, configuration en cours..." && read -rp "Valeur pour $1 : " CONFIGURATION_VALUE && sudo git config --global "$1" "$CONFIGURATION_VALUE"; then log "Configuration administrateur pour $1 installée." else log "Impossible de configurer $1 pour l'adminsitrateur Git." return 1 fi fi } function ensure_yay_installed() { if ! is_installed yay; then log "Installation de yay..." sudo pacman -Syyu --needed --noconfirm git base-devel && rm -rf /tmp/yay && mkdir --parent /tmp/yay && git clone https://aur.archlinux.org/yay /tmp/yay && cd /tmp/yay && makepkg -sri --noconfirm --needed && yay --version && cd - || exit fi } function ensure_system_is_updated() { ensure_yay_installed && log "Mise à jour du système d'exploitation" && yay --noconfirm --needed } function ensure_package_is_installed() { ensure_yay_installed if ! is_installed "$1"; then log "Installation de $1..." if ! yay -S --noconfirm --needed "$1"; then log "Echec lors de l'installation de $1." return 1 fi log "Paquet $1 installé avec succès." return 0 fi log "Paquet $1 déjà installé." } function ensure_package_group_is_installed() { local group_name="$1" local exit_status=0 log "Vérification du groupe de paquets : $group_name" members=$(pacman -Sg "$group_name" 2>/dev/null | awk '{print $2}') if [[ -z "$members" ]]; then log "Le groupe '$group_name' n'existe pas ou ne contient aucun paquet." >&2 return 1 fi missing_packages="" for pkg in $members; do if ! is_installed "$pkg"; then missing_packages+="$pkg " exit_status=1 fi done if [ $exit_status -eq 0 ]; then log "Le groupe '$group_name' est COMPLÈTEMENT installé." return 0 else log "Le groupe '$group_name' est INCOMPLET. Paquets manquants :" for pkg in $missing_pkgs; do ensure_package_is_installed "$pkg" done fi } function synchronize_user_folder() { log "Synchronisation du dossier $1 vers $2..." && rsync --archive --quiet --delete "$1" "$2" } function synchronize_root_folder() { log "Synchronisation du dossier $1 vers $2..." && sudo rsync --archive --quiet --delete "$1" "$2" } function ensure_group_is_installed() { if groups "$USER" | grep "$1" >/dev/null 2>&1; then log "Groupe $1 déjà présent pour l'utilisateur $USER." else log "Groupe $1 absent pour l'utilisateur $USER, configuration..." sudo usermod -aG docker "$1" fi } function ensure_service_active() { local service_name="$1" if ! systemctl is-enabled --quiet "${service_name}"; then log "Le service '${service_name}' n'est pas activé. Activation en cours..." if ! sudo systemctl enable "${service_name}" >/dev/null 2>&1; then log "Impossible d'activer le service '${service_name}'." else log "Service $service_name activé." fi else log "Service $service_name déjà activé." fi if ! systemctl is-active --quiet "${service_name}"; then log "Le service '${service_name}' n'est pas démarré. Démarrage en cours..." if ! sudo systemctl start "${service_name}" >/dev/null 2>&1; then log "Impossible de démarrer le service '${service_name}'." else log "Service '${service_name}' démarré." fi else log "Service '${service_name}' déjà démarré." fi } function ensure_user_service_active() { local service_name="$1" if ! systemctl --user is-enabled --quiet "${service_name}"; then log "Le service '${service_name}' n'est pas activé. Activation en cours..." if ! systemctl --quiet --user enable "${service_name}"; then log "Impossible d'activer le service '${service_name}'." else log "Service $service_name activé." fi else log "Service $service_name déjà activé." fi if ! systemctl --user is-active --quiet "${service_name}"; then log "Le service '${service_name}' n'est pas démarré. Démarrage en cours..." if ! systemctl --quiet --user start "${service_name}"; then log "Impossible de démarrer le service '${service_name}'." else log "Service '${service_name}' démarré." fi else log "Service '${service_name}' déjà démarré." fi } function ensure_ssh_key_installed() { # Installing ssk-keygen and other OpenSSH related packages ensure_package_is_installed openssh if ls -d ~/.ssh/*.pub >/dev/null 2>&1; then log "Clé SSH configurée sur ce système d'exploitation." else log "Aucune clé SSH configurée sur ce système d'exploitation." if ! ssh-keygen -t ed25519; then log "Impossible d'installer la clé SSH." return 1 fi fi } function ensure_shell_installed() { if grep "^$USER:.*:.*/$1$" /etc/passwd >/dev/null 2>&1; then log "Shell $1 déjà installé pour l'utilisateur $USER." return 0 fi log "Installation du shell $1 pour $USER." if sudo chsh -s fish "$USER"; then log "Shell $1 installé pour $USER." else log "Echec lors de l'installation du shell $1 pour l'utilisateur $USER." return 1 fi } function ensure_git_folder_installed_for_user() { local git_path="$1" local repo_dir="$2" local full_url="https://github.com/$git_path" if [[ -d "$repo_dir" ]]; then log "Dossier $repo_dir existant, mise à jour..." if git -C "$repo_dir" pull --quiet; then log "Dépôt $repo_dir mis à jour." return 0 else log "Échec de la mise à jour du dépôt $repo_dir." return 1 fi fi log "Dépôt $repo_dir innexistant, installation..." if git clone --quiet "$full_url" "$repo_dir"; then log "Dépôt cloné avec succès dans $repo_dir." return 0 else log "Échec du clonage de $full_url." return 1 fi } function ensure_git_folder_installed_for_root() { local git_path="$1" local repo_dir="$2" local full_url="https://github.com/$git_path" if sudo test -d "$repo_dir"; then log "Dossier $repo_dir existant, mise à jour..." if sudo git -C "$repo_dir" pull --quiet; then log "Dépôt $repo_dir mis à jour." return 0 else log "Échec de la mise à jour du dépôt $repo_dir." return 1 fi fi log "Dépôt $repo_dir innexistant, installation..." if sudo git clone --quiet "$full_url" "$repo_dir"; then log "Dépôt cloné pour l'administrateur avec succès dans $repo_dir." return 0 else log "Échec du clonage pour l'administrateur de $full_url." return 1 fi } function ensure_gnome_setting_set() { local setting_schema="$1" local setting_key="$2" local setting_value="$3" if gsettings get "$setting_schema" "$setting_key" >/dev/null 2>&1; then log "Paramètre $setting_schema déjà paramétré." return 0 fi if ! gsettings set "$setting_schema" "$setting_key" "$setting_value"; then log "Echec lor de la configuration du paramètre $1." return 1 fi log "Paramètre $setting_schema $setting_key paramétré avec succès." } function ensure_mkinitcpio_configured_for() { local kernel="$1" if sudo mkinitcpio -p "$kernel"; then log "Noyau $kernel installé." else log "Echec lors de l'installation du noyau $kernel, ne redémarrez surtout pas !" fi if ! sudo grub-mkconfig -o /boot/grub/grub.cfg; then log "Erreur lors de la configuration du noyau dans Grub, ne redemarrez pas !" return 1 fi log "Grub configure pour le noyau linux avec succes." } function ensure_github_cli_authenticated() { if gh auth status >/dev/null 2>&1; then log "Déjà connecté à GitHub CLI." return 0 fi log "Déconnecté de GitHub CLI, connexion..." if ! gh auth login; then log "Echec d'authentification à GitHub CLI." return 1 else log "Connecté à GitHub CLI avec succès." fi } function ensure_graphics_packages_installed() { ensure_package_is_installed pciutils log "Détection du matériel graphique..." local vendor local lspci_output lspci_output=$(lspci | grep -i 'vga\|display') if echo "$lspci_output" | grep -iq "NVIDIA"; then vendor="NVIDIA" elif echo "$lspci_output" | grep -iq "AMD\|ATI"; then vendor="AMD" elif echo "$lspci_output" | grep -iq "Intel"; then vendor="Intel" else log "Impossible de détecter le fournisseur de la carte graphique. Aucun paquet graphique ne sera installé." return 0 fi log "Fournisseur de carte graphique détecté : $vendor" case $vendor in "AMD") log "Installation des paquets pour AMD..." ensure_package_is_installed xf86-video-amdgpu && ensure_package_is_installed mesa && ensure_package_is_installed lib32-mesa && ensure_package_is_installed vulkan-radeon && ensure_package_is_installed lib32-vulkan-radeon && ensure_package_is_installed amd-ucode ;; "Intel") log "Installation des paquets pour Intel..." ensure_package_is_installed xf86-video-intel && ensure_package_is_installed mesa && ensure_package_is_installed lib32-mesa && ensure_package_is_installed vulkan-intel && ensure_package_is_installed intel-ucode ;; "NVIDIA") log "Installation des paquets pour NVIDIA..." ensure_package_is_installed nvidia && ensure_package_is_installed mesa && ensure_package_is_installed lib32-mesa && ensure_package_is_installed nvidia-utils && ensure_package_is_installed nvidia-settings ;; esac } function ensure_npm_package_installed() { if ! command -v "$1"; then log "Installation de $1..." if ! sudo npm install --global "$1" >/dev/null 2>&1; then log "Echec d'installation de $1." exit 1 fi log "Installation de $1 résussie." return fi log "$1 déjà installé, mise-à-jour..." if ! sudo npm install --global "$1" >/dev/null 2>&1; then log "Echec de la mise à jour de $1." exit 1 fi log "$1 mis-à-jour." exit 1 }