mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-23 00:56:29 +00:00
Better close/loop handling (#221)
* Better close/loop handling * Update bootstrap.py * Update __main__.py * Update core.py * Update __main__.py * Update __main__.py * Update supervisor.py * Update supervisor.py * Update const.py * fix lint
This commit is contained in:
parent
dca1b6f1d3
commit
7a84972770
@ -13,11 +13,12 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
bootstrap.initialize_logging()
|
bootstrap.initialize_logging()
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
if not bootstrap.check_environment():
|
if not bootstrap.check_environment():
|
||||||
exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
# init executor pool
|
||||||
executor = ThreadPoolExecutor(thread_name_prefix="SyncWorker")
|
executor = ThreadPoolExecutor(thread_name_prefix="SyncWorker")
|
||||||
loop.set_default_executor(executor)
|
loop.set_default_executor(executor)
|
||||||
|
|
||||||
@ -27,19 +28,20 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
bootstrap.migrate_system_env(config)
|
bootstrap.migrate_system_env(config)
|
||||||
|
|
||||||
_LOGGER.info("Run Hassio setup")
|
_LOGGER.info("Setup HassIO")
|
||||||
loop.run_until_complete(hassio.setup())
|
loop.run_until_complete(hassio.setup())
|
||||||
|
|
||||||
_LOGGER.info("Start Hassio")
|
|
||||||
loop.call_soon_threadsafe(loop.create_task, hassio.start())
|
loop.call_soon_threadsafe(loop.create_task, hassio.start())
|
||||||
loop.call_soon_threadsafe(bootstrap.reg_signal, loop, hassio)
|
loop.call_soon_threadsafe(bootstrap.reg_signal, loop)
|
||||||
|
|
||||||
_LOGGER.info("Run Hassio loop")
|
try:
|
||||||
loop.run_forever()
|
_LOGGER.info("Run HassIO")
|
||||||
|
loop.run_forever()
|
||||||
_LOGGER.info("Cleanup system")
|
finally:
|
||||||
executor.shutdown(wait=False)
|
_LOGGER.info("Stopping HassIO")
|
||||||
loop.close()
|
loop.run_until_complete(hassio.stop())
|
||||||
|
executor.shutdown(wait=False)
|
||||||
|
loop.close()
|
||||||
|
|
||||||
_LOGGER.info("Close Hassio")
|
_LOGGER.info("Close Hassio")
|
||||||
sys.exit(hassio.exit_code)
|
sys.exit(0)
|
||||||
|
@ -123,22 +123,22 @@ def check_environment():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def reg_signal(loop, hassio):
|
def reg_signal(loop):
|
||||||
"""Register SIGTERM, SIGKILL to stop system."""
|
"""Register SIGTERM, SIGKILL to stop system."""
|
||||||
try:
|
try:
|
||||||
loop.add_signal_handler(
|
loop.add_signal_handler(
|
||||||
signal.SIGTERM, lambda: loop.create_task(hassio.stop()))
|
signal.SIGTERM, lambda: loop.call_soon(loop.stop))
|
||||||
except (ValueError, RuntimeError):
|
except (ValueError, RuntimeError):
|
||||||
_LOGGER.warning("Could not bind to SIGTERM")
|
_LOGGER.warning("Could not bind to SIGTERM")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
loop.add_signal_handler(
|
loop.add_signal_handler(
|
||||||
signal.SIGHUP, lambda: loop.create_task(hassio.stop()))
|
signal.SIGHUP, lambda: loop.call_soon(loop.stop))
|
||||||
except (ValueError, RuntimeError):
|
except (ValueError, RuntimeError):
|
||||||
_LOGGER.warning("Could not bind to SIGHUP")
|
_LOGGER.warning("Could not bind to SIGHUP")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
loop.add_signal_handler(
|
loop.add_signal_handler(
|
||||||
signal.SIGINT, lambda: loop.create_task(hassio.stop()))
|
signal.SIGINT, lambda: loop.call_soon(loop.stop))
|
||||||
except (ValueError, RuntimeError):
|
except (ValueError, RuntimeError):
|
||||||
_LOGGER.warning("Could not bind to SIGINT")
|
_LOGGER.warning("Could not bind to SIGINT")
|
||||||
|
@ -20,8 +20,6 @@ RUN_WATCHDOG_HOMEASSISTANT_DOCKER = 15
|
|||||||
RUN_WATCHDOG_HOMEASSISTANT_API = 300
|
RUN_WATCHDOG_HOMEASSISTANT_API = 300
|
||||||
RUN_CLEANUP_API_SESSIONS = 900
|
RUN_CLEANUP_API_SESSIONS = 900
|
||||||
|
|
||||||
RESTART_EXIT_CODE = 100
|
|
||||||
|
|
||||||
FILE_HASSIO_ADDONS = Path(HASSIO_DATA, "addons.json")
|
FILE_HASSIO_ADDONS = Path(HASSIO_DATA, "addons.json")
|
||||||
FILE_HASSIO_CONFIG = Path(HASSIO_DATA, "config.json")
|
FILE_HASSIO_CONFIG = Path(HASSIO_DATA, "config.json")
|
||||||
FILE_HASSIO_HOMEASSISTANT = Path(HASSIO_DATA, "homeassistant.json")
|
FILE_HASSIO_HOMEASSISTANT = Path(HASSIO_DATA, "homeassistant.json")
|
||||||
|
@ -177,7 +177,7 @@ class HassIO(object):
|
|||||||
if self.homeassistant.version == 'landingpage':
|
if self.homeassistant.version == 'landingpage':
|
||||||
self.loop.create_task(self.homeassistant.install())
|
self.loop.create_task(self.homeassistant.install())
|
||||||
|
|
||||||
async def stop(self, exit_code=0):
|
async def stop(self):
|
||||||
"""Stop a running orchestration."""
|
"""Stop a running orchestration."""
|
||||||
# don't process scheduler anymore
|
# don't process scheduler anymore
|
||||||
self.scheduler.suspend = True
|
self.scheduler.suspend = True
|
||||||
@ -185,7 +185,6 @@ class HassIO(object):
|
|||||||
# process stop tasks
|
# process stop tasks
|
||||||
self.websession.close()
|
self.websession.close()
|
||||||
self.homeassistant.websession.close()
|
self.homeassistant.websession.close()
|
||||||
await asyncio.wait([self.api.stop(), self.dns.stop()], loop=self.loop)
|
|
||||||
|
|
||||||
self.exit_code = exit_code
|
# process async stop tasks
|
||||||
self.loop.stop()
|
await asyncio.wait([self.api.stop(), self.dns.stop()], loop=self.loop)
|
||||||
|
@ -6,7 +6,6 @@ import docker
|
|||||||
|
|
||||||
from .interface import DockerInterface
|
from .interface import DockerInterface
|
||||||
from .util import docker_process
|
from .util import docker_process
|
||||||
from ..const import RESTART_EXIT_CODE
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -52,7 +51,7 @@ class DockerSupervisor(DockerInterface):
|
|||||||
_LOGGER.info("Update supervisor docker to %s:%s", self.image, tag)
|
_LOGGER.info("Update supervisor docker to %s:%s", self.image, tag)
|
||||||
|
|
||||||
if await self.loop.run_in_executor(None, self._install, tag):
|
if await self.loop.run_in_executor(None, self._install, tag):
|
||||||
self.loop.create_task(self.stop_callback(RESTART_EXIT_CODE))
|
self.loop.call_later(2, self.loop.stop)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user