diff --git a/hassio/const.py b/hassio/const.py index c3075bf7c..acdd79fcb 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -17,6 +17,7 @@ HASSIO_SHARE = Path("/data") RUN_UPDATE_INFO_TASKS = 28800 RUN_UPDATE_SUPERVISOR_TASKS = 29100 RUN_RELOAD_ADDONS_TASKS = 28800 +RUN_WATCHDOG_HOMEASSISTANT = 15 RESTART_EXIT_CODE = 100 diff --git a/hassio/core.py b/hassio/core.py index a0e74fa0f..8f2c59830 100644 --- a/hassio/core.py +++ b/hassio/core.py @@ -11,10 +11,12 @@ from .api import RestAPI from .host_control import HostControl from .const import ( SOCKET_DOCKER, RUN_UPDATE_INFO_TASKS, RUN_RELOAD_ADDONS_TASKS, - RUN_UPDATE_SUPERVISOR_TASKS, STARTUP_AFTER, STARTUP_BEFORE) + RUN_UPDATE_SUPERVISOR_TASKS, RUN_WATCHDOG_HOMEASSISTANT, STARTUP_AFTER, + STARTUP_BEFORE) from .scheduler import Scheduler from .dock.homeassistant import DockerHomeAssistant from .dock.supervisor import DockerSupervisor +from .tasks import hassio_update, homeassistant_watchdog, homeassistant_setup from .tools import get_arch_from_image, get_local_ip _LOGGER = logging.getLogger(__name__) @@ -78,7 +80,8 @@ class HassIO(object): # first start of supervisor? if not await self.homeassistant.exists(): _LOGGER.info("No HomeAssistant docker found.") - await self._setup_homeassistant() + await homeassistant_setup( + self.config, self.loop, self.homeassistant) # Load addons arch = get_arch_from_image(self.supervisor.image) @@ -90,7 +93,8 @@ class HassIO(object): # schedule self update task self.scheduler.register_task( - self._hassio_update, RUN_UPDATE_SUPERVISOR_TASKS) + hassio_update(self.config, self.supervisor), + RUN_UPDATE_SUPERVISOR_TASKS) async def start(self): """Start HassIO orchestration.""" @@ -109,6 +113,11 @@ class HassIO(object): # run HomeAssistant await self.homeassistant.run() + # schedule homeassistant watchdog + self.scheduler.register_task( + homeassistant_watchdog(self.loop, self.homeassistant), + RUN_WATCHDOG_HOMEASSISTANT) + # start addon mark as after await self.addons.auto_boot(STARTUP_AFTER) @@ -123,28 +132,3 @@ class HassIO(object): self.exit_code = exit_code self.loop.stop() - - async def _setup_homeassistant(self): - """Install a homeassistant docker container.""" - while True: - # read homeassistant tag and install it - if not self.config.last_homeassistant: - await self.config.fetch_update_infos() - - tag = self.config.last_homeassistant - if tag and await self.homeassistant.install(tag): - break - _LOGGER.warning("Error on setup HomeAssistant. Retry in 60.") - await asyncio.sleep(60, loop=self.loop) - - # store version - _LOGGER.info("HomeAssistant docker now installed.") - - async def _hassio_update(self): - """Check and run update of supervisor hassio.""" - if self.config.last_hassio == self.supervisor.version: - return - - _LOGGER.info( - "Found new HassIO version %s.", self.config.last_hassio) - await self.supervisor.update(self.config.last_hassio) diff --git a/hassio/tasks.py b/hassio/tasks.py new file mode 100644 index 000000000..bc55eae99 --- /dev/null +++ b/hassio/tasks.py @@ -0,0 +1,47 @@ +"""Multible tasks.""" +import asyncio +import logging + +_LOGGER = logging.getLogger(__name__) + + +def hassio_update(config, supervisor): + """Create scheduler task for update of supervisor hassio.""" + async def _hassio_update(): + """Check and run update of supervisor hassio.""" + if config.last_hassio == supervisor.version: + return + + _LOGGER.info("Found new HassIO version %s.", config.last_hassio) + await supervisor.update(config.last_hassio) + + return _hassio_update + + +def homeassistant_watchdog(loop, homeassistant): + """Create scheduler task for montoring running state.""" + async def _homeassistant_watchdog(): + """Check running state and start if they is close.""" + if homeassistant.in_progress or await homeassistant.is_running(): + return + + loop.create_task(homeassistant.run()) + + return _homeassistant_watchdog + + +async def homeassistant_setup(config, loop, homeassistant): + """Install a homeassistant docker container.""" + while True: + # read homeassistant tag and install it + if not config.last_homeassistant: + await config.fetch_update_infos() + + tag = config.last_homeassistant + if tag and await homeassistant.install(tag): + break + _LOGGER.warning("Error on setup HomeAssistant. Retry in 60.") + await asyncio.sleep(60, loop=loop) + + # store version + _LOGGER.info("HomeAssistant docker now installed.")