147 lines
4.2 KiB
Bash
Executable File
147 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
|
|
|
# Définition de l'URL du script
|
|
SCRIPT_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh"
|
|
SCRIPT_NAME=$(basename "$0")
|
|
TMP_SCRIPT="/tmp/$SCRIPT_NAME"
|
|
|
|
# Télécharger la dernière version du script
|
|
wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
|
|
|
|
# Vérifier si la mise à jour est différente de la version actuelle
|
|
if ! cmp -s "$TMP_SCRIPT" "$0"; then
|
|
echo "🔄 Mise à jour du script..."
|
|
mv "$TMP_SCRIPT" "$0"
|
|
chmod +x "$0"
|
|
echo "✅ Script mis à jour ! Redémarrage..."
|
|
exec "$0" "$@"
|
|
exit 0
|
|
else
|
|
rm "$TMP_SCRIPT"
|
|
fi
|
|
|
|
|
|
# Définition du dépôt et des fichiers de configuration
|
|
REPO_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts"
|
|
DIR_LIST_FILE=".directories.txt"
|
|
SELECTED_DIRS_FILE=".selected_dirs.txt"
|
|
MANDATORY_DIR="common"
|
|
|
|
# Télécharger la liste des dossiers disponibles
|
|
TMP_DIR=$(mktemp -d)
|
|
DIR_LIST_PATH="$TMP_DIR/$DIR_LIST_FILE"
|
|
|
|
wget -q -O "$DIR_LIST_PATH" "$REPO_URL/$DIR_LIST_FILE"
|
|
|
|
# Vérifier que la liste a bien été téléchargée
|
|
if [ ! -s "$DIR_LIST_PATH" ]; then
|
|
echo "❌ Erreur : Impossible de récupérer la liste des dossiers."
|
|
exit 1
|
|
fi
|
|
|
|
# Lire les dossiers disponibles dans un tableau
|
|
mapfile -t AVAILABLE_DIRS < "$DIR_LIST_PATH"
|
|
|
|
# Vérifier qu'il y a bien des dossiers disponibles
|
|
if [ ${#AVAILABLE_DIRS[@]} -eq 0 ]; then
|
|
echo "❌ Aucun dossier disponible dans la liste."
|
|
exit 1
|
|
fi
|
|
|
|
# Charger les dossiers précédemment sélectionnés
|
|
if [ -f "$SELECTED_DIRS_FILE" ]; then
|
|
mapfile -t PREVIOUS_SELECTION < "$SELECTED_DIRS_FILE"
|
|
else
|
|
PREVIOUS_SELECTION=()
|
|
fi
|
|
|
|
# Construire la liste pour whiptail
|
|
CHOICES=()
|
|
for dir in "${AVAILABLE_DIRS[@]}"; do
|
|
if [ "$dir" == "$MANDATORY_DIR" ]; then
|
|
continue # Ne pas inclure le dossier obligatoire dans le choix
|
|
fi
|
|
if [[ " ${PREVIOUS_SELECTION[*]} " =~ " $dir " ]]; then
|
|
CHOICES+=("$dir" "" ON)
|
|
else
|
|
CHOICES+=("$dir" "" OFF)
|
|
fi
|
|
done
|
|
|
|
# Affichage du menu de sélection avec whiptail
|
|
SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
|
|
"Sélectionnez les dossiers à télécharger :" 20 60 10 \
|
|
"${CHOICES[@]}" 3>&1 1>&2 2>&3)
|
|
|
|
# Vérifier si l'utilisateur a annulé
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ Annulation par l'utilisateur."
|
|
exit 1
|
|
fi
|
|
|
|
# Convertir la sélection en tableau
|
|
SELECTED_DIRS_ARRAY=("$MANDATORY_DIR" $(echo "$SELECTED_DIRS" | tr -d '"'))
|
|
|
|
# Enregistrer la sélection actuelle
|
|
echo "${SELECTED_DIRS_ARRAY[@]}" > "$SELECTED_DIRS_FILE"
|
|
|
|
# Identifier les dossiers à supprimer (ceux qui ne sont plus sélectionnés)
|
|
for dir in "${PREVIOUS_SELECTION[@]}"; do
|
|
if [[ ! " ${SELECTED_DIRS_ARRAY[*]} " =~ " $dir " ]]; then
|
|
echo "🗑 Suppression du dossier $dir..."
|
|
rm -rf "$dir"
|
|
fi
|
|
done
|
|
|
|
# Télécharger ou mettre à jour les fichiers pour chaque dossier sélectionné
|
|
for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
|
|
LIST_FILE=".list_files.txt"
|
|
LIST_PATH="$TMP_DIR/$LIST_FILE"
|
|
|
|
echo "🔹 Récupération des scripts de '$TARGET_DIR'..."
|
|
|
|
# Télécharger la liste des fichiers
|
|
wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/$LIST_FILE"
|
|
|
|
if [ ! -s "$LIST_PATH" ]; then
|
|
echo "❌ Erreur : Impossible de récupérer la liste des fichiers pour $TARGET_DIR."
|
|
continue
|
|
fi
|
|
|
|
# Création du répertoire s'il n'existe pas
|
|
mkdir -p "$TARGET_DIR"
|
|
|
|
# Télécharger chaque fichier listé
|
|
while read -r file; do
|
|
FILE_NAME=$(basename "$file")
|
|
FILE_PATH="$TARGET_DIR/$FILE_NAME"
|
|
|
|
if [ -f "$FILE_PATH" ]; then
|
|
echo " ↻ Mise à jour de $FILE_NAME..."
|
|
else
|
|
echo " ↳ Téléchargement de $FILE_NAME..."
|
|
fi
|
|
wget -q -O "$FILE_PATH" "$REPO_URL/$TARGET_DIR/$file"
|
|
done < "$LIST_PATH"
|
|
|
|
# Supprimer les fichiers obsolètes
|
|
for existing_file in "$TARGET_DIR"/*; do
|
|
if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
|
|
echo " 🗑 Suppression de $(basename "$existing_file")..."
|
|
rm "$existing_file"
|
|
fi
|
|
done
|
|
|
|
# Rendre exécutables les scripts téléchargés
|
|
chmod +x "$TARGET_DIR"/*.sh
|
|
|
|
echo "✅ Scripts de '$TARGET_DIR' mis à jour avec succès."
|
|
done
|
|
|
|
# Nettoyage
|
|
rm -rf "$TMP_DIR"
|
|
|
|
echo "🚀 Tous les scripts sélectionnés ont été mis à jour et sont exécutables."
|
|
|