import os import logging import sys import threading import typing import multiprocessing import functools import websockets from flask import Flask, flash, request, redirect, url_for, render_template, Response from werkzeug.utils import secure_filename if ".." not in sys.path: sys.path.append("..") UPLOAD_FOLDER = 'uploads' LOGS_FOLDER = 'logs' multidata_folder = os.path.join(UPLOAD_FOLDER, "multidata") os.makedirs(multidata_folder, exist_ok=True) os.makedirs(LOGS_FOLDER, exist_ok=True) def allowed_file(filename): return filename.endswith('multidata') app = Flask(__name__) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024 # 1 megabyte limit app.config["SECRET_KEY"] = os.urandom(32) name = "localhost" portrange = (49152, 65535) current_port = portrange[0] current_ports = {} current_multiworlds = {} class Multiworld(): def __init__(self, file: str): self.port = get_next_port() self.multidata = file current_ports[self.port] = self current_multiworlds[self.multidata] = self self.process: typing.Optional[multiprocessing.Process] = None def start(self): if self.process and self.process.is_alive(): return logging.info(f"Spinning up {self.multidata}") self.process = multiprocessing.Process(group=None, target=run_server_process, args=(self.port, self.multidata), name="MultiHost" + str(self.port)) self.process.start() def stop(self): if self.process: self.process.terminate() self.process = None del (current_ports[self.port]) del (current_multiworlds[self.multidata]) @app.route('/', methods=['GET', 'POST']) def upload_multidata(): if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] # if user does not select file, browser also # submit an empty part without filename if file.filename == '': flash('No selected file') return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(multidata_folder, filename)) return redirect(url_for('host_multidata', filename=filename)) return '''