diff --git a/src/cloudron.js b/src/cloudron.js index 8baa81ce9..ca1bad359 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -19,11 +19,12 @@ exports = module.exports = { backup: backup, ensureBackup: ensureBackup, - isActivatedSync: isActivatedSync, + isConfiguredSync: isConfiguredSync, events: new (require('events').EventEmitter)(), - EVENT_ACTIVATED: 'activated' + EVENT_ACTIVATED: 'activated', + EVENT_CONFIGURED: 'configured' }; var apps = require('./apps.js'), @@ -64,7 +65,7 @@ var NOOP_CALLBACK = function (error) { if (error) debug(error); }; var gUpdatingDns = false, // flag for dns update reentrancy gCloudronDetails = null, // cached cloudron details like region,size... - gIsActivated = null; // cached activation state so that return value is synchronous. null means we are not initialized yet + gIsConfigured = null; // cached configured state so that return value is synchronous. null means we are not initialized yet function debugApp(app, args) { assert(!app || typeof app === 'object'); @@ -115,29 +116,57 @@ CloudronError.NOT_FOUND = 'Not found'; function initialize(callback) { assert.strictEqual(typeof callback, 'function'); - settings.events.on(settings.DNS_CONFIG_KEY, addDnsRecords); + exports.events.on(exports.EVENT_CONFIGURED, addDnsRecords); - userdb.count(function (error, count) { - if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); - - gIsActivated = count !== 0; - - if (gIsActivated) addDnsRecords(); // reboot/restore/upgrade - - callback(null); - }); + syncConfigState(callback); } function uninitialize(callback) { assert.strictEqual(typeof callback, 'function'); - settings.events.removeListener(settings.DNS_CONFIG_KEY, addDnsRecords); + exports.events.removeListener(exports.EVENT_CONFIGURED, addDnsRecords); callback(null); } -function isActivatedSync() { - return gIsActivated === true; +function isConfiguredSync() { + return gIsConfigured === true; +} + +function isConfigured(callback) { + // set of rules to see if we have the configs required for cloudron to function + // note this checks for missing configs and not invalid configs + + settings.getDnsConfig(function (error, dnsConfig) { + if (error) return callback(error); + + if (!dnsConfig) return callback(null, false); + + var isConfigured = (config.isCustomDomain() && dnsConfig.provider === 'route53') || + (!config.isCustomDomain() && dnsConfig.provider === 'caas'); + + callback(null, isConfigured); + }); +} + +function syncConfigState(callback) { + assert(!gIsConfigured); + + callback = callback || NOOP_CALLBACK; + + isConfigured(function (error, configured) { + if (error) return callback(error); + + if (configured) { + exports.events.emit(exports.EVENT_CONFIGURED); + } else { + settings.events.once(settings.DNS_CONFIG_KEY, function () { syncConfigState(); }); // check again later + } + + gIsConfigured = configured; + + callback(); + }); } function setTimeZone(ip, callback) { @@ -191,8 +220,6 @@ function activate(username, password, email, ip, callback) { tokendb.add(token, tokendb.PREFIX_USER + userObject.id, result.id, expires, '*', function (error) { if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); - gIsActivated = true; - // EE API is sync. do not keep the REST API reponse waiting process.nextTick(function () { exports.events.emit(exports.EVENT_ACTIVATED); }); diff --git a/src/cron.js b/src/cron.js index 6d315ebd5..a2517c8f5 100644 --- a/src/cron.js +++ b/src/cron.js @@ -39,7 +39,6 @@ function initialize(callback) { assert.strictEqual(typeof callback, 'function'); settings.events.on(settings.TIME_ZONE_KEY, recreateJobs); - settings.events.on(settings.AUTOUPDATE_PATTERN_KEY, autoupdatePatternChanged); gHeartbeatJob = new CronJob({ cronTime: '00 */1 * * * *', // every minute @@ -48,7 +47,7 @@ function initialize(callback) { }); cloudron.sendHeartbeat(); // latest unpublished version of CronJob has runOnInit - if (cloudron.isActivatedSync()) { + if (cloudron.isConfiguredSync()) { recreateJobs(callback); } else { cloudron.events.on(cloudron.EVENT_ACTIVATED, recreateJobs); @@ -110,6 +109,8 @@ function recreateJobs(unusedTimeZone, callback) { timeZone: allSettings[settings.TIME_ZONE_KEY] }); + settings.events.removeListener(settings.AUTOUPDATE_PATTERN_KEY, autoupdatePatternChanged); + settings.events.on(settings.AUTOUPDATE_PATTERN_KEY, autoupdatePatternChanged); autoupdatePatternChanged(allSettings[settings.AUTOUPDATE_PATTERN_KEY]); if (callback) callback(); @@ -118,6 +119,7 @@ function recreateJobs(unusedTimeZone, callback) { function autoupdatePatternChanged(pattern) { assert.strictEqual(typeof pattern, 'string'); + assert(gBoxUpdateCheckerJob); debug('Auto update pattern changed to %s', pattern); diff --git a/src/mailer.js b/src/mailer.js index c2b805c1c..f5cd949dc 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -48,10 +48,10 @@ var gMailQueue = [ ], function initialize(callback) { assert.strictEqual(typeof callback, 'function'); - if (cloudron.isActivatedSync()) { + if (cloudron.isConfiguredSync()) { checkDns(); } else { - cloudron.events.on(cloudron.EVENT_ACTIVATED, checkDns); + cloudron.events.on(cloudron.EVENT_CONFIGURED, checkDns); } callback(null); @@ -60,7 +60,7 @@ function initialize(callback) { function uninitialize(callback) { assert.strictEqual(typeof callback, 'function'); - cloudron.events.removeListener(cloudron.EVENT_ACTIVATED, checkDns); + cloudron.events.removeListener(cloudron.EVENT_CONFIGURED, checkDns); // TODO: interrupt processQueue as well clearTimeout(gCheckDnsTimerId); diff --git a/src/taskmanager.js b/src/taskmanager.js index 3ae845673..cef624eaa 100644 --- a/src/taskmanager.js +++ b/src/taskmanager.js @@ -26,10 +26,10 @@ function initialize(callback) { locker.on('unlocked', startNextTask); - if (cloudron.isActivatedSync()) { + if (cloudron.isConfiguredSync()) { resumeTasks(); } else { - cloudron.events.on(cloudron.EVENT_ACTIVATED, resumeTasks); + cloudron.events.on(cloudron.EVENT_CONFIGURED, resumeTasks); } callback(); @@ -43,7 +43,7 @@ function uninitialize(callback) { stopAppTask(appId); } - cloudron.events.removeListener(cloudron.EVENT_ACTIVATED, resumeTasks); + cloudron.events.removeListener(cloudron.EVENT_CONFIGURED, resumeTasks); locker.removeListener('unlocked', startNextTask); callback(null);