summaryrefslogtreecommitdiff
path: root/app/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/main.py')
-rw-r--r--app/main.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/app/main.py b/app/main.py
index 59e7a8b..b90fef9 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,11 +1,15 @@
from typing import Annotated
+import asyncio
+from datetime import datetime, timedelta
from fastapi import FastAPI, Request, Depends
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from starlette.templating import Jinja2Templates
+from pydantic import BaseModel
from utils import get_avatar_urls, get_client_geo
+from app.tasks import restricted_exec_task
templates = Jinja2Templates(directory="templates")
@@ -33,3 +37,27 @@ async def client_addr(
"partials/client_geo.html",
{"request": request, "client_geo": client_geo},
)
+
+
+class RestrictedExecBase(BaseModel):
+ code: str
+
+
+@app.post('/restricted_exec')
+async def post_restricted_exec(
+ body: RestrictedExecBase
+):
+ result = restricted_exec_task.delay(body.code)
+
+ start_time = datetime.now()
+ while datetime.now() - start_time < timedelta(seconds=5):
+ if result.ready():
+ return result.get()
+
+ await asyncio.sleep(0.1)
+
+ result.revoke(terminate=True, signal='SIGTERM')
+ return [
+ 'Execution timeout, task revoked',
+ result.status
+ ]