diff --git a/src/cloudron.js b/src/cloudron.js index 42549f2ee..7ca11c1c7 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -37,7 +37,6 @@ var assert = require('assert'), eventlog = require('./eventlog.js'), fs = require('fs'), mail = require('./mail.js'), - mailer = require('./mailer.js'), notifications = require('./notifications.js'), os = require('os'), path = require('path'), @@ -191,7 +190,8 @@ function isRebootRequired(callback) { function runSystemChecks() { async.parallel([ checkBackupConfiguration, - checkDiskSpace + checkDiskSpace, + checkMailStatus ], function () { debug('runSystemChecks: done'); }); @@ -254,6 +254,35 @@ function checkDiskSpace(callback) { }); } +function checkMailStatus(callback) { + assert.strictEqual(typeof callback, 'function'); + + debug('checking mail status'); + + domains.getAll(function (error, allDomains) { + if (error) return callback(error); + + async.filterSeries(allDomains, function (domainObject, iteratorCallback) { + mail.getStatus(config.adminDomain(), function (error, result) { + if (error) return iteratorCallback(null, true); + + let mailError = Object.keys(result.dns).some((record) => !result.dns[record].status); + if (result.rbl && !result.rbl.status) mailError = true; + if (result.relay && !result.relay.status) mailError = true; + + iteratorCallback(null, mailError); + }); + }, function (error, erroredDomainObjects) { + if (error || erroredDomainObjects.length === 0) return callback(error); + + const erroredDomains = erroredDomainObjects.map((d) => d.domain); + if (erroredDomains.length) notifications.mailStatusWarning(`Email status check of one or more domains failed - ${erroredDomains.join(',')}`); + + callback(); + }); + }); +} + function getLogs(unit, options, callback) { assert.strictEqual(typeof unit, 'string'); assert(options && typeof options === 'object'); diff --git a/src/notifications.js b/src/notifications.js index 9789612dd..5aee2b677 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -18,7 +18,8 @@ exports = module.exports = { processCrash: processCrash, apptaskCrash: apptaskCrash, backupConfigWarning: backupConfigWarning, - diskSpaceWarning: diskSpaceWarning + diskSpaceWarning: diskSpaceWarning, + mailStatusWarning: mailStatusWarning }; var assert = require('assert'), @@ -281,6 +282,16 @@ function backupConfigWarning(message) { }); } +function mailStatusWarning(message) { + assert.strictEqual(typeof message, 'string'); + + actionForAllAdmins([], function (admin, callback) { + upsert(admin.id, null, 'Mail Status', message, '/#/mail', callback); + }, function (error) { + if (error) console.error(error); + }); +} + function diskSpaceWarning(message) { assert.strictEqual(typeof message, 'string');