diff --git a/API.md b/API.md index dbd596b77..95e53dc64 100644 --- a/API.md +++ b/API.md @@ -398,6 +398,7 @@ Get all available addons. "privileged": ["NET_ADMIN", "SYS_ADMIN"], "devices": ["/dev/xy"], "logo": "bool", + "changelog": "bool", "hassio_api": "bool", "homeassistant_api": "bool", "stdin": "bool", @@ -411,6 +412,8 @@ Get all available addons. - GET `/addons/{addon}/logo` +- GET `/addons/{addon}/changelog` + - POST `/addons/{addon}/options` ```json diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 0e0695d18..e24653df9 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -348,6 +348,11 @@ class Addon(object): """Return True if a logo exists.""" return self.path_logo.exists() + @property + def with_changelog(self): + """Return True if a changelog exists.""" + return self.path_changelog.exists() + @property def supported_arch(self): """Return list of supported arch.""" @@ -407,6 +412,11 @@ class Addon(object): """Return path to addon logo.""" return Path(self.path_location, 'logo.png') + @property + def path_changelog(self): + """Return path to addon changelog.""" + return Path(self.path_location, 'CHANGELOG.md') + def write_options(self): """Return True if addon options is written to data.""" schema = self.schema diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py index fd906336d..269fbfd6f 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -104,6 +104,8 @@ class RestAPI(object): '/addons/{addon}/rebuild', api_addons.rebuild) self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs) self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo) + self.webapp.router.add_get( + '/addons/{addon}/changelog', api_addons.changelog) self.webapp.router.add_post('/addons/{addon}/stdin', api_addons.stdin) def register_security(self): diff --git a/hassio/api/addons.py b/hassio/api/addons.py index 0c158b748..b6d6408af 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -13,9 +13,9 @@ from ..const import ( ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER, ATTR_INSTALLED, ATTR_LOGO, ATTR_WEBUI, ATTR_DEVICES, ATTR_PRIVILEGED, ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API, - ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, ATTR_HOST_IPC, - BOOT_AUTO, BOOT_MANUAL, - CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) + ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, BOOT_AUTO, BOOT_MANUAL, + ATTR_CHANGELOG, ATTR_HOST_IPC, + CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY, CONTENT_TYPE_TEXT) from ..validate import DOCKER_PORTS _LOGGER = logging.getLogger(__name__) @@ -133,6 +133,7 @@ class APIAddons(object): ATTR_PRIVILEGED: addon.privileged, ATTR_DEVICES: self._pretty_devices(addon), ATTR_LOGO: addon.with_logo, + ATTR_CHANGELOG: addon.with_changelog, ATTR_WEBUI: addon.webui, ATTR_STDIN: addon.with_stdin, ATTR_HASSIO_API: addon.access_hassio_api, @@ -242,6 +243,16 @@ class APIAddons(object): with addon.path_logo.open('rb') as png: return png.read() + @api_process_raw(CONTENT_TYPE_TEXT) + async def changelog(self, request): + """Return changelog from addon.""" + addon = self._extract_addon(request, check_installed=False) + if not addon.with_changelog: + raise RuntimeError("No changelog found!") + + with addon.path_changelog.open('r') as changelog: + return changelog.read() + @api_process async def stdin(self, request): """Write to stdin of addon.""" diff --git a/hassio/const.py b/hassio/const.py index 0cbb4aff7..ba9843525 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -50,9 +50,11 @@ RESULT_OK = 'ok' CONTENT_TYPE_BINARY = 'application/octet-stream' CONTENT_TYPE_PNG = 'image/png' CONTENT_TYPE_JSON = 'application/json' +CONTENT_TYPE_TEXT = 'text/plain' HEADER_HA_ACCESS = 'x-ha-access' ATTR_WATCHDOG = 'watchdog' +ATTR_CHANGELOG = 'changelog' ATTR_DATE = 'date' ATTR_ARCH = 'arch' ATTR_HOSTNAME = 'hostname'