diff --git a/gnome_extension.sh b/gnome_extension.sh new file mode 100644 index 0000000..5a07ac2 --- /dev/null +++ b/gnome_extension.sh @@ -0,0 +1,361 @@ +#!/bin/bash + +# Script de sauvegarde et restauration des extensions GNOME +# Auteur: Fontaine Johnny +# Version: 1.0 + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Répertoires +BACKUP_DIR="$HOME/Backups/gnome-extensions-backup" +EXTENSIONS_DIR="$HOME/.local/share/gnome-shell/extensions" +CONFIG_DIR="$HOME/.config" + +# Fonction d'affichage avec couleurs +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Fonction pour vérifier les prérequis +check_requirements() { + print_info "Vérification des prérequis..." + + # Vérifier si GNOME Shell est en cours d'exécution + if ! pgrep -x "gnome-shell" > /dev/null; then + print_warning "GNOME Shell ne semble pas être en cours d'exécution" + fi + + # Vérifier si dconf est installé + if ! command -v dconf &> /dev/null; then + print_error "dconf n'est pas installé. Veuillez l'installer avec: sudo apt install dconf-cli" + exit 1 + fi + + # Vérifier si gsettings est disponible + if ! command -v gsettings &> /dev/null; then + print_error "gsettings n'est pas disponible" + exit 1 + fi + + print_success "Prérequis vérifiés" +} + +# Fonction de sauvegarde +backup_extensions() { + print_info "Début de la sauvegarde des extensions GNOME..." + + # Créer le répertoire de sauvegarde + mkdir -p "$BACKUP_DIR" + + # Date de la sauvegarde + BACKUP_DATE=$(date +"%Y%m%d_%H%M%S") + BACKUP_FILE="$BACKUP_DIR/gnome-extensions-$BACKUP_DATE.tar.gz" + SETTINGS_FILE="$BACKUP_DIR/gnome-settings-$BACKUP_DATE.dconf" + EXTENSIONS_LIST="$BACKUP_DIR/extensions-list-$BACKUP_DATE.txt" + + # Sauvegarder les extensions installées + if [ -d "$EXTENSIONS_DIR" ]; then + print_info "Sauvegarde des fichiers d'extensions..." + tar -czf "$BACKUP_FILE" -C "$HOME/.local/share/gnome-shell" extensions/ 2>/dev/null + if [ $? -eq 0 ]; then + print_success "Extensions sauvegardées dans: $BACKUP_FILE" + else + print_warning "Aucune extension à sauvegarder ou erreur lors de l'archivage" + fi + else + print_warning "Répertoire des extensions non trouvé: $EXTENSIONS_DIR" + fi + + # Sauvegarder les paramètres des extensions + print_info "Sauvegarde des paramètres des extensions..." + dconf dump /org/gnome/shell/extensions/ > "$SETTINGS_FILE" 2>/dev/null + if [ -s "$SETTINGS_FILE" ]; then + print_success "Paramètres sauvegardés dans: $SETTINGS_FILE" + else + print_warning "Aucun paramètre d'extension à sauvegarder" + fi + + # Créer une liste des extensions activées + print_info "Sauvegarde de la liste des extensions activées..." + gsettings get org.gnome.shell enabled-extensions > "$EXTENSIONS_LIST" 2>/dev/null + if [ -s "$EXTENSIONS_LIST" ]; then + print_success "Liste des extensions sauvegardée dans: $EXTENSIONS_LIST" + else + print_warning "Impossible de récupérer la liste des extensions activées" + fi + + # Créer un fichier de métadonnées + METADATA_FILE="$BACKUP_DIR/backup-metadata-$BACKUP_DATE.txt" + { + echo "=== SAUVEGARDE EXTENSIONS GNOME ===" + echo "Date: $(date)" + echo "Utilisateur: $USER" + echo "Version GNOME: $(gnome-shell --version 2>/dev/null || echo 'Non disponible')" + echo "Système: $(lsb_release -d 2>/dev/null | cut -f2 || uname -a)" + echo "" + echo "Fichiers créés:" + echo "- Extensions: $(basename "$BACKUP_FILE")" + echo "- Paramètres: $(basename "$SETTINGS_FILE")" + echo "- Liste: $(basename "$EXTENSIONS_LIST")" + } > "$METADATA_FILE" + + print_success "Sauvegarde terminée! Fichiers dans: $BACKUP_DIR" + print_info "Métadonnées sauvegardées dans: $METADATA_FILE" +} + +# Fonction de restauration +restore_extensions() { + print_info "Restauration des extensions GNOME..." + + # Lister les sauvegardes disponibles + if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR"/*.tar.gz 2>/dev/null)" ]; then + print_error "Aucune sauvegarde trouvée dans $BACKUP_DIR" + exit 1 + fi + + echo "Sauvegardes disponibles:" + select backup_file in "$BACKUP_DIR"/*.tar.gz; do + if [ -n "$backup_file" ]; then + break + else + print_error "Sélection invalide" + fi + done + + # Extraire la date de la sauvegarde sélectionnée + BACKUP_DATE=$(basename "$backup_file" | sed 's/gnome-extensions-\(.*\)\.tar\.gz/\1/') + SETTINGS_FILE="$BACKUP_DIR/gnome-settings-$BACKUP_DATE.dconf" + EXTENSIONS_LIST="$BACKUP_DIR/extensions-list-$BACKUP_DATE.txt" + + print_info "Restauration depuis: $(basename "$backup_file")" + + # Demander confirmation + read -p "Voulez-vous continuer avec la restauration? (y/N): " confirm + if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + print_info "Restauration annulée" + exit 0 + fi + + # Créer une sauvegarde de sécurité des extensions actuelles + if [ -d "$EXTENSIONS_DIR" ]; then + print_info "Création d'une sauvegarde de sécurité..." + SAFETY_BACKUP="$BACKUP_DIR/safety-backup-$(date +%Y%m%d_%H%M%S).tar.gz" + tar -czf "$SAFETY_BACKUP" -C "$HOME/.local/share/gnome-shell" extensions/ 2>/dev/null + print_success "Sauvegarde de sécurité créée: $SAFETY_BACKUP" + fi + + # Restaurer les extensions + print_info "Restauration des fichiers d'extensions..." + mkdir -p "$HOME/.local/share/gnome-shell" + tar -xzf "$backup_file" -C "$HOME/.local/share/gnome-shell" 2>/dev/null + if [ $? -eq 0 ]; then + print_success "Extensions restaurées" + else + print_error "Erreur lors de la restauration des extensions" + fi + + # Restaurer les paramètres + if [ -f "$SETTINGS_FILE" ] && [ -s "$SETTINGS_FILE" ]; then + print_info "Restauration des paramètres..." + dconf load /org/gnome/shell/extensions/ < "$SETTINGS_FILE" + print_success "Paramètres restaurés" + else + print_warning "Fichier de paramètres non trouvé ou vide" + fi + + # Restaurer la liste des extensions activées + if [ -f "$EXTENSIONS_LIST" ] && [ -s "$EXTENSIONS_LIST" ]; then + print_info "Restauration de la liste des extensions activées..." + ENABLED_EXTENSIONS=$(cat "$EXTENSIONS_LIST") + gsettings set org.gnome.shell enabled-extensions "$ENABLED_EXTENSIONS" + print_success "Liste des extensions activées restaurée" + else + print_warning "Liste des extensions non trouvée" + fi + + print_success "Restauration terminée!" + print_warning "Vous devrez peut-être redémarrer GNOME Shell (Alt+F2, tapez 'r') ou vous déconnecter/reconnecter" +} + +# Fonction pour lister les sauvegardes +list_backups() { + print_info "Sauvegardes disponibles:" + + if [ ! -d "$BACKUP_DIR" ]; then + print_warning "Répertoire de sauvegarde non trouvé: $BACKUP_DIR" + return + fi + + for backup in "$BACKUP_DIR"/gnome-extensions-*.tar.gz; do + if [ -f "$backup" ]; then + filename=$(basename "$backup") + date_part=$(echo "$filename" | sed 's/gnome-extensions-\(.*\)\.tar\.gz/\1/') + readable_date=$(echo "$date_part" | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3\/\2\/\1 \4:\5:\6/') + size=$(du -h "$backup" | cut -f1) + echo " - $filename (Taille: $size, Date: $readable_date)" + + # Vérifier les fichiers associés + metadata_file="$BACKUP_DIR/backup-metadata-$date_part.txt" + if [ -f "$metadata_file" ]; then + echo " └── Métadonnées disponibles" + fi + fi + done + + if [ -z "$(ls -A "$BACKUP_DIR"/gnome-extensions-*.tar.gz 2>/dev/null)" ]; then + print_warning "Aucune sauvegarde trouvée" + fi +} + +# Fonction pour nettoyer les anciennes sauvegardes +cleanup_backups() { + print_info "Nettoyage des anciennes sauvegardes..." + + if [ ! -d "$BACKUP_DIR" ]; then + print_warning "Répertoire de sauvegarde non trouvé" + return + fi + + read -p "Combien de sauvegardes souhaitez-vous conserver? (défaut: 5): " keep_count + keep_count=${keep_count:-5} + + # Supprimer les anciennes sauvegardes (garder les plus récentes) + ls -t "$BACKUP_DIR"/gnome-extensions-*.tar.gz 2>/dev/null | tail -n +$((keep_count + 1)) | while read -r old_backup; do + if [ -f "$old_backup" ]; then + date_part=$(basename "$old_backup" | sed 's/gnome-extensions-\(.*\)\.tar\.gz/\1/') + print_info "Suppression de $(basename "$old_backup")" + rm -f "$old_backup" + rm -f "$BACKUP_DIR/gnome-settings-$date_part.dconf" + rm -f "$BACKUP_DIR/extensions-list-$date_part.txt" + rm -f "$BACKUP_DIR/backup-metadata-$date_part.txt" + fi + done + + print_success "Nettoyage terminé" +} + +# Fonction d'aide +show_help() { + echo "Script de sauvegarde et restauration des extensions GNOME" + echo "" + echo "Usage: $0 [OPTION]" + echo "" + echo "Options:" + echo " backup, -b Sauvegarder les extensions" + echo " restore, -r Restaurer les extensions" + echo " list, -l Lister les sauvegardes disponibles" + echo " cleanup, -c Nettoyer les anciennes sauvegardes" + echo " help, -h Afficher cette aide" + echo "" + echo "Répertoire de sauvegarde: $BACKUP_DIR" +} + +# Fonction pour afficher le menu principal +show_menu() { + echo "" + echo "==============================================" + echo " Script de gestion des extensions GNOME" + echo "==============================================" + echo "" + echo "Choisissez une action:" + echo "1) Sauvegarder les extensions" + echo "2) Restaurer les extensions" + echo "3) Lister les sauvegardes" + echo "4) Nettoyer les anciennes sauvegardes" + echo "5) Afficher l'aide" + echo "6) Quitter" + echo "" +} + +# Fonction pour demander de continuer +ask_continue() { + echo "" + echo "==============================================" + read -p "Appuyez sur Entrée pour revenir au menu principal..." + echo "" +} + +# Boucle principale interactive +interactive_menu() { + while true; do + show_menu + read -p "Votre choix (1-6): " choice + + case $choice in + 1) + check_requirements && backup_extensions + ask_continue + ;; + 2) + check_requirements && restore_extensions + ask_continue + ;; + 3) + list_backups + ask_continue + ;; + 4) + cleanup_backups + ask_continue + ;; + 5) + show_help + ask_continue + ;; + 6) + print_info "Au revoir!" + exit 0 + ;; + *) + print_error "Choix invalide" + sleep 1 + ;; + esac + done +} + +# Programme principal +main() { + case "${1:-}" in + backup|-b) + check_requirements + backup_extensions + ;; + restore|-r) + check_requirements + restore_extensions + ;; + list|-l) + list_backups + ;; + cleanup|-c) + cleanup_backups + ;; + help|-h|--help) + show_help + ;; + *) + # Mode interactif par défaut + interactive_menu + ;; + esac +} + +main "$@" \ No newline at end of file