Skip to content

Instantly share code, notes, and snippets.

@DavidBabel
Created April 17, 2025 23:08
Show Gist options
  • Save DavidBabel/5089cf7ea745a76e8677371967f10172 to your computer and use it in GitHub Desktop.
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
#!/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