362 lines
12 KiB
Bash
362 lines
12 KiB
Bash
#!/bin/bash
|
|
|
|
# Script de sauvegarde et restauration des extensions GNOME
|
|
# Auteur: Assistant Claude
|
|
# 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 "$@"
|