From 7385d026ea4ae7ce8496e2f74935d88ebcfd65b6 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 16 Apr 2019 00:00:08 +0200 Subject: [PATCH 1/6] Bump version 161 --- hassio/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/const.py b/hassio/const.py index cc333bf58..bef00bb51 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -3,7 +3,7 @@ from pathlib import Path from ipaddress import ip_network -HASSIO_VERSION = "160" +HASSIO_VERSION = "161" URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons" URL_HASSIO_VERSION = "https://s3.amazonaws.com/hassio-version/{channel}.json" From 996891a74087336c41185d782088bf8c5f505182 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 16 Apr 2019 11:05:26 +0200 Subject: [PATCH 2/6] Create stale.yml --- .github/stale.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..dc90e5a1c --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false From e10fe16f211b8142d2d9bcf802a22488f5b9f7f5 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 16 Apr 2019 13:49:51 +0200 Subject: [PATCH 3/6] [skip ci] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4f89bd810..450fd8450 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,8 +14,8 @@ pr: - dev variables: - versionHadolint: v1.16.3 - versionBuilder: 1.1 + versionHadolint: 'v1.16.3' + versionBuilder: '1.1' jobs: From decf254e5f5260d8acbd7632aa7f302f0bb0424a Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 23 Apr 2019 11:18:04 +0200 Subject: [PATCH 4/6] Ingress panel support (#1047) * Ingress Panel support * Fix lists * Allow to set the value * fix panels * Update ha realtime * Fix url * Fix update --- API.md | 23 +++++++++++++++++++++-- hassio/addons/addon.py | 31 +++++++++++++++++++++++++++++++ hassio/addons/validate.py | 8 ++++++++ hassio/api/__init__.py | 1 + hassio/api/addons.py | 6 ++++++ hassio/api/ingress.py | 26 +++++++++++++++++++++++++- hassio/const.py | 8 ++++++++ hassio/ingress.py | 25 +++++++++++++++++++++---- 8 files changed, 121 insertions(+), 7 deletions(-) diff --git a/API.md b/API.md index 0d4679e42..030599729 100644 --- a/API.md +++ b/API.md @@ -516,7 +516,8 @@ Get all available addons. "ingress": "bool", "ingress_entry": "null|/api/hassio_ingress/slug", "ingress_url": "null|/api/hassio_ingress/slug/entry.html", - "ingress_port": "null|int" + "ingress_port": "null|int", + "ingress_panel": "null|bool" } ``` @@ -537,7 +538,8 @@ Get all available addons. }, "options": {}, "audio_output": "null|0,0", - "audio_input": "null|0,0" + "audio_input": "null|0,0", + "ingress_panel": "bool" } ``` @@ -602,6 +604,23 @@ Create a new Session for access to ingress service. } ``` +- GET `/ingress/panels` + +Return a list of enabled panels. + +```json +{ + "panels": { + "addon_slug": { + "enable": "boolean", + "icon": "mdi:...", + "title": "title", + "admin": "boolean" + } + } +} +``` + - VIEW `/ingress/{token}` Ingress WebUI for this Add-on. The addon need support HASS Auth! diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index c6980a24e..659de8fc6 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -47,6 +47,10 @@ from ..const import ( ATTR_INGRESS_ENTRY, ATTR_INGRESS_PORT, ATTR_INGRESS_TOKEN, + ATTR_INGRESS_PANEL, + ATTR_INGRESS_PANEL_ADMIN, + ATTR_INGRESS_PANEL_ICON, + ATTR_INGRESS_PANEL_TITLE, ATTR_KERNEL_MODULES, ATTR_LEGACY, ATTR_LOCATON, @@ -449,6 +453,21 @@ class Addon(CoreSysAttributes): return self.sys_ingress.get_dynamic_port(self.slug) return port + @property + def ingress_icon(self) -> str: + """Return panel icon for Ingress frame.""" + return self._mesh[ATTR_INGRESS_PANEL_ICON] + + @property + def ingress_title(self) -> str: + """Return panel icon for Ingress frame.""" + return self._mesh.get(ATTR_INGRESS_PANEL_TITLE, self.name) + + @property + def ingress_admin(self) -> str: + """Return panel icon for Ingress frame.""" + return self._mesh[ATTR_INGRESS_PANEL_ADMIN] + @property def host_network(self): """Return True if add-on run on host network.""" @@ -538,6 +557,18 @@ class Addon(CoreSysAttributes): """Return True if the add-on access support ingress.""" return self._mesh[ATTR_INGRESS] + @property + def ingress_panel(self) -> Optional[bool]: + """Return True if the add-on access support ingress.""" + if self.is_installed: + return self._data.user[self._id][ATTR_INGRESS_PANEL] + return None + + @ingress_panel.setter + def ingress_panel(self, value: bool): + """Return True if the add-on access support ingress.""" + self._data.user[self._id][ATTR_INGRESS_PANEL] = value + @property def with_gpio(self): """Return True if the add-on access to GPIO interface.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 1bc5ca216..a618961a8 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -41,6 +41,10 @@ from ..const import ( ATTR_INGRESS_ENTRY, ATTR_INGRESS_PORT, ATTR_INGRESS_TOKEN, + ATTR_INGRESS_PANEL, + ATTR_INGRESS_PANEL_ADMIN, + ATTR_INGRESS_PANEL_ICON, + ATTR_INGRESS_PANEL_TITLE, ATTR_KERNEL_MODULES, ATTR_LEGACY, ATTR_LOCATON, @@ -159,6 +163,9 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Optional(ATTR_INGRESS, default=False): vol.Boolean(), vol.Optional(ATTR_INGRESS_PORT, default=8099): vol.Any(NETWORK_PORT, vol.Equal(0)), vol.Optional(ATTR_INGRESS_ENTRY): vol.Coerce(str), + vol.Optional(ATTR_INGRESS_PANEL_ICON, default="mdi:puzzle"): vol.Coerce(str), + vol.Optional(ATTR_INGRESS_PANEL_TITLE): vol.Coerce(str), + vol.Optional(ATTR_INGRESS_PANEL_ADMIN, default=True): vol.Boolean(), vol.Optional(ATTR_HOMEASSISTANT): vol.Maybe(vol.Coerce(str)), vol.Optional(ATTR_HOST_NETWORK, default=False): vol.Boolean(), vol.Optional(ATTR_HOST_PID, default=False): vol.Boolean(), @@ -239,6 +246,7 @@ SCHEMA_ADDON_USER = vol.Schema({ vol.Optional(ATTR_AUDIO_OUTPUT): ALSA_DEVICE, vol.Optional(ATTR_AUDIO_INPUT): ALSA_DEVICE, vol.Optional(ATTR_PROTECTED, default=True): vol.Boolean(), + vol.Optional(ATTR_INGRESS_PANEL, default=False): vol.Boolean(), }, extra=vol.REMOVE_EXTRA) diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py index 865a3cb54..32f453bec 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -195,6 +195,7 @@ class RestAPI(CoreSysAttributes): self.webapp.add_routes([ web.post('/ingress/session', api_ingress.create_session), + web.get('/ingress/panels', api_ingress.panels), web.view('/ingress/{token}/{path:.*}', api_ingress.handler), ]) diff --git a/hassio/api/addons.py b/hassio/api/addons.py index 455195f08..13475539f 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -46,6 +46,7 @@ from ..const import ( ATTR_INGRESS_ENTRY, ATTR_INGRESS_PORT, ATTR_INGRESS_URL, + ATTR_INGRESS_PANEL, ATTR_INSTALLED, ATTR_IP_ADDRESS, ATTR_KERNEL_MODULES, @@ -100,6 +101,7 @@ SCHEMA_OPTIONS = vol.Schema({ vol.Optional(ATTR_AUTO_UPDATE): vol.Boolean(), vol.Optional(ATTR_AUDIO_OUTPUT): ALSA_DEVICE, vol.Optional(ATTR_AUDIO_INPUT): ALSA_DEVICE, + vol.Optional(ATTR_INGRESS_PANEL): vol.Boolean(), }) # pylint: disable=no-value-for-parameter @@ -227,6 +229,7 @@ class APIAddons(CoreSysAttributes): ATTR_INGRESS_ENTRY: addon.ingress_entry, ATTR_INGRESS_URL: addon.ingress_url, ATTR_INGRESS_PORT: addon.ingress_port, + ATTR_INGRESS_PANEL: addon.ingress_panel, } @api_process @@ -251,6 +254,9 @@ class APIAddons(CoreSysAttributes): addon.audio_input = body[ATTR_AUDIO_INPUT] if ATTR_AUDIO_OUTPUT in body: addon.audio_output = body[ATTR_AUDIO_OUTPUT] + if ATTR_INGRESS_PANEL in body: + addon.ingress_panel = body[ATTR_INGRESS_PANEL] + await self.sys_ingress.update_hass_panel(addon) addon.save_data() diff --git a/hassio/api/ingress.py b/hassio/api/ingress.py index 438fa81d9..ac9ae289a 100644 --- a/hassio/api/ingress.py +++ b/hassio/api/ingress.py @@ -14,7 +14,17 @@ from aiohttp.web_exceptions import ( from multidict import CIMultiDict, istr from ..addons.addon import Addon -from ..const import ATTR_SESSION, HEADER_TOKEN, REQUEST_FROM, COOKIE_INGRESS +from ..const import ( + ATTR_ADMIN, + ATTR_ICON, + ATTR_SESSION, + ATTR_TITLE, + ATTR_PANELS, + ATTR_ENABLE, + COOKIE_INGRESS, + HEADER_TOKEN, + REQUEST_FROM, +) from ..coresys import CoreSysAttributes from .utils import api_process @@ -45,6 +55,20 @@ class APIIngress(CoreSysAttributes): """Create URL to container.""" return f"http://{addon.ip_address}:{addon.ingress_port}/{path}" + @api_process + async def panels(self, request: web.Request) -> Dict[str, Any]: + """Create a list of panel data.""" + addons = {} + for addon in self.sys_ingress.addons: + addons[addon.slug] = { + ATTR_TITLE: addon.ingress_title, + ATTR_ICON: addon.ingress_icon, + ATTR_ADMIN: addon.ingress_admin, + ATTR_ENABLE: addon.ingress_panel, + } + + return {ATTR_PANELS: addons} + @api_process async def create_session(self, request: web.Request) -> Dict[str, Any]: """Create a new session.""" diff --git a/hassio/const.py b/hassio/const.py index bef00bb51..b322d99f4 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -198,8 +198,16 @@ ATTR_INGRESS_PORT = "ingress_port" ATTR_INGRESS_ENTRY = "ingress_entry" ATTR_INGRESS_TOKEN = "ingress_token" ATTR_INGRESS_URL = "ingress_url" +ATTR_INGRESS_PANEL = "ingress_panel" +ATTR_INGRESS_PANEL_ICON = "ingress_panel_icon" +ATTR_INGRESS_PANEL_TITLE = "ingress_panel_title" +ATTR_INGRESS_PANEL_ADMIN = "ingress_panel_admin" +ATTR_TITLE = "title" +ATTR_ENABLE = "enable" ATTR_IP_ADDRESS = "ip_address" ATTR_SESSION = "session" +ATTR_ADMIN = "admin" +ATTR_PANELS = "panels" PROVIDE_SERVICE = "provide" NEED_SERVICE = "need" diff --git a/hassio/ingress.py b/hassio/ingress.py index 28b7c12e4..ef44f4b6f 100644 --- a/hassio/ingress.py +++ b/hassio/ingress.py @@ -3,7 +3,7 @@ from datetime import timedelta import logging import random import secrets -from typing import Dict, Optional +from typing import Dict, List, Optional from .addons.addon import Addon from .const import ATTR_PORTS, ATTR_SESSION, FILE_HASSIO_INGRESS @@ -40,6 +40,16 @@ class Ingress(JsonConfig, CoreSysAttributes): """Return list of dynamic ports.""" return self._data[ATTR_PORTS] + @property + def addons(self) -> List[Addon]: + """Return list of ingress Add-ons.""" + addons = [] + for addon in self.sys_addons.list_installed: + if not addon.with_ingress: + continue + addons.append(addon) + return addons + async def load(self) -> None: """Update internal data.""" self._update_token_list() @@ -77,9 +87,7 @@ class Ingress(JsonConfig, CoreSysAttributes): self.tokens.clear() # Read all ingress token and build a map - for addon in self.sys_addons.list_installed: - if not addon.with_ingress: - continue + for addon in self.addons: self.tokens[addon.ingress_token] = addon.slug def create_session(self) -> str: @@ -118,3 +126,12 @@ class Ingress(JsonConfig, CoreSysAttributes): self.ports[addon_slug] = port self.save_data() return port + + async def update_hass_panel(self, addon: Addon): + """Return True if Home Assistant up and running.""" + method = "post" if addon.ingress_panel else "delete" + async with self.sys_homeassistant.make_request(method, f"api/hassio_push/panel/{addon.slug}") as resp: + if resp.status in (200, 201): + _LOGGER.info("Update Ingress as panel for %s", addon.slug) + else: + _LOGGER.warning("Fails Ingress panel for %s with %i", addon.slug, resp.status) From 86a3735d838a7d88a3b496732266696976c56cfc Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 23 Apr 2019 11:29:45 +0200 Subject: [PATCH 5/6] Downgrade logger for audio to debug (#1049) --- hassio/misc/hardware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/misc/hardware.py b/hassio/misc/hardware.py index 0183fb0fe..034a8d6e2 100644 --- a/hassio/misc/hardware.py +++ b/hassio/misc/hardware.py @@ -70,7 +70,7 @@ class Hardware: def audio_devices(self): """Return all available audio interfaces.""" if not ASOUND_CARDS.exists(): - _LOGGER.info("No audio devices found") + _LOGGER.debug("No audio devices found") return {} try: From bce144e19792b00a1ca7c61487c3291144ff2dcb Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 23 Apr 2019 14:28:13 +0200 Subject: [PATCH 6/6] Panel Auto integration (#1050) --- .../api/panel/chunk.083a9da4ddb0a000aec4.js | 1 - .../panel/chunk.083a9da4ddb0a000aec4.js.gz | Bin 9822 -> 0 bytes .../api/panel/chunk.61f4e5888ff9846fe4b8.js | 1 + .../panel/chunk.61f4e5888ff9846fe4b8.js.gz | Bin 0 -> 9891 bytes hassio/api/panel/entrypoint.js | 2 +- hassio/api/panel/entrypoint.js.gz | Bin 1425 -> 1423 bytes home-assistant-polymer | 2 +- 7 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 hassio/api/panel/chunk.083a9da4ddb0a000aec4.js delete mode 100644 hassio/api/panel/chunk.083a9da4ddb0a000aec4.js.gz create mode 100644 hassio/api/panel/chunk.61f4e5888ff9846fe4b8.js create mode 100644 hassio/api/panel/chunk.61f4e5888ff9846fe4b8.js.gz diff --git a/hassio/api/panel/chunk.083a9da4ddb0a000aec4.js b/hassio/api/panel/chunk.083a9da4ddb0a000aec4.js deleted file mode 100644 index f21bfdd1e..000000000 --- a/hassio/api/panel/chunk.083a9da4ddb0a000aec4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{131:function(e,n,t){"use strict";t.r(n);t(94),t(108),t(41),t(25);var o=t(4),a=t(9),i=(t(116),t(15),t(14),t(127),t(128),t(117),t(26),t(30));function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function s(){var e=function(e,n){n||(n=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}(['\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n \n
\n
\n Save\n
\n
\n '],['\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n \n
\n
\n Save\n
\n
\n ']);return s=function(){return e},e}function c(e,n){for(var t=0;t\n :host {\n display: block;\n }\n paper-card {\n display: block;\n }\n .card-actions {\n @apply --layout;\n @apply --layout-justified;\n }\n .errors {\n color: var(--google-red-500);\n margin-bottom: 16px;\n }\n iron-autogrow-textarea {\n width: 100%;\n font-family: monospace;\n }\n .syntaxerror {\n color: var(--google-red-500);\n }\n \n \n
\n \n \n
\n
\n Reset to defaults\n Save\n
\n
\n ']);return f=function(){return e},e}function b(e,n){for(var t=0;t bit more top margin */\n font-weight: 500;\n overflow: hidden;\n text-transform: uppercase;\n text-overflow: ellipsis;\n transition: background-color 0.3s ease-in-out;\n text-transform: var(--ha-label-badge-label-text-transform, uppercase);\n }\n .label-badge .label.big span {\n font-size: 90%;\n padding: 10% 12% 7% 12%; /* push smaller text a bit down to center vertically */\n }\n .badge-container .title {\n margin-top: 1em;\n font-size: var(--ha-label-badge-title-font-size, 0.9em);\n width: var(--ha-label-badge-title-width, 5em);\n font-weight: var(--ha-label-badge-title-font-weight, 400);\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: normal;\n }\n "]);return E=function(){return e},e}function R(){var e=M(['\n
',"
\n "]);return R=function(){return e},e}function z(){var e=M(['\n \n ',"\n \n "]);return z=function(){return e},e}function D(){var e=M(["\n ","\n "]);return D=function(){return e},e}function H(){var e=M(['\n \n ']);return H=function(){return e},e}function N(){var e=M(['\n
\n
\n \n ',"\n ","\n
\n ","\n
\n ","\n \n "]);return N=function(){return e},e}function M(e,n){return n||(n=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}function U(e,n){for(var t=0;t4)}),!this.icon||this.value||this.image?"":Object(w.e)(H(),this.icon),this.value&&!this.image?Object(w.e)(D(),this.value):"",this.label?Object(w.e)(z(),Object(O.a)({label:!0,big:this.label.length>5}),this.label):"",this.description?Object(w.e)(R(),this.description):"")}},{key:"updated",value:function(e){$(q(n.prototype),"updated",this).call(this,e),e.has("image")&&(this.shadowRoot.getElementById("badge").style.backgroundImage=this.image?"url(".concat(this.image,")"):"")}}])&&U(t.prototype,o),a&&U(t,a),n}();customElements.define("ha-label-badge",W);t(70);var J=t(42),X=t(100);t(35);function F(e){return(F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function G(){var e=function(e,n){n||(n=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}(['\n \n\n \n\n \n
\n
\n [[addon.name]]\n
\n \n \n
\n
\n
\n [[addon.description]].
\n Visit\n [[addon.name]] page for\n details.\n
\n \n \n
\n

Addon Security Rating

\n
\n Hass.io provides a security rating to each of the add-ons, which indicates the risks involved when using this add-on. The more access an addon requires on your system, the lower the score, thus raising the possible security risks.\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n Open web UI\n \n \n \n
\n
\n \n ']);return G=function(){return e},e}function V(e,n){for(var t=0;t4?"green":e>2?"yellow":"red"}},{key:"startOnBootToggled",value:function(){var e={boot:"auto"===this.addon.boot?"manual":"auto"};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/options"),e)}},{key:"autoUpdateToggled",value:function(){var e={auto_update:!this.addon.auto_update};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/options"),e)}},{key:"protectionToggled",value:function(){var e={protected:!this.addon.protected};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/security"),e),this.set("addon.protected",!this.addon.protected)}},{key:"showMoreInfo",value:function(e){var n=e.target.getAttribute("id");Object(X.a)(this,{title:Z[n].title,content:Z[n].description})}},{key:"openChangelog",value:function(){var e=this;this.hass.callApi("get","hassio/addons/".concat(this.addonSlug,"/changelog")).then(function(e){return e},function(){return"Error getting changelog"}).then(function(n){Object(X.a)(e,{title:"Changelog",content:n})})}},{key:"_unistallClicked",value:function(){var e=this;if(confirm("Are you sure you want to uninstall this add-on?")){var n="hassio/addons/".concat(this.addonSlug,"/uninstall"),t={path:n};this.hass.callApi("post",n).then(function(e){t.success=!0,t.response=e},function(e){t.success=!1,t.response=e}).then(function(){e.fire("hass-api-called",t)})}}}])&&V(t.prototype,r),s&&V(t,s),n}();customElements.define("hassio-addon-info",ee);var ne=t(101);function te(e){return(te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function oe(){var e=function(e,n){n||(n=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}(['\n \n ','\n \n
\n
\n Refresh\n
\n
\n ']);return oe=function(){return e},e}function ae(e,n){for(var t=0;t\n :host {\n display: block;\n }\n paper-card {\n display: block;\n }\n .errors {\n color: var(--google-red-500);\n margin-bottom: 16px;\n }\n .card-actions {\n @apply --layout;\n @apply --layout-justified;\n }\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n
ContainerHostDescription
\n
\n
\n Reset to defaults\n Save\n
\n
\n ']);return de=function(){return e},e}function ue(e,n){for(var t=0;t\n :host {\n color: var(--primary-text-color);\n --paper-card-header-color: var(--primary-text-color);\n }\n .content {\n padding: 24px 0 32px;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n hassio-addon-info,\n hassio-addon-network,\n hassio-addon-audio,\n hassio-addon-config {\n margin-bottom: 24px;\n width: 600px;\n }\n hassio-addon-logs {\n max-width: calc(100% - 8px);\n min-width: 600px;\n }\n @media only screen and (max-width: 600px) {\n hassio-addon-info,\n hassio-addon-network,\n hassio-addon-audio,\n hassio-addon-config,\n hassio-addon-logs {\n max-width: 100%;\n min-width: 100%;\n }\n }\n \n \n
\n \n\n \n
\n
\n ']);return ge=function(){return e},e}function ye(e,n){for(var t=0;t=0?n:null}:null}),e._resize();for(var n=document.createTreeWalker(e,1,null,!1);n.nextNode();){var t=n.currentNode;"A"===t.tagName&&t.host!==document.location.host?t.target="_blank":"IMG"===t.tagName&&t.addEventListener("load",e._resize)}}else 2===e._scriptLoaded&&(e.innerText=e.content)}))}}])&&r(i.prototype,h),f&&r(i,f),n}();customElements.define("ha-markdown",h)}}]); \ No newline at end of file diff --git a/hassio/api/panel/chunk.083a9da4ddb0a000aec4.js.gz b/hassio/api/panel/chunk.083a9da4ddb0a000aec4.js.gz deleted file mode 100644 index a088ef2b6212c1e24b406fd441e7d64858b263cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9822 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 E098CZ!T\n :host,\n paper-card,\n paper-dropdown-menu {\n display: block;\n }\n .errors {\n color: var(--google-red-500);\n margin-bottom: 16px;\n }\n paper-item {\n width: 450px;\n }\n .card-actions {\n text-align: right;\n }\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n \n
\n
\n Save\n
\n
\n '],['\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n \n
\n
\n Save\n
\n
\n ']);return s=function(){return e},e}function c(e,n){for(var t=0;t\n :host {\n display: block;\n }\n paper-card {\n display: block;\n }\n .card-actions {\n @apply --layout;\n @apply --layout-justified;\n }\n .errors {\n color: var(--google-red-500);\n margin-bottom: 16px;\n }\n iron-autogrow-textarea {\n width: 100%;\n font-family: monospace;\n }\n .syntaxerror {\n color: var(--google-red-500);\n }\n \n \n
\n \n \n
\n
\n Reset to defaults\n Save\n
\n
\n ']);return f=function(){return e},e}function b(e,n){for(var t=0;t bit more top margin */\n font-weight: 500;\n overflow: hidden;\n text-transform: uppercase;\n text-overflow: ellipsis;\n transition: background-color 0.3s ease-in-out;\n text-transform: var(--ha-label-badge-label-text-transform, uppercase);\n }\n .label-badge .label.big span {\n font-size: 90%;\n padding: 10% 12% 7% 12%; /* push smaller text a bit down to center vertically */\n }\n .badge-container .title {\n margin-top: 1em;\n font-size: var(--ha-label-badge-title-font-size, 0.9em);\n width: var(--ha-label-badge-title-width, 5em);\n font-weight: var(--ha-label-badge-title-font-weight, 400);\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: normal;\n }\n "]);return E=function(){return e},e}function R(){var e=M(['\n
',"
\n "]);return R=function(){return e},e}function z(){var e=M(['\n \n ',"\n \n "]);return z=function(){return e},e}function D(){var e=M(["\n ","\n "]);return D=function(){return e},e}function H(){var e=M(['\n \n ']);return H=function(){return e},e}function N(){var e=M(['\n
\n
\n \n ',"\n ","\n
\n ","\n
\n ","\n \n "]);return N=function(){return e},e}function M(e,n){return n||(n=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}function U(e,n){for(var t=0;t4)}),!this.icon||this.value||this.image?"":Object(w.e)(H(),this.icon),this.value&&!this.image?Object(w.e)(D(),this.value):"",this.label?Object(w.e)(z(),Object(O.a)({label:!0,big:this.label.length>5}),this.label):"",this.description?Object(w.e)(R(),this.description):"")}},{key:"updated",value:function(e){$(q(n.prototype),"updated",this).call(this,e),e.has("image")&&(this.shadowRoot.getElementById("badge").style.backgroundImage=this.image?"url(".concat(this.image,")"):"")}}])&&U(t.prototype,o),a&&U(t,a),n}();customElements.define("ha-label-badge",W);t(70);var J=t(42),X=t(100);t(35);function F(e){return(F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function G(){var e=function(e,n){n||(n=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}(['\n \n\n \n\n \n
\n
\n [[addon.name]]\n
\n \n \n
\n
\n
\n [[addon.description]].
\n Visit\n [[addon.name]] page for\n details.\n
\n \n \n
\n

Add-on Security Rating

\n
\n Hass.io provides a security rating to each of the add-ons, which indicates the risks involved when using this add-on. The more access an add-on requires on your system, the lower the score, thus raising the possible security risks.\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n Open web UI\n \n \n \n
\n
\n \n ']);return G=function(){return e},e}function V(e,n){for(var t=0;t4?"green":e>2?"yellow":"red"}},{key:"startOnBootToggled",value:function(){var e={boot:"auto"===this.addon.boot?"manual":"auto"};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/options"),e)}},{key:"autoUpdateToggled",value:function(){var e={auto_update:!this.addon.auto_update};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/options"),e)}},{key:"protectionToggled",value:function(){var e={protected:!this.addon.protected};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/security"),e),this.set("addon.protected",!this.addon.protected)}},{key:"panelToggled",value:function(){var e={ingress_panel:!this.addon.ingress_panel};this.hass.callApi("POST","hassio/addons/".concat(this.addonSlug,"/options"),e)}},{key:"showMoreInfo",value:function(e){var n=e.target.getAttribute("id");Object(X.a)(this,{title:Z[n].title,content:Z[n].description})}},{key:"openChangelog",value:function(){var e=this;this.hass.callApi("get","hassio/addons/".concat(this.addonSlug,"/changelog")).then(function(e){return e},function(){return"Error getting changelog"}).then(function(n){Object(X.a)(e,{title:"Changelog",content:n})})}},{key:"_unistallClicked",value:function(){var e=this;if(confirm("Are you sure you want to uninstall this add-on?")){var n="hassio/addons/".concat(this.addonSlug,"/uninstall"),t={path:n};this.hass.callApi("post",n).then(function(e){t.success=!0,t.response=e},function(e){t.success=!1,t.response=e}).then(function(){e.fire("hass-api-called",t)})}}}])&&V(t.prototype,r),s&&V(t,s),n}();customElements.define("hassio-addon-info",ee);var ne=t(101);function te(e){return(te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function oe(){var e=function(e,n){n||(n=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}(['\n \n ','\n \n
\n
\n Refresh\n
\n
\n ']);return oe=function(){return e},e}function ae(e,n){for(var t=0;t\n :host {\n display: block;\n }\n paper-card {\n display: block;\n }\n .errors {\n color: var(--google-red-500);\n margin-bottom: 16px;\n }\n .card-actions {\n @apply --layout;\n @apply --layout-justified;\n }\n \n \n
\n \n\n \n \n \n \n \n \n \n \n \n
ContainerHostDescription
\n
\n
\n Reset to defaults\n Save\n
\n
\n ']);return de=function(){return e},e}function ue(e,n){for(var t=0;t\n :host {\n color: var(--primary-text-color);\n --paper-card-header-color: var(--primary-text-color);\n }\n .content {\n padding: 24px 0 32px;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n hassio-addon-info,\n hassio-addon-network,\n hassio-addon-audio,\n hassio-addon-config {\n margin-bottom: 24px;\n width: 600px;\n }\n hassio-addon-logs {\n max-width: calc(100% - 8px);\n min-width: 600px;\n }\n @media only screen and (max-width: 600px) {\n hassio-addon-info,\n hassio-addon-network,\n hassio-addon-audio,\n hassio-addon-config,\n hassio-addon-logs {\n max-width: 100%;\n min-width: 100%;\n }\n }\n \n \n
\n \n\n \n
\n
\n ']);return ge=function(){return e},e}function ye(e,n){for(var t=0;t=0?n:null}:null}),e._resize();for(var n=document.createTreeWalker(e,1,null,!1);n.nextNode();){var t=n.currentNode;"A"===t.tagName&&t.host!==document.location.host?t.target="_blank":"IMG"===t.tagName&&t.addEventListener("load",e._resize)}}else 2===e._scriptLoaded&&(e.innerText=e.content)}))}}])&&r(i.prototype,h),f&&r(i,f),n}();customElements.define("ha-markdown",h)}}]); \ No newline at end of file diff --git a/hassio/api/panel/chunk.61f4e5888ff9846fe4b8.js.gz b/hassio/api/panel/chunk.61f4e5888ff9846fe4b8.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d4513f4d323e171939e26aaa218a7d53cc0c1114 GIT binary patch literal 9891 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 literal 1425 zcmV;C1#bEuiwFP!000021C3ValH(u}eiaQrT%yddlC$OGa?a_WHz8<^*_AqcU_z&_n-0FII;(=T<>JUO4Vhm=t!OyEsS|Rq-Y~y+ZzhwDH(h&3;{iqKa4WK1)EW|F6GQ)2egGAC<6Us! zsR4eF?cW~k-@R+VhbOLNU8jZxI+>)f4{wCQ4?1Y5CX)&=?z)S4+VS>as*uu@_5*5h z>X{d(MUnNpXUAN0%v5RE+c(rh=)6thp2K6~d}w!3)Qfl}PNuM|E^cymCKji@-<^d3 zIYxl~BFj8`**l7dTHItWcfI2vuEQN|Sqvi!!tdeD4sm5SLIfHCQai>k>}TjR)GZAB zQdoFMFhobwLi()DqQTRsM(pwMrl-3r1wzunGlNg3o$8KY16LkofZx;*Pbq1YH%%aP zr?@&u-$D?i3)St0FvWv8g6o3FXBl(cs>wugB^YI{T56=_xD7a0Xk*-j!dNLVT9^Aiz z$B6%1-c2Uov-mYH!{@I%4B20t?rI=CW#1Df@7_UsX1j>pWFy>g?f%$=^GQr85Dp!n zY%{T!jtnsa7m-TbV2X%~PcWIpKmKCrMQF_60o)8OP9pds5WT2Nh=@Vn|h%b%$JiD&JtD({J(pWvsOZw)_9Il>yhS~l-iS4+ozA2bf+K;&X_s4j6s)1l$abqp`-~anB ze-`AmEuDT!POoi}RL+LmN*+!9R3!g&r3;QFt+efJ3*J<_$a8yi|GjnX