Files
2026-05-31 17:36:07 +00:00

93 lines
3.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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