diff --git a/src/addons.js b/src/addons.js index 3ddfa1114..11df620ba 100644 --- a/src/addons.js +++ b/src/addons.js @@ -306,14 +306,26 @@ function restoreAddons(app, addons, callback) { }, callback); } +function importAppDatabase(app, addon, callback) { + assert.strictEqual(typeof app, 'object'); + assert.strictEqual(typeof addon, 'string'); + assert.strictEqual(typeof callback, 'function'); + + if (!(addon in KNOWN_ADDONS)) return callback(new Error(`No such addon: ${addon}`)); + + async.series([ + KNOWN_ADDONS[addon].setup.bind(null, app, app.manifest.addons[addon]), + KNOWN_ADDONS[addon].clear.bind(null, app, app.manifest.addons[addon]), // clear in case we crashed in a restore + KNOWN_ADDONS[addon].restore.bind(null, app, app.manifest.addons[addon]) + ], callback); +} + function importDatabase(addon, callback) { assert.strictEqual(typeof addon, 'string'); assert.strictEqual(typeof callback, 'function'); debug(`importDatabase: Importing ${addon}`); - if (!(addon in KNOWN_ADDONS)) return callback(new Error(`No such addon: ${addon}`)); - appdb.getAll(function (error, apps) { if (error) return callback(error); @@ -322,10 +334,7 @@ function importDatabase(addon, callback) { debug(`importDatabase: Importing addon ${addon} of app ${app.id}`); - async.series([ - KNOWN_ADDONS[addon].setup.bind(null, app, app.manifest.addons[addon]), - KNOWN_ADDONS[addon].restore.bind(null, app, app.manifest.addons[addon]) - ], function (error) { + importAppDatabase(app, addon, function (error) { if (!error) return iteratorCallback(); debug(`importDatabase: Error importing ${addon} of app ${app.id}. Marking as errored`, error); diff --git a/src/routes/sysadmin.js b/src/routes/sysadmin.js index 4eb80939e..a0fd3b1f2 100644 --- a/src/routes/sysadmin.js +++ b/src/routes/sysadmin.js @@ -3,10 +3,15 @@ exports = module.exports = { backup: backup, update: update, - retire: retire + retire: retire, + + importAppDatabase: importAppDatabase }; -var backups = require('../backups.js'), +var apps = require('../apps.js'), + AppsError = apps.AppsError, + addons = require('../addons.js'), + backups = require('../backups.js'), BackupsError = require('../backups.js').BackupsError, cloudron = require('../cloudron.js'), debug = require('debug')('box:routes/sysadmin'), @@ -48,8 +53,21 @@ function retire(req, res, next) { debug('triggering retire'); cloudron.retire('migrate', { }, function (error) { - if (error) console.error('Retire failed.', error); + if (error) debug('Retire failed.', error); }); next(new HttpSuccess(202, {})); } + +function importAppDatabase(req, res, next) { + apps.get(req.params.id, function (error, app) { + if (error && error.reason === AppsError.NOT_FOUND) return next(new HttpError(404, 'No such app')); + if (error) return next(new HttpError(500, error)); + + addons.importAppDatabase(app, req.query.addon || '', function (error) { + if (error) return next(new HttpError(500, error)); + + next(new HttpSuccess(202, {})); + }); + }); +} diff --git a/src/server.js b/src/server.js index c5f760ee2..d23372fe0 100644 --- a/src/server.js +++ b/src/server.js @@ -343,6 +343,7 @@ function initializeSysadminExpressSync() { router.post('/api/v1/backup', routes.sysadmin.backup); router.post('/api/v1/update', routes.sysadmin.update); router.post('/api/v1/retire', routes.sysadmin.retire); + router.post('/api/v1/apps/:id/import', routes.sysadmin.importAppDatabase); return httpServer; }