diff --git a/hassio/__main__.py b/hassio/__main__.py index b64bad447..129b46e29 100644 --- a/hassio/__main__.py +++ b/hassio/__main__.py @@ -4,7 +4,7 @@ from concurrent.futures import ThreadPoolExecutor import logging import sys -import hassio.bootstrap as bootstrap +from hassio import bootstrap _LOGGER = logging.getLogger(__name__) diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 51804ca26..c5f2a105e 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -14,7 +14,7 @@ from voluptuous.humanize import humanize_error from .validate import ( validate_options, SCHEMA_ADDON_SNAPSHOT, RE_VOLUME, RE_SERVICE) -from .utils import check_installed +from .utils import check_installed, remove_data from ..const import ( ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, ATTR_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY, @@ -636,7 +636,7 @@ class Addon(CoreSysAttributes): if self.path_data.is_dir(): _LOGGER.info( "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 if self.path_asound.exists(): @@ -857,7 +857,7 @@ class Addon(CoreSysAttributes): def _restore_data(): """Restore data.""" 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)) try: diff --git a/hassio/addons/utils.py b/hassio/addons/utils.py index f7a2a9514..40c986f82 100644 --- a/hassio/addons/utils.py +++ b/hassio/addons/utils.py @@ -1,4 +1,5 @@ """Util addons functions.""" +import asyncio import hashlib import logging import re @@ -33,3 +34,20 @@ def check_installed(method): return await method(addon, *args, **kwargs) 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) diff --git a/hassio/snapshots/validate.py b/hassio/snapshots/validate.py index ab051ffbc..fa1681cba 100644 --- a/hassio/snapshots/validate.py +++ b/hassio/snapshots/validate.py @@ -16,7 +16,7 @@ ALL_FOLDERS = [FOLDER_HOMEASSISTANT, FOLDER_SHARE, FOLDER_ADDONS, FOLDER_SSL] def unique_addons(addons_list): """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): raise vol.Invalid("Invalid addon list on snapshot!") diff --git a/pylintrc b/pylintrc index 4c0b15230..dde7e395e 100644 --- a/pylintrc +++ b/pylintrc @@ -21,7 +21,6 @@ disable= abstract-class-little-used, abstract-class-not-used, unused-argument, - global-statement, redefined-variable-type, too-many-arguments, too-many-branches, @@ -32,7 +31,9 @@ disable= too-many-statements, too-many-lines, too-few-public-methods, - abstract-method + abstract-method, + no-else-return, + useless-return [EXCEPTIONS] overgeneral-exceptions=Exception,HomeAssistantError diff --git a/tox.ini b/tox.ini index 14c887d08..734921741 100644 --- a/tox.ini +++ b/tox.ini @@ -3,8 +3,8 @@ envlist = lint [testenv] deps = - flake8 - pylint + flake8==3.5.0 + pylint==2.0.0 [testenv:lint] basepython = python3