diff --git a/src/backups.js b/src/backups.js index 58c4b2b9f..92526986c 100644 --- a/src/backups.js +++ b/src/backups.js @@ -16,6 +16,7 @@ var assert = require('assert'), config = require('./config.js'), debug = require('debug')('box:backups'), s3 = require('./storage/s3.js'), + settings = require('./settings.js'), superagent = require('superagent'), util = require('util'); @@ -43,8 +44,12 @@ BackupsError.INTERNAL_ERROR = 'internal error'; BackupsError.MISSING_CREDENTIALS = 'missing credentials'; // choose which storage backend we use for test purpose we use s3 -function api() { - return config.token() ? caas : s3; +function api(provider) { + switch (provider) { + case 'caas': return caas; + case 's3': return s3; + default: return null + } } function getAllPaged(page, perPage, callback) { @@ -54,13 +59,17 @@ function getAllPaged(page, perPage, callback) { var url = config.apiServerOrigin() + '/api/v1/boxes/' + config.fqdn() + '/backups'; - superagent.get(url).query({ token: config.token() }).end(function (error, result) { - if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); - if (result.statusCode !== 200) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, result.text)); - if (!result.body || !util.isArray(result.body.backups)) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, 'Unexpected response')); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - // [ { creationTime, boxVersion, restoreKey, dependsOn: [ ] } ] sorted by time (latest first) - return callback(null, result.body.backups); + superagent.get(url).query({ token: backupConfig.token }).end(function (error, result) { + if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); + if (result.statusCode !== 200) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, result.text)); + if (!result.body || !util.isArray(result.body.backups)) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, 'Unexpected response')); + + // [ { creationTime, boxVersion, restoreKey, dependsOn: [ ] } ] sorted by time (latest first) + return callback(null, result.body.backups); + }); }); } @@ -75,19 +84,23 @@ function getBackupUrl(app, callback) { filename = util.format('backup_%s-v%s.tar.gz', (new Date()).toISOString(), config.version()); } - api().getSignedUploadUrl(filename, function (error, result) { - if (error) return callback(error); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - var obj = { - id: filename, - url: result.url, - sessionToken: result.sessionToken, - backupKey: config.backupKey() - }; + api(backupConfig.provider).getSignedUploadUrl(backupConfig, filename, function (error, result) { + if (error) return callback(error); - debug('getBackupUrl: id:%s url:%s sessionToken:%s backupKey:%s', obj.id, obj.url, obj.sessionToken, obj.backupKey); + var obj = { + id: filename, + url: result.url, + sessionToken: result.sessionToken, + backupKey: backupConfig.key + }; - callback(null, obj); + debug('getBackupUrl: id:%s url:%s sessionToken:%s backupKey:%s', obj.id, obj.url, obj.sessionToken, obj.backupKey); + + callback(null, obj); + }); }); } @@ -96,19 +109,23 @@ function getRestoreUrl(backupId, callback) { assert.strictEqual(typeof backupId, 'string'); assert.strictEqual(typeof callback, 'function'); - api().getSignedDownloadUrl(backupId, function (error, result) { - if (error) return callback(error); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - var obj = { - id: backupId, - url: result.url, - sessionToken: result.sessionToken, - backupKey: config.backupKey() - }; + api(backupConfig.provider).getSignedDownloadUrl(backupConfig, backupId, function (error, result) { + if (error) return callback(error); - debug('getRestoreUrl: id:%s url:%s sessionToken:%s backupKey:%s', obj.id, obj.url, obj.sessionToken, obj.backupKey); + var obj = { + id: backupId, + url: result.url, + sessionToken: result.sessionToken, + backupKey: backupConfig.key + }; - callback(null, obj); + debug('getRestoreUrl: id:%s url:%s sessionToken:%s backupKey:%s', obj.id, obj.url, obj.sessionToken, obj.backupKey); + + callback(null, obj); + }); }); } @@ -118,9 +135,14 @@ function copyLastBackup(app, callback) { assert.strictEqual(typeof callback, 'function'); var toFilename = util.format('appbackup_%s_%s-v%s.tar.gz', app.id, (new Date()).toISOString(), app.manifest.version); - api().copyObject(app.lastBackupId, toFilename, function (error) { - if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); - return callback(null, toFilename); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + + api(backupConfig.provider).copyObject(backupConfig, app.lastBackupId, toFilename, function (error) { + if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); + + return callback(null, toFilename); + }); }); } diff --git a/src/cloudron.js b/src/cloudron.js index bb520529c..6e9569950 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -573,15 +573,6 @@ function doUpdate(boxUpdateInfo, callback) { version: boxUpdateInfo.version, boxVersionsUrl: config.get('boxVersionsUrl'), - backupConfig: { - provider: 'caas', - token: config.token(), - key: config.backupKey(), - region: config.aws().region, - bucket: config.aws().backupBucket, - prefix: config.aws().backupPrefix - }, - // legacy aws: config.aws(), backupKey: config.backupKey() diff --git a/src/storage/caas.js b/src/storage/caas.js index 825af31db..3cc5d40b9 100644 --- a/src/storage/caas.js +++ b/src/storage/caas.js @@ -14,12 +14,13 @@ var assert = require('assert'), config = require('../config.js'), superagent = require('superagent'); -function getBackupCredentials(callback) { +function getBackupCredentials(backupConfig, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof callback, 'function'); - assert(config.token()); + assert(backupConfig.token); var url = config.apiServerOrigin() + '/api/v1/boxes/' + config.fqdn() + '/awscredentials'; - superagent.post(url).query({ token: config.token() }).end(function (error, result) { + superagent.post(url).query({ token: backupConfig.token }).end(function (error, result) { if (error) return callback(error); if (result.statusCode !== 201) return callback(new Error(result.text)); if (!result.body || !result.body.credentials) return callback(new Error('Unexpected response')); @@ -31,24 +32,25 @@ function getBackupCredentials(callback) { region: 'us-east-1' }; - if (config.aws().endpoint) credentials.endpoint = new AWS.Endpoint(config.aws().endpoint); + if (backupConfig.endpoint) credentials.endpoint = new AWS.Endpoint(backupConfig.endpoint); callback(null, credentials); }); } -function getSignedUploadUrl(filename, callback) { +function getSignedUploadUrl(backupConfig, filename, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof filename, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var s3 = new AWS.S3(credentials); var params = { - Bucket: config.aws().backupBucket, - Key: config.aws().backupPrefix + '/' + filename, + Bucket: backupConfig.bucket, + Key: backupConfig.prefix + '/' + filename, Expires: 60 * 30 /* 30 minutes */ }; @@ -58,18 +60,19 @@ function getSignedUploadUrl(filename, callback) { }); } -function getSignedDownloadUrl(filename, callback) { +function getSignedDownloadUrl(backupConfig, filename, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof filename, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var s3 = new AWS.S3(credentials); var params = { - Bucket: config.aws().backupBucket, - Key: config.aws().backupPrefix + '/' + filename, + Bucket: backupConfig.bucket, + Key: backupConfig.prefix + '/' + filename, Expires: 60 * 30 /* 30 minutes */ }; @@ -79,18 +82,19 @@ function getSignedDownloadUrl(filename, callback) { }); } -function copyObject(from, to, callback) { +function copyObject(backupConfig, from, to, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof from, 'string'); assert.strictEqual(typeof to, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var params = { - Bucket: config.aws().backupBucket, // target bucket - Key: config.aws().backupPrefix + '/' + to, // target file - CopySource: config.aws().backupBucket + '/' + config.aws().backupPrefix + '/' + from, // source + Bucket: backupConfig.bucket, // target bucket + Key: backupConfig.prefix + '/' + to, // target file + CopySource: backupConfig.bucket + '/' + backupConfig.prefix + '/' + from, // source }; var s3 = new AWS.S3(credentials); diff --git a/src/storage/s3.js b/src/storage/s3.js index 278a40c59..b6c1ef56e 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -13,34 +13,36 @@ var assert = require('assert'), AWS = require('aws-sdk'), config = require('../config.js'); -function getBackupCredentials(callback) { +function getBackupCredentials(backupConfig, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof callback, 'function'); - if (!config.aws().accessKeyId || !config.aws().secretAccessKey) return callback(new Error('missing credentials')); + assert(backupConfig.accessKeyId && backupConfig.secretAccessKey); var credentials = { - accessKeyId: config.aws().accessKeyId, - secretAccessKey: config.aws().secretAccessKey, + accessKeyId: backupConfig.accessKeyId, + secretAccessKey: backupConfig.secretAccessKey, region: 'us-east-1' }; - if (config.aws().endpoint) credentials.endpoint = new AWS.Endpoint(config.aws().endpoint); + if (backupConfig.endpoint) credentials.endpoint = new AWS.Endpoint(backupConfig.endpoint); callback(null, credentials); } -function getSignedUploadUrl(filename, callback) { +function getSignedUploadUrl(backupConfig, filename, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof filename, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var s3 = new AWS.S3(credentials); var params = { - Bucket: config.aws().backupBucket, - Key: config.aws().backupPrefix + '/' + filename, + Bucket: backupConfig.bucket, + Key: backupConfig.prefix + '/' + filename, Expires: 60 * 30 /* 30 minutes */ }; @@ -50,18 +52,19 @@ function getSignedUploadUrl(filename, callback) { }); } -function getSignedDownloadUrl(filename, callback) { +function getSignedDownloadUrl(backupConfig, filename, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof filename, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var s3 = new AWS.S3(credentials); var params = { - Bucket: config.aws().backupBucket, - Key: config.aws().backupPrefix + '/' + filename, + Bucket: backupConfig.bucket, + Key: backupConfig.prefix + '/' + filename, Expires: 60 * 30 /* 30 minutes */ }; @@ -71,18 +74,19 @@ function getSignedDownloadUrl(filename, callback) { }); } -function copyObject(from, to, callback) { +function copyObject(backupConfig, from, to, callback) { + assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof from, 'string'); assert.strictEqual(typeof to, 'string'); assert.strictEqual(typeof callback, 'function'); - getBackupCredentials(function (error, credentials) { + getBackupCredentials(backupConfig, function (error, credentials) { if (error) return callback(error); var params = { - Bucket: config.aws().backupBucket, // target bucket - Key: config.aws().backupPrefix + '/' + to, // target file - CopySource: config.aws().backupBucket + '/' + config.aws().backupPrefix + '/' + from, // source + Bucket: backupConfig.bucket, // target bucket + Key: backupConfig.prefix + '/' + to, // target file + CopySource: backupConfig.bucket + '/' + backupConfig.prefix + '/' + from, // source }; var s3 = new AWS.S3(credentials);