hydra-rce/scripts/server.py

59 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env python3
import asyncio
import sys
from aiohttp import web
from websockets.asyncio.server import broadcast, serve
from websockets.exceptions import ConnectionClosed
connected = set()
async def index(request):
data = await request.post()
try:
broadcast(connected, data["code"])
except KeyError:
pass
return web.Response()
async def handle(ws):
connected.add(ws)
print("connected", file=sys.stderr)
try:
async for message in ws:
pass
except ConnectionClosed:
pass
finally:
connected.remove(ws)
print("disconnected", file=sys.stderr)
async def main():
app = web.Application()
app.add_routes([web.post("/", index)])
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, "localhost", 8000)
await site.start()
try:
async with serve(handle, "localhost", 8765) as server:
await server.serve_forever()
except asyncio.CancelledError:
print(file=sys.stderr)
print("bye", file=sys.stderr)
await runner.cleanup()
asyncio.run(main())