103 lines
2.7 KiB
Bash
103 lines
2.7 KiB
Bash
#!/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 ==="
|