diff --git a/src/cloudron.js b/src/cloudron.js index a80e2c1a1..9f9abfb46 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -8,6 +8,7 @@ exports = module.exports = { activate: activate, getConfig: getConfig, getStatus: getStatus, + dnsSetup: dnsSetup, sendHeartbeat: sendHeartbeat, sendAliveStatus: sendAliveStatus, @@ -113,6 +114,7 @@ CloudronError.BAD_FIELD = 'Field error'; CloudronError.INTERNAL_ERROR = 'Internal Error'; CloudronError.EXTERNAL_ERROR = 'External Error'; CloudronError.ALREADY_PROVISIONED = 'Already Provisioned'; +CloudronError.ALREADY_SETUP = 'Already Setup'; CloudronError.BAD_STATE = 'Bad state'; CloudronError.ALREADY_UPTODATE = 'No Update Available'; CloudronError.NOT_FOUND = 'Not found'; @@ -208,6 +210,23 @@ function syncConfigState(callback) { }); } +function dnsSetup(dnsConfig, domain, callback) { + assert.strictEqual(typeof dnsConfig, 'object'); + assert.strictEqual(typeof domain, 'string'); + assert.strictEqual(typeof callback, 'function'); + + if (config.fqdn()) return callback(new CloudronError(CloudronError.ALREADY_SETUP)); + + config.set('fqdn', domain); // set fqdn only after dns config is valid, otherwise cannot re-setup if we failed + + settings.setDnsConfig(dnsConfig, domain, function (error) { + if (error && error.reason === SettingsError.BAD_FIELD) return callback(new CloudronError(CloudronError.BAD_FIELD, error.message)); + if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); + + callback(); + }); +} + function configureAdmin(callback) { callback = callback || NOOP_CALLBACK; diff --git a/src/routes/cloudron.js b/src/routes/cloudron.js index 72a8b0bd9..10b6de10d 100644 --- a/src/routes/cloudron.js +++ b/src/routes/cloudron.js @@ -87,13 +87,11 @@ function dnsSetup(req, res, next) { assert.strictEqual(typeof req.body, 'object'); if (typeof req.body.provider !== 'string') return next(new HttpError(400, 'provider is required')); - if (config.fqdn()) return next(new HttpError(409, 'Already setup')); if (typeof req.body.domain !== 'string' || !req.body.domain) return next(new HttpError(400, 'domain is required')); - config.set('fqdn', req.body.domain); - - settings.setDnsConfig(req.body, req.body.domain, function (error) { - if (error && error.reason === SettingsError.BAD_FIELD) return next(new HttpError(400, error.message)); + cloudron.dnsSetup(req.body, req.body.domain, function (error) { + if (error && error.reason === CloudronError.ALREADY_SETUP) return next(new HttpError(409, error.message)); + if (error && error.reason === CloudronError.BAD_FIELD) return next(new HttpError(400, error.message)); if (error) return next(new HttpError(500, error)); next(new HttpSuccess(200));