93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
""""Hacs base setup task."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import timedelta
|
|
|
|
from aiogithubapi import GitHubNotModifiedException
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from custom_components.hacs.utils.queue_manager import QueueManager
|
|
from custom_components.hacs.utils.store import (
|
|
async_load_from_store,
|
|
async_save_to_store,
|
|
)
|
|
|
|
from ..base import HacsBase
|
|
from ..enums import HacsStage
|
|
from ..exceptions import HacsException
|
|
from .base import HacsTask
|
|
|
|
|
|
async def async_setup_task(hacs: HacsBase, hass: HomeAssistant) -> Task:
|
|
"""Set up this task."""
|
|
return Task(hacs=hacs, hass=hass)
|
|
|
|
|
|
class Task(HacsTask):
|
|
"""Hacs update critical task."""
|
|
|
|
schedule = timedelta(hours=2)
|
|
stages = [HacsStage.RUNNING]
|
|
|
|
async def async_execute(self) -> None:
|
|
"""Execute the task."""
|
|
critical_queue = QueueManager(hass=self.hass)
|
|
instored = []
|
|
critical = []
|
|
was_installed = False
|
|
|
|
try:
|
|
critical = await self.hacs.async_github_get_hacs_default_file("critical")
|
|
except GitHubNotModifiedException:
|
|
return
|
|
except HacsException:
|
|
pass
|
|
|
|
if not critical:
|
|
self.hacs.log.debug("No critical repositories")
|
|
return
|
|
|
|
stored_critical = await async_load_from_store(self.hass, "critical")
|
|
|
|
for stored in stored_critical or []:
|
|
instored.append(stored["repository"])
|
|
|
|
stored_critical = []
|
|
|
|
for repository in critical:
|
|
removed_repo = self.hacs.repositories.removed_repository(repository["repository"])
|
|
removed_repo.removal_type = "critical"
|
|
repo = self.hacs.repositories.get_by_full_name(repository["repository"])
|
|
|
|
stored = {
|
|
"repository": repository["repository"],
|
|
"reason": repository["reason"],
|
|
"link": repository["link"],
|
|
"acknowledged": True,
|
|
}
|
|
if repository["repository"] not in instored:
|
|
if repo is not None and repo.data.installed:
|
|
self.hacs.log.critical(
|
|
"Removing repository %s, it is marked as critical",
|
|
repository["repository"],
|
|
)
|
|
was_installed = True
|
|
stored["acknowledged"] = False
|
|
# Remove from HACS
|
|
critical_queue.add(repo.uninstall())
|
|
repo.remove()
|
|
|
|
stored_critical.append(stored)
|
|
removed_repo.update_data(stored)
|
|
|
|
# Uninstall
|
|
await critical_queue.execute()
|
|
|
|
# Save to FS
|
|
await async_save_to_store(self.hass, "critical", stored_critical)
|
|
|
|
# Restart HASS
|
|
if was_installed:
|
|
self.hacs.log.critical("Resarting Home Assistant")
|
|
self.hass.async_create_task(self.hass.async_stop(100))
|