From ccd0e27e84bf66c83e76685125e54122eea9fdbb Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sun, 16 Feb 2025 20:00:17 +0100 Subject: [PATCH] Allow renaming of backup files in Synology DSM (#138652) * get backup base file name from meta file * use BackupNotFound --- .../components/synology_dsm/backup.py | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/synology_dsm/backup.py b/homeassistant/components/synology_dsm/backup.py index 83c3455bdf1..670c4c9bef0 100644 --- a/homeassistant/components/synology_dsm/backup.py +++ b/homeassistant/components/synology_dsm/backup.py @@ -14,6 +14,7 @@ from homeassistant.components.backup import ( AgentBackup, BackupAgent, BackupAgentError, + BackupNotFound, suggested_filename, ) from homeassistant.config_entries import ConfigEntry @@ -101,6 +102,7 @@ class SynologyDSMBackupAgent(BackupAgent): ) syno_data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id] self.api = syno_data.api + self.backup_base_names: dict[str, str] = {} @property def _file_station(self) -> SynoFileStation: @@ -109,18 +111,19 @@ class SynologyDSMBackupAgent(BackupAgent): assert self.api.file_station return self.api.file_station - async def _async_suggested_filenames( + async def _async_backup_filenames( self, backup_id: str, ) -> tuple[str, str]: - """Suggest filenames for the backup. + """Return the actual backup filenames. :param backup_id: The ID of the backup that was returned in async_list_backups. :return: A tuple of tar_filename and meta_filename """ - if (backup := await self.async_get_backup(backup_id)) is None: - raise BackupAgentError("Backup not found") - return suggested_filenames(backup) + if await self.async_get_backup(backup_id) is None: + raise BackupNotFound + base_name = self.backup_base_names[backup_id] + return (f"{base_name}.tar", f"{base_name}_meta.json") async def async_download_backup( self, @@ -132,7 +135,7 @@ class SynologyDSMBackupAgent(BackupAgent): :param backup_id: The ID of the backup that was returned in async_list_backups. :return: An async iterator that yields bytes. """ - (filename_tar, _) = await self._async_suggested_filenames(backup_id) + (filename_tar, _) = await self._async_backup_filenames(backup_id) try: resp = await self._file_station.download_file( @@ -193,7 +196,7 @@ class SynologyDSMBackupAgent(BackupAgent): :param backup_id: The ID of the backup that was returned in async_list_backups. """ try: - (filename_tar, filename_meta) = await self._async_suggested_filenames( + (filename_tar, filename_meta) = await self._async_backup_filenames( backup_id ) except BackupAgentError: @@ -247,6 +250,7 @@ class SynologyDSMBackupAgent(BackupAgent): assert files backups: dict[str, AgentBackup] = {} + backup_base_names: dict[str, str] = {} for file in files: if file.name.endswith("_meta.json"): try: @@ -255,7 +259,10 @@ class SynologyDSMBackupAgent(BackupAgent): LOGGER.error("Failed to download meta data: %s", err) continue agent_backup = AgentBackup.from_dict(meta_data) - backups[agent_backup.backup_id] = agent_backup + backup_id = agent_backup.backup_id + backups[backup_id] = agent_backup + backup_base_names[backup_id] = file.name.replace("_meta.json", "") + self.backup_base_names = backup_base_names return backups async def async_get_backup(