mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-09-01 04:10:21 +00:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7c6c982414 | ||
![]() |
07eeb2eaf2 | ||
![]() |
223f5b7bb1 | ||
![]() |
8a9657c452 | ||
![]() |
564e9811d0 | ||
![]() |
b944b52b21 | ||
![]() |
24aecdddf3 | ||
![]() |
7bbfb60039 | ||
![]() |
ece40008c7 | ||
![]() |
0177b38ded | ||
![]() |
16f2f63081 | ||
![]() |
5f376c2a27 | ||
![]() |
90a6f109ee | ||
![]() |
e6fd0ef5dc | ||
![]() |
d46ab56901 | ||
![]() |
3b1ad5c0cd | ||
![]() |
de8a241e72 | ||
![]() |
a4a0b43d91 | ||
![]() |
adf355e54f | ||
![]() |
4f9e646b4c | ||
![]() |
ce57d384ca | ||
![]() |
d53d526673 | ||
![]() |
cd8fc16bcb | ||
![]() |
6b58970354 |
4
.github/workflows/builder.yml
vendored
4
.github/workflows/builder.yml
vendored
@@ -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 }}
|
||||||
|
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
Submodule home-assistant-polymer updated: a45b8ca8e7...446a9b5c02
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
|
||||||
|
@@ -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()))
|
||||||
|
12
supervisor/addons/const.py
Normal file
12
supervisor/addons/const.py
Normal 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"
|
@@ -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."""
|
||||||
|
@@ -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(
|
||||||
|
@@ -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),
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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.")
|
|
||||||
|
@@ -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,
|
||||||
|
1
supervisor/api/middleware/__init__.py
Normal file
1
supervisor/api/middleware/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
"""API middleware for aiohttp."""
|
@@ -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
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"chunk.180b0a3f7ae5fc62f9e4.js","sources":["webpack://home-assistant-frontend/chunk.180b0a3f7ae5fc62f9e4.js"],"mappings":"AAAA","sourceRoot":""}
|
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
@@ -0,0 +1 @@
|
|||||||
|
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
|
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"chunk.ba6f1a3202815ae73338.js","sources":["webpack://home-assistant-frontend/chunk.ba6f1a3202815ae73338.js"],"mappings":"AAAA","sourceRoot":""}
|
|
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"chunk.c8ae6493ca3f230a78cf.js","sources":["webpack://home-assistant-frontend/chunk.c8ae6493ca3f230a78cf.js"],"mappings":"AAAA","sourceRoot":""}
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"entrypoint.8daaaeda.js","sources":["webpack://home-assistant-frontend/entrypoint.8daaaeda.js"],"mappings":";AAAA","sourceRoot":""}
|
|
3
supervisor/api/panel/frontend_es5/entrypoint.9e377d5a.js
Normal file
3
supervisor/api/panel/frontend_es5/entrypoint.9e377d5a.js
Normal file
File diff suppressed because one or more lines are too long
@@ -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
|
BIN
supervisor/api/panel/frontend_es5/entrypoint.9e377d5a.js.gz
Normal file
BIN
supervisor/api/panel/frontend_es5/entrypoint.9e377d5a.js.gz
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"entrypoint.9e377d5a.js","sources":["webpack://home-assistant-frontend/entrypoint.9e377d5a.js"],"mappings":";AAAA","sourceRoot":""}
|
@@ -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
@@ -0,0 +1 @@
|
|||||||
|
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
|
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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":""}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -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":""}
|
@@ -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
|
Binary file not shown.
@@ -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":""}
|
Binary file not shown.
@@ -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":""}
|
|
@@ -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
|
Binary file not shown.
@@ -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":""}
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -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":""}
|
|
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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":""}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -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":"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","sourceRoot":""}
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -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":""}
|
|
File diff suppressed because one or more lines are too long
@@ -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
Reference in New Issue
Block a user