Files
home-assistant/custom_components/hacs/tasks/update_critical_repositories.py
2022-05-04 10:50:54 -07:00

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))