78 lines
2.5 KiB
Bash
Executable File
78 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Usage:
|
|
# SUPABASE_URL="https://xxx.supabase.co" \
|
|
# SUPABASE_SERVICE_ROLE_KEY="eyJ..." \
|
|
# bash db/04-migrate-evidence.sh
|
|
set -e
|
|
|
|
if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_SERVICE_ROLE_KEY" ]; then
|
|
echo "ERROR: SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY must be set"
|
|
exit 1
|
|
fi
|
|
|
|
SERVER="setia@ims.setia.com.my"
|
|
PORT=9321
|
|
REMOTE_DIR="/var/lib/ims/evidence"
|
|
LOCAL_TMP="/tmp/ims-evidence-migration"
|
|
|
|
mkdir -p "$LOCAL_TMP"
|
|
|
|
echo "==> Listing all objects in Supabase Storage bucket 'evidence'..."
|
|
# Paginate: offset 0, limit 1000 (repeat if >1000 files)
|
|
OBJECTS=$(curl -s \
|
|
-H "Authorization: Bearer $SUPABASE_SERVICE_ROLE_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
"$SUPABASE_URL/storage/v1/object/list/evidence" \
|
|
-d '{"limit": 1000, "offset": 0, "prefix": ""}')
|
|
|
|
COUNT=$(echo "$OBJECTS" | python3 -c "import sys,json; data=json.load(sys.stdin); print(len(data))" 2>/dev/null || echo 0)
|
|
echo "==> Found $COUNT objects"
|
|
|
|
if [ "$COUNT" -eq 0 ]; then
|
|
echo "==> No evidence files to migrate. Exiting."
|
|
exit 0
|
|
fi
|
|
|
|
echo "==> Downloading evidence files..."
|
|
# Export vars so the Python subprocess can access them
|
|
export LOCAL_TMP SERVER PORT REMOTE_DIR
|
|
echo "$OBJECTS" | python3 - <<'PYEOF'
|
|
import sys, json, os, subprocess, urllib.request
|
|
|
|
objects = json.load(sys.stdin)
|
|
supabase_url = os.environ['SUPABASE_URL']
|
|
service_role_key = os.environ['SUPABASE_SERVICE_ROLE_KEY']
|
|
local_tmp = os.environ.get('LOCAL_TMP', '/tmp/ims-evidence-migration')
|
|
server = os.environ['SERVER']
|
|
port = os.environ['PORT']
|
|
remote_dir = os.environ['REMOTE_DIR']
|
|
|
|
for i, obj in enumerate(objects):
|
|
name = obj['name'] # e.g. "userId/incidentId/stage/filename.jpg"
|
|
local_path = os.path.join(local_tmp, name)
|
|
os.makedirs(os.path.dirname(local_path), exist_ok=True)
|
|
|
|
# Download from Supabase Storage
|
|
url = f"{supabase_url}/storage/v1/object/evidence/{name}"
|
|
req = urllib.request.Request(url, headers={"Authorization": f"Bearer {service_role_key}"})
|
|
with urllib.request.urlopen(req) as resp, open(local_path, 'wb') as f:
|
|
f.write(resp.read())
|
|
|
|
print(f"[{i+1}/{len(objects)}] Downloaded: {name}")
|
|
PYEOF
|
|
|
|
echo "==> Uploading evidence files to server..."
|
|
# Create remote directory structure
|
|
ssh -p "$PORT" "$SERVER" "mkdir -p $REMOTE_DIR"
|
|
|
|
# rsync preserves directory structure
|
|
rsync -az --progress -e "ssh -p $PORT" "$LOCAL_TMP/" "$SERVER:$REMOTE_DIR/"
|
|
|
|
echo "==> Cleaning up local temp..."
|
|
rm -rf "$LOCAL_TMP"
|
|
|
|
echo "==> Verifying file count on server..."
|
|
ssh -p "$PORT" "$SERVER" "find $REMOTE_DIR -type f | wc -l"
|
|
|
|
echo "==> Evidence migration complete."
|