feat(backups/XO metadata): transfer binary config in base64

This commit is contained in:
Julien Fontanet
2023-04-23 22:42:04 +02:00
parent 1b6ec2c545
commit ad46bde302
3 changed files with 21 additions and 5 deletions

View File

@@ -21,7 +21,12 @@ export class RestoreMetadataBackup {
})
} else {
const metadata = JSON.parse(await handler.readFile(join(backupId, 'metadata.json')))
return String(await handler.readFile(resolve(backupId, metadata.data ?? 'data.json')))
const dataFileName = resolve(backupId, metadata.data ?? 'data.json')
const data = await handler.readFile(dataFileName)
// if data is JSON, sent it as a plain string, otherwise, consider the data as binary and encode it
const isJson = dataFileName.endsWith('.json')
return isJson ? data.toString() : { encoding: 'base64', data: data.toString('base64') }
}
}
}

View File

@@ -22,7 +22,13 @@ export class XoMetadataBackup {
const dir = `${scheduleDir}/${formatFilenameDate(timestamp)}`
const data = job.xoMetadata
const dataBaseName = './data.json'
let dataBaseName = './data'
// JSON data is sent as plain string, binary data is sent as an object with `data` and `encoding properties
const isJson = typeof data === 'string'
if (isJson) {
dataBaseName += '.json'
}
const metadata = JSON.stringify(
{
@@ -54,7 +60,7 @@ export class XoMetadataBackup {
async () => {
const handler = adapter.handler
const dirMode = this._config.dirMode
await handler.outputFile(dataFileName, data, { dirMode })
await handler.outputFile(dataFileName, isJson ? data : Buffer.from(data.data, data.encoding), { dirMode })
await handler.outputFile(metaDataFileName, metadata, {
dirMode,
})

View File

@@ -51,7 +51,11 @@ export default class metadataBackup {
}
const app = this._app
job.xoMetadata = job.xoMetadata ? await app.exportConfig() : undefined
if (job.xoMetadata) {
const config = await app.exportConfig()
job.xoMetadata = typeof config === 'string' ? config : { encoding: 'base64', data: config.toString('base64') }
}
const remoteIds = unboxIdsFromPattern(job.remotes)
const proxyId = job.proxy
@@ -325,7 +329,8 @@ export default class metadataBackup {
const onLog = async log => {
if (type === 'xoConfig' && localTaskIds[log.taskId] === rootTaskId && log.status === 'success') {
try {
await app.importConfig(log.result)
const { result } = log
await app.importConfig(typeof result === 'string' ? result : Buffer.from(result.data, result.encoding))
// don't log the XO config
log.result = undefined