diff --git a/CHANGES b/CHANGES index 0394360e7..15bbca41a 100644 --- a/CHANGES +++ b/CHANGES @@ -1547,4 +1547,5 @@ * Block platform updates based on app manifest constraints * Make crash logs viewable via the dashboard * Fix issue where uploading of filenames with brackets and plus was not working +* Add notification for cert renewal and backup failures diff --git a/src/backups.js b/src/backups.js index 6cbc0ff50..d5d846a55 100644 --- a/src/backups.js +++ b/src/backups.js @@ -55,7 +55,6 @@ var addons = require('./addons.js'), eventlog = require('./eventlog.js'), fs = require('fs'), locker = require('./locker.js'), - mailer = require('./mailer.js'), mkdirp = require('mkdirp'), once = require('once'), path = require('path'), @@ -1018,9 +1017,9 @@ function startBackupTask(auditSource, callback) { task.on('finish', (error, result) => { locker.unlock(locker.OP_FULL_BACKUP); - if (error) mailer.backupFailed(error); + const errorMessage = error ? util.inspect(result, { depth: 10, showHidden: true }) : ''; - eventlog.add(eventlog.ACTION_BACKUP_FINISH, auditSource, { errorMessage: error ? error.message : null, backupId: result }); + eventlog.add(eventlog.ACTION_BACKUP_FINISH, auditSource, { errorMessage: errorMessage, backupId: result }); }); } diff --git a/src/mailer.js b/src/mailer.js index 566a068a8..7ad92ebd4 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -47,17 +47,6 @@ var MAIL_TEMPLATES_DIR = path.join(__dirname, 'mail_templates'); var gMailQueue = [ ]; -function splatchError(error) { - var result = { }; - Object.getOwnPropertyNames(error).forEach(function (key) { - var value = this[key]; - if (value instanceof Error) value = splatchError(value); - result[key] = value; - }, error /* thisArg */); - - return util.inspect(result, { depth: null, showHidden: true }); -} - function getAdminEmails(callback) { users.getAllAdmins(function (error, admins) { if (error) return callback(error); @@ -459,9 +448,7 @@ function sendDigest(info) { }); } -function backupFailed(error) { - var message = splatchError(error); - +function backupFailed(errorMessage) { getMailConfig(function (error, mailConfig) { if (error) return debug('Error getting mail details:', error); @@ -469,7 +456,7 @@ function backupFailed(error) { from: mailConfig.notificationFrom, to: config.provider() === 'caas' ? 'support@cloudron.io' : mailConfig.adminEmails.join(', '), subject: util.format('[%s] Failed to backup', mailConfig.cloudronName), - text: render('backup_failed.ejs', { cloudronName: mailConfig.cloudronName, message: message, format: 'text' }) + text: render('backup_failed.ejs', { cloudronName: mailConfig.cloudronName, message: errorMessage, format: 'text' }) }; enqueue(mailOptions); diff --git a/src/notifications.js b/src/notifications.js index f8c25e296..9a1332684 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -275,6 +275,17 @@ function certificateRenewalError(eventId, vhost, errorMessage, callback) { }, callback); } +function backupFailed(eventId, errorMessage, callback) { + assert.strictEqual(typeof eventId, 'string'); + assert.strictEqual(typeof errorMessage, 'string'); + assert.strictEqual(typeof callback, 'function'); + + actionForAllAdmins([], function (admin, callback) { + mailer.backupFailed(errorMessage); + add(admin.id, eventId, 'Failed to backup', `Backup failed: ${errorMessage}. Will be retried in 4 hours`, callback); + }, callback); +} + function upsert(userId, eventId, title, message, callback) { assert.strictEqual(typeof userId, 'string'); assert(typeof eventId === 'string' || eventId === null); @@ -335,6 +346,8 @@ function onEvent(id, action, source, data, callback) { case eventlog.ACTION_CERTIFICATE_NEW: return data.errorMessage ? certificateRenewalError(id, data.domain, data.errorMessage, callback): callback(); + case eventlog.ACTION_BACKUP_FINISH: return data.errorMessage ? backupFailed(id, data.errorMessage, callback) : callback(); + default: return callback(); } }