Created
April 17, 2025 23:08
-
-
Save DavidBabel/5089cf7ea745a76e8677371967f10172 to your computer and use it in GitHub Desktop.
Allows easy backups in home assistant scripts for backups or any sonarr radarr bazarr backups
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Description : Script de sauvegarde et nettoyage pour Home Assistant et autres applications. | |
# Ce script contient des fonctions utilitaires pour la gestion des fichiers et des répertoires. | |
# Il est conçu pour être utilisé dans le cadre de scripts de sauvegarde et de nettoyage. | |
## usage : | |
# backup "/mnt/ha_backup" "/media/freebox/#ha backups/home_assistant" | |
# backup "/share/bazarr/backup" "/media/freebox/#ha backups/bazarr" | |
## Needs : | |
# Samba share | |
## CONFIGURATION | |
LOG_DESTINATION="/media/freebox/#ha backups/backup.log" | |
SAMBA_LOGIN="h" | |
SAMBA_PASSWORD="h" | |
SAMBA_SERVER="192.168.1.196" | |
## Add to configuration.yaml | |
# shell_command: | |
# backups: bash /media/freebox/\#\ imports_scripts_to_home_assistant/backups.sh | |
echo() { | |
command echo "[$(date '+%H:%M:%S')]" "$@" | |
} | |
# trim_log_file mon_fichier.log 500 | |
trim_log_file() { | |
local file="$1" | |
local max_lines="${2:-1000}" # Par défaut : 1000 lignes si non spécifié | |
if [[ ! -f "$file" ]]; then | |
echo "Fichier introuvable : $file" | |
return 1 | |
fi | |
tail -n "$max_lines" "$file" > "${file}.trimmed" && mv "${file}.trimmed" "$file" | |
echo "Fichier '$file' tronqué à $max_lines lignes." | |
} | |
# enable_logging "/media/freebox/#ha backups/backup.log" | |
enable_logging() { | |
local log_file="$1" | |
if [[ -z "$log_file" ]]; then | |
echo "Erreur : aucun fichier de log spécifié." | |
return 1 | |
fi | |
mkdir -p "$(dirname "$log_file")" | |
exec > >(tee -a "$log_file") 2>&1 | |
trim_log_file "$log_file" | |
} | |
enable_logging "$LOG_DESTINATION" | |
mount_ha() { | |
local share_name="$1" | |
local allowed_shares=("addons" "addon_configs" "backup" "config" "media" "share" "ssl") | |
if [[ ! " ${allowed_shares[*]} " =~ " $share_name " ]]; then | |
echo "Erreur : '$share_name' n'est pas un partage valide." | |
echo "Partages autorisés : ${allowed_shares[*]}" | |
return 1 | |
fi | |
local mount_point="/mnt/ha_${share_name}" | |
local server="$SAMBA_SERVER" | |
local username="$SAMBA_LOGIN" | |
local password="$SAMBA_PASSWORD" | |
mkdir -p "$mount_point" | |
echo "Montage de //$server/$share_name sur $mount_point" | |
mount -t cifs "//$server/$share_name" "$mount_point" \ | |
-o username=$username,password=$password,iocharset=utf8,noperm || return 1 | |
# Ajoute une commande de nettoyage à la fin du script | |
trap "echo 'Démontage de $mount_point'; umount '$mount_point'" EXIT | |
# Exporte le point de montage pour qu'il soit utilisable par le reste du script | |
export HA_MOUNT_POINT="$mount_point" | |
} | |
# delete_old_backups "/chemin/vers/dossier" "pattern" "nombre_max" | |
# Ex: delete_old_backups "/media/freebox/#ha backups/home_assistant" "Automatic_backup_*.tar" 10 | |
delete_old_backups() { | |
local dir="$1" | |
local pattern="$2" | |
local max="${3:-10}" | |
if [[ ! -d "$dir" ]]; then | |
echo "❌ Dossier non trouvé : $dir" | |
return 1 | |
fi | |
cd "$dir" || { | |
echo "❌ Erreur : impossible d'accéder à $dir" | |
return 1 | |
} | |
local files=( $pattern ) | |
if [ ${#files[@]} -le "$max" ]; then | |
echo "✅ Il y a ${#files[@]} fichiers — rien à supprimer." | |
return 0 | |
fi | |
echo "🧹 Suppression des fichiers suivants (au-delà des $max plus récents) :" | |
ls -1t $pattern | tail -n +$((max + 1)) | tee /dev/stderr | xargs -r rm -- | |
echo "✅ Nettoyage terminé." | |
} | |
# copy_matching_files "/chemin/source" "motif" "/chemin/destination" | |
# Ex: copy_matching_files "$SOURCE_DIR" "Automatic_backup_*.tar" "$DEST_DIR" | |
copy_matching_files() { | |
local src="$1" | |
local pattern="$2" | |
local dest="$3" | |
if [[ ! -d "$src" ]]; then | |
echo "❌ Dossier source introuvable : $src" | |
return 1 | |
fi | |
mkdir -p "$dest" | |
local matching_files=( "$src"/$pattern ) | |
# Si aucun fichier ne correspond (expansion littérale = pas de fichier trouvé) | |
if [[ ! -e "${matching_files[0]}" ]]; then | |
echo "ℹ️ Aucun fichier à déplacer depuis $src." | |
return 0 | |
fi | |
echo "📦 Copie des fichiers depuis $src vers $dest..." | |
cp "${matching_files[@]}" "$dest"/ | |
echo "✅ Fichiers copiés avec succès." | |
cd "$dest" || { | |
echo "❌ Erreur : impossible d'accéder à $dest" | |
return 1 | |
} | |
} | |
# sync_backups "/chemin/source" "/chemin/destination" | |
# Exemple : | |
# sync_backups "/mnt/ha_backup" "/media/freebox/#ha backups/home_assistant" | |
backup() { | |
local source="$1" | |
local dest="$2" | |
local pattern="" | |
local allowed_shares=("addons" "addon_configs" "backup" "config" "media" "share" "ssl") | |
echo "🚀 Démarrage de la synchronisation depuis '$source' vers '$dest'..." | |
for share in "${allowed_shares[@]}"; do | |
if [[ "$source" == "/mnt/ha_${share}"* ]]; then | |
echo "🔌 Source détectée comme partage Home Assistant : '$share'" | |
mount_ha "$share" || { | |
echo "❌ Échec du montage du partage '$share'." | |
return 1 | |
} | |
source="$HA_MOUNT_POINT" | |
break | |
fi | |
done | |
if [[ ! -d "$source" ]]; then | |
echo "❌ Le dossier source '$source' n'existe pas." | |
return 1 | |
fi | |
echo "🔍 Recherche d’un motif de fichiers dans le dossier source..." | |
local first_file | |
first_file=$(find "$source" -maxdepth 1 -type f | head -n 1) | |
first_file=$(basename "$first_file") | |
if [[ -z "$first_file" ]]; then | |
echo "ℹ️ Aucun fichier trouvé dans '$source' — rien à copier." | |
return 0 | |
fi | |
# Extraire l’extension complète | |
local extension="" | |
if [[ "$first_file" =~ \.tar\.gz$ ]]; then | |
extension=".tar.gz" | |
else | |
extension=".${first_file##*.}" # .tar ou autre | |
fi | |
# Supprimer l’extension pour traiter uniquement le nom | |
local filename_no_ext="${first_file%"$extension"}" | |
# Extraire la partie avant le premier chiffre | |
local prefix="${filename_no_ext%%[0-9]*}" | |
# Construire le pattern final | |
pattern="${prefix}*${extension}" | |
echo "🧠 Motif détecté (tolérant) : '$pattern'" | |
mkdir -p "$dest" | |
copy_matching_files "$source" "$pattern" "$dest" || { | |
echo "❌ Échec lors de la copie des fichiers." | |
return 1 | |
} | |
delete_old_backups "$dest" "$pattern" 10 || { | |
echo "⚠️ Suppression des anciens fichiers échouée." | |
return 1 | |
} | |
echo "✅ Synchronisation terminée avec succès." | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment