Compare commits

...

24 Commits

Author SHA1 Message Date
Joakim Sørensen
7c6c982414 Add ingress_stream add-on option (#2982) 2021-06-30 09:28:29 +02:00
Joakim Sørensen
07eeb2eaf2 Only use .content for POST (#2981)
Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
Co-authored-by: Pascal Vizeli <pvizeli@syshack.ch>
2021-06-29 11:29:47 +02:00
Joakim Sørensen
223f5b7bb1 Fix failing test (#2980) 2021-06-26 19:32:00 +02:00
Joakim Sørensen
8a9657c452 Stream requests to ingress (#2979)
* Chunk large requests to ingress

* Remove timout for POST

* No timeout

* stream

* Remove chunked
2021-06-26 19:31:15 +02:00
Joakim Sørensen
564e9811d0 Use brotlipy instead of Brotli (#2977) 2021-06-24 19:12:48 +02:00
Pascal Vizeli
b944b52b21 Add running job condition to OS update (#2976) 2021-06-24 16:06:06 +02:00
dependabot[bot]
24aecdddf3 Bump docker/login-action from 1.9.0 to 1.10.0 (#2975)
Bumps [docker/login-action](https://github.com/docker/login-action) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v1.9.0...v1.10.0)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-24 12:48:33 +02:00
Stefan Agner
7bbfb60039 Allow upgrade when using {os_name} in URL (#2974)
Once {os_name} is part of the update URL we also need to set the OS name
explicitly for upgrades: A user might use a new Supervisor version on a
OS release 5 device. The device will still use "hassos" as OS name.
Before introducing {os_name}, the new OS name was part of the URL. Now
when {os_name} is used, we need to adjust the name for upgrade as well.
2021-06-24 08:39:50 +02:00
Pascal Vizeli
ece40008c7 Logging in local timezone (#2971)
* Logging in local timezone

* fix convert

* Apply suggestions from code review

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2021-06-21 13:42:39 +02:00
Pascal Vizeli
0177b38ded Support HOT/COLD snapshots for Add-ons (#2943)
* Support HOT/COLD snapshots for Add-ons

* Apply suggestions from code review

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>

* Add warning

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2021-06-21 09:07:54 +02:00
Stefan Agner
16f2f63081 Allow downgrade to "hassos" from "haos" (#2970)
* Add "os_name" as possible URL variable

* Replace "os_name" for downgrades to OS versions before 6.0
2021-06-19 18:50:54 +02:00
Pascal Vizeli
5f376c2a27 Using images data from version file (#2969)
* Using images data from version file

* fix tests
2021-06-18 22:59:11 +02:00
dependabot[bot]
90a6f109ee Bump gitpython from 3.1.17 to 3.1.18 (#2967)
Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.17 to 3.1.18.
- [Release notes](https://github.com/gitpython-developers/GitPython/releases)
- [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES)
- [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.17...3.1.18)

---
updated-dependencies:
- dependency-name: gitpython
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-18 13:32:53 +02:00
dependabot[bot]
e6fd0ef5dc Bump actions/upload-artifact from 2.2.3 to 2.2.4 (#2965)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2.2.3 to 2.2.4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2.2.3...v2.2.4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-17 09:49:28 +02:00
Joakim Sørensen
d46ab56901 Update frontend to 446a9b5c (#2962) 2021-06-16 11:45:28 +02:00
Pascal Vizeli
3b1ad5c0cd Run API watchdog only if core is running (#2961)
* Run API watchdog only if core is running

* negate

* fix comment
2021-06-16 11:45:06 +02:00
Joakim Sørensen
de8a241e72 When validating add-ons transform core-addons url (#2960) 2021-06-15 15:06:40 +02:00
Pascal Vizeli
a4a0b43d91 Using ghcr.io/home-assistant + fallback (#2959) 2021-06-14 20:07:44 +02:00
Pascal Vizeli
adf355e54f Fix API watchdog never trigger (#2958) 2021-06-14 14:11:22 +02:00
Joakim Sørensen
4f9e646b4c Fix addon_pwned enabled setter (#2952)
* Fix addon_pwned enabled setter

* whatever

* adjust
2021-06-14 11:33:53 +02:00
dependabot[bot]
ce57d384ca Bump pyupgrade from 2.19.3 to 2.19.4 (#2957)
Bumps [pyupgrade](https://github.com/asottile/pyupgrade) from 2.19.3 to 2.19.4.
- [Release notes](https://github.com/asottile/pyupgrade/releases)
- [Commits](https://github.com/asottile/pyupgrade/compare/v2.19.3...v2.19.4)

---
updated-dependencies:
- dependency-name: pyupgrade
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-14 11:32:50 +02:00
Pascal Vizeli
d53d526673 Add-on: Block update itself (#2956)
* Add-on: Block update itself

* Better logging

* Update
2021-06-14 10:37:59 +02:00
Pascal Vizeli
cd8fc16bcb Cleanup security layer - Add-on default access role (#2954)
* Allow access to network info (add-on)

* fix check

* make it nice

* cleanup

* cleanup

* fix tests

* Add warning

* allow access to addons/store/snapshot infos

* revert
2021-06-14 10:05:37 +02:00
dependabot[bot]
6b58970354 Bump black from 21.5b2 to 21.6b0 (#2953)
* Bump black from 21.5b2 to 21.6b0

Bumps [black](https://github.com/psf/black) from 21.5b2 to 21.6b0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/commits)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update .pre-commit-config.yaml

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pascal Vizeli <pvizeli@syshack.ch>
2021-06-13 12:44:11 +02:00
207 changed files with 902 additions and 567 deletions

View File

@@ -109,14 +109,14 @@ jobs:
- name: Login to DockerHub - name: Login to DockerHub
if: needs.init.outputs.publish == 'true' if: needs.init.outputs.publish == 'true'
uses: docker/login-action@v1.9.0 uses: docker/login-action@v1.10.0
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
if: needs.init.outputs.publish == 'true' if: needs.init.outputs.publish == 'true'
uses: docker/login-action@v1.9.0 uses: docker/login-action@v1.10.0
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ secrets.GIT_USER }} username: ${{ secrets.GIT_USER }}

View File

@@ -394,7 +394,7 @@ jobs:
-o console_output_style=count \ -o console_output_style=count \
tests tests
- name: Upload coverage artifact - name: Upload coverage artifact
uses: actions/upload-artifact@v2.2.3 uses: actions/upload-artifact@v2.2.4
with: with:
name: coverage-${{ matrix.python-version }} name: coverage-${{ matrix.python-version }}
path: .coverage path: .coverage

View File

@@ -1,6 +1,6 @@
repos: repos:
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.5b1 rev: 21.6b0
hooks: hooks:
- id: black - id: black
args: args:

View File

@@ -3,7 +3,7 @@ async_timeout==3.0.1
atomicwrites==1.4.0 atomicwrites==1.4.0
attrs==21.2.0 attrs==21.2.0
awesomeversion==21.6.0 awesomeversion==21.6.0
brotli==1.0.9 brotlipy==0.7.0
cchardet==2.1.7 cchardet==2.1.7
ciso8601==2.1.3 ciso8601==2.1.3
colorlog==5.0.1 colorlog==5.0.1
@@ -11,7 +11,7 @@ cpe==1.2.1
cryptography==3.4.6 cryptography==3.4.6
debugpy==1.3.0 debugpy==1.3.0
docker==5.0.0 docker==5.0.0
gitpython==3.1.17 gitpython==3.1.18
jinja2==3.0.1 jinja2==3.0.1
pulsectl==21.5.18 pulsectl==21.5.18
pyudev==0.22.0 pyudev==0.22.0

View File

@@ -1,4 +1,4 @@
black==21.5b2 black==21.6b0
codecov==2.1.11 codecov==2.1.11
coverage==5.5 coverage==5.5
flake8-docstrings==1.6.0 flake8-docstrings==1.6.0
@@ -11,4 +11,4 @@ pytest-asyncio==0.12.0 # NB!: Versions over 0.12.0 breaks pytest-aiohttp (https:
pytest-cov==2.12.1 pytest-cov==2.12.1
pytest-timeout==1.4.2 pytest-timeout==1.4.2
pytest==6.2.4 pytest==6.2.4
pyupgrade==2.19.3 pyupgrade==2.19.4

View File

@@ -65,6 +65,7 @@ from ..utils import check_port
from ..utils.apparmor import adjust_profile from ..utils.apparmor import adjust_profile
from ..utils.json import read_json_file, write_json_file from ..utils.json import read_json_file, write_json_file
from ..utils.tar import atomic_contents_add, secure_path from ..utils.tar import atomic_contents_add, secure_path
from .const import SnapshotAddonMode
from .model import AddonModel, Data from .model import AddonModel, Data
from .options import AddonOptions from .options import AddonOptions
from .utils import remove_data from .utils import remove_data
@@ -695,6 +696,8 @@ class Addon(AddonModel):
async def snapshot(self, tar_file: tarfile.TarFile) -> None: async def snapshot(self, tar_file: tarfile.TarFile) -> None:
"""Snapshot state of an add-on.""" """Snapshot state of an add-on."""
is_running = await self.is_running()
with TemporaryDirectory(dir=self.sys_config.path_tmp) as temp: with TemporaryDirectory(dir=self.sys_config.path_tmp) as temp:
temp_path = Path(temp) temp_path = Path(temp)
@@ -744,8 +747,15 @@ class Addon(AddonModel):
arcname="data", arcname="data",
) )
if self.snapshot_pre is not None: if (
is_running
and self.snapshot_mode == SnapshotAddonMode.HOT
and self.snapshot_pre is not None
):
await self._snapshot_command(self.snapshot_pre) await self._snapshot_command(self.snapshot_pre)
elif is_running and self.snapshot_mode == SnapshotAddonMode.COLD:
_LOGGER.info("Shutdown add-on %s for cold snapshot", self.slug)
await self.instance.stop()
try: try:
_LOGGER.info("Building snapshot for add-on %s", self.slug) _LOGGER.info("Building snapshot for add-on %s", self.slug)
@@ -754,8 +764,15 @@ class Addon(AddonModel):
_LOGGER.error("Can't write tarfile %s: %s", tar_file, err) _LOGGER.error("Can't write tarfile %s: %s", tar_file, err)
raise AddonsError() from err raise AddonsError() from err
finally: finally:
if self.snapshot_post is not None: if (
is_running
and self.snapshot_mode == SnapshotAddonMode.HOT
and self.snapshot_post is not None
):
await self._snapshot_command(self.snapshot_post) await self._snapshot_command(self.snapshot_post)
elif is_running and self.snapshot_mode is SnapshotAddonMode.COLD:
_LOGGER.info("Starting add-on %s again", self.slug)
await self.start()
_LOGGER.info("Finish snapshot for addon %s", self.slug) _LOGGER.info("Finish snapshot for addon %s", self.slug)

View File

@@ -48,7 +48,7 @@ class AddonBuild(FileConfiguration, CoreSysAttributes):
def base_image(self) -> str: def base_image(self) -> str:
"""Return base image for this add-on.""" """Return base image for this add-on."""
if not self._data[ATTR_BUILD_FROM]: if not self._data[ATTR_BUILD_FROM]:
return f"homeassistant/{self.sys_arch.default}-base:latest" return f"ghcr.io/home-assistant/{self.sys_arch.default}-base:latest"
# Evaluate correct base image # Evaluate correct base image
arch = self.sys_arch.match(list(self._data[ATTR_BUILD_FROM].keys())) arch = self.sys_arch.match(list(self._data[ATTR_BUILD_FROM].keys()))

View File

@@ -0,0 +1,12 @@
"""Add-on static data."""
from enum import Enum
class SnapshotAddonMode(str, Enum):
"""Snapshot mode of an Add-on."""
HOT = "hot"
COLD = "cold"
ATTR_SNAPSHOT = "snapshot"

View File

@@ -5,6 +5,8 @@ from typing import Any, Awaitable, Dict, List, Optional
from awesomeversion import AwesomeVersion, AwesomeVersionException from awesomeversion import AwesomeVersion, AwesomeVersionException
from supervisor.addons.const import SnapshotAddonMode
from ..const import ( from ..const import (
ATTR_ADVANCED, ATTR_ADVANCED,
ATTR_APPARMOR, ATTR_APPARMOR,
@@ -30,6 +32,7 @@ from ..const import (
ATTR_HOST_PID, ATTR_HOST_PID,
ATTR_IMAGE, ATTR_IMAGE,
ATTR_INGRESS, ATTR_INGRESS,
ATTR_INGRESS_STREAM,
ATTR_INIT, ATTR_INIT,
ATTR_JOURNALD, ATTR_JOURNALD,
ATTR_KERNEL_MODULES, ATTR_KERNEL_MODULES,
@@ -76,6 +79,7 @@ from ..const import (
) )
from ..coresys import CoreSys, CoreSysAttributes from ..coresys import CoreSys, CoreSysAttributes
from ..docker.const import Capabilities from ..docker.const import Capabilities
from .const import ATTR_SNAPSHOT
from .options import AddonOptions, UiOptions from .options import AddonOptions, UiOptions
from .validate import RE_SERVICE, RE_VOLUME from .validate import RE_SERVICE, RE_VOLUME
@@ -370,6 +374,11 @@ class AddonModel(CoreSysAttributes, ABC):
"""Return post-snapshot command.""" """Return post-snapshot command."""
return self.data.get(ATTR_SNAPSHOT_POST) return self.data.get(ATTR_SNAPSHOT_POST)
@property
def snapshot_mode(self) -> SnapshotAddonMode:
"""Return if snapshot is hot/cold."""
return self.data[ATTR_SNAPSHOT]
@property @property
def default_init(self) -> bool: def default_init(self) -> bool:
"""Return True if the add-on have no own init.""" """Return True if the add-on have no own init."""
@@ -390,6 +399,11 @@ class AddonModel(CoreSysAttributes, ABC):
"""Return True if the add-on access support ingress.""" """Return True if the add-on access support ingress."""
return None return None
@property
def ingress_stream(self) -> bool:
"""Return True if post requests to ingress should be streamed."""
return self.data[ATTR_INGRESS_STREAM]
@property @property
def with_gpio(self) -> bool: def with_gpio(self) -> bool:
"""Return True if the add-on access to GPIO interface.""" """Return True if the add-on access to GPIO interface."""

View File

@@ -7,6 +7,8 @@ import uuid
import voluptuous as vol import voluptuous as vol
from supervisor.addons.const import SnapshotAddonMode
from ..const import ( from ..const import (
ARCH_ALL, ARCH_ALL,
ATTR_ACCESS_TOKEN, ATTR_ACCESS_TOKEN,
@@ -43,6 +45,7 @@ from ..const import (
ATTR_INGRESS_ENTRY, ATTR_INGRESS_ENTRY,
ATTR_INGRESS_PANEL, ATTR_INGRESS_PANEL,
ATTR_INGRESS_PORT, ATTR_INGRESS_PORT,
ATTR_INGRESS_STREAM,
ATTR_INGRESS_TOKEN, ATTR_INGRESS_TOKEN,
ATTR_INIT, ATTR_INIT,
ATTR_JOURNALD, ATTR_JOURNALD,
@@ -107,6 +110,7 @@ from ..validate import (
uuid_match, uuid_match,
version_tag, version_tag,
) )
from .const import ATTR_SNAPSHOT
from .options import RE_SCHEMA_ELEMENT from .options import RE_SCHEMA_ELEMENT
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@@ -161,6 +165,14 @@ def _warn_addon_config(config: Dict[str, Any]):
name, name,
) )
if config.get(ATTR_SNAPSHOT, SnapshotAddonMode.HOT) == SnapshotAddonMode.COLD and (
config.get(ATTR_SNAPSHOT_POST) or config.get(ATTR_SNAPSHOT_PRE)
):
_LOGGER.warning(
"Add-on which only support COLD backups trying to use post/pre commands. Please report this to the maintainer of %s",
name,
)
return config return config
@@ -248,6 +260,7 @@ _SCHEMA_ADDON_CONFIG = vol.Schema(
network_port, vol.Equal(0) network_port, vol.Equal(0)
), ),
vol.Optional(ATTR_INGRESS_ENTRY): str, vol.Optional(ATTR_INGRESS_ENTRY): str,
vol.Optional(ATTR_INGRESS_STREAM, default=False): vol.Boolean(),
vol.Optional(ATTR_PANEL_ICON, default="mdi:puzzle"): str, vol.Optional(ATTR_PANEL_ICON, default="mdi:puzzle"): str,
vol.Optional(ATTR_PANEL_TITLE): str, vol.Optional(ATTR_PANEL_TITLE): str,
vol.Optional(ATTR_PANEL_ADMIN, default=True): vol.Boolean(), vol.Optional(ATTR_PANEL_ADMIN, default=True): vol.Boolean(),
@@ -284,6 +297,9 @@ _SCHEMA_ADDON_CONFIG = vol.Schema(
vol.Optional(ATTR_SNAPSHOT_EXCLUDE): [str], vol.Optional(ATTR_SNAPSHOT_EXCLUDE): [str],
vol.Optional(ATTR_SNAPSHOT_PRE): str, vol.Optional(ATTR_SNAPSHOT_PRE): str,
vol.Optional(ATTR_SNAPSHOT_POST): str, vol.Optional(ATTR_SNAPSHOT_POST): str,
vol.Optional(ATTR_SNAPSHOT, default=SnapshotAddonMode.HOT): vol.Coerce(
SnapshotAddonMode
),
vol.Optional(ATTR_OPTIONS, default={}): dict, vol.Optional(ATTR_OPTIONS, default={}): dict,
vol.Optional(ATTR_SCHEMA, default={}): vol.Any( vol.Optional(ATTR_SCHEMA, default={}): vol.Any(
vol.Schema( vol.Schema(

View File

@@ -19,7 +19,7 @@ from .host import APIHost
from .info import APIInfo from .info import APIInfo
from .ingress import APIIngress from .ingress import APIIngress
from .jobs import APIJobs from .jobs import APIJobs
from .middleware_security import SecurityMiddleware from .middleware.security import SecurityMiddleware
from .multicast import APIMulticast from .multicast import APIMulticast
from .network import APINetwork from .network import APINetwork
from .observer import APIObserver from .observer import APIObserver
@@ -223,7 +223,6 @@ class RestAPI(CoreSysAttributes):
[ [
web.get("/hardware/info", api_hardware.info), web.get("/hardware/info", api_hardware.info),
web.get("/hardware/audio", api_hardware.audio), web.get("/hardware/audio", api_hardware.audio),
web.post("/hardware/trigger", api_hardware.trigger),
] ]
) )

View File

@@ -1,6 +1,6 @@
"""Init file for Supervisor hardware RESTful API.""" """Init file for Supervisor hardware RESTful API."""
import logging import logging
from typing import Any, Awaitable, Dict from typing import Any, Dict
from aiohttp import web from aiohttp import web
@@ -58,8 +58,3 @@ class APIHardware(CoreSysAttributes):
}, },
} }
} }
@api_process
async def trigger(self, request: web.Request) -> Awaitable[None]:
"""Trigger a udev device reload."""
_LOGGER.debug("Ignoring DEPRECATED hardware trigger function call.")

View File

@@ -5,7 +5,7 @@ import logging
from typing import Any, Dict, Union from typing import Any, Dict, Union
import aiohttp import aiohttp
from aiohttp import hdrs, web from aiohttp import ClientTimeout, hdrs, web
from aiohttp.web_exceptions import ( from aiohttp.web_exceptions import (
HTTPBadGateway, HTTPBadGateway,
HTTPServiceUnavailable, HTTPServiceUnavailable,
@@ -162,9 +162,18 @@ class APIIngress(CoreSysAttributes):
) -> Union[web.Response, web.StreamResponse]: ) -> Union[web.Response, web.StreamResponse]:
"""Ingress route for request.""" """Ingress route for request."""
url = self._create_url(addon, path) url = self._create_url(addon, path)
data = await request.read()
source_header = _init_header(request, addon) source_header = _init_header(request, addon)
# Passing the raw stream breaks requests for some webservers
# since we just need it for POST requests really, for all other methods
# we read the bytes and pass that to the request to the add-on
# add-ons needs to add support with that in the configuration
data = (
request.content
if request.method == "POST" and addon.ingress_stream
else await request.read()
)
async with self.sys_websession.request( async with self.sys_websession.request(
request.method, request.method,
url, url,
@@ -172,6 +181,7 @@ class APIIngress(CoreSysAttributes):
params=request.query, params=request.query,
allow_redirects=False, allow_redirects=False,
data=data, data=data,
timeout=ClientTimeout(total=None),
) as result: ) as result:
headers = _response_header(result) headers = _response_header(result)
@@ -219,6 +229,7 @@ def _init_header(
if name in ( if name in (
hdrs.CONTENT_LENGTH, hdrs.CONTENT_LENGTH,
hdrs.CONTENT_ENCODING, hdrs.CONTENT_ENCODING,
hdrs.TRANSFER_ENCODING,
hdrs.SEC_WEBSOCKET_EXTENSIONS, hdrs.SEC_WEBSOCKET_EXTENSIONS,
hdrs.SEC_WEBSOCKET_PROTOCOL, hdrs.SEC_WEBSOCKET_PROTOCOL,
hdrs.SEC_WEBSOCKET_VERSION, hdrs.SEC_WEBSOCKET_VERSION,

View File

@@ -0,0 +1 @@
"""API middleware for aiohttp."""

View File

@@ -5,7 +5,7 @@ import re
from aiohttp.web import Request, RequestHandler, Response, middleware from aiohttp.web import Request, RequestHandler, Response, middleware
from aiohttp.web_exceptions import HTTPForbidden, HTTPUnauthorized from aiohttp.web_exceptions import HTTPForbidden, HTTPUnauthorized
from ..const import ( from ...const import (
REQUEST_FROM, REQUEST_FROM,
ROLE_ADMIN, ROLE_ADMIN,
ROLE_BACKUP, ROLE_BACKUP,
@@ -14,8 +14,8 @@ from ..const import (
ROLE_MANAGER, ROLE_MANAGER,
CoreState, CoreState,
) )
from ..coresys import CoreSys, CoreSysAttributes from ...coresys import CoreSys, CoreSysAttributes
from .utils import api_return_error, excract_supervisor_token from ..utils import api_return_error, excract_supervisor_token
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@@ -53,7 +53,6 @@ ADDONS_API_BYPASS = re.compile(
r"|/addons/self/(?!security|update)[^/]+" r"|/addons/self/(?!security|update)[^/]+"
r"|/addons/self/options/config" r"|/addons/self/options/config"
r"|/info" r"|/info"
r"|/hardware/trigger"
r"|/services.*" r"|/services.*"
r"|/discovery.*" r"|/discovery.*"
r"|/auth" r"|/auth"
@@ -65,22 +64,24 @@ ADDONS_ROLE_ACCESS = {
ROLE_DEFAULT: re.compile( ROLE_DEFAULT: re.compile(
r"^(?:" r"^(?:"
r"|/.+/info" r"|/.+/info"
r"|/addons"
r")$" r")$"
), ),
ROLE_HOMEASSISTANT: re.compile( ROLE_HOMEASSISTANT: re.compile(
r"^(?:" r"^(?:"
r"|/.+/info"
r"|/core/.+" r"|/core/.+"
r"|/homeassistant/.+" r"|/homeassistant/.+"
r")$" r")$"
), ),
ROLE_BACKUP: re.compile( ROLE_BACKUP: re.compile(
r"^(?:" r"^(?:"
r"|/.+/info"
r"|/snapshots.*" r"|/snapshots.*"
r")$" r")$"
), ),
ROLE_MANAGER: re.compile( ROLE_MANAGER: re.compile(
r"^(?:" r"^(?:"
r"|/.+/info"
r"|/addons(?:/[^/]+/(?!security).+|/reload)?" r"|/addons(?:/[^/]+/(?!security).+|/reload)?"
r"|/audio/.+" r"|/audio/.+"
r"|/auth/cache" r"|/auth/cache"
@@ -101,6 +102,7 @@ ADDONS_ROLE_ACCESS = {
r"|/snapshots.*" r"|/snapshots.*"
r"|/store.*" r"|/store.*"
r"|/supervisor/.+" r"|/supervisor/.+"
r"|/security/.+"
r")$" r")$"
), ),
ROLE_ADMIN: re.compile( ROLE_ADMIN: re.compile(
@@ -191,6 +193,10 @@ class SecurityMiddleware(CoreSysAttributes):
request_from = addon request_from = addon
else: else:
_LOGGER.warning("%s no role for %s", request.path, addon.slug) _LOGGER.warning("%s no role for %s", request.path, addon.slug)
elif addon:
_LOGGER.warning(
"%s missing API permission for %s", addon.slug, request.path
)
if request_from: if request_from:
request[REQUEST_FROM] = request_from request[REQUEST_FROM] = request_from

View File

@@ -1,9 +1,9 @@
try { try {
new Function("import('/api/hassio/app/frontend_latest/entrypoint.586ea840.js')")(); new Function("import('/api/hassio/app/frontend_latest/entrypoint.0d3c68f7.js')")();
} catch (err) { } catch (err) {
var el = document.createElement('script'); var el = document.createElement('script');
el.src = '/api/hassio/app/frontend_es5/entrypoint.8daaaeda.js'; el.src = '/api/hassio/app/frontend_es5/entrypoint.9e377d5a.js';
document.body.appendChild(el); document.body.appendChild(el);
} }

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.180b0a3f7ae5fc62f9e4.js","sources":["webpack://home-assistant-frontend/chunk.180b0a3f7ae5fc62f9e4.js"],"mappings":"AAAA","sourceRoot":""}

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.35c154979120736d0193.js","sources":["webpack://home-assistant-frontend/chunk.35c154979120736d0193.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.36c614645dd4e17cedb3.js","sources":["webpack://home-assistant-frontend/chunk.36c614645dd4e17cedb3.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.59c74b66dacd491cc21f.js","sources":["webpack://home-assistant-frontend/chunk.59c74b66dacd491cc21f.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.78121a52537052b2b5cf.js","sources":["webpack://home-assistant-frontend/chunk.78121a52537052b2b5cf.js"],"mappings":";AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.936c888555134e76dc1e.js","sources":["webpack://home-assistant-frontend/chunk.936c888555134e76dc1e.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.a249d520500f6fad60b1.js","sources":["webpack://home-assistant-frontend/chunk.a249d520500f6fad60b1.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.ba6f1a3202815ae73338.js","sources":["webpack://home-assistant-frontend/chunk.ba6f1a3202815ae73338.js"],"mappings":"AAAA","sourceRoot":""}

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.bd47f88f5d2c285fbc78.js","sources":["webpack://home-assistant-frontend/chunk.bd47f88f5d2c285fbc78.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.c7c74d7ba8aa6ae309d1.js","sources":["webpack://home-assistant-frontend/chunk.c7c74d7ba8aa6ae309d1.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.c8ae6493ca3f230a78cf.js","sources":["webpack://home-assistant-frontend/chunk.c8ae6493ca3f230a78cf.js"],"mappings":"AAAA","sourceRoot":""}

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.cb15e7ebc34918f41b9b.js","sources":["webpack://home-assistant-frontend/chunk.cb15e7ebc34918f41b9b.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.e3438695380b5c3cf915.js","sources":["webpack://home-assistant-frontend/chunk.e3438695380b5c3cf915.js"],"mappings":"AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"entrypoint.8daaaeda.js","sources":["webpack://home-assistant-frontend/entrypoint.8daaaeda.js"],"mappings":";AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -13,8 +13,6 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */ ***************************************************************************** */
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
/** /**
* @license * @license
* Copyright 2017 Google LLC * Copyright 2017 Google LLC

View File

@@ -0,0 +1 @@
{"version":3,"file":"entrypoint.9e377d5a.js","sources":["webpack://home-assistant-frontend/entrypoint.9e377d5a.js"],"mappings":";AAAA","sourceRoot":""}

View File

@@ -1,3 +1,3 @@
{ {
"entrypoint.js": "/api/hassio/app/frontend_es5/entrypoint.8daaaeda.js" "entrypoint.js": "/api/hassio/app/frontend_es5/entrypoint.9e377d5a.js"
} }

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.06111c56068f5b7f6c10.js","sources":["webpack://home-assistant-frontend/chunk.06111c56068f5b7f6c10.js"],"mappings":";AAAA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.1fe3be586e0ecf2c327a.js","sources":["webpack://home-assistant-frontend/chunk.1fe3be586e0ecf2c327a.js"],"mappings":"AAAA;;;;AAqNA;AACA;;;;AAIA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;;;;AAKA;;;AAGA;AACA;;;AAGA;;;;;;AA3CA;;;;;;;;;;;;;;AAwEA","sourceRoot":""}

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.207d75acb526e7ab7c80.js","sources":["webpack://home-assistant-frontend/chunk.207d75acb526e7ab7c80.js"],"mappings":"AAAA;AAqqBA;AACA;AACA;AAGA;;;;;;;;;;;;;;;;AAyBA;AA0QA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;;AAGA;;AAEA;;;AAGA;;;;AAIA;;AAEA;;;AAGA;;;;;AAKA;AACA;;AAEA;;AAEA;AACA;;;;;AAKA;AACA;;;;AAMA;AACA;;AAEA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;;;;AAIA;;AAEA;;;AAGA;AACA;;;AAGA;AACA;;;AAGA;AACA;;;AAGA;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA;AAsDA;AACA;AACA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;AAKA","sourceRoot":""}

View File

@@ -39,7 +39,7 @@
</p>`} </p>`}
${this._error?i.dy`<p class="error">${this._error}</p>`:""} ${this._error?i.dy`<p class="error">${this._error}</p>`:""}
</ha-dialog> </ha-dialog>
`:i.dy``}},{kind:"method",key:"_toggleSnapshot",value:function(){this._createSnapshot=!this._createSnapshot}},{kind:"method",key:"_update",value:async function(){if(this._createSnapshot){this._action="snapshot";try{await(0,s.iN)(this.hass,this._dialogParams.snapshotParams)}catch(e){return this._error=(0,a.js)(e),void(this._action=null)}}this._action="update";try{await this._dialogParams.updateHandler()}catch(e){return this.hass.connection.connected&&!(0,a.yz)(e)&&(this._error=(0,a.js)(e)),void(this._action=null)}this.closeDialog()}},{kind:"get",static:!0,key:"styles",value:function(){return[l.Qx,l.yu,i.iv` `:i.dy``}},{kind:"method",key:"_toggleSnapshot",value:function(){this._createSnapshot=!this._createSnapshot}},{kind:"method",key:"_update",value:async function(){if(this._createSnapshot){this._action="snapshot";try{await(0,s.iN)(this.hass,this._dialogParams.snapshotParams)}catch(e){return this._error=(0,a.js)(e),void(this._action=null)}}this._action="update";try{await this._dialogParams.updateHandler()}catch(e){return void(this.hass.connection.connected&&!(0,a.yz)(e)&&(this._error=(0,a.js)(e),this._action=null))}this.closeDialog()}},{kind:"get",static:!0,key:"styles",value:function(){return[l.Qx,l.yu,i.iv`
.form { .form {
color: var(--primary-text-color); color: var(--primary-text-color);
} }
@@ -59,4 +59,4 @@
text-align: center; text-align: center;
} }
`]}}]}}),i.oi)}}]); `]}}]}}),i.oi)}}]);
//# sourceMappingURL=chunk.5a6ec0bde8ac85b43894.js.map //# sourceMappingURL=chunk.342edcac6840583a8f96.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"chunk.5a6ec0bde8ac85b43894.js","sources":["webpack://home-assistant-frontend/chunk.5a6ec0bde8ac85b43894.js"],"mappings":"AAAA;AA4JA;AACA;;AAEA;;;;AAIA;;;;;AAKA;;;AAGA;;;AAGA;;AAEA;;;;AAIA;AACA;;;AAGA;AACA;;;AAGA;AACA;;;AAGA;;AAEA;;AA1CA;;;;;;;;;;;;;;;;;;;AA+GA","sourceRoot":""} {"version":3,"file":"chunk.342edcac6840583a8f96.js","sources":["webpack://home-assistant-frontend/chunk.342edcac6840583a8f96.js"],"mappings":"AAAA;AA4JA;AACA;;AAEA;;;;AAIA;;;;;AAKA;;;AAGA;;;AAGA;;AAEA;;;;AAIA;AACA;;;AAGA;AACA;;;AAGA;AACA;;;AAGA;;AAEA;;AA1CA;;;;;;;;;;;;;;;;;;;AA+GA","sourceRoot":""}

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.5598c951cccebf59265c.js","sources":["webpack://home-assistant-frontend/chunk.5598c951cccebf59265c.js"],"mappings":"AAAA;AAqqBA;AACA;AACA;AAGA;;;;;;;;;;;;;;;;;AA0BA;AAmOA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;;;AAIA;;;AAGA;;;AAGA;;;;;AAKA;;;AAGA;;;AAGA;;;;;AAKA;AACA;;AAEA;;AAEA;AACA;;;;;AAKA;AACA;;;;AAMA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;;;AAIA;;AAEA;;;AAGA;AACA;;;AAGA;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA;AAgDA;AACA;AACA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;;;AAKA","sourceRoot":""}

View File

@@ -22,10 +22,10 @@
${this._dialogParams.supervisor.localize("snapshot.create")} ${this._dialogParams.supervisor.localize("snapshot.create")}
</mwc-button> </mwc-button>
</ha-dialog> </ha-dialog>
`:i.dy``}},{kind:"method",key:"_createSnapshot",value:async function(){if("running"!==this._dialogParams.supervisor.info.state)return void(0,c.Ys)(this,{title:this._dialogParams.supervisor.localize("snapshot.could_not_create"),text:this._dialogParams.supervisor.localize("snapshot.create_blocked_not_running","state",this._dialogParams.supervisor.info.state)});const e=this._snapshotContent.snapshotDetails();if(this._creatingSnapshot=!0,this._error="",this._snapshotContent.snapshotHasPassword&&!this._snapshotContent.snapshotPassword.length)return this._error=this._dialogParams.supervisor.localize("snapshot.enter_password"),void(this._creatingSnapshot=!1);try{"full"===this._snapshotContent.snapshotType?await(0,l.a2)(this.hass,e):await(0,l.iN)(this.hass,e),this._dialogParams.onCreate(),this.closeDialog()}catch(e){this._error=(0,a.js)(e)}this._creatingSnapshot=!1}},{kind:"get",static:!0,key:"styles",value:function(){return[d.Qx,d.yu,i.iv` `:i.dy``}},{kind:"method",key:"_createSnapshot",value:async function(){if("running"!==this._dialogParams.supervisor.info.state)return void(0,c.Ys)(this,{title:this._dialogParams.supervisor.localize("snapshot.could_not_create"),text:this._dialogParams.supervisor.localize("snapshot.create_blocked_not_running","state",this._dialogParams.supervisor.info.state)});const e=this._snapshotContent.snapshotDetails();if(this._creatingSnapshot=!0,this._error="",e.password&&!e.password.length)return this._error=this._dialogParams.supervisor.localize("snapshot.enter_password"),void(this._creatingSnapshot=!1);if(e.password&&e.password!==e.confirm_password)return this._error=this._dialogParams.supervisor.localize("snapshot.passwords_not_matching"),void(this._creatingSnapshot=!1);delete e.confirm_password;try{"full"===this._snapshotContent.snapshotType?await(0,l.a2)(this.hass,e):await(0,l.iN)(this.hass,e),this._dialogParams.onCreate(),this.closeDialog()}catch(e){this._error=(0,a.js)(e)}this._creatingSnapshot=!1}},{kind:"get",static:!0,key:"styles",value:function(){return[d.Qx,d.yu,i.iv`
ha-circular-progress { ha-circular-progress {
display: block; display: block;
text-align: center; text-align: center;
} }
`]}}]}}),i.oi)}}]); `]}}]}}),i.oi)}}]);
//# sourceMappingURL=chunk.6ea5225840eebdecf9f4.js.map //# sourceMappingURL=chunk.58ccbbcd7a2d185c5a5d.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.58ccbbcd7a2d185c5a5d.js","sources":["webpack://home-assistant-frontend/chunk.58ccbbcd7a2d185c5a5d.js"],"mappings":"AAAA;;;;AAuIA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;;AAxBA;;;;;AA0FA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.5d46f709c2effa2a3af5.js","sources":["webpack://home-assistant-frontend/chunk.5d46f709c2effa2a3af5.js"],"mappings":"AAAA;;;;AA0MA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;;;;;;;AAQA;AACA;;;AAGA;;;;;;AAjCA;;;;;;;;AAwDA","sourceRoot":""}

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.6ea5225840eebdecf9f4.js","sources":["webpack://home-assistant-frontend/chunk.6ea5225840eebdecf9f4.js"],"mappings":"AAAA;;;;AAuIA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;;AAxBA;;;;;AAkFA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"chunk.9b1e5f0529cd61352928.js","sources":["webpack://home-assistant-frontend/chunk.9b1e5f0529cd61352928.js"],"mappings":"AAAA;;;;;AAiJA;AACA;;;;AAIA;;;AAGA;;;;;AAKA;AACA;AACA;;;;;AAKA;AACA;AACA;;;;;AAKA;;AAEA;;;;AAIA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA;;;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA","sourceRoot":""}

View File

@@ -1 +1 @@
{"version":3,"file":"chunk.d1bf586cab064970bcb1.js","sources":["webpack://home-assistant-frontend/chunk.d1bf586cab064970bcb1.js"],"mappings":"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","sourceRoot":""} {"version":3,"file":"chunk.abe8714eb54d8d9a6780.js","sources":["webpack://home-assistant-frontend/chunk.abe8714eb54d8d9a6780.js"],"mappings":"AAAA;;AAsMA;;;AAGA;AACA;;AAEA;AACA;;;;;AAKA;;AAEA;AACA;AACA;;;;;;AAMA;AACA;;;;;AAKA;;AAEA;AACA;AACA;;;;;;;AAOA;AACA;;;;AAMA;;;;;;;;;;;;;;;;AAuBA;AAuOA;AACA;;AAIA;;;;;AAsBA;;;;;;;AAmGA;;AA2FA;AACA;AACA;AACA;AACA;;AAEA;;AAIA;;AAkOA;;AAEA;;AAEA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;;;AAIA;;;AAGA;AACA;AACA;AACA;AACA;;AAIA;;;;;;;;AAgDA;;;;;;;;AAwHA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;AAIA;AAIA;;AAEA;;;AAGA;;;;;AAQA;;;;;;;;;;;;;;;AAwEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuOA;;AA6YA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAWA;;AAyLA;AACA;AACA;;AAMA;AA2GA;;;;AAIA;AACA;;AAIA;AACA;AACA;;;;;AAOA;;;;AAqCA;;AAyGA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAOA;;;AAGA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAIA;;;;;AAkDA;AA0GA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAMA;AACA;;AAEA;;AAEA;AACA;AASA;;;;AAsDA;;;;AAoRA;AA6IA;;AAEA;;AAEA;AACA;;AAIA;AAqOA;;;;AAIA;;;AAGA;;AAEA;;AAEA;AACA;;;AAGA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;AAIA;;AAEA;;;AAGA;AACA;;;AAGA;;;AAGA;AACA;;AAEA;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6MA;;AAgHA;;;AAGA;AACA;;;;;AAKA;;;AAGA;;AAEA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;;;;AAIA;;;;;;;AAOA;AACA;;AAEA;AACA;;;;AA5CA;;;;;;;;;;;;;;;AA4LA;;AAyFA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAIA;;;;;;;;;;;AAoBA;;;AAmHA;;AAEA;;;;AARA;;;;;;;;;;;;AAiCA;;AAqIA;AACA;AACA;;;AAKA;;;;AA2CA;;;;AA4FA;;;AAMA;AACA;;;AAGA;;AAEA;;AAKA;;AAEA;;AAEA;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6EA;AAwLA;;AAEA;;;;AAIA;AACA;AACA;AACA;;;AAGA;;AAMA;;AANA;;AAEA;;AAMA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;;AAEA;;;AAGA;;;AAGA;AACA;;;;;;;;;;AAUA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;;;AAIA;AACA;AACA;;AAEA;;;AAGA;AACA;;;;;AAKA;AACA;AACA;;;;;AAKA;;;AAGA;;AAEA;;AAEA;AACA;AAIA;;AAEA;;;;AAIA;;AAEA;AACA;;AAEA;AAKA;;AAEA;;;;AAIA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;;AAGA;;;AAGA;;AAEA;;AAKA;;AAEA;;;AAGA;;;AAGA;AACA;;;;;AAKA;AACA;;AAEA;;;AAGA;;;AAGA;AACA;;;;AAIA;AACA;AACA;;AAEA;;;AAGA;;;AAGA;AACA;;;;AAIA;AACA;AACA;;AAEA;;;AAGA;;;AAGA;AACA;;;;AAIA;AACA;AACA;;AAEA;;;AAGA;;;AAGA;AACA;;;;AAIA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAKA;AACA;AACA;;AAGA;;;AAGA;AACA;;AAMA;;AANA;;AAEA;;;;;;AAUA;;;AAGA;;AAEA;;;;AAIA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;;AAKA;;AAEA;;;;;;AAMA;;;AAGA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;;;;;AAKA;;;;AAIA;;;;AAIA;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAijBA;;;AA4FA;AACA;AACA;AACA;;;AATA;;;;;;AA6BA;AA4GA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;;;;AAMA;;;;;;;;;AAgBA;;;AAyGA;AACA;AACA;;;AARA;;;;;;AA4BA;AA8PA;AAIA;;AAkCA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA;AA6UA;AACA;AACA;AANA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"file":"chunk.f31c7a14d3f583802ab5.js","sources":["webpack://home-assistant-frontend/chunk.f31c7a14d3f583802ab5.js"],"mappings":"AAAA;AA0PA;AACA;AACA;AANA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA","sourceRoot":""}

View File

@@ -13,8 +13,6 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */ ***************************************************************************** */
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
/** /**
* @license * @license
* Copyright 2016 Google Inc. * Copyright 2016 Google Inc.

Some files were not shown because too many files have changed in this diff Show More