diff --git a/src/caas.js b/src/caas.js index 5690e55d6..d0b9e81ef 100644 --- a/src/caas.js +++ b/src/caas.js @@ -19,10 +19,10 @@ var assert = require('assert'), debug = require('debug')('box:caas'), locker = require('./locker.js'), path = require('path'), - progress = require('./progress.js'), settings = require('./settings.js'), shell = require('./shell.js'), superagent = require('superagent'), + tasks = require('./tasks.js'), util = require('util'), _ = require('underscore'); @@ -128,10 +128,10 @@ function doMigrate(options, caasConfig, callback) { function unlock(error) { debug('Failed to migrate', error); locker.unlock(locker.OP_MIGRATE); - progress.set(progress.MIGRATE, -1, 'Backup failed: ' + error.message); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: -1, result: `Backup failed: ${error.message}` }, NOOP_CALLBACK); } - progress.set(progress.MIGRATE, 10, 'Backing up for migration'); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: 10, result: 'Backing up for migration' }, NOOP_CALLBACK); // initiate the migration in the background backups.backupBoxAndApps({ userId: null, username: 'migrator' }, function (error) { @@ -150,7 +150,7 @@ function doMigrate(options, caasConfig, callback) { if (result.statusCode === 404) return unlock(new CaasError(CaasError.NOT_FOUND)); if (result.statusCode !== 202) return unlock(new CaasError(CaasError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body))); - progress.set(progress.MIGRATE, 10, 'Migrating'); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: 40, result: 'Migrating' }, NOOP_CALLBACK); retire('migrate', _.pick(options, 'domain', 'size', 'region')); }); @@ -177,11 +177,11 @@ function upgrade(boxUpdateInfo, callback) { assert(boxUpdateInfo !== null && typeof boxUpdateInfo === 'object'); function upgradeError(e) { - progress.set(progress.UPDATE, -1, e.message); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: -1, result: e.message }, NOOP_CALLBACK); callback(e); } - progress.set(progress.UPDATE, 5, 'Backing up for upgrade'); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: 5, result: 'Backing up for upgrade' }, NOOP_CALLBACK); backups.backupBoxAndApps({ userId: null, username: 'upgrader' }, function (error) { if (error) return upgradeError(error); @@ -197,7 +197,7 @@ function upgrade(boxUpdateInfo, callback) { if (error && !error.response) return upgradeError(new Error('Network error making upgrade request: ' + error)); if (result.statusCode !== 202) return upgradeError(new Error(util.format('Server not ready to upgrade. statusCode: %s body: %j', result.status, result.body))); - progress.set(progress.UPDATE, 10, 'Updating base system'); + tasks.setProgress(tasks.TASK_MIGRATE, { percent: 10, result: 'Updating base system' }, NOOP_CALLBACK); // no need to unlock since this is the last thing we ever do on this box callback(); diff --git a/src/cloudron.js b/src/cloudron.js index 8a4cb36a9..42e81a9f4 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -33,7 +33,6 @@ var assert = require('assert'), path = require('path'), paths = require('./paths.js'), platform = require('./platform.js'), - progress = require('./progress.js'), reverseProxy = require('./reverseproxy.js'), safe = require('safetydance'), settings = require('./settings.js'), @@ -171,7 +170,6 @@ function getConfig(callback) { adminFqdn: config.adminFqdn(), mailFqdn: config.mailFqdn(), version: config.version(), - progress: progress.getAll(), isDemo: config.isDemo(), edition: config.edition(), memory: os.totalmem(), diff --git a/src/progress.js b/src/progress.js deleted file mode 100644 index 0e31fc4a5..000000000 --- a/src/progress.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -exports = module.exports = { - set: set, - setDetail: setDetail, - clear: clear, - getAll: getAll, - - UPDATE: 'update', - BACKUP: 'backup', - MIGRATE: 'migrate' -}; - -var assert = require('assert'), - debug = require('debug')('box:progress'); - -// if progress.update or progress.backup are object, they will contain 'percent' and 'message' properties -// otherwise no such operation is currently ongoing -var progress = { - update: null, - backup: null, - migrate: null -}; - -// We use -1 for percentage to indicate errors -function set(tag, percent, message) { - assert.strictEqual(typeof tag, 'string'); - assert.strictEqual(typeof percent, 'number'); - assert.strictEqual(typeof message, 'string'); - - progress[tag] = { - percent: percent, - message: message, - detail: '' - }; - - debug('%s: %s %s', tag, percent, message); -} - -function setDetail(tag, detail) { - assert.strictEqual(typeof tag, 'string'); - assert.strictEqual(typeof detail, 'string'); - - if (!progress[tag]) return debug('[%s] %s', tag, detail); - - progress[tag].detail = detail; -} - -function clear(tag) { - assert.strictEqual(typeof tag, 'string'); - - progress[tag] = null; - - debug('clearing %s', tag); -} - -function getAll() { - return progress; -} diff --git a/src/routes/cloudron.js b/src/routes/cloudron.js index 44e452e28..0b5af5f3e 100644 --- a/src/routes/cloudron.js +++ b/src/routes/cloudron.js @@ -2,7 +2,6 @@ exports = module.exports = { reboot: reboot, - getProgress: getProgress, getConfig: getConfig, getDisks: getDisks, getUpdateInfo: getUpdateInfo, @@ -22,7 +21,6 @@ var appstore = require('../appstore.js'), CloudronError = cloudron.CloudronError, HttpError = require('connect-lastmile').HttpError, HttpSuccess = require('connect-lastmile').HttpSuccess, - progress = require('../progress.js'), updater = require('../updater.js'), updateChecker = require('../updatechecker.js'), UpdaterError = require('../updater.js').UpdaterError, @@ -33,10 +31,6 @@ function auditSource(req) { return { ip: ip, username: req.user ? req.user.username : null, userId: req.user ? req.user.id : null }; } -function getProgress(req, res, next) { - return next(new HttpSuccess(200, progress.getAll())); -} - function reboot(req, res, next) { // Finish the request, to let the appstore know we triggered the restore it next(new HttpSuccess(202, {})); diff --git a/src/routes/test/cloudron-test.js b/src/routes/test/cloudron-test.js index 940b734ab..bcaf0aa75 100644 --- a/src/routes/test/cloudron-test.js +++ b/src/routes/test/cloudron-test.js @@ -191,7 +191,6 @@ describe('Cloudron', function () { expect(result.body.apiServerOrigin).to.eql('http://localhost:6060'); expect(result.body.webServerOrigin).to.eql(null); expect(result.body.adminFqdn).to.eql(config.adminFqdn()); - expect(result.body.progress).to.be.an('object'); expect(result.body.version).to.eql(config.version()); expect(result.body.memory).to.eql(os.totalmem()); expect(result.body.cloudronName).to.be.a('string'); diff --git a/src/server.js b/src/server.js index 3f6dd161f..1fe469c78 100644 --- a/src/server.js +++ b/src/server.js @@ -113,7 +113,6 @@ function initializeExpressSync() { router.post('/api/v1/cloudron/activate', routes.setup.setupTokenAuth, routes.setup.activate); router.get ('/api/v1/cloudron/status', routes.cloudron.getStatus); - router.get ('/api/v1/cloudron/progress', routes.cloudron.getProgress); router.get ('/api/v1/cloudron/avatar', routes.settings.getCloudronAvatar); // this is a public alias for /api/v1/settings/cloudron_avatar // developer routes diff --git a/src/tasks.js b/src/tasks.js index 18e999b93..7bd294697 100644 --- a/src/tasks.js +++ b/src/tasks.js @@ -8,7 +8,9 @@ exports = module.exports = { TaskError: TaskError, - TASK_BACKUP: 'backup' + TASK_BACKUP: 'backup', + TASK_UPDATE: 'update', + TASK_MIGRATE: 'migrate' }; let assert = require('assert'), diff --git a/src/test/backups-test.js b/src/test/backups-test.js index acbf8b744..96368dac6 100644 --- a/src/test/backups-test.js +++ b/src/test/backups-test.js @@ -18,7 +18,6 @@ var async = require('async'), mkdirp = require('mkdirp'), readdirp = require('readdirp'), path = require('path'), - progress = require('../progress.js'), rimraf = require('rimraf'), settings = require('../settings.js'), SettingsError = require('../settings.js').SettingsError, @@ -309,7 +308,6 @@ describe('backups', function () { after(function (done) { rimraf.sync(gBackupConfig.backupFolder); - progress.clear(progress.BACKUP); done(); }); diff --git a/src/test/server-test.js b/src/test/server-test.js index 95054a143..4b80b5419 100644 --- a/src/test/server-test.js +++ b/src/test/server-test.js @@ -9,7 +9,6 @@ var config = require('../config.js'), database = require('../database.js'), expect = require('expect.js'), - progress = require('../progress.js'), superagent = require('superagent'), server = require('../server.js'); @@ -138,54 +137,6 @@ describe('Server', function () { }); }); - describe('progress', function () { - before(function (done) { - server.start(done); - }); - - after(function (done) { - server.stop(function () { - done(); - }); - }); - - it('succeeds with no progress', function (done) { - superagent.get(SERVER_URL + '/api/v1/cloudron/progress', function (error, result) { - expect(result.statusCode).to.equal(200); - expect(result.body.update).to.be(null); - expect(result.body.backup).to.be(null); - done(); - }); - }); - - it('succeeds with update progress', function (done) { - progress.set(progress.UPDATE, 13, 'This is some status string'); - - superagent.get(SERVER_URL + '/api/v1/cloudron/progress', function (error, result) { - expect(result.statusCode).to.equal(200); - expect(result.body.update).to.be.an('object'); - expect(result.body.update.percent).to.be.a('number'); - expect(result.body.update.percent).to.equal(13); - expect(result.body.update.message).to.be.a('string'); - expect(result.body.update.message).to.equal('This is some status string'); - - expect(result.body.backup).to.be(null); - done(); - }); - }); - - it('succeeds with no progress after clearing the update', function (done) { - progress.clear(progress.UPDATE); - - superagent.get(SERVER_URL + '/api/v1/cloudron/progress', function (error, result) { - expect(result.statusCode).to.equal(200); - expect(result.body.update).to.be(null); - expect(result.body.backup).to.be(null); - done(); - }); - }); - }); - describe('shutdown', function () { before(function (done) { server.start(done); diff --git a/src/updater.js b/src/updater.js index 1657c50cd..ff5a82151 100644 --- a/src/updater.js +++ b/src/updater.js @@ -20,15 +20,15 @@ var assert = require('assert'), os = require('os'), path = require('path'), paths = require('./paths.js'), - progress = require('./progress.js'), safe = require('safetydance'), shell = require('./shell.js'), + tasks = require('./tasks.js'), updateChecker = require('./updatechecker.js'), - util = require('util'), - _ = require('underscore'); + util = require('util'); const RELEASES_PUBLIC_KEY = path.join(__dirname, 'releases.gpg'); const UPDATE_CMD = path.join(__dirname, 'scripts/update.sh'); +const NOOP_CALLBACK = function (error) { if (error) debug(error); }; function UpdaterError(reason, errorOrMessage) { assert.strictEqual(typeof reason, 'string'); @@ -158,23 +158,23 @@ function doUpdate(boxUpdateInfo, callback) { assert(boxUpdateInfo && typeof boxUpdateInfo === 'object'); function updateError(e) { - progress.set(progress.UPDATE, -1, e.message); + tasks.setProgress(tasks.TASK_UPDATE, { percent: -1, result: e.message }, NOOP_CALLBACK); callback(e); } - progress.set(progress.UPDATE, 5, 'Downloading and verifying release'); + tasks.setProgress(tasks.TASK_UPDATE, { percent: 5, message: 'Downloading and verifying release' }, NOOP_CALLBACK); downloadAndVerifyRelease(boxUpdateInfo, function (error, packageInfo) { if (error) return updateError(error); - progress.set(progress.UPDATE, 10, 'Backing up'); + tasks.setProgress(tasks.TASK_UPDATE, { percent: 10, message: 'Backing up' }, NOOP_CALLBACK); backups.backupBoxAndApps({ userId: null, username: 'updater' }, function (error) { if (error) return updateError(error); debug('updating box %s', boxUpdateInfo.sourceTarballUrl); - progress.set(progress.UPDATE, 70, 'Installing update'); + tasks.setProgress(tasks.TASK_UPDATE, { percent: 70, message: 'Installing update' }, NOOP_CALLBACK); shell.sudo('update', [ UPDATE_CMD, packageInfo.file ], function (error) { if (error) return updateError(error); @@ -198,7 +198,7 @@ function update(boxUpdateInfo, auditSource, callback) { eventlog.add(eventlog.ACTION_UPDATE, auditSource, { boxUpdateInfo: boxUpdateInfo }); // ensure tools can 'wait' on progress - progress.set(progress.UPDATE, 0, 'Starting'); + tasks.setProgress(tasks.TASK_UPDATE, { percent: 0, message: 'Starting' }, NOOP_CALLBACK); // initiate the update/upgrade but do not wait for it if (boxUpdateInfo.upgrade) {