mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-27 19:16:29 +00:00
Use packages version (#2013)
* Use package version * more readable * Fix
This commit is contained in:
parent
51dcbf5db7
commit
c85aa664e1
@ -5,6 +5,7 @@ import logging
|
|||||||
from typing import Any, Awaitable, Dict, List, Optional
|
from typing import Any, Awaitable, Dict, List, Optional
|
||||||
|
|
||||||
import docker
|
import docker
|
||||||
|
from packaging import version as pkg_version
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from . import CommandReturn
|
from . import CommandReturn
|
||||||
@ -431,12 +432,12 @@ class DockerInterface(CoreSysAttributes):
|
|||||||
# Check return value
|
# Check return value
|
||||||
return int(docker_container.attrs["State"]["ExitCode"]) != 0
|
return int(docker_container.attrs["State"]["ExitCode"]) != 0
|
||||||
|
|
||||||
def get_latest_version(self, key: Any = int) -> Awaitable[str]:
|
def get_latest_version(self) -> Awaitable[str]:
|
||||||
"""Return latest version of local Home Asssistant image."""
|
"""Return latest version of local image."""
|
||||||
return self.sys_run_in_executor(self._get_latest_version, key)
|
return self.sys_run_in_executor(self._get_latest_version)
|
||||||
|
|
||||||
def _get_latest_version(self, key: Any = int) -> str:
|
def _get_latest_version(self) -> str:
|
||||||
"""Return latest version of local Home Asssistant image.
|
"""Return latest version of local image.
|
||||||
|
|
||||||
Need run inside executor.
|
Need run inside executor.
|
||||||
"""
|
"""
|
||||||
@ -446,8 +447,8 @@ class DockerInterface(CoreSysAttributes):
|
|||||||
for tag in image.tags:
|
for tag in image.tags:
|
||||||
version = tag.partition(":")[2]
|
version = tag.partition(":")[2]
|
||||||
try:
|
try:
|
||||||
key(version)
|
pkg_version.parse(version)
|
||||||
except (AttributeError, ValueError):
|
except (TypeError, pkg_version.InvalidVersion):
|
||||||
continue
|
continue
|
||||||
available_version.append(version)
|
available_version.append(version)
|
||||||
|
|
||||||
@ -461,5 +462,5 @@ class DockerInterface(CoreSysAttributes):
|
|||||||
_LOGGER.debug("Found %s versions: %s", self.image, available_version)
|
_LOGGER.debug("Found %s versions: %s", self.image, available_version)
|
||||||
|
|
||||||
# Sort version and return latest version
|
# Sort version and return latest version
|
||||||
available_version.sort(key=key, reverse=True)
|
available_version.sort(key=pkg_version.parse, reverse=True)
|
||||||
return available_version[0]
|
return available_version[0]
|
||||||
|
@ -53,8 +53,8 @@ class HomeAssistantCore(CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.sys_homeassistant.version:
|
if not self.sys_homeassistant.version:
|
||||||
self.sys_homeassistant.version = await self.instance.get_latest_version(
|
self.sys_homeassistant.version = (
|
||||||
key=pkg_version.parse
|
await self.instance.get_latest_version()
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.instance.attach(tag=self.sys_homeassistant.version)
|
await self.instance.attach(tag=self.sys_homeassistant.version)
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from packaging.version import LegacyVersion, parse as pkg_parse
|
||||||
|
|
||||||
from ..coresys import CoreSys, CoreSysAttributes
|
from ..coresys import CoreSys, CoreSysAttributes
|
||||||
from ..exceptions import HassioError
|
from ..exceptions import HassioError
|
||||||
from .audio import Audio
|
from .audio import Audio
|
||||||
@ -15,10 +17,10 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
|
|||||||
class PluginManager(CoreSysAttributes):
|
class PluginManager(CoreSysAttributes):
|
||||||
"""Manage supported function for plugins."""
|
"""Manage supported function for plugins."""
|
||||||
|
|
||||||
required_cli: int = 26
|
required_cli: LegacyVersion = pkg_parse("26")
|
||||||
required_dns: int = 9
|
required_dns: LegacyVersion = pkg_parse("9")
|
||||||
required_audio: int = 17
|
required_audio: LegacyVersion = pkg_parse("17")
|
||||||
required_multicast: int = 3
|
required_multicast: LegacyVersion = pkg_parse("3")
|
||||||
|
|
||||||
def __init__(self, coresys: CoreSys):
|
def __init__(self, coresys: CoreSys):
|
||||||
"""Initialize plugin manager."""
|
"""Initialize plugin manager."""
|
||||||
@ -61,7 +63,7 @@ class PluginManager(CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
await plugin.load()
|
await plugin.load()
|
||||||
except Exception as err: # pylint: disable=broad-except
|
except Exception as err: # pylint: disable=broad-except
|
||||||
_LOGGER.warning("Can't load plugin %s", type(plugin).__name__)
|
_LOGGER.warning("Can't load plugin %s: %s", type(plugin).__name__, err)
|
||||||
self.sys_capture_exception(err)
|
self.sys_capture_exception(err)
|
||||||
|
|
||||||
# Check requirements
|
# Check requirements
|
||||||
@ -73,18 +75,16 @@ class PluginManager(CoreSysAttributes):
|
|||||||
):
|
):
|
||||||
# Check if need an update
|
# Check if need an update
|
||||||
try:
|
try:
|
||||||
if int(plugin.version) >= required_version:
|
if pkg_parse(plugin.version) >= required_version:
|
||||||
continue
|
|
||||||
except (TypeError, ValueError):
|
|
||||||
if plugin.version == "dev":
|
|
||||||
continue
|
continue
|
||||||
|
except TypeError:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Somethings going wrong with requirements on %s",
|
"Somethings going wrong with requirements on %s",
|
||||||
type(plugin).__name__,
|
type(plugin).__name__,
|
||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Requirement need update for %s - %i",
|
"Requirement need update for %s - %s",
|
||||||
type(plugin).__name__,
|
type(plugin).__name__,
|
||||||
required_version,
|
required_version,
|
||||||
)
|
)
|
||||||
@ -92,12 +92,14 @@ class PluginManager(CoreSysAttributes):
|
|||||||
await plugin.update(version=str(required_version))
|
await plugin.update(version=str(required_version))
|
||||||
except HassioError:
|
except HassioError:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"Can't update %s to %i but it's a reuirement, the Supervisor is not health now!",
|
"Can't update %s to %s but it's a reuirement, the Supervisor is not health now!",
|
||||||
type(plugin).__name__,
|
type(plugin).__name__,
|
||||||
required_version,
|
required_version,
|
||||||
)
|
)
|
||||||
except Exception as err: # pylint: disable=broad-except
|
except Exception as err: # pylint: disable=broad-except
|
||||||
_LOGGER.warning("Can't update plugin %s", type(plugin).__name__)
|
_LOGGER.warning(
|
||||||
|
"Can't update plugin %s: %s", type(plugin).__name__, err
|
||||||
|
)
|
||||||
self.sys_capture_exception(err)
|
self.sys_capture_exception(err)
|
||||||
|
|
||||||
async def repair(self) -> None:
|
async def repair(self) -> None:
|
||||||
@ -123,5 +125,5 @@ class PluginManager(CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
await plugin.stop()
|
await plugin.stop()
|
||||||
except Exception as err: # pylint: disable=broad-except
|
except Exception as err: # pylint: disable=broad-except
|
||||||
_LOGGER.warning("Can't stop plugin %s", type(plugin).__name__)
|
_LOGGER.warning("Can't stop plugin %s: %s", type(plugin).__name__, err)
|
||||||
self.sys_capture_exception(err)
|
self.sys_capture_exception(err)
|
||||||
|
@ -88,7 +88,7 @@ class Audio(JsonConfig, CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = await self.instance.get_latest_version(key=int)
|
self.version = await self.instance.get_latest_version()
|
||||||
|
|
||||||
await self.instance.attach(tag=self.version)
|
await self.instance.attach(tag=self.version)
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
@ -76,7 +76,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = await self.instance.get_latest_version(key=int)
|
self.version = await self.instance.get_latest_version()
|
||||||
|
|
||||||
await self.instance.attach(tag=self.version)
|
await self.instance.attach(tag=self.version)
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
@ -123,7 +123,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = await self.instance.get_latest_version(key=int)
|
self.version = await self.instance.get_latest_version()
|
||||||
|
|
||||||
await self.instance.attach(tag=self.version)
|
await self.instance.attach(tag=self.version)
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
@ -70,7 +70,7 @@ class Multicast(JsonConfig, CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = await self.instance.get_latest_version(key=int)
|
self.version = await self.instance.get_latest_version()
|
||||||
|
|
||||||
await self.instance.attach(tag=self.version)
|
await self.instance.attach(tag=self.version)
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user