From de45e910978a957cb7f9fc74b099b54f33c55744 Mon Sep 17 00:00:00 2001 From: Thomas Dannenberg Date: Tue, 23 Sep 2025 17:13:17 +0000 Subject: [PATCH] Kapitel 13/Tutorial.md aktualisiert --- Kapitel 13/Tutorial.md | 125 ++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 77 deletions(-) diff --git a/Kapitel 13/Tutorial.md b/Kapitel 13/Tutorial.md index cbfc499..9636be0 100644 --- a/Kapitel 13/Tutorial.md +++ b/Kapitel 13/Tutorial.md @@ -629,96 +629,67 @@ In diesem Schritt erstellen wir den eigentlichen Workflow in **n8n**. Er sorgt d Inhalt: ```bash - #!/usr/bin/env bash -# /usr/local/bin/nc_finalize_vod + #!/usr/bin/env bash + # /usr/local/bin/nc_finalize_vod -set -euo pipefail + set -euo pipefail -# ---- Konfigurationsdatei einbinden -CONF="/etc/nc_uploader.conf" -[[ -f "$CONF" ]] || { echo "Config fehlt: $CONF" >&2; exit 1; } -# shellcheck disable=SC1090 -source "$CONF" + CONF="/etc/nc_uploader.conf" + [[ -f "$CONF" ]] || { echo "Config fehlt: $CONF" >&2; exit 1; } + # shellcheck disable=SC1090 + source "$CONF" -# ---- VOD-ID als Argument -VOD_ID="${1:?need VOD id}" + VOD_ID="${1:?need VOD id}" -# ---- Eingaben & Pfade aus Config -DROP_BASE="${DROP_BASE:?DROP_BASE fehlt in Config}" -NC_DATA="${NC_DATA:?NC_DATA fehlt in Config}" -NC_USER="${NC_USER:?NC_USER fehlt in Config}" -NC_TARGET_SUBPATH="${NC_TARGET_SUBPATH:?NC_TARGET_SUBPATH fehlt in Config}" -PHP="${PHP:-/usr/bin/php}" -OCC="${OCC:-/var/www/nextcloud/occ}" -CLIPPER_OUT="${CLIPPER_OUT:?CLIPPER_OUT fehlt in Config}" -SFTP_HOST="${SFTP_HOST:?}" -SFTP_PORT="${SFTP_PORT:?}" -SFTP_USER="${SFTP_USER:?}" -SFTP_KEY="${SFTP_KEY:?}" + # ---- Eingaben & Pfade + DROP_BASE="${DROP_BASE:?DROP_BASE fehlt in Config}" + NC_DATA="${NC_DATA:?NC_DATA fehlt in Config}" + NC_USER="${NC_USER:?NC_USER fehlt in Config}" + NC_TARGET_SUBPATH="${NC_TARGET_SUBPATH:?NC_TARGET_SUBPATH fehlt in Config}" + PHP="${PHP:-/usr/bin/php}" + OCC="${OCC:-/var/www/nextcloud/occ}" -# ---- Abgeleitete Pfade -SRC_DIR="${DROP_BASE}/${VOD_ID}" # kann leer bleiben – wird nicht mehr verwendet -DST_BASE="${NC_DATA}/${NC_USER}/files" -DST_DIR="${DST_BASE}/${NC_TARGET_SUBPATH}" -SCAN_PATH="${NC_USER}/files/${NC_TARGET_SUBPATH}" + SRC_DIR="${DROP_BASE}/${VOD_ID}" + DST_BASE="${NC_DATA}/${NC_USER}/files" + DST_DIR="${DST_BASE}/${NC_TARGET_SUBPATH}/${VOD_ID}" + SCAN_PATH="${NC_USER}/files/${NC_TARGET_SUBPATH}/${VOD_ID}" -# ---- Vorbedingungen prüfen -[[ -d "$NC_DATA" ]] || { echo "NC_DATA nicht gefunden: $NC_DATA" >&2; exit 2; } -[[ -d "$DST_BASE" ]] || { echo "Benutzerdateien fehlen: $DST_BASE (stimmt NC_USER/NC_DATA?)" >&2; exit 3; } + # ---- Vorbedingungen prüfen (wir legen KEINE Benutzerstruktur an!) + [[ -d "$NC_DATA" ]] || { echo "NC_DATA nicht gefunden: $NC_DATA" >&2; exit 2; } + [[ -d "$DST_BASE" ]] || { echo "Benutzerdateien fehlen: $DST_BASE (stimmt NC_USER/NC_DATA?)" >&2; exit 3; } + [[ -d "$SRC_DIR" ]] || { echo "Drop-Ordner fehlt: $SRC_DIR" >&2; exit 4; } -# ---- Archiv des gesamten VOD-Ordners erstellen (z. B. /srv/clipper/out/VOD123 → VOD123.tar.gz) -ARCHIVE_NAME="${VOD_ID}.tar.gz" -ARCHIVE_PATH="${CLIPPER_OUT}/${ARCHIVE_NAME}" + # ---- Ziel-Unterordner anlegen (falls nicht vorhanden) + mkdir -p "$DST_DIR" + chown -R www-data:www-data "$DST_BASE/$NC_TARGET_SUBPATH" -if [[ -f "$ARCHIVE_PATH" ]]; then - echo "⚠️ Archiv existiert bereits: $ARCHIVE_PATH – wird nicht erneut erstellt" -else - echo "📦 Erstelle Archiv: $ARCHIVE_PATH" - tar -czf "$ARCHIVE_PATH" -C "$CLIPPER_OUT" "$VOD_ID" - echo "✅ Archiv erfolgreich erstellt" -fi + # ---- Dateien/Ordner verschieben + shopt -s nullglob dotglob + had_files=false + for f in "${SRC_DIR}/"*; do + had_files=true + mv -f "$f" "$DST_DIR/" + done + # Leeren Drop-Ordner entfernen (optional) + rmdir "$SRC_DIR" 2>/dev/null || true + shopt -u nullglob dotglob -# ---- Archiv direkt ins Nextcloud-Zielverzeichnis hochladen (per SFTP) -REMOTE_PATH="${DST_DIR}/${ARCHIVE_NAME}" -LOCAL_PATH="${ARCHIVE_PATH}" + if [[ "$had_files" = false ]]; then + echo "Keine Dateien in Drop-Ordner: ${SRC_DIR}" >&2 + exit 5 + fi -if [[ ! -f "$LOCAL_PATH" ]]; then - echo "❌ Archiv nicht gefunden: $LOCAL_PATH" >&2 - exit 6 -fi + # ---- Rechte setzen wie von Nextcloud erwartet + chown -R www-data:www-data "$DST_DIR" -# Hochladen per SFTP mit SSH-Key -sftp -i "$SFTP_KEY" -P "$SFTP_PORT" -oStrictHostKeyChecking=no "$SFTP_USER@$SFTP_HOST" </dev/null || true -# ---- Archiv entpacken (z. B. /var/ncdata//files/TMP/VOD123.tar.gz → ./VOD123/) -if [[ -f "$REMOTE_PATH" ]]; then - echo "📂 Entpacke Archiv: $REMOTE_PATH" - tar -xzf "$REMOTE_PATH" -C "$DST_DIR" - echo "✅ Archiv entpackt" - - # Optional: Archiv löschen nach Entpacken - rm -f "$REMOTE_PATH" -else - echo "❌ Archiv zum Entpacken nicht gefunden: $REMOTE_PATH" >&2 - exit 7 -fi - -# ---- Ziel-Verzeichnis absichern (Rechte setzen) -mkdir -p "$DST_DIR" -chown -R www-data:www-data "$DST_DIR" - -# ---- Index in Nextcloud aktualisieren -sudo -n -u www-data "$PHP" "$OCC" files:scan --path="$SCAN_PATH" --quiet - -# ---- Übrig gebliebene .lock-Dateien entfernen (optional) -find "$DROP_BASE" -type f -name "*.lock" -delete 2>/dev/null || true - -# ---- Erfolgsmeldung -echo "OK: ${REMOTE_PATH}" + # ---- Erfolgsmeldung + echo "OK: $(printf '%s\n' "$DST_DIR")" ```