From 8984d4afd6830e03f1c1cd3bfc83741c6bd224ba Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 2 Mar 2022 15:54:34 +0100 Subject: [PATCH] Fix partial backup with Core (#3476) * Fix partial backup with Core * reformat * same style --- supervisor/api/backups.py | 9 +++++--- supervisor/backups/manager.py | 41 ++++++++++++++++++---------------- supervisor/backups/validate.py | 1 - 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/supervisor/api/backups.py b/supervisor/api/backups.py index 88c013c08..4e40e455c 100644 --- a/supervisor/api/backups.py +++ b/supervisor/api/backups.py @@ -9,7 +9,7 @@ from aiohttp import web from aiohttp.hdrs import CONTENT_DISPOSITION import voluptuous as vol -from ..backups.validate import ALL_FOLDERS +from ..backups.validate import ALL_FOLDERS, FOLDER_HOMEASSISTANT from ..const import ( ATTR_ADDONS, ATTR_BACKUPS, @@ -36,13 +36,16 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) RE_SLUGIFY_NAME = re.compile(r"[^A-Za-z0-9]+") +# Backwards compatible / Remove 2022.08 +_ALL_FOLDERS = ALL_FOLDERS + [FOLDER_HOMEASSISTANT] + # pylint: disable=no-value-for-parameter SCHEMA_RESTORE_PARTIAL = vol.Schema( { vol.Optional(ATTR_PASSWORD): vol.Maybe(str), vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(), vol.Optional(ATTR_ADDONS): vol.All([str], vol.Unique()), - vol.Optional(ATTR_FOLDERS): vol.All([vol.In(ALL_FOLDERS)], vol.Unique()), + vol.Optional(ATTR_FOLDERS): vol.All([vol.In(_ALL_FOLDERS)], vol.Unique()), } ) @@ -59,7 +62,7 @@ SCHEMA_BACKUP_FULL = vol.Schema( SCHEMA_BACKUP_PARTIAL = SCHEMA_BACKUP_FULL.extend( { vol.Optional(ATTR_ADDONS): vol.All([str], vol.Unique()), - vol.Optional(ATTR_FOLDERS): vol.All([vol.In(ALL_FOLDERS)], vol.Unique()), + vol.Optional(ATTR_FOLDERS): vol.All([vol.In(_ALL_FOLDERS)], vol.Unique()), vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(), } ) diff --git a/supervisor/backups/manager.py b/supervisor/backups/manager.py index d0285982f..d01ea946b 100644 --- a/supervisor/backups/manager.py +++ b/supervisor/backups/manager.py @@ -144,13 +144,11 @@ class BackupManager(CoreSysAttributes): _LOGGER.info("Backing up %s store Add-ons", backup.slug) await backup.store_addons(addon_list) - # Backup folders # HomeAssistant Folder is for v1 - if homeassistant or FOLDER_HOMEASSISTANT in folder_list: + if homeassistant: await backup.store_homeassistant() - folder_list = list(folder_list) - folder_list.remove(FOLDER_HOMEASSISTANT) + # Backup folders if folder_list: _LOGGER.info("Backing up %s store folders", backup.slug) await backup.store_folders(folder_list) @@ -186,12 +184,12 @@ class BackupManager(CoreSysAttributes): @Job(conditions=[JobCondition.FREE_SPACE, JobCondition.RUNNING]) async def do_backup_partial( self, - name="", - addons=None, - folders=None, - password=None, - homeassistant=True, - compressed=True, + name: str = "", + addons: list[str] | None = None, + folders: list[str] | None = None, + password: str | None = None, + homeassistant: bool = False, + compressed: bool = True, ): """Create a partial backup.""" if self.lock.locked(): @@ -201,6 +199,11 @@ class BackupManager(CoreSysAttributes): addons = addons or [] folders = folders or [] + # HomeAssistant Folder is for v1 + if FOLDER_HOMEASSISTANT in folders: + folders.remove(FOLDER_HOMEASSISTANT) + homeassistant = True + if len(addons) == 0 and len(folders) == 0 and not homeassistant: _LOGGER.error("Nothing to create backup for") @@ -227,15 +230,10 @@ class BackupManager(CoreSysAttributes): self, backup: Backup, addon_list: list[str], - folder_list: list[Path], + folder_list: list[str], homeassistant: bool, replace: bool, ): - # Version 1 - if FOLDER_HOMEASSISTANT in folder_list: - folder_list.remove(FOLDER_HOMEASSISTANT) - homeassistant = backup.homeassistant_version is not None - try: task_hass: asyncio.Task | None = None async with backup: @@ -356,6 +354,14 @@ class BackupManager(CoreSysAttributes): _LOGGER.error("A backup/restore process is already running") return False + addon_list = addons or [] + folder_list = folders or [] + + # Version 1 + if FOLDER_HOMEASSISTANT in folder_list: + folder_list.remove(FOLDER_HOMEASSISTANT) + homeassistant = True + if backup.protected and not backup.set_password(password): _LOGGER.error("Invalid password for backup %s", backup.slug) return False @@ -364,9 +370,6 @@ class BackupManager(CoreSysAttributes): _LOGGER.error("No Home Assistant Core data inside the backup") return False - addon_list = addons or [] - folder_list = folders or [] - _LOGGER.info("Partial-Restore %s start", backup.slug) async with self.lock: self.sys_core.state = CoreState.FREEZE diff --git a/supervisor/backups/validate.py b/supervisor/backups/validate.py index 8017ee7ac..0420eeeea 100644 --- a/supervisor/backups/validate.py +++ b/supervisor/backups/validate.py @@ -31,7 +31,6 @@ from ..const import ( from ..validate import SCHEMA_DOCKER_CONFIG, repositories, version_tag ALL_FOLDERS = [ - FOLDER_HOMEASSISTANT, FOLDER_SHARE, FOLDER_ADDONS, FOLDER_SSL,