93 lines
3.0 KiB
Bash
93 lines
3.0 KiB
Bash
#!/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
|