mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-19 15:16:33 +00:00
Fix partial backup with Core (#3476)
* Fix partial backup with Core * reformat * same style
This commit is contained in:
parent
7ae8dfe587
commit
8984d4afd6
@ -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(),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user