#!/bin/bash set -euo pipefail ZIP_URL="${1:-https://webshare.casaderoll.de/share/Phoenix.zip}" PHOENIX_ROOT="${2:-}" if [ -z "$PHOENIX_ROOT" ] || [ ! -d "$PHOENIX_ROOT" ]; then echo "invalid Phoenix root: $PHOENIX_ROOT" >&2 exit 1 fi TMP_BASE="${TMPDIR:-/tmp}" WORK_DIR="$(mktemp -d "$TMP_BASE/phoenix-update.XXXXXX")" ZIP_PATH="$WORK_DIR/phoenix.zip" EXTRACT_DIR="$WORK_DIR/extract" PHOENIX_PARENT="$(cd "$PHOENIX_ROOT/.." && pwd -P)" PHOENIX_NAME="$(basename "$PHOENIX_ROOT")" STAGE_DIR="$PHOENIX_PARENT/${PHOENIX_NAME}.update" LOG_FILE="$PHOENIX_PARENT/${PHOENIX_NAME}.update.log" exec >>"$LOG_FILE" 2>&1 echo "=== $(date): update_phoenix_from_zip.sh START ===" echo "ZIP_URL=$ZIP_URL" echo "PHOENIX_ROOT=$PHOENIX_ROOT" echo "STAGE_DIR=$STAGE_DIR" cleanup() { echo "cleanup work dir: $WORK_DIR" rm -rf "$WORK_DIR" } trap cleanup EXIT mkdir -p "$EXTRACT_DIR" if ! command -v curl >/dev/null 2>&1; then echo "curl not found" >&2 exit 1 fi extract_zip() { local zip_path="$1" local extract_dir="$2" if command -v unzip >/dev/null 2>&1; then unzip -oq "$zip_path" -d "$extract_dir" return fi if command -v python3 >/dev/null 2>&1; then python3 -m zipfile -e "$zip_path" "$extract_dir" return fi echo "no zip extractor found: install unzip or python3" >&2 exit 1 } echo "downloading update archive..." curl -fL "$ZIP_URL" -o "$ZIP_PATH" echo "download complete: $ZIP_PATH" extract_zip "$ZIP_PATH" "$EXTRACT_DIR" echo "archive extracted to: $EXTRACT_DIR" SOURCE_DIR="" while IFS= read -r candidate; do if [ -f "$candidate/Cargo.toml" ] && [ -d "$candidate/www" ] && [ -d "$candidate/src" ]; then SOURCE_DIR="$candidate" break fi done < <(find "$EXTRACT_DIR" -mindepth 0 -maxdepth 4 -type d | sort) if [ -z "$SOURCE_DIR" ]; then echo "no Phoenix project found inside update archive" >&2 exit 1 fi echo "source project root: $SOURCE_DIR" # Build-Artefakte und Mac-Reste nie mitdeployen. find "$SOURCE_DIR" -type d \( -name target -o -name .git \) -prune -exec rm -rf {} + find "$SOURCE_DIR" -type f \( -name '.DS_Store' -o -name 'Thumbs.db' \) -delete echo "source tree cleaned" rm -rf "$STAGE_DIR" mkdir -p "$STAGE_DIR" echo "stage dir prepared" if command -v rsync >/dev/null 2>&1; then rsync -a --delete --omit-dir-times --no-perms --no-owner --no-group \ "$SOURCE_DIR"/ "$STAGE_DIR"/ else echo "rsync not found; using cp fallback" cp -a "$SOURCE_DIR"/. "$STAGE_DIR"/ fi echo "stage sync complete" if [ ! -f "$STAGE_DIR/Cargo.toml" ] || [ ! -d "$STAGE_DIR/src" ] || [ ! -d "$STAGE_DIR/www" ] || [ ! -d "$STAGE_DIR/scripts" ]; then echo "staged update is incomplete: $STAGE_DIR" >&2 exit 1 fi echo "staged update validated" echo "=== $(date): update_phoenix_from_zip.sh OK ==="