diff --git a/src/data/backup.ts b/src/data/backup.ts index 689f46cc2b..ac28c3c7b8 100644 --- a/src/data/backup.ts +++ b/src/data/backup.ts @@ -35,8 +35,8 @@ export type GenerateBackupParams = { password?: string; }; -export const getBackupDownloadUrl = (id: string) => - `/api/backup/download/${id}`; +export const getBackupDownloadUrl = (id: string, agentId: string) => + `/api/backup/download/${id}?agent_id=${agentId}`; export const fetchBackupInfo = (hass: HomeAssistant): Promise => hass.callWS({ @@ -89,3 +89,10 @@ export const uploadBackup = async ( throw new Error(`${resp.status} ${resp.statusText}`); } }; + +export const getPreferredAgentForDownload = (agents: string[]) => { + const localAgents = agents.filter( + (agent) => agent.split(".")[0] === "backup" + ); + return localAgents[0] || agents[0]; +}; diff --git a/src/panels/config/backup/ha-config-backup-dashboard.ts b/src/panels/config/backup/ha-config-backup-dashboard.ts index 70313b02ba..d9ad6d70cb 100644 --- a/src/panels/config/backup/ha-config-backup-dashboard.ts +++ b/src/panels/config/backup/ha-config-backup-dashboard.ts @@ -26,6 +26,7 @@ import { getBackupDownloadUrl, removeBackup, type BackupContent, + getPreferredAgentForDownload, } from "../../../data/backup"; import { extractApiErrorMessage } from "../../../data/hassio/common"; import { @@ -290,9 +291,10 @@ class HaConfigBackupDashboard extends SubscribeMixin(LitElement) { } private async _downloadBackup(backup: BackupContent): Promise { + const preferedAgent = getPreferredAgentForDownload(backup!.agent_ids!); const signedUrl = await getSignedPath( this.hass, - getBackupDownloadUrl(backup.backup_id) + getBackupDownloadUrl(backup.backup_id, preferedAgent) ); fileDownload(signedUrl.path); } diff --git a/src/panels/config/backup/ha-config-backup-details.ts b/src/panels/config/backup/ha-config-backup-details.ts index 56aeef6af4..ddf16c5a79 100644 --- a/src/panels/config/backup/ha-config-backup-details.ts +++ b/src/panels/config/backup/ha-config-backup-details.ts @@ -1,7 +1,7 @@ +import type { ActionDetail } from "@material/mwc-list"; import { mdiDelete, mdiDotsVertical, mdiDownload } from "@mdi/js"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; -import type { ActionDetail } from "@material/mwc-list"; import { formatDateTime } from "../../../common/datetime/format_date_time"; import { navigate } from "../../../common/navigate"; import "../../../components/ha-alert"; @@ -17,6 +17,7 @@ import type { BackupContent } from "../../../data/backup"; import { fetchBackupDetails, getBackupDownloadUrl, + getPreferredAgentForDownload, removeBackup, } from "../../../data/backup"; import { domainToName } from "../../../data/integration"; @@ -130,6 +131,25 @@ class HaConfigBackupDetails extends LitElement { slot="start" />
${domainName}: ${name}
+ + + + + Download from this location + + `; })} @@ -162,10 +182,18 @@ class HaConfigBackupDetails extends LitElement { } } - private async _downloadBackup(): Promise { + private _handleAgentAction(ev: CustomEvent) { + const button = ev.currentTarget; + const agentId = (button as any).agent; + this._downloadBackup(agentId); + } + + private async _downloadBackup(agentId?: string): Promise { + const preferedAgent = + agentId ?? getPreferredAgentForDownload(this._backup!.agent_ids!); const signedUrl = await getSignedPath( this.hass, - getBackupDownloadUrl(this._backup!.backup_id) + getBackupDownloadUrl(this._backup!.backup_id, preferedAgent) ); fileDownload(signedUrl.path); }