mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-25 18:16:32 +00:00
commit
3a4ef6ceb3
27
.github/lock.yml
vendored
Normal file
27
.github/lock.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
|
||||||
|
|
||||||
|
# Number of days of inactivity before a closed issue or pull request is locked
|
||||||
|
daysUntilLock: 1
|
||||||
|
|
||||||
|
# Skip issues and pull requests created before a given timestamp. Timestamp must
|
||||||
|
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
|
||||||
|
skipCreatedBefore: 2020-01-01
|
||||||
|
|
||||||
|
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
|
||||||
|
exemptLabels: []
|
||||||
|
|
||||||
|
# Label to add before locking, such as `outdated`. Set to `false` to disable
|
||||||
|
lockLabel: false
|
||||||
|
|
||||||
|
# Comment to post before locking. Set to `false` to disable
|
||||||
|
lockComment: false
|
||||||
|
|
||||||
|
# Assign `resolved` as the reason for locking. Set to `false` to disable
|
||||||
|
setLockReason: false
|
||||||
|
|
||||||
|
# Limit to only `issues` or `pulls`
|
||||||
|
only: pulls
|
||||||
|
|
||||||
|
# Optionally, specify configuration settings just for `issues` or `pulls`
|
||||||
|
issues:
|
||||||
|
daysUntilLock: 30
|
1
API.md
1
API.md
@ -410,7 +410,6 @@ Output is the raw Docker log.
|
|||||||
"last_version": "Optional for custom image|null",
|
"last_version": "Optional for custom image|null",
|
||||||
"port": "port for access hass",
|
"port": "port for access hass",
|
||||||
"ssl": "bool",
|
"ssl": "bool",
|
||||||
"password": "",
|
|
||||||
"refresh_token": "",
|
"refresh_token": "",
|
||||||
"watchdog": "bool",
|
"watchdog": "bool",
|
||||||
"wait_boot": 600
|
"wait_boot": 600
|
||||||
|
@ -4,153 +4,151 @@ trigger:
|
|||||||
batch: true
|
batch: true
|
||||||
branches:
|
branches:
|
||||||
include:
|
include:
|
||||||
- master
|
- master
|
||||||
- dev
|
- dev
|
||||||
tags:
|
tags:
|
||||||
include:
|
include:
|
||||||
- '*'
|
- "*"
|
||||||
exclude:
|
exclude:
|
||||||
- untagged*
|
- untagged*
|
||||||
pr:
|
pr:
|
||||||
- dev
|
- dev
|
||||||
variables:
|
variables:
|
||||||
- name: basePythonTag
|
- name: basePythonTag
|
||||||
value: '3.7-alpine3.10'
|
value: "3.7-alpine3.11"
|
||||||
- name: versionHadolint
|
- name: versionHadolint
|
||||||
value: 'v1.16.3'
|
value: "v1.16.3"
|
||||||
- name: versionBuilder
|
- name: versionBuilder
|
||||||
value: '4.4'
|
value: "4.4"
|
||||||
- name: versionWheels
|
- name: versionWheels
|
||||||
value: '1.0-3.7-alpine3.10'
|
value: "1.6-3.7-alpine3.11"
|
||||||
- group: docker
|
- group: docker
|
||||||
- group: wheels
|
- group: wheels
|
||||||
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
|
- stage: "Test"
|
||||||
|
jobs:
|
||||||
|
- job: "Tox"
|
||||||
|
pool:
|
||||||
|
vmImage: "ubuntu-latest"
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
displayName: "Use Python 3.7"
|
||||||
|
inputs:
|
||||||
|
versionSpec: "3.7"
|
||||||
|
- script: pip install tox
|
||||||
|
displayName: "Install Tox"
|
||||||
|
- script: tox
|
||||||
|
displayName: "Run Tox"
|
||||||
|
- job: "JQ"
|
||||||
|
pool:
|
||||||
|
vmImage: "ubuntu-latest"
|
||||||
|
steps:
|
||||||
|
- script: sudo apt-get install -y jq
|
||||||
|
displayName: "Install JQ"
|
||||||
|
- bash: |
|
||||||
|
shopt -s globstar
|
||||||
|
cat **/*.json | jq '.'
|
||||||
|
displayName: "Run JQ"
|
||||||
|
- job: "Hadolint"
|
||||||
|
pool:
|
||||||
|
vmImage: "ubuntu-latest"
|
||||||
|
steps:
|
||||||
|
- script: sudo docker pull hadolint/hadolint:$(versionHadolint)
|
||||||
|
displayName: "Install Hadolint"
|
||||||
|
- script: |
|
||||||
|
sudo docker run --rm -i \
|
||||||
|
-v $(pwd)/.hadolint.yaml:/.hadolint.yaml:ro \
|
||||||
|
hadolint/hadolint:$(versionHadolint) < Dockerfile
|
||||||
|
displayName: "Run Hadolint"
|
||||||
|
|
||||||
- stage: 'Test'
|
- stage: "Wheels"
|
||||||
jobs:
|
jobs:
|
||||||
- job: 'Tox'
|
- job: "Wheels"
|
||||||
pool:
|
condition: eq(variables['Build.SourceBranchName'], 'dev')
|
||||||
vmImage: 'ubuntu-latest'
|
timeoutInMinutes: 360
|
||||||
steps:
|
pool:
|
||||||
- task: UsePythonVersion@0
|
vmImage: "ubuntu-latest"
|
||||||
displayName: 'Use Python 3.7'
|
strategy:
|
||||||
inputs:
|
maxParallel: 5
|
||||||
versionSpec: '3.7'
|
matrix:
|
||||||
- script: pip install tox
|
amd64:
|
||||||
displayName: 'Install Tox'
|
buildArch: "amd64"
|
||||||
- script: tox
|
i386:
|
||||||
displayName: 'Run Tox'
|
buildArch: "i386"
|
||||||
- job: 'JQ'
|
armhf:
|
||||||
pool:
|
buildArch: "armhf"
|
||||||
vmImage: 'ubuntu-latest'
|
armv7:
|
||||||
steps:
|
buildArch: "armv7"
|
||||||
- script: sudo apt-get install -y jq
|
aarch64:
|
||||||
displayName: 'Install JQ'
|
buildArch: "aarch64"
|
||||||
- bash: |
|
steps:
|
||||||
shopt -s globstar
|
- script: |
|
||||||
cat **/*.json | jq '.'
|
sudo apt-get update
|
||||||
displayName: 'Run JQ'
|
sudo apt-get install -y --no-install-recommends \
|
||||||
- job: 'Hadolint'
|
qemu-user-static \
|
||||||
pool:
|
binfmt-support \
|
||||||
vmImage: 'ubuntu-latest'
|
curl
|
||||||
steps:
|
|
||||||
- script: sudo docker pull hadolint/hadolint:$(versionHadolint)
|
|
||||||
displayName: 'Install Hadolint'
|
|
||||||
- script: |
|
|
||||||
sudo docker run --rm -i \
|
|
||||||
-v $(pwd)/.hadolint.yaml:/.hadolint.yaml:ro \
|
|
||||||
hadolint/hadolint:$(versionHadolint) < Dockerfile
|
|
||||||
displayName: 'Run Hadolint'
|
|
||||||
|
|
||||||
- stage: 'Wheels'
|
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
|
||||||
jobs:
|
sudo update-binfmts --enable qemu-arm
|
||||||
- job: 'Wheels'
|
sudo update-binfmts --enable qemu-aarch64
|
||||||
condition: eq(variables['Build.SourceBranchName'], 'dev')
|
displayName: "Initial cross build"
|
||||||
timeoutInMinutes: 360
|
- script: |
|
||||||
pool:
|
mkdir -p .ssh
|
||||||
vmImage: 'ubuntu-latest'
|
echo -e "-----BEGIN RSA PRIVATE KEY-----\n$(wheelsSSH)\n-----END RSA PRIVATE KEY-----" >> .ssh/id_rsa
|
||||||
strategy:
|
ssh-keyscan -H $(wheelsHost) >> .ssh/known_hosts
|
||||||
maxParallel: 5
|
chmod 600 .ssh/*
|
||||||
matrix:
|
displayName: "Install ssh key"
|
||||||
amd64:
|
- script: sudo docker pull homeassistant/$(buildArch)-wheels:$(versionWheels)
|
||||||
buildArch: 'amd64'
|
displayName: "Install wheels builder"
|
||||||
i386:
|
- script: |
|
||||||
buildArch: 'i386'
|
sudo docker run --rm -v $(pwd):/data:ro -v $(pwd)/.ssh:/root/.ssh:rw \
|
||||||
armhf:
|
homeassistant/$(buildArch)-wheels:$(versionWheels) \
|
||||||
buildArch: 'armhf'
|
--apk "build-base;libffi-dev;openssl-dev" \
|
||||||
armv7:
|
--index $(wheelsIndex) \
|
||||||
buildArch: 'armv7'
|
--requirement requirements.txt \
|
||||||
aarch64:
|
--upload rsync \
|
||||||
buildArch: 'aarch64'
|
--remote wheels@$(wheelsHost):/opt/wheels
|
||||||
steps:
|
displayName: "Run wheels build"
|
||||||
- script: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y --no-install-recommends \
|
|
||||||
qemu-user-static \
|
|
||||||
binfmt-support \
|
|
||||||
curl
|
|
||||||
|
|
||||||
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
|
- stage: "Deploy"
|
||||||
sudo update-binfmts --enable qemu-arm
|
jobs:
|
||||||
sudo update-binfmts --enable qemu-aarch64
|
- job: "VersionValidate"
|
||||||
displayName: 'Initial cross build'
|
condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), eq(variables['Build.SourceBranchName'], 'dev'))
|
||||||
- script: |
|
pool:
|
||||||
mkdir -p .ssh
|
vmImage: "ubuntu-latest"
|
||||||
echo -e "-----BEGIN RSA PRIVATE KEY-----\n$(wheelsSSH)\n-----END RSA PRIVATE KEY-----" >> .ssh/id_rsa
|
steps:
|
||||||
ssh-keyscan -H $(wheelsHost) >> .ssh/known_hosts
|
- task: UsePythonVersion@0
|
||||||
chmod 600 .ssh/*
|
displayName: "Use Python 3.7"
|
||||||
displayName: 'Install ssh key'
|
inputs:
|
||||||
- script: sudo docker pull homeassistant/$(buildArch)-wheels:$(versionWheels)
|
versionSpec: "3.7"
|
||||||
displayName: 'Install wheels builder'
|
- script: |
|
||||||
- script: |
|
setup_version="$(python setup.py -V)"
|
||||||
sudo docker run --rm -v $(pwd):/data:ro -v $(pwd)/.ssh:/root/.ssh:rw \
|
branch_version="$(Build.SourceBranchName)"
|
||||||
homeassistant/$(buildArch)-wheels:$(versionWheels) \
|
|
||||||
--apk "build-base;libffi-dev;openssl-dev" \
|
|
||||||
--index $(wheelsIndex) \
|
|
||||||
--requirement requirements.txt \
|
|
||||||
--upload rsync \
|
|
||||||
--remote wheels@$(wheelsHost):/opt/wheels
|
|
||||||
displayName: 'Run wheels build'
|
|
||||||
|
|
||||||
- stage: 'Deploy'
|
if [ "${branch_version}" == "dev" ]; then
|
||||||
jobs:
|
exit 0
|
||||||
- job: 'VersionValidate'
|
elif [ "${setup_version}" != "${branch_version}" ]; then
|
||||||
condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), eq(variables['Build.SourceBranchName'], 'dev'))
|
echo "Version of tag ${branch_version} don't match with ${setup_version}!"
|
||||||
pool:
|
exit 1
|
||||||
vmImage: 'ubuntu-latest'
|
fi
|
||||||
steps:
|
displayName: "Check version of branch/tag"
|
||||||
- task: UsePythonVersion@0
|
- job: "Release"
|
||||||
displayName: 'Use Python 3.7'
|
dependsOn:
|
||||||
inputs:
|
- "VersionValidate"
|
||||||
versionSpec: '3.7'
|
pool:
|
||||||
- script: |
|
vmImage: "ubuntu-latest"
|
||||||
setup_version="$(python setup.py -V)"
|
steps:
|
||||||
branch_version="$(Build.SourceBranchName)"
|
- script: sudo docker login -u $(dockerUser) -p $(dockerPassword)
|
||||||
|
displayName: "Docker hub login"
|
||||||
if [ "${branch_version}" == "dev" ]; then
|
- script: sudo docker pull homeassistant/amd64-builder:$(versionBuilder)
|
||||||
exit 0
|
displayName: "Install Builder"
|
||||||
elif [ "${setup_version}" != "${branch_version}" ]; then
|
- script: |
|
||||||
echo "Version of tag ${branch_version} don't match with ${setup_version}!"
|
sudo docker run --rm --privileged \
|
||||||
exit 1
|
-v ~/.docker:/root/.docker \
|
||||||
fi
|
-v /run/docker.sock:/run/docker.sock:rw -v $(pwd):/data:ro \
|
||||||
displayName: 'Check version of branch/tag'
|
homeassistant/amd64-builder:$(versionBuilder) \
|
||||||
- job: 'Release'
|
--supervisor $(basePythonTag) --version $(Build.SourceBranchName) \
|
||||||
dependsOn:
|
--all -t /data --docker-hub homeassistant
|
||||||
- 'VersionValidate'
|
displayName: "Build Release"
|
||||||
pool:
|
|
||||||
vmImage: 'ubuntu-latest'
|
|
||||||
steps:
|
|
||||||
- script: sudo docker login -u $(dockerUser) -p $(dockerPassword)
|
|
||||||
displayName: 'Docker hub login'
|
|
||||||
- script: sudo docker pull homeassistant/amd64-builder:$(versionBuilder)
|
|
||||||
displayName: 'Install Builder'
|
|
||||||
- script: |
|
|
||||||
sudo docker run --rm --privileged \
|
|
||||||
-v ~/.docker:/root/.docker \
|
|
||||||
-v /run/docker.sock:/run/docker.sock:rw -v $(pwd):/data:ro \
|
|
||||||
homeassistant/amd64-builder:$(versionBuilder) \
|
|
||||||
--supervisor $(basePythonTag) --version $(Build.SourceBranchName) \
|
|
||||||
--all -t /data --docker-hub homeassistant
|
|
||||||
displayName: 'Build Release'
|
|
||||||
|
@ -254,10 +254,10 @@ class AddonManager(CoreSysAttributes):
|
|||||||
async def restore(self, slug: str, tar_file: tarfile.TarFile) -> None:
|
async def restore(self, slug: str, tar_file: tarfile.TarFile) -> None:
|
||||||
"""Restore state of an add-on."""
|
"""Restore state of an add-on."""
|
||||||
if slug not in self.local:
|
if slug not in self.local:
|
||||||
_LOGGER.debug("Add-on %s is not local available for restore")
|
_LOGGER.debug("Add-on %s is not local available for restore", slug)
|
||||||
addon = Addon(self.coresys, slug)
|
addon = Addon(self.coresys, slug)
|
||||||
else:
|
else:
|
||||||
_LOGGER.debug("Add-on %s is local available for restore")
|
_LOGGER.debug("Add-on %s is local available for restore", slug)
|
||||||
addon = self.local[slug]
|
addon = self.local[slug]
|
||||||
|
|
||||||
await addon.restore(tar_file)
|
await addon.restore(tar_file)
|
||||||
|
@ -25,6 +25,9 @@ from .supervisor import APISupervisor
|
|||||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
MAX_CLIENT_SIZE: int = 1024 ** 2 * 16
|
||||||
|
|
||||||
|
|
||||||
class RestAPI(CoreSysAttributes):
|
class RestAPI(CoreSysAttributes):
|
||||||
"""Handle RESTful API for Hass.io."""
|
"""Handle RESTful API for Hass.io."""
|
||||||
|
|
||||||
@ -33,7 +36,8 @@ class RestAPI(CoreSysAttributes):
|
|||||||
self.coresys: CoreSys = coresys
|
self.coresys: CoreSys = coresys
|
||||||
self.security: SecurityMiddleware = SecurityMiddleware(coresys)
|
self.security: SecurityMiddleware = SecurityMiddleware(coresys)
|
||||||
self.webapp: web.Application = web.Application(
|
self.webapp: web.Application = web.Application(
|
||||||
middlewares=[self.security.token_validation]
|
client_max_size=MAX_CLIENT_SIZE,
|
||||||
|
middlewares=[self.security.token_validation],
|
||||||
)
|
)
|
||||||
|
|
||||||
# service stuff
|
# service stuff
|
||||||
|
@ -21,7 +21,6 @@ from ..const import (
|
|||||||
ATTR_MEMORY_PERCENT,
|
ATTR_MEMORY_PERCENT,
|
||||||
ATTR_NETWORK_RX,
|
ATTR_NETWORK_RX,
|
||||||
ATTR_NETWORK_TX,
|
ATTR_NETWORK_TX,
|
||||||
ATTR_PASSWORD,
|
|
||||||
ATTR_PORT,
|
ATTR_PORT,
|
||||||
ATTR_REFRESH_TOKEN,
|
ATTR_REFRESH_TOKEN,
|
||||||
ATTR_SSL,
|
ATTR_SSL,
|
||||||
@ -45,7 +44,6 @@ SCHEMA_OPTIONS = vol.Schema(
|
|||||||
vol.Inclusive(ATTR_IMAGE, "custom_hass"): vol.Maybe(docker_image),
|
vol.Inclusive(ATTR_IMAGE, "custom_hass"): vol.Maybe(docker_image),
|
||||||
vol.Inclusive(ATTR_LAST_VERSION, "custom_hass"): vol.Maybe(vol.Coerce(str)),
|
vol.Inclusive(ATTR_LAST_VERSION, "custom_hass"): vol.Maybe(vol.Coerce(str)),
|
||||||
vol.Optional(ATTR_PORT): network_port,
|
vol.Optional(ATTR_PORT): network_port,
|
||||||
vol.Optional(ATTR_PASSWORD): vol.Maybe(vol.Coerce(str)),
|
|
||||||
vol.Optional(ATTR_SSL): vol.Boolean(),
|
vol.Optional(ATTR_SSL): vol.Boolean(),
|
||||||
vol.Optional(ATTR_WATCHDOG): vol.Boolean(),
|
vol.Optional(ATTR_WATCHDOG): vol.Boolean(),
|
||||||
vol.Optional(ATTR_WAIT_BOOT): vol.All(vol.Coerce(int), vol.Range(min=60)),
|
vol.Optional(ATTR_WAIT_BOOT): vol.All(vol.Coerce(int), vol.Range(min=60)),
|
||||||
@ -92,10 +90,6 @@ class APIHomeAssistant(CoreSysAttributes):
|
|||||||
if ATTR_PORT in body:
|
if ATTR_PORT in body:
|
||||||
self.sys_homeassistant.api_port = body[ATTR_PORT]
|
self.sys_homeassistant.api_port = body[ATTR_PORT]
|
||||||
|
|
||||||
if ATTR_PASSWORD in body:
|
|
||||||
self.sys_homeassistant.api_password = body[ATTR_PASSWORD]
|
|
||||||
self.sys_homeassistant.refresh_token = None
|
|
||||||
|
|
||||||
if ATTR_SSL in body:
|
if ATTR_SSL in body:
|
||||||
self.sys_homeassistant.api_ssl = body[ATTR_SSL]
|
self.sys_homeassistant.api_ssl = body[ATTR_SSL]
|
||||||
|
|
||||||
@ -107,7 +101,6 @@ class APIHomeAssistant(CoreSysAttributes):
|
|||||||
|
|
||||||
if ATTR_REFRESH_TOKEN in body:
|
if ATTR_REFRESH_TOKEN in body:
|
||||||
self.sys_homeassistant.refresh_token = body[ATTR_REFRESH_TOKEN]
|
self.sys_homeassistant.refresh_token = body[ATTR_REFRESH_TOKEN]
|
||||||
self.sys_homeassistant.api_password = None
|
|
||||||
|
|
||||||
self.sys_homeassistant.save_data()
|
self.sys_homeassistant.save_data()
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from ipaddress import ip_network
|
from ipaddress import ip_network
|
||||||
|
|
||||||
HASSIO_VERSION = "194"
|
HASSIO_VERSION = "195"
|
||||||
|
|
||||||
|
|
||||||
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"
|
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"
|
||||||
|
@ -112,13 +112,13 @@ class HassOS(CoreSysAttributes):
|
|||||||
async def load(self) -> None:
|
async def load(self) -> None:
|
||||||
"""Load HassOS data."""
|
"""Load HassOS data."""
|
||||||
try:
|
try:
|
||||||
if self.sys_host.info.cpe is None:
|
if not self.sys_host.info.cpe:
|
||||||
raise TypeError()
|
raise NotImplementedError()
|
||||||
cpe = CPE(self.sys_host.info.cpe)
|
|
||||||
|
|
||||||
|
cpe = CPE(self.sys_host.info.cpe)
|
||||||
if cpe.get_product()[0] != "hassos":
|
if cpe.get_product()[0] != "hassos":
|
||||||
raise TypeError()
|
raise NotImplementedError()
|
||||||
except TypeError:
|
except NotImplementedError:
|
||||||
_LOGGER.debug("Found no HassOS")
|
_LOGGER.debug("Found no HassOS")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
@ -22,7 +22,6 @@ from .const import (
|
|||||||
ATTR_BOOT,
|
ATTR_BOOT,
|
||||||
ATTR_IMAGE,
|
ATTR_IMAGE,
|
||||||
ATTR_LAST_VERSION,
|
ATTR_LAST_VERSION,
|
||||||
ATTR_PASSWORD,
|
|
||||||
ATTR_PORT,
|
ATTR_PORT,
|
||||||
ATTR_REFRESH_TOKEN,
|
ATTR_REFRESH_TOKEN,
|
||||||
ATTR_SSL,
|
ATTR_SSL,
|
||||||
@ -31,7 +30,6 @@ from .const import (
|
|||||||
ATTR_WAIT_BOOT,
|
ATTR_WAIT_BOOT,
|
||||||
ATTR_WATCHDOG,
|
ATTR_WATCHDOG,
|
||||||
FILE_HASSIO_HOMEASSISTANT,
|
FILE_HASSIO_HOMEASSISTANT,
|
||||||
HEADER_HA_ACCESS,
|
|
||||||
)
|
)
|
||||||
from .coresys import CoreSys, CoreSysAttributes
|
from .coresys import CoreSys, CoreSysAttributes
|
||||||
from .docker.homeassistant import DockerHomeAssistant
|
from .docker.homeassistant import DockerHomeAssistant
|
||||||
@ -122,16 +120,6 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
|||||||
"""Set network port for Home Assistant instance."""
|
"""Set network port for Home Assistant instance."""
|
||||||
self._data[ATTR_PORT] = value
|
self._data[ATTR_PORT] = value
|
||||||
|
|
||||||
@property
|
|
||||||
def api_password(self) -> str:
|
|
||||||
"""Return password for Home Assistant instance."""
|
|
||||||
return self._data.get(ATTR_PASSWORD)
|
|
||||||
|
|
||||||
@api_password.setter
|
|
||||||
def api_password(self, value: str):
|
|
||||||
"""Set password for Home Assistant instance."""
|
|
||||||
self._data[ATTR_PASSWORD] = value
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def api_ssl(self) -> bool:
|
def api_ssl(self) -> bool:
|
||||||
"""Return if we need ssl to Home Assistant instance."""
|
"""Return if we need ssl to Home Assistant instance."""
|
||||||
@ -500,10 +488,6 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
|||||||
if content_type is not None:
|
if content_type is not None:
|
||||||
headers[hdrs.CONTENT_TYPE] = content_type
|
headers[hdrs.CONTENT_TYPE] = content_type
|
||||||
|
|
||||||
# Set old API Password
|
|
||||||
if not self.refresh_token and self.api_password:
|
|
||||||
headers[HEADER_HA_ACCESS] = self.api_password
|
|
||||||
|
|
||||||
for _ in (1, 2):
|
for _ in (1, 2):
|
||||||
# Prepare Access token
|
# Prepare Access token
|
||||||
if self.refresh_token:
|
if self.refresh_token:
|
||||||
|
@ -24,7 +24,6 @@ from ..const import (
|
|||||||
ATTR_IMAGE,
|
ATTR_IMAGE,
|
||||||
ATTR_LAST_VERSION,
|
ATTR_LAST_VERSION,
|
||||||
ATTR_NAME,
|
ATTR_NAME,
|
||||||
ATTR_PASSWORD,
|
|
||||||
ATTR_PORT,
|
ATTR_PORT,
|
||||||
ATTR_PROTECTED,
|
ATTR_PROTECTED,
|
||||||
ATTR_REFRESH_TOKEN,
|
ATTR_REFRESH_TOKEN,
|
||||||
@ -37,16 +36,27 @@ from ..const import (
|
|||||||
ATTR_WAIT_BOOT,
|
ATTR_WAIT_BOOT,
|
||||||
ATTR_WATCHDOG,
|
ATTR_WATCHDOG,
|
||||||
CRYPTO_AES128,
|
CRYPTO_AES128,
|
||||||
|
FOLDER_HOMEASSISTANT,
|
||||||
)
|
)
|
||||||
from ..coresys import CoreSys, CoreSysAttributes
|
from ..coresys import CoreSys, CoreSysAttributes
|
||||||
from ..exceptions import AddonsError
|
from ..exceptions import AddonsError
|
||||||
from ..utils.json import write_json_file
|
from ..utils.json import write_json_file
|
||||||
from ..utils.tar import SecureTarFile, secure_path
|
from ..utils.tar import SecureTarFile, exclude_filter, secure_path
|
||||||
from .utils import key_to_iv, password_for_validating, password_to_key, remove_folder
|
from .utils import key_to_iv, password_for_validating, password_to_key, remove_folder
|
||||||
from .validate import ALL_FOLDERS, SCHEMA_SNAPSHOT
|
from .validate import ALL_FOLDERS, SCHEMA_SNAPSHOT
|
||||||
|
|
||||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
MAP_FOLDER_EXCLUDE = {
|
||||||
|
FOLDER_HOMEASSISTANT: [
|
||||||
|
"*.db-wal",
|
||||||
|
"*.db-shm",
|
||||||
|
"__pycache__/*",
|
||||||
|
"*.log",
|
||||||
|
"OZW_Log.txt",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Snapshot(CoreSysAttributes):
|
class Snapshot(CoreSysAttributes):
|
||||||
"""A single Hass.io snapshot."""
|
"""A single Hass.io snapshot."""
|
||||||
@ -359,7 +369,11 @@ class Snapshot(CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
_LOGGER.info("Snapshot folder %s", name)
|
_LOGGER.info("Snapshot folder %s", name)
|
||||||
with SecureTarFile(tar_name, "w", key=self._key) as tar_file:
|
with SecureTarFile(tar_name, "w", key=self._key) as tar_file:
|
||||||
tar_file.add(origin_dir, arcname=".")
|
tar_file.add(
|
||||||
|
origin_dir,
|
||||||
|
arcname=".",
|
||||||
|
filter=exclude_filter(MAP_FOLDER_EXCLUDE.get(name, [])),
|
||||||
|
)
|
||||||
|
|
||||||
_LOGGER.info("Snapshot folder %s done", name)
|
_LOGGER.info("Snapshot folder %s done", name)
|
||||||
self._data[ATTR_FOLDERS].append(name)
|
self._data[ATTR_FOLDERS].append(name)
|
||||||
@ -428,9 +442,6 @@ class Snapshot(CoreSysAttributes):
|
|||||||
self.homeassistant[ATTR_REFRESH_TOKEN] = self._encrypt_data(
|
self.homeassistant[ATTR_REFRESH_TOKEN] = self._encrypt_data(
|
||||||
self.sys_homeassistant.refresh_token
|
self.sys_homeassistant.refresh_token
|
||||||
)
|
)
|
||||||
self.homeassistant[ATTR_PASSWORD] = self._encrypt_data(
|
|
||||||
self.sys_homeassistant.api_password
|
|
||||||
)
|
|
||||||
|
|
||||||
def restore_homeassistant(self):
|
def restore_homeassistant(self):
|
||||||
"""Write all data to the Home Assistant object."""
|
"""Write all data to the Home Assistant object."""
|
||||||
@ -451,9 +462,6 @@ class Snapshot(CoreSysAttributes):
|
|||||||
self.sys_homeassistant.refresh_token = self._decrypt_data(
|
self.sys_homeassistant.refresh_token = self._decrypt_data(
|
||||||
self.homeassistant[ATTR_REFRESH_TOKEN]
|
self.homeassistant[ATTR_REFRESH_TOKEN]
|
||||||
)
|
)
|
||||||
self.sys_homeassistant.api_password = self._decrypt_data(
|
|
||||||
self.homeassistant[ATTR_PASSWORD]
|
|
||||||
)
|
|
||||||
|
|
||||||
# save
|
# save
|
||||||
self.sys_homeassistant.save_data()
|
self.sys_homeassistant.save_data()
|
||||||
|
@ -11,7 +11,6 @@ from ..const import (
|
|||||||
ATTR_IMAGE,
|
ATTR_IMAGE,
|
||||||
ATTR_LAST_VERSION,
|
ATTR_LAST_VERSION,
|
||||||
ATTR_NAME,
|
ATTR_NAME,
|
||||||
ATTR_PASSWORD,
|
|
||||||
ATTR_PORT,
|
ATTR_PORT,
|
||||||
ATTR_PROTECTED,
|
ATTR_PROTECTED,
|
||||||
ATTR_REFRESH_TOKEN,
|
ATTR_REFRESH_TOKEN,
|
||||||
@ -64,7 +63,6 @@ SCHEMA_SNAPSHOT = vol.Schema(
|
|||||||
vol.Optional(ATTR_BOOT, default=True): vol.Boolean(),
|
vol.Optional(ATTR_BOOT, default=True): vol.Boolean(),
|
||||||
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
||||||
vol.Optional(ATTR_PORT, default=8123): network_port,
|
vol.Optional(ATTR_PORT, default=8123): network_port,
|
||||||
vol.Optional(ATTR_PASSWORD): vol.Maybe(vol.Coerce(str)),
|
|
||||||
vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)),
|
vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)),
|
||||||
vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(),
|
vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(),
|
||||||
vol.Optional(ATTR_WAIT_BOOT, default=600): vol.All(
|
vol.Optional(ATTR_WAIT_BOOT, default=600): vol.All(
|
||||||
|
@ -21,7 +21,6 @@ from .const import (
|
|||||||
ATTR_LAST_BOOT,
|
ATTR_LAST_BOOT,
|
||||||
ATTR_LAST_VERSION,
|
ATTR_LAST_VERSION,
|
||||||
ATTR_LOGGING,
|
ATTR_LOGGING,
|
||||||
ATTR_PASSWORD,
|
|
||||||
ATTR_PORT,
|
ATTR_PORT,
|
||||||
ATTR_PORTS,
|
ATTR_PORTS,
|
||||||
ATTR_REFRESH_TOKEN,
|
ATTR_REFRESH_TOKEN,
|
||||||
@ -110,7 +109,6 @@ SCHEMA_HASS_CONFIG = vol.Schema(
|
|||||||
vol.Inclusive(ATTR_IMAGE, "custom_hass"): docker_image,
|
vol.Inclusive(ATTR_IMAGE, "custom_hass"): docker_image,
|
||||||
vol.Inclusive(ATTR_LAST_VERSION, "custom_hass"): vol.Coerce(str),
|
vol.Inclusive(ATTR_LAST_VERSION, "custom_hass"): vol.Coerce(str),
|
||||||
vol.Optional(ATTR_PORT, default=8123): network_port,
|
vol.Optional(ATTR_PORT, default=8123): network_port,
|
||||||
vol.Optional(ATTR_PASSWORD): vol.Maybe(vol.Coerce(str)),
|
|
||||||
vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)),
|
vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)),
|
||||||
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
||||||
vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(),
|
vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user