#!/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