#!/usr/bin/env python3 import os import subprocess import tempfile import threading import time from pathlib import Path from flask import Flask, Response, jsonify, render_template_string, request SETUP_FLAG = Path("/tmp/setup_mode") START_SCRIPT = "/opt/server/start.sh" UPLOAD_DIR = Path("/tmp/world_upload") UPLOAD_DIR.mkdir(parents=True, exist_ok=True) app = Flask(__name__) app.config["MAX_CONTENT_LENGTH"] = 1024 * 1024 * 1024 SETUP_HTML = r"""
pp
""" @app.route("/") def root(): if SETUP_FLAG.exists(): return render_template_string(SETUP_HTML) return Response(NOT_FOUND_HTML, 200, {"Content-Type": "text/html"}) @app.route("/setup/upload", methods=["POST"]) def setup_upload(): if not SETUP_FLAG.exists(): return jsonify({"ok": False, "message": "Not in setup mode"}), 403 hf_token = (request.form.get("hf_token") or "").strip() if not hf_token: return jsonify({"ok": False, "message": "HF token is required"}), 400 f = request.files.get("world") if not f or not f.filename.endswith(".zip"): return jsonify({"ok": False, "message": "A .zip file is required"}), 400 tmp_path = UPLOAD_DIR / "world_upload.zip" f.save(str(tmp_path)) os.environ["HF_TOKEN"] = hf_token import importlib, sys sys.path.insert(0, "/opt/server") import sync_world importlib.reload(sync_world) ok = sync_world.store_uploaded_zip(str(tmp_path)) if not ok: return jsonify({"ok": False, "message": "HF upload failed — check token / repo id"}), 500 SETUP_FLAG.unlink(missing_ok=True) def _restart(): time.sleep(1) subprocess.Popen(["/bin/bash", START_SCRIPT]) threading.Thread(target=_restart, daemon=True).start() return jsonify({"ok": True}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, threaded=True)