Fix partial backup with Core (#3476)

* Fix partial backup with Core

* reformat

* same style
This commit is contained in:
Pascal Vizeli 2022-03-02 15:54:34 +01:00 committed by GitHub
parent 7ae8dfe587
commit 8984d4afd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 23 deletions

View File

@ -9,7 +9,7 @@ from aiohttp import web
from aiohttp.hdrs import CONTENT_DISPOSITION from aiohttp.hdrs import CONTENT_DISPOSITION
import voluptuous as vol import voluptuous as vol
from ..backups.validate import ALL_FOLDERS from ..backups.validate import ALL_FOLDERS, FOLDER_HOMEASSISTANT
from ..const import ( from ..const import (
ATTR_ADDONS, ATTR_ADDONS,
ATTR_BACKUPS, ATTR_BACKUPS,
@ -36,13 +36,16 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
RE_SLUGIFY_NAME = re.compile(r"[^A-Za-z0-9]+") 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 # pylint: disable=no-value-for-parameter
SCHEMA_RESTORE_PARTIAL = vol.Schema( SCHEMA_RESTORE_PARTIAL = vol.Schema(
{ {
vol.Optional(ATTR_PASSWORD): vol.Maybe(str), vol.Optional(ATTR_PASSWORD): vol.Maybe(str),
vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(), vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(),
vol.Optional(ATTR_ADDONS): vol.All([str], vol.Unique()), 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( SCHEMA_BACKUP_PARTIAL = SCHEMA_BACKUP_FULL.extend(
{ {
vol.Optional(ATTR_ADDONS): vol.All([str], vol.Unique()), 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(), vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(),
} }
) )

View File

@ -144,13 +144,11 @@ class BackupManager(CoreSysAttributes):
_LOGGER.info("Backing up %s store Add-ons", backup.slug) _LOGGER.info("Backing up %s store Add-ons", backup.slug)
await backup.store_addons(addon_list) await backup.store_addons(addon_list)
# Backup folders
# HomeAssistant Folder is for v1 # HomeAssistant Folder is for v1
if homeassistant or FOLDER_HOMEASSISTANT in folder_list: if homeassistant:
await backup.store_homeassistant() await backup.store_homeassistant()
folder_list = list(folder_list)
folder_list.remove(FOLDER_HOMEASSISTANT)
# Backup folders
if folder_list: if folder_list:
_LOGGER.info("Backing up %s store folders", backup.slug) _LOGGER.info("Backing up %s store folders", backup.slug)
await backup.store_folders(folder_list) await backup.store_folders(folder_list)
@ -186,12 +184,12 @@ class BackupManager(CoreSysAttributes):
@Job(conditions=[JobCondition.FREE_SPACE, JobCondition.RUNNING]) @Job(conditions=[JobCondition.FREE_SPACE, JobCondition.RUNNING])
async def do_backup_partial( async def do_backup_partial(
self, self,
name="", name: str = "",
addons=None, addons: list[str] | None = None,
folders=None, folders: list[str] | None = None,
password=None, password: str | None = None,
homeassistant=True, homeassistant: bool = False,
compressed=True, compressed: bool = True,
): ):
"""Create a partial backup.""" """Create a partial backup."""
if self.lock.locked(): if self.lock.locked():
@ -201,6 +199,11 @@ class BackupManager(CoreSysAttributes):
addons = addons or [] addons = addons or []
folders = folders 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: if len(addons) == 0 and len(folders) == 0 and not homeassistant:
_LOGGER.error("Nothing to create backup for") _LOGGER.error("Nothing to create backup for")
@ -227,15 +230,10 @@ class BackupManager(CoreSysAttributes):
self, self,
backup: Backup, backup: Backup,
addon_list: list[str], addon_list: list[str],
folder_list: list[Path], folder_list: list[str],
homeassistant: bool, homeassistant: bool,
replace: bool, replace: bool,
): ):
# Version 1
if FOLDER_HOMEASSISTANT in folder_list:
folder_list.remove(FOLDER_HOMEASSISTANT)
homeassistant = backup.homeassistant_version is not None
try: try:
task_hass: asyncio.Task | None = None task_hass: asyncio.Task | None = None
async with backup: async with backup:
@ -356,6 +354,14 @@ class BackupManager(CoreSysAttributes):
_LOGGER.error("A backup/restore process is already running") _LOGGER.error("A backup/restore process is already running")
return False 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): if backup.protected and not backup.set_password(password):
_LOGGER.error("Invalid password for backup %s", backup.slug) _LOGGER.error("Invalid password for backup %s", backup.slug)
return False return False
@ -364,9 +370,6 @@ class BackupManager(CoreSysAttributes):
_LOGGER.error("No Home Assistant Core data inside the backup") _LOGGER.error("No Home Assistant Core data inside the backup")
return False return False
addon_list = addons or []
folder_list = folders or []
_LOGGER.info("Partial-Restore %s start", backup.slug) _LOGGER.info("Partial-Restore %s start", backup.slug)
async with self.lock: async with self.lock:
self.sys_core.state = CoreState.FREEZE self.sys_core.state = CoreState.FREEZE

View File

@ -31,7 +31,6 @@ from ..const import (
from ..validate import SCHEMA_DOCKER_CONFIG, repositories, version_tag from ..validate import SCHEMA_DOCKER_CONFIG, repositories, version_tag
ALL_FOLDERS = [ ALL_FOLDERS = [
FOLDER_HOMEASSISTANT,
FOLDER_SHARE, FOLDER_SHARE,
FOLDER_ADDONS, FOLDER_ADDONS,
FOLDER_SSL, FOLDER_SSL,