diff --git a/scripts/verify-backup.sh b/scripts/verify-backup.sh new file mode 100644 index 0000000..179e32d --- /dev/null +++ b/scripts/verify-backup.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +# ============================================================================= +# verify-backup.sh – Prüft die Integrität des Borg-Repositories und der Archive +# ============================================================================= + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="${SCRIPT_DIR}/../config/backup.conf" +source "$CONFIG_FILE" + +export BORG_PASSPHRASE +export BORG_REPO + +GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m' +log() { echo -e "${BLUE}[CHECK]${NC} $*"; } +log_ok() { echo -e "${GREEN}[CHECK] ✓${NC} $*"; } +log_warn(){ echo -e "${YELLOW}[CHECK] ⚠${NC} $*"; } +log_err() { echo -e "${RED}[CHECK] ✗${NC} $*" >&2; } + +ERRORS=0 + +# --- 1. Repository-Integrität ------------------------------------------------ +log "Prüfe Repository-Integrität..." +if borg check --repository-only "${BORG_REPO}"; then + log_ok "Repository OK" +else + log_err "Repository-Fehler gefunden!" + ((ERRORS++)) || true +fi + +# --- 2. Aktuellstes Archiv je Datenbank prüfen ------------------------------- +log "Prüfe aktuellste Archive..." +for db in "${PG_DATABASES[@]}"; do + latest=$(borg list --short "${BORG_REPO}" | grep "^${db}-" | sort -r | head -1) + + if [[ -z "$latest" ]]; then + log_err "Kein Archiv für Datenbank '${db}' gefunden!" + ((ERRORS++)) || true + continue + fi + + log "Prüfe Archiv: ${latest}" + if borg check --archives-only "${BORG_REPO}::${latest}"; then + log_ok "Archiv OK: ${latest}" + else + log_err "Archiv fehlerhaft: ${latest}" + ((ERRORS++)) || true + fi + + # Alter des Backups prüfen + archive_ts=$(borg info "${BORG_REPO}::${latest}" | grep "^Time (start)" | awk '{print $4, $5}') + archive_epoch=$(date -d "$archive_ts" +%s 2>/dev/null || echo 0) + now_epoch=$(date +%s) + age_hours=$(( (now_epoch - archive_epoch) / 3600 )) + + if [[ $age_hours -gt 26 ]]; then + log_warn "Letztes Backup von '${db}' ist ${age_hours}h alt (>26h)!" + else + log_ok "Letztes Backup von '${db}': ${age_hours}h alt" + fi +done + +# --- 3. Festplattenplatz ------------------------------------------------------ +log "Prüfe Speicherplatz..." +REPO_DIR="$(dirname "$BORG_REPO")" +df_out=$(df -h "$REPO_DIR" | tail -1) +used_pct=$(echo "$df_out" | awk '{print $5}' | tr -d '%') + +echo " $df_out" +if [[ $used_pct -ge 90 ]]; then + log_err "Speicherplatz kritisch: ${used_pct}% belegt!" + ((ERRORS++)) || true +elif [[ $used_pct -ge 80 ]]; then + log_warn "Speicherplatz knapp: ${used_pct}% belegt" +else + log_ok "Speicherplatz OK: ${used_pct}% belegt" +fi + +# --- 4. Repo-Statistiken ausgeben -------------------------------------------- +log "Repository-Statistiken:" +borg info "${BORG_REPO}" | grep -E "All archives|Unique chmods|Deduplicated" || true + +# --- Ergebnis ---------------------------------------------------------------- +echo "" +if [[ $ERRORS -eq 0 ]]; then + log_ok "Alle Checks bestanden!" + exit 0 +else + log_err "${ERRORS} Fehler gefunden!" + exit 1 +fi