latest appdaemon version came now from docker image
This commit is contained in:
1 parent
35856b2ba9
commit
3130df69ce
1 file changed
+22
-8
@@ -4,11 +4,14 @@ from importlib import metadata
|
|||||||
import json
|
import json
|
||||||
import pickle
|
import pickle
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
|
||||||
class InformationsCollector(SmartObject):
|
class InformationsCollector(SmartObject):
|
||||||
|
|
||||||
APPDAEMON_PYPI_URL = "https://pypi.org/pypi/appdaemon/json"
|
APPDAEMON_DOCKER_TAGS_URL = (
|
||||||
|
"https://hub.docker.com/v2/repositories/acockburn/appdaemon/tags?page_size=100"
|
||||||
|
)
|
||||||
|
|
||||||
def on_initialize_smart_object(self):
|
def on_initialize_smart_object(self):
|
||||||
super().on_initialize_smart_object()
|
super().on_initialize_smart_object()
|
||||||
@@ -26,7 +29,7 @@ class InformationsCollector(SmartObject):
|
|||||||
sensor_name,
|
sensor_name,
|
||||||
state='unknown',
|
state='unknown',
|
||||||
attributes={
|
attributes={
|
||||||
'latest_official_version': self.dataset.get('appdaemon_latest_official_version'),
|
'latest_official_version': self.dataset.get('appdaemon_latest_docker_version'),
|
||||||
'update_available': None,
|
'update_available': None,
|
||||||
},
|
},
|
||||||
icon='mdi:package-up'
|
icon='mdi:package-up'
|
||||||
@@ -143,9 +146,9 @@ class InformationsCollector(SmartObject):
|
|||||||
latest_official_version = self._get_latest_official_appdaemon_version()
|
latest_official_version = self._get_latest_official_appdaemon_version()
|
||||||
|
|
||||||
if latest_official_version is not None:
|
if latest_official_version is not None:
|
||||||
self.dataset['appdaemon_latest_official_version'] = latest_official_version
|
self.dataset['appdaemon_latest_docker_version'] = latest_official_version
|
||||||
else:
|
else:
|
||||||
latest_official_version = self.dataset.get('appdaemon_latest_official_version')
|
latest_official_version = self.dataset.get('appdaemon_latest_docker_version')
|
||||||
|
|
||||||
update_available = self._is_appdaemon_update_available(installed_version, latest_official_version)
|
update_available = self._is_appdaemon_update_available(installed_version, latest_official_version)
|
||||||
|
|
||||||
@@ -168,11 +171,22 @@ class InformationsCollector(SmartObject):
|
|||||||
|
|
||||||
def _get_latest_official_appdaemon_version(self):
|
def _get_latest_official_appdaemon_version(self):
|
||||||
try:
|
try:
|
||||||
with urlopen(self.APPDAEMON_PYPI_URL, timeout=10) as response:
|
url = self.APPDAEMON_DOCKER_TAGS_URL
|
||||||
payload = json.load(response)
|
versions = {}
|
||||||
return payload.get('info', {}).get('version')
|
while url:
|
||||||
|
with urlopen(url, timeout=10) as response:
|
||||||
|
payload = json.load(response)
|
||||||
|
for tag in payload['results']:
|
||||||
|
name = tag.get('name', '')
|
||||||
|
# Only stable version tags with published container images.
|
||||||
|
if re.fullmatch(r'[0-9]+\.[0-9]+\.[0-9]+', name) and tag.get('images'):
|
||||||
|
versions[tuple(map(int, name.split('.')))] = name
|
||||||
|
url = payload.get('next')
|
||||||
|
if not versions:
|
||||||
|
raise ValueError("No stable AppDaemon Docker image found")
|
||||||
|
return versions[max(versions)]
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
self.log_warning(f"Unable to fetch latest official AppDaemon version: {err}")
|
self.log_warning(f"Unable to fetch latest official AppDaemon Docker version: {err}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _is_appdaemon_update_available(self, installed_version, latest_official_version):
|
def _is_appdaemon_update_available(self, installed_version, latest_official_version):
|
||||||
|
|||||||
Reference in new issue
Block a user