mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-04-22 20:27:16 +00:00
66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
"""Handle Arch for underlay maschine/platforms."""
|
|
import logging
|
|
from typing import List
|
|
from pathlib import Path
|
|
|
|
from .coresys import CoreSysAttributes, CoreSys
|
|
from .exceptions import HassioArchNotFound, JsonFileError
|
|
from .utils.json import read_json_file
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class CpuArch(CoreSysAttributes):
|
|
"""Manage available architectures."""
|
|
|
|
def __init__(self, coresys: CoreSys) -> None:
|
|
"""Initialize CPU Architecture handler."""
|
|
self.coresys = coresys
|
|
self._supported_arch: List[str] = []
|
|
self._default_arch: str
|
|
|
|
@property
|
|
def default(self) -> str:
|
|
"""Return system default arch."""
|
|
return self._default_arch
|
|
|
|
@property
|
|
def supervisor(self) -> str:
|
|
"""Return supervisor arch."""
|
|
return self.sys_supervisor.arch
|
|
|
|
@property
|
|
def supported(self) -> List[str]:
|
|
"""Return support arch by CPU/Machine."""
|
|
return self._supported_arch
|
|
|
|
async def load(self) -> None:
|
|
"""Load data and initialize default arch."""
|
|
try:
|
|
arch_data = read_json_file(Path(__file__).parent.joinpath("arch.json"))
|
|
except JsonFileError:
|
|
_LOGGER.warning("Can't read arch json")
|
|
return
|
|
|
|
# Evaluate current CPU/Platform
|
|
if not self.sys_machine or self.sys_machine not in arch_data:
|
|
_LOGGER.warning("Can't detect underlay machine type!")
|
|
self._default_arch = self.sys_supervisor.arch
|
|
self._supported_arch.append(self.default)
|
|
return
|
|
|
|
# Use configs from arch.json
|
|
self._supported_arch.extend(arch_data[self.sys_machine])
|
|
self._default_arch = self.supported[0]
|
|
|
|
def is_supported(self, arch_list: List[str]) -> bool:
|
|
"""Return True if there is a supported arch by this platform."""
|
|
return not set(self.supported).isdisjoint(set(arch_list))
|
|
|
|
def match(self, arch_list: List[str]) -> str:
|
|
"""Return best match for this CPU/Platform."""
|
|
for self_arch in self.supported:
|
|
if self_arch in arch_list:
|
|
return self_arch
|
|
raise HassioArchNotFound()
|