diff --git a/core/helper.py b/core/helper.py new file mode 100644 index 0000000..ae3c53b --- /dev/null +++ b/core/helper.py @@ -0,0 +1,30 @@ +import asyncio +import logging +import signal + +loop = None + + +def create_task(coro): + global loop + loop.create_task(coro) + + +async def shutdown(sig, loop): + log = logging.getLogger() + log.info(f"Received exit signal {sig.name}...") + tasks = [t for t in asyncio.all_tasks() if t is not + asyncio.current_task()] + [task.cancel() for task in tasks] + log.info(f"Cancelling {len(tasks)} outstanding tasks") + await asyncio.wait_for(loop.shutdown_asyncgens(), timeout=10) + loop.stop() + log.info("Shutdown complete.") + + +def init_loop(): + global loop + loop = asyncio.get_event_loop() + loop.add_signal_handler(signal.SIGTERM, lambda: asyncio.create_task(shutdown(signal.SIGTERM, loop))) + loop.add_signal_handler(signal.SIGINT, lambda: asyncio.create_task(shutdown(signal.SIGINT, loop))) + return loop diff --git a/core/requirements.dev.txt b/core/requirements.dev.txt new file mode 100644 index 0000000..0c39d90 --- /dev/null +++ b/core/requirements.dev.txt @@ -0,0 +1,65 @@ +aiosmtpd==1.4.4.post2 +aiosmtplib==3.0.1 +anyio==4.1.0 +asgiref==3.7.2 +asynctest==0.7.1 +atpublic==4.0 +attrs==23.1.0 +autobahn==23.6.2 +Automat==22.10.0 +certifi==2023.11.17 +cffi==1.16.0 +channels==4.0.0 +channels-redis==4.1.0 +charset-normalizer==3.3.2 +click==8.1.7 +constantly==23.10.4 +coreapi==2.3.3 +coreschema==0.0.4 +coverage==7.3.2 +cryptography==41.0.5 +daphne==4.0.0 +Django==4.2.7 +django-async-test==0.2.2 +django-extensions==3.2.3 +django-rest-knox==4.2.0 +django-soft-delete==0.9.21 +djangorestframework==3.14.0 +drf-yasg==1.21.7 +h11==0.14.0 +hyperlink==21.0.0 +idna==3.4 +incremental==22.10.0 +inflection==0.5.1 +itypes==1.2.0 +Jinja2==3.1.2 +MarkupSafe==2.1.3 +msgpack==1.0.7 +msgpack-python==0.5.6 +openapi-codec==1.3.2 +packaging==23.2 +Pillow==10.1.0 +pyasn1==0.5.1 +pyasn1-modules==0.3.0 +pycparser==2.21 +pyOpenSSL==23.3.0 +python-dotenv==1.0.0 +pytz==2023.3.post1 +PyYAML==6.0.1 +redis==5.0.1 +requests==2.31.0 +sdnotify==0.3.2 +service-identity==23.1.0 +setproctitle==1.3.3 +six==1.16.0 +sniffio==1.3.0 +sqlparse==0.4.4 +Twisted==23.10.0 +txaio==23.1.1 +typing_extensions==4.8.0 +uritemplate==4.1.1 +urllib3==2.1.0 +uvicorn==0.24.0.post1 +watchfiles==0.21.0 +websockets==12.0 +zope.interface==6.1 diff --git a/core/requirements.prod.txt b/core/requirements.prod.txt index b176517..835dede 100644 --- a/core/requirements.prod.txt +++ b/core/requirements.prod.txt @@ -10,6 +10,7 @@ coreschema==0.0.4 Django==4.2.7 django-extensions==3.2.3 django-mysql==4.12.0 +django-rest-knox==4.2.0 django-soft-delete==0.9.21 djangorestframework==3.14.0 drf-yasg==1.21.7 diff --git a/core/server.py b/core/server.py index ee0db06..d08b595 100644 --- a/core/server.py +++ b/core/server.py @@ -9,29 +9,11 @@ import uvicorn django.setup() -from core.globals import init_loop +from helper import init_loop from mail.protocol import LMTPHandler from mail.socket import UnixSocketLMTPController - -# async def handle_echo(reader, writer): -# # session = Session() -# data = await reader.read(100) -# message = data.decode() -# addr = writer.get_extra_info('peername') -# -# print(f"Received {message!r} from {addr!r}") -# -# print(f"Send: {message!r}") -# writer.write(data) -# await writer.drain() -# -# print("Close the connection") -# writer.close() -# await writer.wait_closed() - - class UvicornServer(uvicorn.Server): def install_signal_handlers(self): pass @@ -47,21 +29,6 @@ async def web(loop): await server.serve() -# async def tcp(loop): -# log = logging.getLogger('test.log') -# log.addHandler(logging.FileHandler('test.log')) -# log.setLevel(logging.DEBUG) -# log.info("Starting TCP server") -# server = await asyncio.start_unix_server(handle_echo, path='test.sock') -# -# addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets) -# log.info(f'Serving on {addrs}') -# -# async with server: -# await server.serve_forever() -# log.info("TCP done") - - async def lmtp(loop): import grp log = logging.getLogger('mail.log')