Files
raspi-backup/03_verify.sh
2025-12-30 23:52:08 +01:00

87 lines
3.3 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
set -Eeuo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
CFG="$SCRIPT_DIR/config.sh"
[[ -f "$CFG" ]] || { echo "ERROR: config.sh fehlt: $CFG (erst 01_setup.sh ausführen)"; exit 1; }
# shellcheck disable=SC1090
source "$CFG"
# Der User, der das Script gestartet hat (auch wenn via sudo)
RUN_USER="${SUDO_USER:-$USER}"
# --- helpers ---
APP="raspi-backup"
STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/${APP}"
LOG_FILE="${STATE_DIR}/${APP}.log"
mkdir -p "$STATE_DIR"
log(){ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" >/dev/null; }
die(){ log "ERROR: $*"; echo "ERROR: $*" >&2; exit 1; }
need_cmd(){ command -v "$1" >/dev/null 2>&1 || die "Fehlt: $1"; }
need_root(){ [[ "${EUID:-$(id -u)}" -eq 0 ]] || die "Bitte mit sudo starten: sudo $SCRIPT_DIR/03_verify.sh"; }
host_short(){ hostname -s 2>/dev/null || hostname 2>/dev/null || echo "raspi"; }
nas_alias(){ echo "${ALIAS_PREFIX}-$(host_short)"; }
need_root
need_cmd ssh
# validate config vars (OHNE SSH_USER)
: "${NAS_HOST:?}" "${NAS_USER:?}" "${NAS_PORT:?}" "${ALIAS_PREFIX:?}" "${NAS_BACKUP_BASE:?}" "${KEY_TYPE:?}"
hn="$(host_short)"
alias="$(nas_alias)"
ssh_user="$RUN_USER"
remote_root="${NAS_BACKUP_BASE%/}/${hn}"
# Keypfad (gehört RUN_USER)
key_path="$(eval echo "~${ssh_user}/.ssh/id_${KEY_TYPE}_${hn}")"
[[ -f "$key_path" ]] || die "Key fehlt: $key_path (erst 02_setup_ssh.sh ausführen)"
log "VERIFY START: run_user=${ssh_user} alias=${alias} remote_root=${remote_root}"
# optional Port check
if command -v nc >/dev/null 2>&1; then
log "Check NAS Port: ${NAS_HOST}:${NAS_PORT}"
nc -vz "$NAS_HOST" "$NAS_PORT" >/dev/null 2>&1 || die "NAS Port nicht erreichbar: ${NAS_HOST}:${NAS_PORT}"
else
log "nc nicht vorhanden überspringe Port-Check"
fi
# Direkte SSH Optionen (robust, nicht abhängig von ssh-config/alias)
SSH_BASE=(ssh -p "$NAS_PORT" -i "$key_path"
-o IdentitiesOnly=yes
-o BatchMode=yes
-o StrictHostKeyChecking=yes
-o ConnectTimeout=10
)
# 1) SSH login test als RUN_USER (wie bisher)
log "Check SSH Login (RUN_USER): ${NAS_USER}@${NAS_HOST}:${NAS_PORT}"
if ! sudo -u "$ssh_user" "${SSH_BASE[@]}" "${NAS_USER}@${NAS_HOST}" "echo ok" >/dev/null 2>&1; then
die "SSH Login fehlgeschlagen als User '${ssh_user}' (Hostkey/Key/Netz prüfen)"
fi
# 2) Extra: SSH login test als root (wichtig, weil Backup Run via sudo/root)
log "Check SSH Login (root): ${NAS_USER}@${NAS_HOST}:${NAS_PORT}"
if ! "${SSH_BASE[@]}" "${NAS_USER}@${NAS_HOST}" "echo ok" >/dev/null 2>&1; then
echo "Hinweis: root kann nicht verbinden (oft fehlt root der Hostkey in /root/.ssh/known_hosts)." >&2
echo "Fix: 02_setup_ssh.sh erneut laufen lassen (lernt Hostkey für root), oder root-known_hosts ergänzen." >&2
die "SSH Login fehlgeschlagen als root"
fi
# 3) Remote backup dir
log "Check/Create Remote Backup Dir: ${remote_root}"
sudo -u "$ssh_user" "${SSH_BASE[@]}" "${NAS_USER}@${NAS_HOST}" \
"mkdir -p '$remote_root' && test -d '$remote_root'" >/dev/null \
|| die "Remote Backup Pfad nicht nutzbar: $remote_root"
log "VERIFY OK"
echo "Verify OK:"
echo "- NAS erreichbar (${NAS_HOST}:${NAS_PORT})"
echo "- SSH Login OK (User: ${NAS_USER}@${NAS_HOST}:${NAS_PORT})"
echo "- SSH Login OK (root: ${NAS_USER}@${NAS_HOST}:${NAS_PORT})"
echo "- Key OK (${key_path})"
echo "- Remote Backup Pfad OK (${remote_root})"
echo "Info: SSH-Alias (optional) wäre: ${alias}"