import signal import asyncio import logging import functools import naz async def _signal_handling(logger: logging.Logger, client: naz.Client) -> None: try: loop = asyncio.get_running_loop() except RuntimeError: loop = asyncio.get_event_loop() try: for _signal in [signal.SIGHUP, signal.SIGQUIT, signal.SIGTERM]: loop.add_signal_handler( _signal, functools.partial( asyncio.ensure_future, _handle_termination_signal(logger=logger, _signal=_signal, client=client), ), ) except ValueError as e: logger.log( logging.DEBUG, { "event": "naz.cli.signals", "stage": "end", "state": "this OS does not support the said signal", "error": str(e), }, ) async def _handle_termination_signal( logger: logging.Logger, _signal: "signal.Signals", client: naz.Client ) -> None: logger.log( logging.INFO, { "event": "naz.cli.signals", "stage": "start", "state": "received termination signal", "signal": _signal.name, }, ) await client.shutdown() logger.log( logging.INFO, {"event": "naz.cli.signals", "stage": "end", "state": "client has succesfully shutdown"}, ) return