Reset readonly on remove data (#569)

* Reset readonly on remove data

* Update addon.py

* Update utils.py

* Fix lint

* Update utils.py

* Update utils.py

* Update utils.py

* Update utils.py

* Update addon.py
This commit is contained in:
Pascal Vizeli 2018-07-19 12:44:16 +02:00 committed by GitHub
parent e7e0b9adda
commit 029f277945
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 9 deletions

View File

@ -4,7 +4,7 @@ from concurrent.futures import ThreadPoolExecutor
import logging import logging
import sys import sys
import hassio.bootstrap as bootstrap from hassio import bootstrap
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -14,7 +14,7 @@ from voluptuous.humanize import humanize_error
from .validate import ( from .validate import (
validate_options, SCHEMA_ADDON_SNAPSHOT, RE_VOLUME, RE_SERVICE) validate_options, SCHEMA_ADDON_SNAPSHOT, RE_VOLUME, RE_SERVICE)
from .utils import check_installed from .utils import check_installed, remove_data
from ..const import ( from ..const import (
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_BOOT, ATTR_MAP, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_BOOT, ATTR_MAP,
ATTR_OPTIONS, ATTR_PORTS, ATTR_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY, ATTR_OPTIONS, ATTR_PORTS, ATTR_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY,
@ -636,7 +636,7 @@ class Addon(CoreSysAttributes):
if self.path_data.is_dir(): if self.path_data.is_dir():
_LOGGER.info( _LOGGER.info(
"Remove Home-Assistant addon data folder %s", self.path_data) "Remove Home-Assistant addon data folder %s", self.path_data)
shutil.rmtree(str(self.path_data)) await remove_data(self.path_data)
# Cleanup audio settings # Cleanup audio settings
if self.path_asound.exists(): if self.path_asound.exists():
@ -857,7 +857,7 @@ class Addon(CoreSysAttributes):
def _restore_data(): def _restore_data():
"""Restore data.""" """Restore data."""
if self.path_data.is_dir(): if self.path_data.is_dir():
shutil.rmtree(str(self.path_data), ignore_errors=True) await remove_data(self.path_data)
shutil.copytree(str(Path(temp, "data")), str(self.path_data)) shutil.copytree(str(Path(temp, "data")), str(self.path_data))
try: try:

View File

@ -1,4 +1,5 @@
"""Util addons functions.""" """Util addons functions."""
import asyncio
import hashlib import hashlib
import logging import logging
import re import re
@ -33,3 +34,20 @@ def check_installed(method):
return await method(addon, *args, **kwargs) return await method(addon, *args, **kwargs)
return wrap_check return wrap_check
async def remove_data(folder):
"""Remove folder and reset privileged."""
try:
proc = await asyncio.create_subprocess_shell(
["rm", "-rf", str(folder)], stdout=asyncio.DEVNULL
)
response = await proc.communicate()
wrong = response[1].decode()
except OSError as err:
wrong = str(err)
if proc.returncode == 0:
return
_LOGGER.error("Can't remove Add-on Data: %s", wrong)

View File

@ -16,7 +16,7 @@ ALL_FOLDERS = [FOLDER_HOMEASSISTANT, FOLDER_SHARE, FOLDER_ADDONS, FOLDER_SSL]
def unique_addons(addons_list): def unique_addons(addons_list):
"""Validate that an add-on is unique.""" """Validate that an add-on is unique."""
single = set([addon[ATTR_SLUG] for addon in addons_list]) single = set(addon[ATTR_SLUG] for addon in addons_list)
if len(single) != len(addons_list): if len(single) != len(addons_list):
raise vol.Invalid("Invalid addon list on snapshot!") raise vol.Invalid("Invalid addon list on snapshot!")

View File

@ -21,7 +21,6 @@ disable=
abstract-class-little-used, abstract-class-little-used,
abstract-class-not-used, abstract-class-not-used,
unused-argument, unused-argument,
global-statement,
redefined-variable-type, redefined-variable-type,
too-many-arguments, too-many-arguments,
too-many-branches, too-many-branches,
@ -32,7 +31,9 @@ disable=
too-many-statements, too-many-statements,
too-many-lines, too-many-lines,
too-few-public-methods, too-few-public-methods,
abstract-method abstract-method,
no-else-return,
useless-return
[EXCEPTIONS] [EXCEPTIONS]
overgeneral-exceptions=Exception,HomeAssistantError overgeneral-exceptions=Exception,HomeAssistantError

View File

@ -3,8 +3,8 @@ envlist = lint
[testenv] [testenv]
deps = deps =
flake8 flake8==3.5.0
pylint pylint==2.0.0
[testenv:lint] [testenv:lint]
basepython = python3 basepython = python3