diff options
author | Stas Medvedev <medvedevsa97@gmail.com> | 2024-06-12 16:56:07 +0300 |
---|---|---|
committer | Stas Medvedev <medvedevsa97@gmail.com> | 2024-06-12 16:56:07 +0300 |
commit | 0c1a65570be7f34f12a35da45669676f4479abd4 (patch) | |
tree | eb0905e4a6454d154b679830666e31f066a9fea7 /app/main.py | |
parent | ed49bb17b9e93a1406ab51f7dca5906661863627 (diff) |
add utils.restricted_exec
add app.tasks
Diffstat (limited to 'app/main.py')
-rw-r--r-- | app/main.py | 28 |
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 + ] |