diff --git a/src/backups.js b/src/backups.js index 51194fe14..4ac72d00c 100644 --- a/src/backups.js +++ b/src/backups.js @@ -114,32 +114,6 @@ function getByAppIdPaged(page, perPage, appId, callback) { }); } -function getBoxBackupCredentials(appBackupIds, callback) { - assert(util.isArray(appBackupIds)); - assert.strictEqual(typeof callback, 'function'); - - var now = new Date(); - var filebase = util.format('backup_%s-v%s', now.toISOString(), config.version()); - var filename = filebase + '.tar.gz'; - - settings.getBackupConfig(function (error, backupConfig) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - api(backupConfig.provider).getBackupCredentials(backupConfig, function (error, result) { - if (error) return callback(error); - - result.provider = backupConfig.provider; - result.id = filename; - result.s3Url = 's3://' + backupConfig.bucket + '/' + backupConfig.prefix + '/' + filename; - result.backupKey = backupConfig.key; - - debug('getBoxBackupCredentials: %j', result); - - callback(null, result); - }); - }); -} - function getAppBackupCredentials(app, manifest, callback) { assert.strictEqual(typeof app, 'object'); assert(manifest && typeof manifest === 'object'); @@ -252,31 +226,30 @@ function copyLastBackup(app, manifest, callback) { function backupBoxWithAppBackupIds(appBackupIds, callback) { assert(util.isArray(appBackupIds)); - getBoxBackupCredentials(appBackupIds, function (error, result) { - if (error && error.reason === BackupsError.EXTERNAL_ERROR) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + var now = new Date(); + var filebase = util.format('backup_%s-v%s', now.toISOString(), config.version()); + var filename = filebase + '.tar.gz'; + + settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debug('backupBoxWithAppBackupIds: %j', result); + api(backupConfig.provider).getBackupDetails(backupConfig, filename, function (error, result) { + if (error) return callback(error); - var args; - if (result.provider === 'filesystem') { - args = [ 'filesystem', '/tmp/backups', result.id, result.backupKey ]; - } else { - args = [ 's3', result.s3Url, result.accessKeyId, result.secretAccessKey, result.region, result.backupKey ]; - if (result.sessionToken) args.push(result.sessionToken); - } + debug('backupBoxWithAppBackupIds: backup details %j', result); - shell.sudo('backupBox', [ BACKUP_BOX_CMD ].concat(args), function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - debug('backupBoxWithAppBackupIds: success'); - - backupdb.add({ id: result.id, version: config.version(), type: backupdb.BACKUP_TYPE_BOX, dependsOn: appBackupIds }, function (error) { + shell.sudo('backupBox', [ BACKUP_BOX_CMD ].concat(result.backupScriptArguments), function (error) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - webhooks.backupDone(result.id, null /* app */, appBackupIds, function (error) { - if (error) return callback(error); - callback(null, result.id); + debug('backupBoxWithAppBackupIds: success'); + + backupdb.add({ id: result.id, version: config.version(), type: backupdb.BACKUP_TYPE_BOX, dependsOn: appBackupIds }, function (error) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + + webhooks.backupDone(result.id, null /* app */, appBackupIds, function (error) { + if (error) return callback(error); + callback(null, result.id); + }); }); }); }); diff --git a/src/storage/caas.js b/src/storage/caas.js index 490eb0d6e..c211059b8 100644 --- a/src/storage/caas.js +++ b/src/storage/caas.js @@ -5,7 +5,7 @@ exports = module.exports = { copyObject: copyObject, - getBackupCredentials: getBackupCredentials, + getBackupDetails: getBackupDetails, getAllPaged: getAllPaged }; @@ -28,6 +28,7 @@ function getBackupCredentials(apiConfig, callback) { if (!result.body || !result.body.credentials) return callback(new Error('Unexpected response')); var credentials = { + signatureVersion: 'v4', accessKeyId: result.body.credentials.AccessKeyId, secretAccessKey: result.body.credentials.SecretAccessKey, sessionToken: result.body.credentials.SessionToken, @@ -40,6 +41,25 @@ function getBackupCredentials(apiConfig, callback) { }); } +function getBackupDetails(apiConfig, id, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + getBackupCredentials(apiConfig, function (error, result) { + if (error) return callback(error); + + var s3Url = 's3://' + apiConfig.bucket + '/' + apiConfig.prefix + '/' + id; + var region = apiConfig.region || 'us-east-1'; + + var details = { + backupScriptArguments: [ 's3', s3Url, apiConfig.accessKeyId, apiConfig.secretAccessKey, region, apiConfig.key, result.sessionToken ] + }; + + callback(null, details); + }); +} + function getAllPaged(apiConfig, page, perPage, callback) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof page, 'number'); diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 0e86bc582..e518e081b 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -6,16 +6,23 @@ exports = module.exports = { copyObject: copyObject, getAllPaged: getAllPaged, - getBackupCredentials: getBackupCredentials + getBackupDetails: getBackupDetails }; var assert = require('assert'); -function getBackupCredentials(apiConfig, callback) { +function getBackupDetails(apiConfig, id, callback) { assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof id, 'string'); assert.strictEqual(typeof callback, 'function'); - callback(null, {}); + var backupFolder = apiConfig.backupFolder || '/tmp/backups'; + + var details = { + backupScriptArguments: [ 'filesystem', backupFolder, id, apiConfig.key ] + }; + + callback(null, details); } function getAllPaged(apiConfig, page, perPage, callback) { diff --git a/src/storage/s3.js b/src/storage/s3.js index a68fc7f6c..98e0326c3 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -6,7 +6,7 @@ exports = module.exports = { copyObject: copyObject, getAllPaged: getAllPaged, - getBackupCredentials: getBackupCredentials + getBackupDetails: getBackupDetails }; var assert = require('assert'), @@ -30,6 +30,21 @@ function getBackupCredentials(apiConfig, callback) { callback(null, credentials); } +function getBackupDetails(apiConfig, id, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var s3Url = 's3://' + apiConfig.bucket + '/' + apiConfig.prefix + '/' + id; + var region = apiConfig.region || 'us-east-1'; + + var details = { + backupScriptArguments: [ 's3', s3Url, apiConfig.accessKeyId, apiConfig.secretAccessKey, region, apiConfig.key ] + }; + + callback(null, details); +} + function getAllPaged(apiConfig, page, perPage, callback) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof page, 'number');