1234 lines
39 KiB
Bash
1234 lines
39 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# G A G (Gestionnaire d'Applications GNOME) - Version Pro 4.0
|
||
# Backup/Restauration modulaire avec système de sauvegardes multiples
|
||
# Auteur: Fontaine Johnny
|
||
# Date: 07/08/2025
|
||
|
||
set -e
|
||
|
||
# =====================================
|
||
# CONFIGURATION
|
||
# =====================================
|
||
|
||
# Couleurs et styles
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
BOLD='\033[1m'
|
||
UNDERLINE='\033[4m'
|
||
|
||
# Emojis
|
||
EMOJI_OK="✅"
|
||
EMOJI_ERROR="❌"
|
||
EMOJI_WARN="⚠ "
|
||
EMOJI_INFO="ℹ "
|
||
EMOJI_CONFIG="⚙ "
|
||
EMOJI_BACKUP="📦"
|
||
EMOJI_RESTORE="🔄"
|
||
EMOJI_APPS="📱"
|
||
EMOJI_DEB="📦"
|
||
EMOJI_FLATPAK="📦"
|
||
EMOJI_OLLAMA="🤖"
|
||
EMOJI_PWSH="💻"
|
||
EMOJI_STARTUP="🚀"
|
||
EMOJI_BRAVE="🦁"
|
||
EMOJI_BOTTLES="🍾"
|
||
EMOJI_LIST="📋"
|
||
EMOJI_CHECK="🔍"
|
||
EMOJI_DELETE="🗑 "
|
||
|
||
# Répertoires de sauvegarde
|
||
BACKUP_BASE_DIR="$HOME/Backups/gnome-apps-backup"
|
||
CURRENT_BACKUP=""
|
||
|
||
# Applications Flatpak à gérer
|
||
declare -A FLATPAK_APPS=(
|
||
["Arduino IDE 2"]="cc.arduino.IDE2"
|
||
["AnyDesk"]="com.anydesk.Anydesk"
|
||
["Bitwarden"]="com.bitwarden.desktop"
|
||
["Brave Browser"]="com.brave.Browser"
|
||
["Dropbox"]="com.dropbox.Client"
|
||
["Flatseal"]="com.github.tchx84.Flatseal"
|
||
["Bottles"]="com.usebottles.bottles"
|
||
)
|
||
|
||
# Modèles Ollama recommandés
|
||
declare -a OLLAMA_MODELS=(
|
||
"llama3.1:8b"
|
||
"codellama:7b"
|
||
"mistral:7b"
|
||
)
|
||
|
||
# Applications tierces à vérifier
|
||
declare -A THIRD_PARTY_APPS=(
|
||
["Outlook"]="outlook-for-linux"
|
||
["Microsoft Teams"]="teams-for-linux"
|
||
["OpenFortiGUI"]="openfortigui"
|
||
["Ollama"]="ollama"
|
||
["PowerShell"]="pwsh"
|
||
)
|
||
|
||
# =====================================
|
||
# FONCTIONS UTILITAIRES
|
||
# =====================================
|
||
|
||
print_header() {
|
||
echo -e "${PURPLE}${BOLD}${UNDERLINE}$1${NC}"
|
||
}
|
||
|
||
print_section() {
|
||
echo -e "\n${CYAN}${BOLD}$1${NC}"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${BLUE}${EMOJI_INFO} [INFO]${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}${EMOJI_OK} [SUCCESS]${NC} $1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}${EMOJI_WARN} [WARNING]${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}${EMOJI_ERROR} [ERROR]${NC} $1"
|
||
}
|
||
|
||
command_exists() {
|
||
command -v "$1" >/dev/null 2>&1
|
||
}
|
||
|
||
select_backup_dir() {
|
||
local backups=()
|
||
local count=1
|
||
|
||
print_section "${EMOJI_LIST} Liste des sauvegardes disponibles"
|
||
|
||
if [ ! -d "$BACKUP_BASE_DIR" ]; then
|
||
print_error "Aucune sauvegarde disponible"
|
||
return 1
|
||
fi
|
||
|
||
while IFS= read -r -d '' dir; do
|
||
if [ -d "$dir" ] && [ "$(basename "$dir")" != "gnome-apps-backup" ]; then
|
||
backups+=("$dir")
|
||
local backup_date=$(basename "$dir")
|
||
local backup_size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
||
echo -e "${CYAN}${count}.${NC} ${backup_date} (${backup_size})"
|
||
((count++))
|
||
fi
|
||
done < <(find "$BACKUP_BASE_DIR" -maxdepth 1 -type d -print0 2>/dev/null | sort -z)
|
||
|
||
if [ ${#backups[@]} -eq 0 ]; then
|
||
print_error "Aucune sauvegarde disponible"
|
||
return 1
|
||
fi
|
||
|
||
echo -ne "${YELLOW}${BOLD}Sélectionnez une sauvegarde [1-${#backups[@]}]: ${NC}"
|
||
read -r choice
|
||
|
||
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le ${#backups[@]} ]; then
|
||
CURRENT_BACKUP="${backups[$((choice-1))]}"
|
||
print_success "Sauvegarde sélectionnée: $(basename "$CURRENT_BACKUP")"
|
||
return 0
|
||
else
|
||
print_error "Sélection invalide"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
create_backup_dir() {
|
||
local timestamp=$(date +"%Y%m%d_%H%M%S")
|
||
CURRENT_BACKUP="$BACKUP_BASE_DIR/$timestamp"
|
||
mkdir -p "$CURRENT_BACKUP"
|
||
print_success "Nouvelle sauvegarde créée: $timestamp"
|
||
}
|
||
|
||
# =====================================
|
||
# GESTION DES SAUVEGARDES
|
||
# =====================================
|
||
|
||
list_backups() {
|
||
print_section "${EMOJI_LIST} Liste des sauvegardes disponibles"
|
||
|
||
if [ ! -d "$BACKUP_BASE_DIR" ]; then
|
||
print_error "Aucune sauvegarde disponible"
|
||
return 1
|
||
fi
|
||
|
||
local count=1
|
||
local total_size=0
|
||
|
||
while IFS= read -r -d '' dir; do
|
||
if [ -d "$dir" ] && [ "$(basename "$dir")" != "gnome-apps-backup" ]; then
|
||
local backup_date=$(basename "$dir")
|
||
local backup_size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
||
local backup_size_bytes=$(du -sb "$dir" 2>/dev/null | cut -f1)
|
||
local formatted_date=$(date -d "${backup_date:0:8} ${backup_date:9:2}:${backup_date:11:2}:${backup_date:13:2}" "+%d/%m/%Y %H:%M:%S" 2>/dev/null || echo "$backup_date")
|
||
|
||
echo -e "${CYAN}${count}.${NC} ${formatted_date} - Taille: ${backup_size}"
|
||
|
||
# Afficher le contenu de la sauvegarde
|
||
local content=""
|
||
[ -d "$dir/brave" ] && content="${content}Brave "
|
||
[ -d "$dir/bottles" ] && content="${content}Bottles "
|
||
[ -d "$dir/startup" ] && content="${content}Démarrage "
|
||
[ -d "$dir/ollama" ] && content="${content}Ollama "
|
||
[ -f "$dir/deb-packages.list" ] && content="${content}DEB "
|
||
[ -f "$dir/flatpak-apps.list" ] && content="${content}Flatpak "
|
||
|
||
if [ -n "$content" ]; then
|
||
echo -e " ${BLUE}Contenu:${NC} ${content}"
|
||
fi
|
||
|
||
total_size=$((total_size + backup_size_bytes))
|
||
((count++))
|
||
fi
|
||
done < <(find "$BACKUP_BASE_DIR" -maxdepth 1 -type d -print0 2>/dev/null | sort -z)
|
||
|
||
if [ $count -eq 1 ]; then
|
||
print_warning "Aucune sauvegarde disponible"
|
||
else
|
||
local total_size_human=$(numfmt --to=iec --suffix=B $total_size)
|
||
echo -e "\n${BOLD}Total: $((count-1)) sauvegardes - Espace utilisé: ${total_size_human}${NC}"
|
||
fi
|
||
}
|
||
|
||
delete_backups() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_DELETE} Gestion des sauvegardes - Suppression"
|
||
|
||
list_backups
|
||
|
||
if [ ! -d "$BACKUP_BASE_DIR" ] || [ -z "$(ls -A "$BACKUP_BASE_DIR" 2>/dev/null)" ]; then
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
return
|
||
fi
|
||
|
||
echo -e "\n${CYAN}Options de suppression:${NC}"
|
||
echo -e "${CYAN} 1. ${EMOJI_DELETE} Supprimer une sauvegarde spécifique"
|
||
echo -e "${CYAN} 2. ${EMOJI_DELETE} Supprimer les sauvegardes anciennes (> 30 jours)"
|
||
echo -e "${CYAN} 3. ${EMOJI_DELETE} Supprimer toutes les sauvegardes"
|
||
echo -e "${CYAN} 4. ${EMOJI_INFO} Retour au menu de gestion"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-4]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1) delete_specific_backup ;;
|
||
2) delete_old_backups ;;
|
||
3) delete_all_backups ;;
|
||
4) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
delete_specific_backup() {
|
||
local backups=()
|
||
local count=1
|
||
|
||
print_section "${EMOJI_DELETE} Suppression d'une sauvegarde spécifique"
|
||
|
||
while IFS= read -r -d '' dir; do
|
||
if [ -d "$dir" ] && [ "$(basename "$dir")" != "gnome-apps-backup" ]; then
|
||
backups+=("$dir")
|
||
local backup_date=$(basename "$dir")
|
||
local backup_size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
||
local formatted_date=$(date -d "${backup_date:0:8} ${backup_date:9:2}:${backup_date:11:2}:${backup_date:13:2}" "+%d/%m/%Y %H:%M:%S" 2>/dev/null || echo "$backup_date")
|
||
echo -e "${CYAN}${count}.${NC} ${formatted_date} (${backup_size})"
|
||
((count++))
|
||
fi
|
||
done < <(find "$BACKUP_BASE_DIR" -maxdepth 1 -type d -print0 2>/dev/null | sort -z)
|
||
|
||
if [ ${#backups[@]} -eq 0 ]; then
|
||
print_error "Aucune sauvegarde à supprimer"
|
||
return
|
||
fi
|
||
|
||
echo -ne "${YELLOW}${BOLD}Sélectionnez la sauvegarde à supprimer [1-${#backups[@]}] (0 pour annuler): ${NC}"
|
||
read -r choice
|
||
|
||
if [ "$choice" = "0" ]; then
|
||
print_info "Suppression annulée"
|
||
return
|
||
fi
|
||
|
||
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le ${#backups[@]} ]; then
|
||
local backup_to_delete="${backups[$((choice-1))]}"
|
||
local backup_name=$(basename "$backup_to_delete")
|
||
|
||
echo -ne "${RED}${BOLD}Êtes-vous sûr de vouloir supprimer la sauvegarde '${backup_name}' ? [y/N]: ${NC}"
|
||
read -r confirm
|
||
|
||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||
rm -rf "$backup_to_delete" && \
|
||
print_success "Sauvegarde '$backup_name' supprimée avec succès" || \
|
||
print_error "Échec de la suppression de la sauvegarde '$backup_name'"
|
||
else
|
||
print_info "Suppression annulée"
|
||
fi
|
||
else
|
||
print_error "Sélection invalide"
|
||
fi
|
||
}
|
||
|
||
delete_old_backups() {
|
||
print_section "${EMOJI_DELETE} Suppression des sauvegardes anciennes (> 30 jours)"
|
||
|
||
local deleted_count=0
|
||
local current_date=$(date +%s)
|
||
local thirty_days_ago=$((current_date - 30 * 24 * 3600))
|
||
|
||
while IFS= read -r -d '' dir; do
|
||
if [ -d "$dir" ] && [ "$(basename "$dir")" != "gnome-apps-backup" ]; then
|
||
local backup_date=$(basename "$dir")
|
||
# Extraire la date du nom de fichier (format: YYYYMMDD_HHMMSS)
|
||
local backup_date_formatted="${backup_date:0:4}-${backup_date:4:2}-${backup_date:6:2}"
|
||
local backup_timestamp=$(date -d "$backup_date_formatted" +%s 2>/dev/null || echo 0)
|
||
|
||
if [ "$backup_timestamp" -gt 0 ] && [ "$backup_timestamp" -lt "$thirty_days_ago" ]; then
|
||
echo -e "${YELLOW}Suppression de la sauvegarde: $(basename "$dir")${NC}"
|
||
rm -rf "$dir" && ((deleted_count++))
|
||
fi
|
||
fi
|
||
done < <(find "$BACKUP_BASE_DIR" -maxdepth 1 -type d -print0 2>/dev/null)
|
||
|
||
if [ $deleted_count -gt 0 ]; then
|
||
print_success "$deleted_count sauvegarde(s) ancienne(s) supprimée(s)"
|
||
else
|
||
print_info "Aucune sauvegarde ancienne à supprimer"
|
||
fi
|
||
}
|
||
|
||
delete_all_backups() {
|
||
print_section "${EMOJI_DELETE} Suppression de toutes les sauvegardes"
|
||
|
||
local backup_count=$(find "$BACKUP_BASE_DIR" -maxdepth 1 -type d ! -path "$BACKUP_BASE_DIR" 2>/dev/null | wc -l)
|
||
|
||
if [ "$backup_count" -eq 0 ]; then
|
||
print_info "Aucune sauvegarde à supprimer"
|
||
return
|
||
fi
|
||
|
||
echo -ne "${RED}${BOLD}Êtes-vous sûr de vouloir supprimer TOUTES les sauvegardes ($backup_count) ? [y/N]: ${NC}"
|
||
read -r confirm
|
||
|
||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||
echo -ne "${RED}${BOLD}ATTENTION: Cette action est irréversible! Tapez 'SUPPRIMER' pour confirmer: ${NC}"
|
||
read -r final_confirm
|
||
|
||
if [ "$final_confirm" = "SUPPRIMER" ]; then
|
||
find "$BACKUP_BASE_DIR" -maxdepth 1 -type d ! -path "$BACKUP_BASE_DIR" -exec rm -rf {} \; && \
|
||
print_success "Toutes les sauvegardes ont été supprimées" || \
|
||
print_error "Échec de la suppression des sauvegardes"
|
||
else
|
||
print_info "Suppression annulée"
|
||
fi
|
||
else
|
||
print_info "Suppression annulée"
|
||
fi
|
||
}
|
||
|
||
# =====================================
|
||
# FONCTIONS DE VÉRIFICATION
|
||
# =====================================
|
||
|
||
check_requirements() {
|
||
print_section "${EMOJI_CHECK} Vérification des prérequis système"
|
||
|
||
local missing=()
|
||
local to_install=()
|
||
|
||
# Vérifier les outils de base
|
||
declare -a required_tools=("curl" "wget" "git" "figlet")
|
||
|
||
for tool in "${required_tools[@]}"; do
|
||
if ! command_exists "$tool"; then
|
||
missing+=("$tool")
|
||
to_install+=("$tool")
|
||
print_warning "$tool n'est pas installé"
|
||
fi
|
||
done
|
||
|
||
# Vérifier Flatpak
|
||
if ! command_exists "flatpak"; then
|
||
print_warning "Flatpak n'est pas installé - nécessaire pour de nombreuses applications"
|
||
to_install+=("flatpak")
|
||
fi
|
||
|
||
# Vérifier Docker
|
||
if ! command_exists "docker"; then
|
||
print_warning "Docker n'est pas installé - nécessaire pour Open WebUI"
|
||
fi
|
||
|
||
# Vérifier Ollama
|
||
if ! command_exists "ollama"; then
|
||
print_warning "Ollama n'est pas installé - nécessaire pour les modèles IA"
|
||
fi
|
||
|
||
if [ ${#to_install[@]} -gt 0 ]; then
|
||
print_warning "Outils manquants: ${missing[*]}"
|
||
echo -ne "${YELLOW}Voulez-vous les installer automatiquement? [y/N]: ${NC}"
|
||
read -r response
|
||
if [[ "$response" =~ ^[Yy]$ ]]; then
|
||
if command_exists apt; then
|
||
sudo apt update
|
||
sudo apt install -y "${to_install[@]}"
|
||
print_success "Outils installés avec succès"
|
||
elif command_exists dnf; then
|
||
sudo dnf install -y "${to_install[@]}"
|
||
print_success "Outils installés avec succès"
|
||
elif command_exists pacman; then
|
||
sudo pacman -S --noconfirm "${to_install[@]}"
|
||
print_success "Outils installés avec succès"
|
||
else
|
||
print_error "Gestionnaire de paquets non supporté. Veuillez installer manuellement: ${to_install[*]}"
|
||
fi
|
||
fi
|
||
else
|
||
print_success "Tous les prérequis système sont satisfaits"
|
||
fi
|
||
}
|
||
|
||
check_installed_apps() {
|
||
print_section "${EMOJI_CHECK} Vérification des applications installées"
|
||
|
||
print_info "${EMOJI_DEB} Applications DEB:"
|
||
if command_exists dpkg; then
|
||
local deb_count=$(dpkg --get-selections | grep -c install)
|
||
echo "Total: $deb_count packages installés"
|
||
dpkg --get-selections | head -n 10
|
||
echo "... (plus dans le rapport complet)"
|
||
else
|
||
print_warning "dpkg non disponible"
|
||
fi
|
||
|
||
print_info "\n${EMOJI_FLATPAK} Applications Flatpak:"
|
||
if command_exists flatpak; then
|
||
local flatpak_count=$(flatpak list --app 2>/dev/null | wc -l)
|
||
echo "Total: $flatpak_count applications Flatpak installées"
|
||
flatpak list --app --columns=application 2>/dev/null | head -n 10
|
||
echo "... (plus dans le rapport complet)"
|
||
else
|
||
print_warning "Flatpak non installé"
|
||
fi
|
||
|
||
print_info "\n${EMOJI_INFO} Applications tierces:"
|
||
for app in "${!THIRD_PARTY_APPS[@]}"; do
|
||
if command_exists "${THIRD_PARTY_APPS[$app]}"; then
|
||
echo -e "${GREEN}${EMOJI_OK} $app${NC}"
|
||
else
|
||
echo -e "${RED}${EMOJI_ERROR} $app (manquant)${NC}"
|
||
fi
|
||
done
|
||
|
||
# Vérification spéciale pour Open WebUI
|
||
print_info "\n${EMOJI_INFO} Open WebUI:"
|
||
if command_exists docker && docker ps | grep -q "open-webui"; then
|
||
echo -e "${GREEN}${EMOJI_OK} Open WebUI (conteneur actif)${NC}"
|
||
local port=$(docker ps | grep "open-webui" | sed -n 's/.*:\([0-9]*\)->.*/\1/p' | head -n1)
|
||
if [ -n "$port" ]; then
|
||
echo -e " ${BLUE}Accessible sur: http://localhost:$port${NC}"
|
||
else
|
||
echo -e " ${BLUE}Accessible sur: http://localhost:8080${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED}${EMOJI_ERROR} Open WebUI (conteneur non actif)${NC}"
|
||
fi
|
||
|
||
print_info "\n${EMOJI_WARN} Recommandations:"
|
||
if ! command_exists "ollama"; then
|
||
echo "- Installez Ollama pour les fonctionnalités IA"
|
||
fi
|
||
if ! command_exists "docker"; then
|
||
echo "- Installez Docker pour exécuter Open WebUI"
|
||
fi
|
||
if command_exists flatpak && ! flatpak list 2>/dev/null | grep -q "com.brave.Browser"; then
|
||
echo "- Brave Browser n'est pas installé (recommandé)"
|
||
fi
|
||
}
|
||
|
||
# =====================================
|
||
# SAUVEGARDES SPÉCIFIQUES
|
||
# =====================================
|
||
|
||
backup_brave() {
|
||
print_section "${EMOJI_BRAVE} Sauvegarde de Brave Browser (Flatpak)"
|
||
|
||
local config_dir="$CURRENT_BACKUP/brave"
|
||
mkdir -p "$config_dir"
|
||
|
||
# Sauvegarde des données Brave Flatpak
|
||
local brave_data_dir="$HOME/.var/app/com.brave.Browser"
|
||
if [ -d "$brave_data_dir" ]; then
|
||
cp -r "$brave_data_dir" "$config_dir" && \
|
||
print_success "Données Brave sauvegardées"
|
||
else
|
||
print_warning "Aucune donnée Brave trouvée"
|
||
fi
|
||
|
||
# Sauvegarde des préférences
|
||
if command_exists dconf; then
|
||
dconf dump /com/brave/ > "$config_dir/brave-settings.dconf" 2>/dev/null && \
|
||
print_success "Préférences Brave sauvegardées" || \
|
||
print_warning "Aucune préférence Brave à sauvegarder"
|
||
else
|
||
print_warning "dconf non disponible pour sauvegarder les préférences"
|
||
fi
|
||
}
|
||
|
||
backup_bottles() {
|
||
print_section "${EMOJI_BOTTLES} Sauvegarde de Bottles"
|
||
|
||
local config_dir="$CURRENT_BACKUP/bottles"
|
||
mkdir -p "$config_dir"
|
||
|
||
# Sauvegarde des bouteilles
|
||
local bottles_dir="$HOME/.var/app/com.usebottles.bottles/data/bottles"
|
||
if [ -d "$bottles_dir" ]; then
|
||
cp -r "$bottles_dir" "$config_dir" && \
|
||
print_success "Bouteilles Bottles sauvegardées"
|
||
else
|
||
print_warning "Aucune bouteille Bottles trouvée"
|
||
fi
|
||
|
||
# Sauvegarde de la configuration
|
||
local bottles_config="$HOME/.var/app/com.usebottles.bottles/config"
|
||
if [ -d "$bottles_config" ]; then
|
||
cp -r "$bottles_config" "$config_dir" && \
|
||
print_success "Configuration Bottles sauvegardée"
|
||
fi
|
||
}
|
||
|
||
backup_startup_apps() {
|
||
print_section "${EMOJI_STARTUP} Sauvegarde des applications de démarrage"
|
||
|
||
local startup_dir="$CURRENT_BACKUP/startup"
|
||
mkdir -p "$startup_dir"
|
||
|
||
# Sauvegarde des applications de démarrage
|
||
if [ -d "$HOME/.config/autostart" ]; then
|
||
cp -r "$HOME/.config/autostart" "$startup_dir" && \
|
||
print_success "Applications de démarrage sauvegardées"
|
||
else
|
||
print_warning "Aucune application de démarrage trouvée"
|
||
fi
|
||
}
|
||
|
||
backup_ollama() {
|
||
print_section "${EMOJI_OLLAMA} Sauvegarde d'Ollama"
|
||
|
||
local config_dir="$CURRENT_BACKUP/ollama"
|
||
mkdir -p "$config_dir"
|
||
|
||
# Sauvegarde des modèles
|
||
if command_exists ollama; then
|
||
ollama list > "$config_dir/models.txt" 2>/dev/null && \
|
||
print_success "Liste des modèles sauvegardée" || \
|
||
print_warning "Impossible de sauvegarder la liste des modèles"
|
||
else
|
||
print_warning "Ollama n'est pas installé"
|
||
fi
|
||
|
||
# Sauvegarde de la configuration
|
||
if [ -d "$HOME/.ollama" ]; then
|
||
cp -r "$HOME/.ollama" "$config_dir" && \
|
||
print_success "Configuration Ollama sauvegardée"
|
||
else
|
||
print_warning "Aucune configuration Ollama trouvée"
|
||
fi
|
||
}
|
||
|
||
backup_deb_packages() {
|
||
print_section "${EMOJI_DEB} Sauvegarde des packages DEB"
|
||
|
||
if command_exists dpkg; then
|
||
dpkg --get-selections > "$CURRENT_BACKUP/deb-packages.list" && \
|
||
print_success "Liste des packages DEB sauvegardée" || \
|
||
print_warning "Impossible de sauvegarder la liste des packages DEB"
|
||
else
|
||
print_warning "dpkg non disponible"
|
||
fi
|
||
}
|
||
|
||
backup_flatpak_apps() {
|
||
print_section "${EMOJI_FLATPAK} Sauvegarde des applications Flatpak"
|
||
|
||
if command_exists flatpak; then
|
||
flatpak list --app --columns=application > "$CURRENT_BACKUP/flatpak-apps.list" && \
|
||
print_success "Liste des applications Flatpak sauvegardée" || \
|
||
print_warning "Impossible de sauvegarder la liste des applications Flatpak"
|
||
else
|
||
print_warning "Flatpak non installé"
|
||
fi
|
||
}
|
||
|
||
# =====================================
|
||
# RESTAURATIONS SPÉCIFIQUES
|
||
# =====================================
|
||
|
||
restore_brave() {
|
||
print_section "${EMOJI_BRAVE} Restauration de Brave Browser"
|
||
|
||
local config_dir="$CURRENT_BACKUP/brave"
|
||
|
||
if [ -d "$config_dir/com.brave.Browser" ]; then
|
||
# Restauration des données
|
||
mkdir -p "$HOME/.var/app"
|
||
cp -r "$config_dir/com.brave.Browser" "$HOME/.var/app/" && \
|
||
print_success "Données Brave restaurées"
|
||
else
|
||
print_warning "Aucune donnée Brave à restaurer"
|
||
fi
|
||
|
||
if [ -f "$config_dir/brave-settings.dconf" ] && command_exists dconf; then
|
||
# Restauration des préférences
|
||
dconf load /com/brave/ < "$config_dir/brave-settings.dconf" && \
|
||
print_success "Préférences Brave restaurées"
|
||
else
|
||
print_warning "Aucune préférence Brave à restaurer"
|
||
fi
|
||
}
|
||
|
||
restore_bottles() {
|
||
print_section "${EMOJI_BOTTLES} Restauration de Bottles"
|
||
|
||
local config_dir="$CURRENT_BACKUP/bottles"
|
||
|
||
if [ -d "$config_dir/bottles" ]; then
|
||
# Restauration des bouteilles
|
||
mkdir -p "$HOME/.var/app/com.usebottles.bottles/data"
|
||
cp -r "$config_dir/bottles" "$HOME/.var/app/com.usebottles.bottles/data/" && \
|
||
print_success "Bouteilles Bottles restaurées"
|
||
else
|
||
print_warning "Aucune bouteille à restaurer"
|
||
fi
|
||
|
||
if [ -d "$config_dir/config" ]; then
|
||
# Restauration de la configuration
|
||
mkdir -p "$HOME/.var/app/com.usebottles.bottles"
|
||
cp -r "$config_dir/config" "$HOME/.var/app/com.usebottles.bottles/" && \
|
||
print_success "Configuration Bottles restaurée"
|
||
else
|
||
print_warning "Aucune configuration à restaurer"
|
||
fi
|
||
}
|
||
|
||
restore_startup_apps() {
|
||
print_section "${EMOJI_STARTUP} Restauration des applications de démarrage"
|
||
|
||
local config_dir="$CURRENT_BACKUP/startup"
|
||
|
||
if [ -d "$config_dir/autostart" ]; then
|
||
mkdir -p "$HOME/.config"
|
||
cp -r "$config_dir/autostart" "$HOME/.config/" && \
|
||
print_success "Applications de démarrage restaurées"
|
||
else
|
||
print_warning "Aucune application de démarrage à restaurer"
|
||
fi
|
||
}
|
||
|
||
restore_ollama() {
|
||
print_section "${EMOJI_OLLAMA} Restauration d'Ollama"
|
||
|
||
local config_dir="$CURRENT_BACKUP/ollama"
|
||
|
||
if [ -d "$config_dir" ]; then
|
||
# Restauration de la configuration
|
||
if [ -d "$config_dir/.ollama" ]; then
|
||
mkdir -p "$HOME"
|
||
cp -r "$config_dir/.ollama" "$HOME/" && \
|
||
print_success "Configuration Ollama restaurée"
|
||
fi
|
||
|
||
# Restauration des modèles
|
||
if [ -f "$config_dir/models.txt" ] && command_exists ollama; then
|
||
print_info "Téléchargement des modèles Ollama..."
|
||
while read -r model; do
|
||
if [ -n "$model" ]; then
|
||
ollama pull "$model" || print_warning "Impossible de télécharger le modèle: $model"
|
||
fi
|
||
done < "$config_dir/models.txt"
|
||
print_success "Modèles Ollama restaurés"
|
||
fi
|
||
else
|
||
print_warning "Aucune sauvegarde Ollama à restaurer"
|
||
fi
|
||
}
|
||
|
||
restore_deb_packages() {
|
||
print_section "${EMOJI_DEB} Restauration des packages DEB"
|
||
|
||
if [ -f "$CURRENT_BACKUP/deb-packages.list" ] && command_exists dpkg && command_exists apt; then
|
||
echo -ne "${YELLOW}Voulez-vous restaurer les packages DEB ? [y/N]: ${NC}"
|
||
read -r response
|
||
if [[ "$response" =~ ^[Yy]$ ]]; then
|
||
print_info "Installation des packages DEB manquants..."
|
||
sudo apt update
|
||
while read -r package status; do
|
||
if [ "$status" = "install" ] && ! dpkg -l | grep -q "^ii $package "; then
|
||
sudo apt install -y "$package" || print_warning "Impossible d'installer: $package"
|
||
fi
|
||
done < "$CURRENT_BACKUP/deb-packages.list"
|
||
print_success "Packages DEB restaurés"
|
||
fi
|
||
else
|
||
print_warning "Aucune liste de packages DEB à restaurer"
|
||
fi
|
||
}
|
||
|
||
restore_flatpak_apps() {
|
||
print_section "${EMOJI_FLATPAK} Restauration des applications Flatpak"
|
||
|
||
if [ -f "$CURRENT_BACKUP/flatpak-apps.list" ] && command_exists flatpak; then
|
||
echo -ne "${YELLOW}Voulez-vous restaurer les applications Flatpak ? [y/N]: ${NC}"
|
||
read -r response
|
||
if [[ "$response" =~ ^[Yy]$ ]]; then
|
||
print_info "Installation des applications Flatpak manquantes..."
|
||
while read -r app; do
|
||
if [ -n "$app" ] && ! flatpak list | grep -q "$app"; then
|
||
flatpak install -y flathub "$app" || print_warning "Impossible d'installer: $app"
|
||
fi
|
||
done < "$CURRENT_BACKUP/flatpak-apps.list"
|
||
print_success "Applications Flatpak restaurées"
|
||
fi
|
||
else
|
||
print_warning "Aucune liste d'applications Flatpak à restaurer"
|
||
fi
|
||
}
|
||
|
||
# =====================================
|
||
# APPLICATIONS TIERCES
|
||
# =====================================
|
||
|
||
install_outlook() {
|
||
print_info "Installation d'Outlook for Linux..."
|
||
|
||
# Téléchargement et installation du package Outlook
|
||
if command_exists apt; then
|
||
mkdir -p ~/Downloads
|
||
wget -O ~/Downloads/outlook-for-linux_1.3.13_amd64.deb "https://github.com/mahmoudbahaa/outlook-for-linux/releases/download/v1.3.13-outlook/outlook-for-linux_1.3.13_amd64.deb" || {
|
||
print_error "Échec du téléchargement d'Outlook"
|
||
return 1
|
||
}
|
||
sudo apt install -y ~/Downloads/outlook-for-linux_1.3.13_amd64.deb && {
|
||
rm ~/Downloads/outlook-for-linux_1.3.13_amd64.deb
|
||
print_success "Outlook for Linux installé avec succès"
|
||
} || {
|
||
print_error "Échec de l'installation d'Outlook"
|
||
}
|
||
else
|
||
print_error "Installation d'Outlook non supportée sur ce système"
|
||
fi
|
||
}
|
||
|
||
install_teams() {
|
||
print_info "Installation de Teams for Linux..."
|
||
|
||
# Installation de Teams for Linux
|
||
if command_exists apt; then
|
||
mkdir -p ~/Downloads
|
||
wget -O ~/Downloads/teams-for-linux_2.1.3_amd64.deb "https://github.com/IsmaelMartinez/teams-for-linux/releases/download/v2.1.3/teams-for-linux_2.1.3_amd64.deb" || {
|
||
print_error "Échec du téléchargement de Teams"
|
||
return 1
|
||
}
|
||
sudo apt install -y ~/Downloads/teams-for-linux_2.1.3_amd64.deb && {
|
||
rm ~/Downloads/teams-for-linux_2.1.3_amd64.deb
|
||
print_success "Teams for Linux installé avec succès"
|
||
} || {
|
||
print_error "Échec de l'installation de Teams"
|
||
}
|
||
else
|
||
print_error "Installation de Teams non supportée sur ce système"
|
||
fi
|
||
}
|
||
|
||
install_openfortigui() {
|
||
print_info "Installation d'OpenFortiGUI..."
|
||
|
||
# Téléchargement et installation du package OpenFortiGUI
|
||
if command_exists apt; then
|
||
mkdir -p ~/Downloads
|
||
wget -O ~/Downloads/openfortigui_0.9.10-1_amd64_noble.deb "https://apt.iteas.at/iteas/pool/main/o/openfortigui/openfortigui_0.9.10-1_amd64_noble.deb" || {
|
||
print_error "Échec du téléchargement d'OpenFortiGUI"
|
||
return 1
|
||
}
|
||
sudo apt install -y ~/Downloads/openfortigui_0.9.10-1_amd64_noble.deb && {
|
||
rm ~/Downloads/openfortigui_0.9.10-1_amd64_noble.deb
|
||
print_success "OpenFortiGUI installé avec succès"
|
||
} || {
|
||
print_error "Échec de l'installation d'OpenFortiGUI"
|
||
}
|
||
else
|
||
print_error "Installation d'OpenFortiGUI non supportée sur ce système"
|
||
fi
|
||
}
|
||
|
||
install_ollama_stack() {
|
||
print_info "Installation d'Ollama..."
|
||
|
||
# Installation d'Ollama
|
||
curl -fsSL https://ollama.com/install.sh | sh && \
|
||
print_success "Ollama installé avec succès" || {
|
||
print_error "Échec de l'installation d'Ollama"
|
||
return 1
|
||
}
|
||
|
||
# Démarrer le service Ollama
|
||
if command_exists systemctl; then
|
||
sudo systemctl enable ollama || print_warning "Impossible d'activer le service Ollama"
|
||
sudo systemctl start ollama || print_warning "Impossible de démarrer le service Ollama"
|
||
fi
|
||
|
||
print_info "Installation d'Open WebUI..."
|
||
|
||
# Installation d'Open WebUI avec Docker
|
||
if command_exists docker; then
|
||
docker run -d \
|
||
--network=host \
|
||
-v open-webui:/app/backend/data \
|
||
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
|
||
--name open-webui \
|
||
--restart always \
|
||
ghcr.io/open-webui/open-webui:main && {
|
||
print_success "Open WebUI installé avec succès"
|
||
print_info "Accédez à l'interface sur: http://localhost:8080"
|
||
} || {
|
||
print_error "Échec de l'installation d'Open WebUI"
|
||
}
|
||
else
|
||
print_error "Docker n'est pas installé. Impossible d'installer Open WebUI."
|
||
fi
|
||
}
|
||
|
||
install_powershell() {
|
||
print_info "Installation de PowerShell..."
|
||
|
||
# Installation de PowerShell
|
||
if command_exists apt; then
|
||
# Importation de la clé GPG de Microsoft
|
||
wget -O- https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft.gpg && \
|
||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/microsoft-debian-$(lsb_release -cs)-prod $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/microsoft.list && \
|
||
sudo apt update && \
|
||
sudo apt install -y powershell && \
|
||
print_success "PowerShell installé avec succès" || \
|
||
print_error "Échec de l'installation de PowerShell"
|
||
elif command_exists dnf; then
|
||
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc && \
|
||
curl -sSL https://packages.microsoft.com/config/rhel/$(rpm -E %rhel)/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo && \
|
||
sudo dnf install -y powershell && \
|
||
print_success "PowerShell installé avec succès" || \
|
||
print_error "Échec de l'installation de PowerShell"
|
||
else
|
||
print_error "Installation de PowerShell non supportée sur ce système"
|
||
fi
|
||
}
|
||
|
||
# =====================================
|
||
# MENU APPLICATIONS TIERCES
|
||
# =====================================
|
||
|
||
install_third_party() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_APPS} Menu Applications Tierces"
|
||
echo -e "${CYAN} 1. ${EMOJI_APPS} Installer Outlook for Linux"
|
||
echo -e "${CYAN} 2. ${EMOJI_APPS} Installer Teams for Linux"
|
||
echo -e "${CYAN} 3. ${EMOJI_APPS} Installer OpenFortiGUI"
|
||
echo -e "${CYAN} 4. ${EMOJI_OLLAMA} Installer Ollama + Open WebUI"
|
||
echo -e "${CYAN} 5. ${EMOJI_PWSH} Installer PowerShell"
|
||
echo -e "${CYAN} 6. ${EMOJI_INFO} Retour au menu principal"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-6]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1) install_outlook ;;
|
||
2) install_teams ;;
|
||
3) install_openfortigui ;;
|
||
4) install_ollama_stack ;;
|
||
5) install_powershell ;;
|
||
6) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# MENU DE SAUVEGARDE
|
||
# =====================================
|
||
|
||
backup_menu() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_BACKUP} Menu de Sauvegarde"
|
||
echo -e "${CYAN} 1. ${EMOJI_BACKUP} Nouvelle sauvegarde complète"
|
||
echo -e "${CYAN} 2. ${EMOJI_BRAVE} Sauvegarder Brave Browser"
|
||
echo -e "${CYAN} 3. ${EMOJI_BOTTLES} Sauvegarder Bottles"
|
||
echo -e "${CYAN} 4. ${EMOJI_STARTUP} Sauvegarder les applications de démarrage"
|
||
echo -e "${CYAN} 5. ${EMOJI_OLLAMA} Sauvegarder Ollama"
|
||
echo -e "${CYAN} 6. ${EMOJI_DEB} Sauvegarder les packages DEB"
|
||
echo -e "${CYAN} 7. ${EMOJI_FLATPAK} Sauvegarder les applications Flatpak"
|
||
echo -e "${CYAN} 8. ${EMOJI_INFO} Retour au menu principal"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-8]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1)
|
||
create_backup_dir
|
||
backup_brave
|
||
backup_bottles
|
||
backup_startup_apps
|
||
backup_ollama
|
||
backup_deb_packages
|
||
backup_flatpak_apps
|
||
print_success "Sauvegarde complète terminée!"
|
||
;;
|
||
2)
|
||
create_backup_dir
|
||
backup_brave
|
||
;;
|
||
3)
|
||
create_backup_dir
|
||
backup_bottles
|
||
;;
|
||
4)
|
||
create_backup_dir
|
||
backup_startup_apps
|
||
;;
|
||
5)
|
||
create_backup_dir
|
||
backup_ollama
|
||
;;
|
||
6)
|
||
create_backup_dir
|
||
backup_deb_packages
|
||
;;
|
||
7)
|
||
create_backup_dir
|
||
backup_flatpak_apps
|
||
;;
|
||
8) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# MENU DE RESTAURATION
|
||
# =====================================
|
||
|
||
restore_menu() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_RESTORE} Menu de Restauration"
|
||
|
||
if ! select_backup_dir; then
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
return
|
||
fi
|
||
|
||
while true; do
|
||
clear
|
||
echo -e "${PURPLE}${BOLD}Restauration: $(basename "$CURRENT_BACKUP")${NC}"
|
||
echo -e "${CYAN} 1. ${EMOJI_RESTORE} Restaurer tout"
|
||
echo -e "${CYAN} 2. ${EMOJI_BRAVE} Restaurer Brave Browser"
|
||
echo -e "${CYAN} 3. ${EMOJI_BOTTLES} Restaurer Bottles"
|
||
echo -e "${CYAN} 4. ${EMOJI_STARTUP} Restaurer les applications de démarrage"
|
||
echo -e "${CYAN} 5. ${EMOJI_OLLAMA} Restaurer Ollama"
|
||
echo -e "${CYAN} 6. ${EMOJI_DEB} Restaurer les packages DEB"
|
||
echo -e "${CYAN} 7. ${EMOJI_FLATPAK} Restaurer les applications Flatpak"
|
||
echo -e "${CYAN} 8. ${EMOJI_INFO} Changer de sauvegarde"
|
||
echo -e "${CYAN} 9. ${EMOJI_INFO} Retour au menu principal"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-9]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1)
|
||
restore_brave
|
||
restore_bottles
|
||
restore_startup_apps
|
||
restore_ollama
|
||
restore_deb_packages
|
||
restore_flatpak_apps
|
||
print_success "Restauration complète terminée!"
|
||
;;
|
||
2) restore_brave ;;
|
||
3) restore_bottles ;;
|
||
4) restore_startup_apps ;;
|
||
5) restore_ollama ;;
|
||
6) restore_deb_packages ;;
|
||
7) restore_flatpak_apps ;;
|
||
8) break ;;
|
||
9) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# MENU DE GESTION DES SAUVEGARDES
|
||
# =====================================
|
||
|
||
manage_backups_menu() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_LIST} Menu de Gestion des Sauvegardes"
|
||
echo -e "${CYAN} 1. ${EMOJI_LIST} Lister les sauvegardes"
|
||
echo -e "${CYAN} 2. ${EMOJI_DELETE} Supprimer des sauvegardes"
|
||
echo -e "${CYAN} 3. ${EMOJI_INFO} Informations sur l'espace disque"
|
||
echo -e "${CYAN} 4. ${EMOJI_INFO} Retour au menu principal"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-4]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1)
|
||
list_backups
|
||
;;
|
||
2)
|
||
delete_backups
|
||
;;
|
||
3)
|
||
print_section "${EMOJI_INFO} Informations sur l'espace disque"
|
||
if [ -d "$BACKUP_BASE_DIR" ]; then
|
||
echo -e "${BLUE}Répertoire de sauvegarde:${NC} $BACKUP_BASE_DIR"
|
||
local total_size=$(du -sh "$BACKUP_BASE_DIR" 2>/dev/null | cut -f1)
|
||
echo -e "${BLUE}Espace total utilisé:${NC} $total_size"
|
||
|
||
local available_space=$(df -h "$HOME" | awk 'NR==2{print $4}')
|
||
echo -e "${BLUE}Espace disponible sur $HOME:${NC} $available_space"
|
||
else
|
||
print_warning "Aucun répertoire de sauvegarde trouvé"
|
||
fi
|
||
;;
|
||
4) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# MENU DE VÉRIFICATIONS
|
||
# =====================================
|
||
|
||
verify_flatpak_repo() {
|
||
print_section "${EMOJI_FLATPAK} Vérification du dépôt Flatpak"
|
||
|
||
if ! command_exists flatpak; then
|
||
print_warning "Flatpak n'est pas installé"
|
||
echo -ne "${YELLOW}Voulez-vous installer Flatpak ? [y/N]: ${NC}"
|
||
read -r response
|
||
if [[ "$response" =~ ^[Yy]$ ]]; then
|
||
if command_exists apt; then
|
||
sudo apt update && sudo apt install -y flatpak
|
||
elif command_exists dnf; then
|
||
sudo dnf install -y flatpak
|
||
elif command_exists pacman; then
|
||
sudo pacman -S --noconfirm flatpak
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
if command_exists flatpak; then
|
||
if flatpak remotes | grep -q flathub; then
|
||
print_success "Dépôt Flathub déjà configuré"
|
||
else
|
||
print_warning "Dépôt Flathub non configuré"
|
||
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo && \
|
||
print_success "Dépôt Flathub ajouté avec succès" || \
|
||
print_error "Échec de l'ajout du dépôt Flathub"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
verify_startup_apps() {
|
||
print_section "${EMOJI_STARTUP} Vérification des applications de démarrage"
|
||
|
||
if [ -d "$HOME/.config/autostart" ]; then
|
||
local startup_count=$(ls -1 "$HOME/.config/autostart"/*.desktop 2>/dev/null | wc -l)
|
||
if [ "$startup_count" -gt 0 ]; then
|
||
print_success "$startup_count application(s) de démarrage configurée(s)"
|
||
echo -e "${BLUE}Applications de démarrage:${NC}"
|
||
for file in "$HOME/.config/autostart"/*.desktop; do
|
||
if [ -f "$file" ]; then
|
||
local app_name=$(grep "^Name=" "$file" | cut -d= -f2)
|
||
echo " - ${app_name:-$(basename "$file" .desktop)}"
|
||
fi
|
||
done
|
||
else
|
||
print_warning "Aucune application de démarrage configurée"
|
||
fi
|
||
else
|
||
print_warning "Répertoire des applications de démarrage non trouvé"
|
||
fi
|
||
}
|
||
|
||
verify_ollama_and_webui() {
|
||
print_section "${EMOJI_OLLAMA} Vérification d'Ollama et Open WebUI"
|
||
|
||
# Vérification d'Ollama
|
||
if command_exists ollama; then
|
||
print_success "Ollama installé"
|
||
|
||
# Vérifier si le service fonctionne
|
||
if systemctl is-active --quiet ollama 2>/dev/null || pgrep -x ollama >/dev/null; then
|
||
print_success "Service Ollama actif"
|
||
|
||
# Tester la connexion
|
||
if ollama list >/dev/null 2>&1; then
|
||
local model_count=$(ollama list 2>/dev/null | tail -n +2 | wc -l)
|
||
print_success "$model_count modèle(s) disponible(s)"
|
||
else
|
||
print_warning "Ollama ne répond pas correctement"
|
||
fi
|
||
else
|
||
print_warning "Service Ollama inactif"
|
||
fi
|
||
else
|
||
print_error "Ollama non installé"
|
||
fi
|
||
|
||
# Vérification d'Open WebUI
|
||
if command_exists docker; then
|
||
if docker ps | grep -q "open-webui"; then
|
||
print_success "Open WebUI (conteneur actif)"
|
||
|
||
# Récupérer le port
|
||
local port_mapping=$(docker ps | grep "open-webui" | grep -o '0.0.0.0:[0-9]*->8080' | cut -d: -f2 | cut -d- -f1)
|
||
if [ -n "$port_mapping" ]; then
|
||
print_info "Interface accessible sur: http://localhost:$port_mapping"
|
||
else
|
||
# Vérifier si c'est en mode host
|
||
if docker ps | grep "open-webui" | grep -q "host"; then
|
||
print_info "Interface accessible sur: http://localhost:8080"
|
||
else
|
||
print_warning "Port non déterminé, vérifiez la configuration"
|
||
fi
|
||
fi
|
||
else
|
||
print_warning "Open WebUI (conteneur inactif)"
|
||
if docker ps -a | grep -q "open-webui"; then
|
||
print_info "Conteneur Open WebUI existe mais n'est pas démarré"
|
||
else
|
||
print_warning "Conteneur Open WebUI non trouvé"
|
||
fi
|
||
fi
|
||
else
|
||
print_error "Docker non installé - nécessaire pour Open WebUI"
|
||
fi
|
||
}
|
||
|
||
verification_menu() {
|
||
while true; do
|
||
clear
|
||
print_header "${EMOJI_CONFIG} Menu de Vérifications"
|
||
echo -e "${CYAN} 1. ${EMOJI_CONFIG} Vérifier les prérequis système"
|
||
echo -e "${CYAN} 2. ${EMOJI_FLATPAK} Vérifier le dépôt Flatpak"
|
||
echo -e "${CYAN} 3. ${EMOJI_STARTUP} Vérifier les applications de démarrage"
|
||
echo -e "${CYAN} 4. ${EMOJI_OLLAMA} Vérifier Ollama et Open WebUI"
|
||
echo -e "${CYAN} 5. ${EMOJI_INFO} Retour au menu principal"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-5]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1) check_requirements ;;
|
||
2) verify_flatpak_repo ;;
|
||
3) verify_startup_apps ;;
|
||
4) verify_ollama_and_webui ;;
|
||
5) return ;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# MENU PRINCIPAL
|
||
# =====================================
|
||
|
||
main_menu() {
|
||
while true; do
|
||
clear
|
||
|
||
# Affichage du titre avec figlet si disponible
|
||
if command_exists figlet; then
|
||
echo -e "${PURPLE}${BOLD}"
|
||
figlet -f small "GAG Pro 4.0"
|
||
echo -e "${NC}"
|
||
else
|
||
echo -e "${PURPLE}${BOLD}"
|
||
echo " ____ _ ____ "
|
||
echo " / ___| / \\ / ___| "
|
||
echo " | | _ / _ \\ | | _ "
|
||
echo " | |_| | / ___ \\ | |_| | "
|
||
echo " \\____| /_/ \\_\\ \\____| "
|
||
echo -e "${NC}"
|
||
fi
|
||
|
||
echo -e "${BLUE}${BOLD} G A G (Gestionnaire d'Applications GNOME) - Version Pro 4.0 ${NC}"
|
||
echo -e "${BLUE}${BOLD}=============================================================${NC}"
|
||
echo -e "${CYAN} 1. ${EMOJI_BACKUP} Sauvegarde"
|
||
echo -e "${CYAN} 2. ${EMOJI_RESTORE} Restauration"
|
||
echo -e "${CYAN} 3. ${EMOJI_DELETE} Gérer les sauvegardes"
|
||
echo -e "${CYAN} 4. ${EMOJI_APPS} Installer des applications tierces"
|
||
echo -e "${CYAN} 5. ${EMOJI_CONFIG} Menu de vérifications"
|
||
echo -e "${CYAN} 6. ${EMOJI_CHECK} Vérifier les applications installées"
|
||
echo -e "${CYAN} 7. ${EMOJI_INFO} Quitter"
|
||
echo -ne "${YELLOW}${BOLD}Choisissez une option [1-7]: ${NC}"
|
||
read -r choice
|
||
|
||
case $choice in
|
||
1) backup_menu ;;
|
||
2) restore_menu ;;
|
||
3) manage_backups_menu ;;
|
||
4) install_third_party ;;
|
||
5) verification_menu ;;
|
||
6) check_installed_apps ;;
|
||
7)
|
||
echo -e "${GREEN}${EMOJI_OK} Merci d'avoir utilisé GAG. À bientôt!${NC}"
|
||
exit 0
|
||
;;
|
||
*) print_error "Option invalide" ;;
|
||
esac
|
||
|
||
echo -ne "\n${YELLOW}Appuyez sur une touche pour continuer...${NC}"
|
||
read -n 1 -s -r
|
||
done
|
||
}
|
||
|
||
# =====================================
|
||
# POINT D'ENTRÉE PRINCIPAL
|
||
# =====================================
|
||
|
||
clear
|
||
print_header "Démarrage de GAG Pro 4.0"
|
||
check_requirements
|
||
main_menu
|