From e0f7064766360aed4cf0304db2bf0152419774a3 Mon Sep 17 00:00:00 2001 From: Phiippe Favre Date: Mon, 28 Jul 2025 03:22:37 +0200 Subject: [PATCH] Refactor gaming deployment tool: unified interface, enhanced logging, updated package sources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Unified installation/uninstallation into single window interface - Added 4-column layout with emojis by application type - Simplified validation flow to single confirmation per operation - Enhanced comprehensive logging throughout all operations - Verified Heroic (GitHub) and Lutris (APT) package sources 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .claude/settings.local.json | 3 +- install_gaming.sh | 1008 +++++++++++++++++++++++++++++------ 2 files changed, 845 insertions(+), 166 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 8da1a29..e3fd087 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -4,7 +4,8 @@ "Bash(grep:*)", "Bash(git add:*)", "Bash(git commit:*)", - "Bash(git push:*)" + "Bash(git push:*)", + "Bash(bash:*)" ], "deny": [] } diff --git a/install_gaming.sh b/install_gaming.sh index 842c797..af79506 100755 --- a/install_gaming.sh +++ b/install_gaming.sh @@ -73,45 +73,40 @@ TIMEOUT_APT=180 # 3 minutes pour les commandes apt # Fonction pour afficher les logs en cas d'erreur show_error_logs() { local error_message="$1" - local show_logs="${2:-true}" - # D'abord afficher l'erreur, puis demander si l'utilisateur veut voir les logs - zenity 2>/dev/null --error --title="Erreur" --text="$error_message" - - if [ "$show_logs" = "true" ] && [ -f "$LOG_FILE" ]; then - if zenity 2>/dev/null --question --title="Voir les logs" --text="Voulez-vous consulter les logs d'erreur pour plus de détails ?"; then - # Vérifier si le fichier de log existe et contient des données - if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then - # Afficher les logs dans une fenêtre scrollable avec le contenu complet - zenity 2>/dev/null --text-info \ - --title="Logs d'erreur - $error_message" \ - --filename="$LOG_FILE" \ - --width=800 --height=550 \ - --no-wrap - else - # Informations de débogage pour le fichier de log - local log_info="" - if [ ! -f "$LOG_FILE" ]; then - log_info="Le fichier de log n'existe pas." - elif [ ! -s "$LOG_FILE" ]; then - log_info="Le fichier de log existe mais est vide." - else - log_info="Problème inconnu avec le fichier de log." - fi - - log_info="$log_info\n\nFichier de log : $LOG_FILE" - log_info="$log_info\nTaille du fichier : $(ls -la "$LOG_FILE" 2>/dev/null || echo "N/A")" - - zenity 2>/dev/null --info --title="Logs vides" --text="$log_info" - fi + # Afficher directement les logs sans demander de confirmation + if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then + # Afficher les logs dans une fenêtre scrollable avec le contenu complet + zenity 2>/dev/null --text-info \ + --title="Journaux - $error_message" \ + --filename="$LOG_FILE" \ + --width=800 --height=550 \ + --no-wrap + else + # Informations de débogage pour le fichier de log + local log_info="" + if [ ! -f "$LOG_FILE" ]; then + log_info="Le fichier de log n'existe pas." + elif [ ! -s "$LOG_FILE" ]; then + log_info="Le fichier de log existe mais est vide." + else + log_info="Problème inconnu avec le fichier de log." fi + + log_info="$log_info\n\nFichier de log : $LOG_FILE" + log_info="$log_info\nTaille du fichier : $(ls -la "$LOG_FILE" 2>/dev/null || echo "N/A")" + + zenity 2>/dev/null --info --title="Journaux vides - $error_message" --text="$log_info" fi } # Fonction pour afficher le récapitulatif des installations show_installation_summary() { if [ ${#INSTALLED_APPS[@]} -eq 0 ]; then - zenity 2>/dev/null --warning --title="Aucune installation" --text="Aucune application n'a été installée." + zenity 2>/dev/null --warning --title="Installation incomplète" --text="Aucune application n'a été installée." --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs d'installation - Aucune installation" + fi return fi @@ -132,7 +127,10 @@ show_installation_summary() { summary_text+="\n🔄 Important : Redémarrage système requis pour les drivers NVIDIA\n" fi - zenity 2>/dev/null --info --title="Installation terminée" --text="$summary_text" --width=500 + zenity 2>/dev/null --info --title="Installation achevée" --text="$summary_text" --width=500 --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs d'installation" + fi } # Fonction de logging @@ -192,7 +190,7 @@ check_sudo_password() { echo "$password" | sudo -S true 2>/dev/null if [ $? -ne 0 ]; then log_error "Mot de passe sudo incorrect" - zenity 2>/dev/null --error --title="Erreur d'authentification" --text="Mot de passe sudo incorrect." + zenity 2>/dev/null --error --title="Erreur d'authentification" --text="Mot de passe administrateur incorrect." return 1 fi return 0 @@ -210,7 +208,7 @@ get_global_sudo_password() { fi # Demander le mot de passe sudo pour toutes les installations - GLOBAL_SUDO_PASSWORD=$(zenity 2>/dev/null --password --title="Authentification - Debian Gaming Deployment Tool" --text="Mot de passe sudo requis pour installer :\n$app_list") + GLOBAL_SUDO_PASSWORD=$(zenity 2>/dev/null --password --title="Authentification - Debian Gaming Deployment Tool" --text="Mot de passe administrateur requis pour l'installation :\n$app_list") if [ $? -eq 1 ]; then return 1 @@ -232,7 +230,7 @@ use_global_password_or_ask() { # Si le mot de passe global n'est pas défini, demander un nouveau if [ -z "$GLOBAL_SUDO_PASSWORD" ]; then - password=$(zenity 2>/dev/null --password --title="Authentification - Installation $app_name" --text="Mot de passe sudo requis pour installer $app_name:") + password=$(zenity 2>/dev/null --password --title="Authentification - Installation de $app_name" --text="Mot de passe administrateur requis pour installer $app_name :") if [ $? -eq 1 ]; then return 1 @@ -296,6 +294,43 @@ end_batch_install() { fi } +# Fonction pour confirmer avant de continuer +confirm_continue() { + local message="$1" + local title="${2:-Confirmation}" + + if ! zenity 2>/dev/null --question --title="$title" --text="$message\n\nVoulez-vous continuer ?"; then + exit 0 + fi +} + +# Fonction pour afficher un message et attendre validation +show_message_and_wait() { + local message="$1" + local title="${2:-Information}" + + zenity 2>/dev/null --info --title="$title" --text="$message\n\nCliquez sur OK pour continuer." +} + +# Fonction pour désinstaller sans confirmation supplémentaire +uninstall_with_progress() { + local component="$1" + local password="$2" + local app_name="$3" + local uninstall_function="$4" + + log_info "Début de la désinstallation de $app_name via $uninstall_function" + + # Exécuter la désinstallation + if $uninstall_function "$password"; then + log_info "Désinstallation de $app_name terminée avec succès" + return 0 + else + log_error "Échec de la désinstallation de $app_name" + return 1 + fi +} + # Fonction pour gérer l'affichage de progression (individuelle ou groupée) show_progress() { local app_name="$1" @@ -371,57 +406,34 @@ ensure_flathub_sources() { # Fonction pour afficher la fenêtre de sélection d'installation -show_install_selection() { +show_unified_selection() { zenity 2>/dev/null --list --checklist \ --title="Debian Gaming Deployment Tool" \ - --text="Sélectionnez les composants à installer :" \ - --column="Installer" --column="Composant" --column="Description" \ - --width=600 --height=450 \ + --text="Sélectionnez les applications puis choisissez l'action :" \ + --column="Sélection" --column="Application" --column="Type" --column="Description" \ + --width=1000 --height=600 \ --ok-label="Installer" \ --extra-button="Désinstaller" \ - FALSE "nvidia" "💻 NVIDIA + CUDA - Pilotes graphiques" \ - FALSE "flatpak" "📦 Flatpak + Flathub - Magasin d'applications" \ - FALSE "steam" "🎮 Steam - Plateforme gaming Valve" \ - FALSE "heroic" "🎮 Heroic - Epic Games & GOG" \ - FALSE "lutris" "🎮 Lutris - Gestionnaire de jeux" \ - FALSE "retroarch" "🕹️ RetroArch - Multi-émulateur (Flatpak)" \ - FALSE "utils" "⚡ Goverlay - Affichage performances (FPS, CPU, GPU)" \ - FALSE "protonup" "🔄 ProtonUp-Qt - Gestionnaire versions Proton (Flatpak)" \ - FALSE "wine" "🍷 Wine + Winetricks - Compatibilité Windows" \ - FALSE "bottles" "🍷 Bottles - Gestionnaire Wine moderne (Flatpak)" \ - FALSE "discord" "💬 Discord - Chat vocal & texte (Flatpak)" \ - FALSE "vesktop" "💬 Vesktop - Client Discord alternatif (Flatpak)" \ - FALSE "teamspeak" "💬 TeamSpeak - Communication vocale (Flatpak)" \ - FALSE "mumble" "💬 Mumble - Communication vocale libre" \ - FALSE "flatseal" "📦 Flatseal - Gestionnaire permissions Flatpak" \ - FALSE "gearlever" "📦 Gear Lever - Gestionnaire AppImage (Flatpak)" + --cancel-label="Annuler" \ + --separator="|" \ + FALSE "nvidia" "💻 APT" "NVIDIA + CUDA - Pilotes graphiques professionnels" \ + FALSE "flatpak" "📦 APT" "Flatpak + Flathub - Gestionnaire d'applications universelles" \ + FALSE "steam" "🎮 APT" "Steam - Plateforme de jeux numériques Valve" \ + FALSE "heroic" "🎮 GitHub" "Heroic Game Launcher - Client Epic Games et GOG" \ + FALSE "lutris" "🎮 APT" "Lutris - Gestionnaire de bibliothèque de jeux" \ + FALSE "retroarch" "🕹️ Flatpak" "RetroArch - Plateforme d'émulation multi-systèmes" \ + FALSE "utils" "⚡ APT" "Utilitaires gaming - Monitoring des performances (FPS, CPU, GPU)" \ + FALSE "protonup" "🔄 Flatpak" "ProtonUp-Qt - Gestionnaire de versions Proton" \ + FALSE "wine" "🍷 APT" "Wine + Winetricks - Couche de compatibilité Windows" \ + FALSE "bottles" "🍷 Flatpak" "Bottles - Gestionnaire Wine moderne" \ + FALSE "discord" "💬 Flatpak" "Discord - Plateforme de communication gaming" \ + FALSE "vesktop" "💬 Flatpak" "Vesktop - Client Discord alternatif" \ + FALSE "teamspeak" "💬 Flatpak" "TeamSpeak - Communication vocale" \ + FALSE "mumble" "💬 APT" "Mumble - Communication vocale libre" \ + FALSE "flatseal" "🔧 Flatpak" "Flatseal - Gestionnaire permissions Flatpak" \ + FALSE "gearlever" "📦 Flatpak" "Gear Lever - Gestionnaire AppImage" } -# Fonction pour afficher la fenêtre de sélection de désinstallation -show_uninstall_selection() { - zenity 2>/dev/null --list --checklist \ - --title="Debian Gaming Deployment Tool - Désinstallation" \ - --text="Sélectionnez les composants à désinstaller :" \ - --column="Désinstaller" --column="Composant" --column="Description" \ - --width=850 --height=550 \ - --ok-label="Désinstaller" \ - FALSE "nvidia" "💻 NVIDIA + CUDA - Pilotes graphiques" \ - FALSE "flatpak" "📦 Flatpak + Flathub - Magasin d'applications" \ - FALSE "steam" "🎮 Steam - Plateforme gaming Valve" \ - FALSE "heroic" "🎮 Heroic - Epic Games & GOG" \ - FALSE "lutris" "🎮 Lutris - Gestionnaire de jeux" \ - FALSE "retroarch" "🕹️ RetroArch - Multi-émulateur (Flatpak)" \ - FALSE "utils" "⚡ Goverlay - Affichage performances (FPS, CPU, GPU)" \ - FALSE "protonup" "🔄 ProtonUp-Qt - Gestionnaire versions Proton (Flatpak)" \ - FALSE "wine" "🍷 Wine + Winetricks - Compatibilité Windows" \ - FALSE "bottles" "🍷 Bottles - Gestionnaire Wine moderne (Flatpak)" \ - FALSE "discord" "💬 Discord - Chat vocal & texte (Flatpak)" \ - FALSE "vesktop" "💬 Vesktop - Client Discord alternatif (Flatpak)" \ - FALSE "teamspeak" "💬 TeamSpeak - Communication vocale (Flatpak)" \ - FALSE "mumble" "💬 Mumble - Communication vocale libre" \ - FALSE "flatseal" "📦 Flatseal - Gestionnaire permissions Flatpak" \ - FALSE "gearlever" "📦 Gear Lever - Gestionnaire AppImage (Flatpak)" -} # Fonction d'installation Steam install_steam() { @@ -431,7 +443,7 @@ install_steam() { if dpkg -l | grep -q "^ii.*steam-installer"; then log_info "steam-installer déjà installé" if [ "$BATCH_INSTALL_MODE" != "true" ]; then - zenity 2>/dev/null --info --title="Déjà installé" --text="steam-installer est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="steam-installer est déjà installé sur le système." fi return fi @@ -530,7 +542,7 @@ install_protonup() { # Vérifier si ProtonUp-Qt est déjà installé if flatpak list | grep -q "net.davidotek.pupgui2"; then log_info "ProtonUp-Qt déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="ProtonUp-Qt est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="ProtonUp-Qt est déjà installé sur le système." return fi @@ -586,7 +598,7 @@ install_lutris() { # Vérifier si Lutris est déjà installé if dpkg -l | grep -q "^ii.*lutris" || command -v lutris &> /dev/null; then log_info "Lutris déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="Lutris est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Lutris est déjà installé sur le système." return fi @@ -663,7 +675,7 @@ install_bottles() { # Vérifier si Bottles est déjà installé if command -v bottles &> /dev/null || flatpak list | grep -q "com.usebottles.bottles"; then log_info "Bottles déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="Bottles est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Bottles est déjà installé sur le système." return fi @@ -722,7 +734,7 @@ install_wine() { if [ "$wine_installed" = "oui" ] && [ "$winetricks_installed" = "oui" ]; then log_info "Wine et Winetricks déjà installés" - zenity 2>/dev/null --info --title="Déjà installés" --text="Wine et Winetricks sont déjà installés sur le système." + zenity 2>/dev/null --info --title="Composants déjà présents" --text="Wine et Winetricks sont déjà installés sur le système." return fi @@ -840,7 +852,7 @@ install_retroarch() { # Vérifier si RetroArch est déjà installé if dpkg -l | grep -q "^ii.*retroarch" || command -v retroarch &> /dev/null || flatpak list | grep -q "org.libretro.RetroArch"; then log_info "RetroArch déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="RetroArch est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="RetroArch est déjà installé sur le système." return fi @@ -899,7 +911,7 @@ install_flatpak() { if [ "$flatpak_installed" = "oui" ] && [ "$flathub_configured" = "oui" ]; then log_info "Flatpak et Flathub déjà configurés" - zenity 2>/dev/null --info --title="Déjà configurés" --text="Flatpak et Flathub sont déjà installés et configurés sur le système." + zenity 2>/dev/null --info --title="Composants déjà configurés" --text="Flatpak et Flathub sont déjà installés et configurés sur le système." return fi @@ -971,7 +983,7 @@ install_flatseal() { if flatpak list | grep -q "com.github.tchx84.Flatseal" 2>/dev/null; then log_info "Flatseal déjà installé via Flatpak" if [ "$BATCH_INSTALL_MODE" != "true" ]; then - zenity 2>/dev/null --info --title="Déjà installé" --text="Flatseal est déjà installé via Flatpak sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Flatseal est déjà installé via Flatpak sur le système." fi return fi @@ -1054,7 +1066,7 @@ install_gearlever() { # Vérifier si Gear Lever est déjà installé if command -v gear-lever &> /dev/null || flatpak list | grep -q "it.mijorus.gearlever"; then log_info "Gear Lever déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="Gear Lever est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Gear Lever est déjà installé sur le système." return fi @@ -1110,7 +1122,7 @@ install_discord() { # Vérifier si Discord est déjà installé if command -v discord &> /dev/null || flatpak list | grep -q "com.discordapp.Discord"; then log_info "Discord déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="Discord est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Discord est déjà installé sur le système." return fi @@ -1166,7 +1178,7 @@ install_vesktop() { # Vérifier si Vesktop est déjà installé via Flatpak if flatpak list | grep -q "dev.vencord.Vesktop" 2>/dev/null; then log_info "Vesktop déjà installé via Flatpak" - zenity 2>/dev/null --info --title="Déjà installé" --text="Vesktop est déjà installé via Flatpak sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Vesktop est déjà installé via Flatpak sur le système." return fi @@ -1222,7 +1234,7 @@ install_teamspeak() { # Vérifier si TeamSpeak est déjà installé via Flatpak if flatpak list | grep -q "com.teamspeak.TeamSpeak3" 2>/dev/null; then log_info "TeamSpeak déjà installé via Flatpak" - zenity 2>/dev/null --info --title="Déjà installé" --text="TeamSpeak est déjà installé via Flatpak sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="TeamSpeak est déjà installé via Flatpak sur le système." return fi @@ -1279,7 +1291,7 @@ install_mumble() { if dpkg -l | grep -q "^ii.*mumble" || command -v mumble &> /dev/null; then log_info "Mumble déjà installé" if [ "$BATCH_INSTALL_MODE" != "true" ]; then - zenity 2>/dev/null --info --title="Déjà installé" --text="Mumble est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Mumble est déjà installé sur le système." fi return fi @@ -1366,7 +1378,7 @@ install_heroic() { # Vérifier si Heroic Game Launcher est déjà installé if dpkg -l | grep -q "^ii.*heroic" || command -v heroic &> /dev/null; then log_info "Heroic Game Launcher déjà installé" - zenity 2>/dev/null --info --title="Déjà installé" --text="Heroic Game Launcher est déjà installé sur le système." + zenity 2>/dev/null --info --title="Composant déjà présent" --text="Heroic Game Launcher est déjà installé sur le système." return fi @@ -1449,7 +1461,7 @@ install_nvidia() { # Vérifier si les drivers NVIDIA sont déjà installés if dpkg -l | grep -q "^ii.*nvidia-open" || dpkg -l | grep -q "^ii.*cuda-toolkit"; then log_info "Drivers NVIDIA déjà installés" - zenity 2>/dev/null --info --title="Déjà installé" --text="Les drivers NVIDIA ou CUDA sont déjà installés sur le système." + zenity 2>/dev/null --info --title="Composants déjà présents" --text="Les drivers NVIDIA ou CUDA sont déjà installés sur le système." return fi @@ -1549,7 +1561,7 @@ install_utils() { if [ "$gamemode_installed" = "oui" ] && [ "$mangohud_installed" = "oui" ] && [ "$goverlay_installed" = "oui" ]; then log_info "Tous les utilitaires gaming déjà installés" - zenity 2>/dev/null --info --title="Déjà installés" --text="Tous les utilitaires gaming sont déjà installés sur le système." + zenity 2>/dev/null --info --title="Composants déjà présents" --text="Tous les utilitaires gaming sont déjà installés sur le système." return fi @@ -1605,7 +1617,7 @@ install_utils() { if [ "$gamemode_ok" = "✗" ] || [ "$mangohud_ok" = "✗" ] || [ "$goverlay_ok" = "✗" ]; then # Afficher d'abord le message puis proposer les logs zenity 2>/dev/null --info --title="Installation partielle" --text="$message" - if zenity 2>/dev/null --question --title="Voir les logs" --text="Certains utilitaires ont échoué.\nVoulez-vous consulter les logs d'erreur ?"; then + if zenity 2>/dev/null --question --title="Consultation des journaux" --text="Certains utilitaires ont échoué.\nSouhaitez-vous consulter les journaux d'erreur ?"; then show_error_logs "Installation partielle des utilitaires gaming" fi else @@ -1621,7 +1633,7 @@ uninstall_steam() { # Vérifier si steam-installer est installé if ! dpkg -l | grep -q "^ii.*steam-installer"; then log_info "steam-installer non installé" - zenity 2>/dev/null --info --title="Non installé" --text="steam-installer n'est pas installé sur le système." + zenity 2>/dev/null --info --title="Composant non présent" --text="steam-installer n'est pas installé sur le système." return fi @@ -1680,6 +1692,45 @@ uninstall_steam() { fi } +# Version silencieuse pour désinstallation multiple +uninstall_steam_silent() { + local password="$1" + log_info "Début de la désinstallation de steam-installer (mode silencieux)" + + # Vérifier si steam-installer est installé + log_info "Vérification de l'installation de steam-installer..." + if ! dpkg -l | grep -q "^ii.*steam-installer"; then + log_info "steam-installer n'est pas installé" + return 0 + fi + log_info "steam-installer est installé, procédure de désinstallation" + + # Désinstaller sans confirmation ni interface graphique + log_info "Exécution de la commande de désinstallation..." + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y steam-installer >> "$LOG_FILE" 2>&1 + local apt_result=$? + log_info "Code de retour de apt-get purge: $apt_result" + + if ! check_apt_success $apt_result "steam-installer" "désinstallation"; then + log_error "Échec de la désinstallation de steam-installer (code: $apt_result)" + return 1 + fi + + # Nettoyage des paquets orphelins + log_info "Nettoyage des paquets orphelins..." + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + + # Vérifier si la désinstallation a réussi + log_info "Vérification finale de la désinstallation..." + if ! dpkg -l | grep -q "^ii.*steam-installer"; then + log_info "steam-installer désinstallé avec succès" + return 0 + else + log_error "steam-installer toujours présent après désinstallation" + return 1 + fi +} + # Fonction de désinstallation ProtonUp-Qt uninstall_protonup() { log_info "Début de la désinstallation de ProtonUp-Qt" @@ -1741,6 +1792,33 @@ uninstall_protonup() { fi } +uninstall_protonup_silent() { + local password="$1" + log_info "Début de la désinstallation de ProtonUp-Qt (mode silencieux)" + + # Vérifier si ProtonUp-Qt est installé + if ! flatpak list | grep -q "net.davidotek.pupgui2"; then + log_info "ProtonUp-Qt non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y net.davidotek.pupgui2 >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de ProtonUp-Qt" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "net.davidotek.pupgui2"; then + log_info "ProtonUp-Qt désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de ProtonUp-Qt" + return 1 + fi +} + # Fonction de désinstallation Bottles uninstall_bottles() { log_info "Début de la désinstallation de Bottles" @@ -1802,6 +1880,33 @@ uninstall_bottles() { fi } +uninstall_bottles_silent() { + local password="$1" + log_info "Début de la désinstallation de Bottles (mode silencieux)" + + # Vérifier si Bottles est installé + if ! flatpak list | grep -q "com.usebottles.bottles"; then + log_info "Bottles non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y com.usebottles.bottles >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de Bottles" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "com.usebottles.bottles"; then + log_info "Bottles désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Bottles" + return 1 + fi +} + # Fonction de désinstallation Wine + Winetricks uninstall_wine() { log_info "Début de la désinstallation de Wine + Winetricks" @@ -1871,6 +1976,47 @@ uninstall_wine() { fi } +uninstall_wine_silent() { + local password="$1" + log_info "Début de la désinstallation de Wine + Winetricks (mode silencieux)" + + # Vérifier si Wine et Winetricks sont installés + wine_installed=$(dpkg -l | grep -q "^ii.*winehq-stable\|^ii.*wine\b" && echo "oui" || echo "non") + winetricks_installed=$(command -v winetricks &> /dev/null && echo "oui" || echo "non") + + if [ "$wine_installed" = "non" ] && [ "$winetricks_installed" = "non" ]; then + log_info "Wine et Winetricks non installés" + return 0 + fi + + # Désinstaller Wine + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y winehq-stable wine* >> "$LOG_FILE" 2>&1 + wine_remove_result=$? + + # Désinstaller Winetricks + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y winetricks >> "$LOG_FILE" 2>&1 + winetricks_remove_result=$? + + # Logger les résultats individuels + check_apt_success $wine_remove_result "wine" "désinstallation" + check_apt_success $winetricks_remove_result "winetricks" "désinstallation" + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + + # Vérifier si la désinstallation a réussi + wine_ok=$(dpkg -l | grep -q "^ii.*winehq-stable\|^ii.*wine\b" && echo "non" || echo "oui") + winetricks_ok=$(command -v winetricks &> /dev/null && echo "non" || echo "oui") + + if [ "$wine_ok" = "oui" ] && [ "$winetricks_ok" = "oui" ]; then + log_info "Désinstallation Wine + Winetricks réussie" + return 0 + else + log_info "Désinstallation partielle de Wine + Winetricks" + return 1 + fi +} + # Fonction de désinstallation RetroArch uninstall_retroarch() { log_info "Début de la désinstallation de RetroArch" @@ -1932,6 +2078,33 @@ uninstall_retroarch() { fi } +uninstall_retroarch_silent() { + local password="$1" + log_info "Début de la désinstallation de RetroArch (mode silencieux)" + + # Vérifier si RetroArch est installé + if ! flatpak list | grep -q "org.libretro.RetroArch" && ! dpkg -l | grep -q "^ii.*retroarch"; then + log_info "RetroArch non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y org.libretro.RetroArch >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de RetroArch" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "org.libretro.RetroArch"; then + log_info "RetroArch désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de RetroArch" + return 1 + fi +} + # Fonction de désinstallation Flatpak uninstall_flatpak() { log_info "Début de la désinstallation de Flatpak" @@ -1995,6 +2168,36 @@ uninstall_flatpak() { fi } +uninstall_flatpak_silent() { + local password="$1" + log_info "Début de la désinstallation de Flatpak (mode silencieux)" + + # Vérifier si Flatpak est installé + if ! command -v flatpak &> /dev/null; then + log_info "Flatpak non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y flatpak >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "flatpak" "désinstallation"; then + log_error "Échec de la désinstallation de Flatpak" + return 1 + fi + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + + # Vérifier si la désinstallation a réussi + if ! command -v flatpak &> /dev/null; then + log_info "Flatpak désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Flatpak" + return 1 + fi +} + # Fonction de désinstallation Gear Lever uninstall_gearlever() { log_info "Début de la désinstallation de Gear Lever" @@ -2056,6 +2259,33 @@ uninstall_gearlever() { fi } +uninstall_gearlever_silent() { + local password="$1" + log_info "Début de la désinstallation de Gear Lever (mode silencieux)" + + # Vérifier si Gear Lever est installé + if ! flatpak list | grep -q "it.mijorus.gearlever"; then + log_info "Gear Lever non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y it.mijorus.gearlever >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de Gear Lever" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "it.mijorus.gearlever"; then + log_info "Gear Lever désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Gear Lever" + return 1 + fi +} + # Fonction de désinstallation Discord uninstall_discord() { log_info "Début de la désinstallation de Discord" @@ -2117,6 +2347,33 @@ uninstall_discord() { fi } +uninstall_discord_silent() { + local password="$1" + log_info "Début de la désinstallation de Discord (mode silencieux)" + + # Vérifier si Discord est installé + if ! flatpak list | grep -q "com.discordapp.Discord" && ! command -v discord &> /dev/null; then + log_info "Discord non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y com.discordapp.Discord >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de Discord" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "com.discordapp.Discord"; then + log_info "Discord désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Discord" + return 1 + fi +} + # Fonction de désinstallation Vesktop uninstall_vesktop() { log_info "Début de la désinstallation de Vesktop via Flatpak" @@ -2178,6 +2435,33 @@ uninstall_vesktop() { fi } +uninstall_vesktop_silent() { + local password="$1" + log_info "Début de la désinstallation de Vesktop (mode silencieux)" + + # Vérifier si Vesktop est installé via Flatpak + if ! flatpak list | grep -q "dev.vencord.Vesktop" 2>/dev/null; then + log_info "Vesktop non installé via Flatpak" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y dev.vencord.Vesktop >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de Vesktop" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "dev.vencord.Vesktop" 2>/dev/null; then + log_info "Vesktop désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Vesktop" + return 1 + fi +} + # Fonction de désinstallation TeamSpeak uninstall_teamspeak() { log_info "Début de la désinstallation de TeamSpeak via Flatpak" @@ -2239,6 +2523,33 @@ uninstall_teamspeak() { fi } +uninstall_teamspeak_silent() { + local password="$1" + log_info "Début de la désinstallation de TeamSpeak (mode silencieux)" + + # Vérifier si TeamSpeak est installé via Flatpak + if ! flatpak list | grep -q "com.teamspeak.TeamSpeak3" 2>/dev/null; then + log_info "TeamSpeak non installé via Flatpak" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y com.teamspeak.TeamSpeak3 >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de TeamSpeak" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "com.teamspeak.TeamSpeak3" 2>/dev/null; then + log_info "TeamSpeak désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de TeamSpeak" + return 1 + fi +} + # Fonction de désinstallation Mumble uninstall_mumble() { log_info "Début de la désinstallation de Mumble" @@ -2302,6 +2613,36 @@ uninstall_mumble() { fi } +uninstall_mumble_silent() { + local password="$1" + log_info "Début de la désinstallation de Mumble (mode silencieux)" + + # Vérifier si Mumble est installé + if ! dpkg -l | grep -q "^ii.*mumble" && ! command -v mumble &> /dev/null; then + log_info "Mumble non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y mumble >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "mumble" "désinstallation"; then + log_error "Échec de la désinstallation de Mumble" + return 1 + fi + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + + # Vérifier si la désinstallation a réussi + if ! dpkg -l | grep -q "^ii.*mumble" && ! command -v mumble &> /dev/null; then + log_info "Mumble désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Mumble" + return 1 + fi +} + # Fonction de désinstallation Flatseal uninstall_flatseal() { log_info "Début de la désinstallation de Flatseal via Flatpak" @@ -2363,6 +2704,33 @@ uninstall_flatseal() { fi } +uninstall_flatseal_silent() { + local password="$1" + log_info "Début de la désinstallation de Flatseal (mode silencieux)" + + # Vérifier si Flatseal est installé via Flatpak + if ! flatpak list | grep -q "com.github.tchx84.Flatseal" 2>/dev/null; then + log_info "Flatseal non installé via Flatpak" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S flatpak uninstall -y com.github.tchx84.Flatseal >> "$LOG_FILE" 2>&1 + if [ $? -ne 0 ]; then + log_error "Échec de la désinstallation de Flatseal" + return 1 + fi + + # Vérifier si la désinstallation a réussi + if ! flatpak list | grep -q "com.github.tchx84.Flatseal" 2>/dev/null; then + log_info "Flatseal désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Flatseal" + return 1 + fi +} + # Fonction de désinstallation Lutris uninstall_lutris() { log_info "Début de la désinstallation de Lutris" @@ -2429,6 +2797,39 @@ uninstall_lutris() { fi } +uninstall_lutris_silent() { + local password="$1" + log_info "Début de la désinstallation de Lutris (mode silencieux)" + + # Vérifier si Lutris est installé + if ! dpkg -l | grep -q "^ii.*lutris" && ! command -v lutris &> /dev/null; then + log_info "Lutris non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y lutris >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "lutris" "désinstallation"; then + log_error "Échec de la désinstallation de Lutris" + return 1 + fi + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "paquets orphelins" "nettoyage"; then + log_info "Avertissement: Erreur lors du nettoyage des paquets orphelins" + fi + + # Vérifier si la désinstallation a réussi + if ! dpkg -l | grep -q "^ii.*lutris" && ! command -v lutris &> /dev/null; then + log_info "Lutris désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Lutris" + return 1 + fi +} + # Fonction de désinstallation Heroic Game Launcher uninstall_heroic() { log_info "Début de la désinstallation de Heroic Game Launcher" @@ -2495,6 +2896,39 @@ uninstall_heroic() { fi } +uninstall_heroic_silent() { + local password="$1" + log_info "Début de la désinstallation de Heroic Game Launcher (mode silencieux)" + + # Vérifier si Heroic est installé + if ! dpkg -l | grep -q "^ii.*heroic" && ! command -v heroic &> /dev/null; then + log_info "Heroic Game Launcher non installé" + return 0 + fi + + # Désinstaller sans confirmation ni interface graphique + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y heroic >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "heroic" "désinstallation"; then + log_error "Échec de la désinstallation de Heroic Game Launcher" + return 1 + fi + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "paquets orphelins" "nettoyage"; then + log_info "Avertissement: Erreur lors du nettoyage des paquets orphelins" + fi + + # Vérifier si la désinstallation a réussi + if ! dpkg -l | grep -q "^ii.*heroic" && ! command -v heroic &> /dev/null; then + log_info "Heroic Game Launcher désinstallé avec succès" + return 0 + else + log_error "Échec de la désinstallation de Heroic Game Launcher" + return 1 + fi +} + # Fonction de désinstallation drivers NVIDIA uninstall_nvidia() { log_info "Début de la désinstallation des drivers NVIDIA" @@ -2572,6 +3006,50 @@ uninstall_nvidia() { fi } +uninstall_nvidia_silent() { + local password="$1" + log_info "Début de la désinstallation des drivers NVIDIA (mode silencieux)" + + # Vérifier si les drivers NVIDIA sont installés + if ! dpkg -l | grep -q "^ii.*nvidia-open" && ! dpkg -l | grep -q "^ii.*cuda-toolkit"; then + log_info "Drivers NVIDIA non installés" + return 0 + fi + + # Désinstaller CUDA Toolkit + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y cuda-toolkit-12-9 >> "$LOG_FILE" 2>&1 + cuda_remove_result=$? + + # Désinstaller les drivers NVIDIA + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y nvidia-open >> "$LOG_FILE" 2>&1 + nvidia_remove_result=$? + + # Logger les résultats individuels + check_apt_success $cuda_remove_result "cuda-toolkit-12-9" "désinstallation" + check_apt_success $nvidia_remove_result "nvidia-open" "désinstallation" + + # Vérifier si au moins une désinstallation a échoué + if [ $cuda_remove_result -ne 0 ] || [ $nvidia_remove_result -ne 0 ]; then + log_error "Erreur lors de la désinstallation des composants NVIDIA" + return 1 + fi + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + + # Vérifier si la désinstallation a réussi + cuda_ok=$(dpkg -l | grep -q "^ii.*cuda-toolkit" && echo "non" || echo "oui") + nvidia_ok=$(dpkg -l | grep -q "^ii.*nvidia-open" && echo "non" || echo "oui") + + if [ "$cuda_ok" = "oui" ] && [ "$nvidia_ok" = "oui" ]; then + log_info "Désinstallation des drivers NVIDIA réussie" + return 0 + else + log_info "Désinstallation partielle des drivers NVIDIA" + return 1 + fi +} + # Fonction de désinstallation des utilitaires gaming uninstall_utils() { log_info "Début de la désinstallation des utilitaires gaming" @@ -2651,6 +3129,57 @@ uninstall_utils() { fi } +uninstall_utils_silent() { + local password="$1" + log_info "Début de la désinstallation des utilitaires gaming (mode silencieux)" + + # Vérifier si les utilitaires sont installés + gamemode_installed=$(dpkg -l | grep -q "^ii.*gamemode" && echo "oui" || echo "non") + mangohud_installed=$(dpkg -l | grep -q "^ii.*mangohud" && echo "oui" || echo "non") + goverlay_installed=$(dpkg -l | grep -q "^ii.*goverlay" && echo "oui" || echo "non") + + if [ "$gamemode_installed" = "non" ] && [ "$mangohud_installed" = "non" ] && [ "$goverlay_installed" = "non" ]; then + log_info "Aucun utilitaire gaming installé" + return 0 + fi + + # Désinstaller gamemode + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y gamemode >> "$LOG_FILE" 2>&1 + gamemode_remove_result=$? + + # Désinstaller mangohud + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y mangohud >> "$LOG_FILE" 2>&1 + mangohud_remove_result=$? + + # Désinstaller goverlay + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get purge -y goverlay >> "$LOG_FILE" 2>&1 + goverlay_remove_result=$? + + # Logger les résultats individuels + check_apt_success $gamemode_remove_result "gamemode" "désinstallation" + check_apt_success $mangohud_remove_result "mangohud" "désinstallation" + check_apt_success $goverlay_remove_result "goverlay" "désinstallation" + + # Nettoyage des paquets orphelins + echo "$password" | timeout $TIMEOUT_APT sudo -S apt-get autoremove -y >> "$LOG_FILE" 2>&1 + if ! check_apt_success $? "paquets orphelins" "nettoyage"; then + log_info "Avertissement: Erreur lors du nettoyage des paquets orphelins" + fi + + # Vérifier si la désinstallation a réussi + gamemode_ok=$(dpkg -l | grep -q "^ii.*gamemode" && echo "non" || echo "oui") + mangohud_ok=$(dpkg -l | grep -q "^ii.*mangohud" && echo "non" || echo "oui") + goverlay_ok=$(dpkg -l | grep -q "^ii.*goverlay" && echo "non" || echo "oui") + + if [ "$gamemode_ok" = "oui" ] && [ "$mangohud_ok" = "oui" ] && [ "$goverlay_ok" = "oui" ]; then + log_info "Désinstallation complète des utilitaires gaming réussie" + return 0 + else + log_info "Échec de désinstallation de certains utilitaires gaming" + return 1 + fi +} + # Vérifier et installer zenity 2>/dev/null si nécessaire (sans sudo) check_zenity_user() { if ! command -v zenity 2>/dev/null &> /dev/null; then @@ -2680,123 +3209,272 @@ log_info "Fichier de log créé dans: $(pwd)/$(basename "$LOG_FILE")" # Afficher le chemin du log à l'utilisateur en cas de debug echo "Fichier de log: $(pwd)/$(basename "$LOG_FILE")" >&2 -# Afficher le menu d'installation avec bouton désinstaller -selection=$(show_install_selection) +# Afficher le menu principal unifié +selection=$(show_unified_selection) exit_code=$? -# Vérifier si l'utilisateur a cliqué sur "Désinstaller" -if [ $exit_code -eq 1 ] && [ "$selection" = "Désinstaller" ]; then - # Mode désinstallation - selection=$(show_uninstall_selection) - - # Vérifier si l'utilisateur a annulé - if [ $? -eq 1 ]; then - exit 0 - fi - - # Vérifier si aucune sélection - if [ -z "$selection" ]; then - zenity 2>/dev/null --info --title="Aucune sélection" --text="Aucun composant sélectionné pour la désinstallation." - exit 0 - fi - - # Traiter les sélections de désinstallation - IFS='|' read -ra SELECTED <<< "$selection" +# Déterminer l'action selon le code de retour +# 0 = Installer (bouton OK) +# 1 = Désinstaller (bouton extra) +# autres = Annuler + +if [ $exit_code -ne 0 ] && [ $exit_code -ne 1 ]; then + # L'utilisateur a annulé (codes 252, 143, etc.) + exit 0 +fi + +# Vérifier si aucune sélection +if [ -z "$selection" ]; then + show_message_and_wait "Aucun composant sélectionné. Le script va se terminer." "Aucune sélection" + exit 0 +fi + +# Traiter la sélection selon le bouton cliqué +IFS='|' read -ra SELECTED <<< "$selection" + + +if [ $exit_code -eq 1 ]; then + # Mode désinstallation (bouton extra) + # Créer la liste des composants pour confirmation + uninstall_display="" for component in "${SELECTED[@]}"; do + case $component in + "steam") uninstall_display="$uninstall_display\n• Steam" ;; + "protonup") uninstall_display="$uninstall_display\n• ProtonUp-Qt" ;; + "heroic") uninstall_display="$uninstall_display\n• Heroic Game Launcher" ;; + "lutris") uninstall_display="$uninstall_display\n• Lutris" ;; + "bottles") uninstall_display="$uninstall_display\n• Bottles" ;; + "wine") uninstall_display="$uninstall_display\n• Wine + Winetricks" ;; + "retroarch") uninstall_display="$uninstall_display\n• RetroArch" ;; + "flatpak") uninstall_display="$uninstall_display\n• Flatpak (ATTENTION: supprimera TOUTES les applications Flatpak)" ;; + "gearlever") uninstall_display="$uninstall_display\n• Gear Lever" ;; + "discord") uninstall_display="$uninstall_display\n• Discord" ;; + "vesktop") uninstall_display="$uninstall_display\n• Vesktop" ;; + "teamspeak") uninstall_display="$uninstall_display\n• TeamSpeak" ;; + "mumble") uninstall_display="$uninstall_display\n• Mumble" ;; + "flatseal") uninstall_display="$uninstall_display\n• Flatseal" ;; + "nvidia") uninstall_display="$uninstall_display\n• Drivers NVIDIA (ATTENTION: peut affecter l'affichage)" ;; + "utils") uninstall_display="$uninstall_display\n• Utilitaires gaming (GameMode, MangoHUD, GOverlay)" ;; + esac + done + + # Demander confirmation globale une seule fois + if ! zenity 2>/dev/null --question --title="Confirmation de désinstallation" --text="Êtes-vous sûr de vouloir désinstaller les composants suivants ?$uninstall_display"; then + exit 0 + fi + + # Demander le mot de passe sudo une seule fois + password=$(zenity 2>/dev/null --password --title="Authentification" --text="Mot de passe sudo requis pour la désinstallation:") + if [ $? -eq 1 ] || [ -z "$password" ]; then + log_error "Mot de passe non fourni ou dialogue annulé" + exit 0 + fi + + # Vérifier le mot de passe sudo + log_info "Vérification du mot de passe sudo..." + if ! echo "$password" | sudo -S true 2>/dev/null; then + log_error "Mot de passe sudo incorrect" + zenity 2>/dev/null --error --title="Erreur d'authentification" --text="Mot de passe administrateur incorrect." + exit 1 + fi + log_info "Mot de passe sudo validé avec succès" + + # Variables pour suivre les résultats + success_count=0 + failed_components="" + total_components=${#SELECTED[@]} + + log_info "Début du processus de désinstallation pour ${total_components} composant(s)" + log_info "Composants sélectionnés: ${SELECTED[*]}" + + # Traiter les sélections de désinstallation + for component in "${SELECTED[@]}"; do + log_info "Traitement du composant: $component" case $component in "steam") - uninstall_steam + if uninstall_with_progress "$component" "$password" "Steam" "uninstall_steam_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Steam" + fi ;; "protonup") - uninstall_protonup + if uninstall_with_progress "$component" "$password" "ProtonUp-Qt" "uninstall_protonup_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• ProtonUp-Qt" + fi ;; "heroic") - uninstall_heroic + if uninstall_with_progress "$component" "$password" "Heroic Game Launcher" "uninstall_heroic_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Heroic Game Launcher" + fi ;; "lutris") - uninstall_lutris + if uninstall_with_progress "$component" "$password" "Lutris" "uninstall_lutris_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Lutris" + fi ;; "bottles") - uninstall_bottles + if uninstall_with_progress "$component" "$password" "Bottles" "uninstall_bottles_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Bottles" + fi ;; "wine") - uninstall_wine + if uninstall_with_progress "$component" "$password" "Wine + Winetricks" "uninstall_wine_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Wine + Winetricks" + fi ;; "retroarch") - uninstall_retroarch + if uninstall_with_progress "$component" "$password" "RetroArch" "uninstall_retroarch_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• RetroArch" + fi ;; "flatpak") - uninstall_flatpak + if uninstall_with_progress "$component" "$password" "Flatpak" "uninstall_flatpak_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Flatpak" + fi ;; "gearlever") - uninstall_gearlever + if uninstall_with_progress "$component" "$password" "Gear Lever" "uninstall_gearlever_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Gear Lever" + fi ;; "discord") - uninstall_discord + if uninstall_with_progress "$component" "$password" "Discord" "uninstall_discord_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Discord" + fi ;; "vesktop") - uninstall_vesktop + if uninstall_with_progress "$component" "$password" "Vesktop" "uninstall_vesktop_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Vesktop" + fi ;; "teamspeak") - uninstall_teamspeak + if uninstall_with_progress "$component" "$password" "TeamSpeak" "uninstall_teamspeak_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• TeamSpeak" + fi ;; "mumble") - uninstall_mumble + if uninstall_with_progress "$component" "$password" "Mumble" "uninstall_mumble_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Mumble" + fi ;; "flatseal") - uninstall_flatseal + if uninstall_with_progress "$component" "$password" "Flatseal" "uninstall_flatseal_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Flatseal" + fi ;; "nvidia") - uninstall_nvidia + if uninstall_with_progress "$component" "$password" "Drivers NVIDIA" "uninstall_nvidia_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Drivers NVIDIA" + fi ;; "utils") - uninstall_utils + if uninstall_with_progress "$component" "$password" "Utilitaires gaming" "uninstall_utils_silent"; then + ((success_count++)) + else + failed_components="$failed_components\n• Utilitaires gaming" + fi ;; esac done -elif [ $exit_code -eq 1 ]; then - # L'utilisateur a annulé - exit 0 -else - # Mode installation - # Vérifier si aucune sélection - if [ -z "$selection" ]; then - zenity 2>/dev/null --info --title="Aucune sélection" --text="Aucun composant sélectionné pour l'installation." - exit 0 + + log_info "Fin du processus de désinstallation - Succès: $success_count/$total_components" + if [ -n "$failed_components" ]; then + log_error "Composants en échec: $failed_components" fi - - # Créer la liste des applications sélectionnées pour l'affichage - IFS='|' read -ra SELECTED <<< "$selection" - app_list="" + + # Afficher le résultat final + if [ $success_count -eq $total_components ]; then + zenity 2>/dev/null --info --title="Désinstallation terminée" --text="Tous les composants ont été désinstallés avec succès ! ($success_count/$total_components)" --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs de désinstallation" + fi + elif [ $success_count -gt 0 ]; then + if [ -n "$failed_components" ]; then + zenity 2>/dev/null --warning --title="Désinstallation partiellement réussie" --text="$success_count composant(s) sur $total_components désinstallé(s) avec succès.\n\nÉchecs :$failed_components" --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs de désinstallation - Échecs détaillés" + fi + else + zenity 2>/dev/null --info --title="Désinstallation terminée" --text="$success_count composant(s) sur $total_components désinstallé(s) avec succès." --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs de désinstallation" + fi + fi + else + if [ -n "$failed_components" ]; then + zenity 2>/dev/null --error --title="Échec de la désinstallation" --text="Aucun composant n'a pu être désinstallé.\n\nÉchecs :$failed_components" --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs de désinstallation - Tous les échecs" + fi + else + zenity 2>/dev/null --error --title="Échec de la désinstallation" --text="Aucun composant n'a pu être désinstallé." --extra-button="Voir les logs" + if [ $? -eq 1 ]; then + show_error_logs "Logs de désinstallation" + fi + fi + fi +else + # Mode installation (bouton OK, exit_code = 0) + # Créer la liste des applications pour confirmation + install_display="" for component in "${SELECTED[@]}"; do case $component in - "steam") app_list="$app_list\n• Steam" ;; - "protonup") app_list="$app_list\n• ProtonUp-Qt" ;; - "heroic") app_list="$app_list\n• Heroic Game Launcher" ;; - "lutris") app_list="$app_list\n• Lutris" ;; - "bottles") app_list="$app_list\n• Bottles" ;; - "wine") app_list="$app_list\n• Wine + Winetricks" ;; - "retroarch") app_list="$app_list\n• RetroArch" ;; - "flatpak") app_list="$app_list\n• Flatpak + Flathub" ;; - "gearlever") app_list="$app_list\n• Gear Lever" ;; - "discord") app_list="$app_list\n• Discord" ;; - "vesktop") app_list="$app_list\n• Vesktop" ;; - "teamspeak") app_list="$app_list\n• TeamSpeak" ;; - "mumble") app_list="$app_list\n• Mumble" ;; - "flatseal") app_list="$app_list\n• Flatseal" ;; - "nvidia") app_list="$app_list\n• NVIDIA + CUDA" ;; - "utils") app_list="$app_list\n• Goverlay (FPS, CPU, GPU, température)" ;; + "steam") install_display="$install_display\n• Steam" ;; + "protonup") install_display="$install_display\n• ProtonUp-Qt" ;; + "heroic") install_display="$install_display\n• Heroic Game Launcher" ;; + "lutris") install_display="$install_display\n• Lutris" ;; + "bottles") install_display="$install_display\n• Bottles" ;; + "wine") install_display="$install_display\n• Wine + Winetricks" ;; + "retroarch") install_display="$install_display\n• RetroArch" ;; + "flatpak") install_display="$install_display\n• Flatpak + Flathub" ;; + "gearlever") install_display="$install_display\n• Gear Lever" ;; + "discord") install_display="$install_display\n• Discord" ;; + "vesktop") install_display="$install_display\n• Vesktop" ;; + "teamspeak") install_display="$install_display\n• TeamSpeak" ;; + "mumble") install_display="$install_display\n• Mumble" ;; + "flatseal") install_display="$install_display\n• Flatseal" ;; + "nvidia") install_display="$install_display\n• NVIDIA + CUDA" ;; + "utils") install_display="$install_display\n• Goverlay (FPS, CPU, GPU, température)" ;; esac done # Demander le mot de passe sudo une seule fois pour toutes les installations - if ! get_global_sudo_password "$app_list"; then + if ! get_global_sudo_password "$install_display"; then exit 0 fi # Activer le mode installation groupée si plusieurs applications sont sélectionnées if [ ${#SELECTED[@]} -gt 1 ]; then - start_batch_install ${#SELECTED[@]} "$app_list" + start_batch_install ${#SELECTED[@]} "$install_display" # Afficher une notification au début zenity 2>/dev/null --info --timeout=5 \