From d07840c8ef2b82b247c3f21f4f50e606c906fda9 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Sat, 3 Sep 2016 12:02:42 -0700 Subject: [PATCH] Load mail conf in mailer.js addon vars is not really used other than for email. mail config is required even if platform code is not initialized since it is called from mailer.unexpectedExit fixes #29 --- src/mailer.js | 44 ++++++++++++++++++++++++++++++-------------- src/platform.js | 36 ++++-------------------------------- 2 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/mailer.js b/src/mailer.js index 64037bd32..bde504eb5 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -39,9 +39,11 @@ var assert = require('assert'), dns = require('native-dns'), docker = require('./docker.js').connection, ejs = require('ejs'), + fs = require('fs'), + ini = require('ini'), nodemailer = require('nodemailer'), path = require('path'), - platform = require('./platform.js'), + paths = require('./paths.js'), safe = require('safetydance'), smtpTransport = require('nodemailer-smtp-transport'), users = require('./user.js'), @@ -81,6 +83,20 @@ function uninitialize(callback) { callback(null); } +function mailConfig() { + if (process.env.BOX_ENV === 'test' && !process.env.TEST_CREATE_INFRA) { + return { username: 'no-reply', from: 'no-reply@' + config.fqdn(), password: 'doesnotwork' }; + } + + var mail = ini.parse(fs.readFileSync(paths.DATA_DIR + '/addons/mail_vars.sh', 'utf8')); + + return { + username: mail.MAIL_ROOT_USERNAME, + from: '"Cloudron" <' + mail.MAIL_ROOT_USERNAME + '@' + config.fqdn() + '>', + password: mail.MAIL_ROOT_PASSWORD + }; +} + function getTxtRecords(callback) { dns.resolveNs(config.zoneName(), function (error, nameservers) { if (error || !nameservers) return callback(error || new Error('Unable to get nameservers')); @@ -162,8 +178,8 @@ function sendMails(queue) { host: mailServerIp, port: config.get('smtpPort'), auth: { - user: platform.mailConfig().username, - pass: platform.mailConfig().password + user: mailConfig().username, + pass: mailConfig().password } })); @@ -223,7 +239,7 @@ function mailUserEventToAdmins(user, event) { adminEmails = _.difference(adminEmails, [ user.email ]); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: adminEmails.join(', '), subject: util.format('%s %s in Cloudron %s', user.username || user.email, event, config.fqdn()), text: render('user_event.ejs', { fqdn: config.fqdn(), user: user, event: event, format: 'text' }), @@ -249,7 +265,7 @@ function sendInvite(user, invitor) { }; var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: user.email, subject: util.format('Welcome to Cloudron %s', config.fqdn()), text: render('welcome_user.ejs', templateData) @@ -272,7 +288,7 @@ function userAdded(user, inviteSent) { var inviteLink = inviteSent ? null : config.adminOrigin() + '/api/v1/session/account/setup.html?reset_token=' + user.resetToken; var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: adminEmails.join(', '), subject: util.format('%s added in Cloudron %s', user.email, config.fqdn()), text: render('user_added.ejs', { fqdn: config.fqdn(), user: user, inviteLink: inviteLink, format: 'text' }), @@ -307,7 +323,7 @@ function passwordReset(user) { var resetLink = config.adminOrigin() + '/api/v1/session/password/reset.html?reset_token=' + user.resetToken; var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: user.email, subject: 'Password Reset Request', text: render('password_reset.ejs', { fqdn: config.fqdn(), user: user, resetLink: resetLink, format: 'text' }) @@ -325,7 +341,7 @@ function appDied(app) { if (error) return console.log('Error getting admins', error); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: config.provider() === 'caas' ? 'support@cloudron.io' : adminEmails.concat('support@cloudron.io').join(', '), subject: util.format('App %s is down', app.location), text: render('app_down.ejs', { fqdn: config.fqdn(), title: app.manifest.title, appFqdn: config.appFqdn(app.location), format: 'text' }) @@ -343,7 +359,7 @@ function boxUpdateAvailable(newBoxVersion, changelog) { if (error) return console.log('Error getting admins', error); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: adminEmails.join(', '), subject: util.format('%s has a new update available', config.fqdn()), text: render('box_update_available.ejs', { fqdn: config.fqdn(), webadminUrl: config.adminOrigin(), newBoxVersion: newBoxVersion, changelog: changelog, format: 'text' }) @@ -361,7 +377,7 @@ function appUpdateAvailable(app, updateInfo) { if (error) return console.log('Error getting admins', error); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: adminEmails.join(', '), subject: util.format('%s has a new update available', app.fqdn), text: render('app_update_available.ejs', { fqdn: config.fqdn(), webadminUrl: config.adminOrigin(), app: app, updateInfo: updateInfo, format: 'text' }) @@ -378,7 +394,7 @@ function outOfDiskSpace(message) { if (error) return console.log('Error getting admins', error); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: config.provider() === 'caas' ? 'support@cloudron.io' : adminEmails.join(', '), subject: util.format('[%s] Out of disk space alert', config.fqdn()), text: render('out_of_disk_space.ejs', { fqdn: config.fqdn(), message: message, format: 'text' }) @@ -396,7 +412,7 @@ function certificateRenewalError(domain, message) { if (error) return console.log('Error getting admins', error); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: config.provider() === 'caas' ? 'support@cloudron.io' : adminEmails.join(', '), subject: util.format('[%s] Certificate renewal error', domain), text: render('certificate_renewal_error.ejs', { domain: domain, message: message, format: 'text' }) @@ -413,7 +429,7 @@ function unexpectedExit(program, context) { assert.strictEqual(typeof context, 'string'); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: 'support@cloudron.io', subject: util.format('[%s] %s exited unexpectedly', config.fqdn(), program), text: render('unexpected_exit.ejs', { fqdn: config.fqdn(), program: program, context: context, format: 'text' }) @@ -435,7 +451,7 @@ function sendFeedback(user, type, subject, description) { type === exports.FEEDBACK_TYPE_APP_ERROR); var mailOptions = { - from: platform.mailConfig().from, + from: mailConfig().from, to: 'support@cloudron.io', subject: util.format('[%s] %s - %s', type, config.fqdn(), subject), text: render('feedback.ejs', { fqdn: config.fqdn(), type: type, user: user, subject: subject, description: description, format: 'text'}) diff --git a/src/platform.js b/src/platform.js index 88d44bf29..9aa08aac8 100644 --- a/src/platform.js +++ b/src/platform.js @@ -7,9 +7,7 @@ exports = module.exports = { events: new (require('events').EventEmitter)(), EVENT_READY: 'ready', - isReadySync: isReadySync, - - mailConfig: mailConfig + isReadySync: isReadySync }; var apps = require('./apps.js'), @@ -21,7 +19,6 @@ var apps = require('./apps.js'), fs = require('fs'), hat = require('hat'), infra = require('./infra_version.js'), - ini = require('ini'), mailboxes = require('./mailboxes.js'), paths = require('./paths.js'), safe = require('safetydance'), @@ -31,8 +28,7 @@ var apps = require('./apps.js'), util = require('util'), _ = require('underscore'); -var gAddonVars = null, - gPlatformReadyTimer = null; +var gPlatformReadyTimer = null; var NOOP_CALLBACK = function (error) { if (error) debug(error); }; @@ -41,9 +37,7 @@ function initialize(callback) { debug('initializing addon infrastructure'); - settings.events.on(settings.MAIL_CONFIG_KEY, function () { - async.series([ startMail, loadAddonVars ], NOOP_CALLBACK); - }); + settings.events.on(settings.MAIL_CONFIG_KEY, function () { startMail(NOOP_CALLBACK); }); var existingInfra = { version: 'none' }; if (fs.existsSync(paths.INFRA_VERSION_FILE)) { @@ -55,7 +49,7 @@ function initialize(callback) { if (_.isEqual(infra, existingInfra)) { debug('platform is uptodate at version %s', infra.version); process.nextTick(function () { exports.events.emit(exports.EVENT_READY); }); - return loadAddonVars(callback); + return callback; } debug('Updating infrastructure from %s to %s', existingInfra.version, infra.version); @@ -66,7 +60,6 @@ function initialize(callback) { startAddons.bind(null, existingInfra), removeOldImages, startApps.bind(null, existingInfra), - loadAddonVars, fs.writeFile.bind(fs, paths.INFRA_VERSION_FILE, JSON.stringify(infra)) ], function (error) { if (error) return callback(error); @@ -316,24 +309,3 @@ function startApps(existingInfra, callback) { } } -function loadAddonVars(callback) { - gAddonVars = { - mail: ini.parse(fs.readFileSync(paths.DATA_DIR + '/addons/mail_vars.sh', 'utf8')), - postgresql: ini.parse(fs.readFileSync(paths.DATA_DIR + '/addons/postgresql_vars.sh', 'utf8')), - mysql: ini.parse(fs.readFileSync(paths.DATA_DIR + '/addons/mysql_vars.sh', 'utf8')), - mongodb: ini.parse(fs.readFileSync(paths.DATA_DIR + '/addons/mongodb_vars.sh', 'utf8')) - }; - callback(); -} - -function mailConfig() { - if (process.env.BOX_ENV === 'test' && !process.env.TEST_CREATE_INFRA) { - return { username: 'no-reply', from: 'no-reply@' + config.fqdn(), password: 'doesnotwork' }; - } - - return { - username: gAddonVars.mail.MAIL_ROOT_USERNAME, - from: '"Cloudron" <' + gAddonVars.mail.MAIL_ROOT_USERNAME + '@' + config.fqdn() + '>', - password: gAddonVars.mail.MAIL_ROOT_PASSWORD - }; -}