#!/usr/bin/env python3 import asyncio import logging import os import uvicorn from helper import init_loop from lmtp.protocol import LMTPHandler from lmtp.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 async def web(loop): log_config = uvicorn.config.LOGGING_CONFIG log_config["handlers"]["default"] = {"class": "logging.FileHandler", "filename": "web.log", "formatter": "default"} log_config["handlers"]["access"] = {"class": "logging.FileHandler", "filename": "web-access.log", "formatter": "access"} config = uvicorn.Config("core.asgi:application", uds="web.sock", log_config=log_config) server = UvicornServer(config=config) 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') log.addHandler(logging.FileHandler('mail.log')) # log.setLevel(logging.WARNING) log.setLevel(logging.INFO) log.info("Starting LMTP server") server = await UnixSocketLMTPController(LMTPHandler(), unix_socket='lmtp.sock', loop=loop).serve() addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets) log.info(f'Serving on {addrs}') try: os.chmod('lmtp.sock', 0o775) current_uid = os.getuid() posix_gid = grp.getgrnam('postfix').gr_gid os.chown('lmtp.sock', current_uid, posix_gid) except Exception as e: log.error(e) async with server: await server.serve_forever() log.info("LMTP done") def main(): import sdnotify import setproctitle import os setproctitle.setproctitle("c3lf-sys3") log = logging.getLogger('server.log') log.addHandler(logging.FileHandler('server.log')) log.setLevel(logging.DEBUG) log.info("Starting server") loop = init_loop() loop.create_task(web(loop)) # loop.create_task(tcp(loop)) loop.create_task(lmtp(loop)) n = sdnotify.SystemdNotifier() n.notify("READY=1") log.info("Server ready") try: loop.run_forever() finally: loop.close() try: os.remove("lmtp.sock") except Exception as e: log.error(e) try: os.remove("web.sock") except Exception as e: log.error(e) log.error(e) logging.info("Server stopped") logging.shutdown() if __name__ == '__main__': main()