diff --git a/CHANGES b/CHANGES index c2e731771..fc5568f26 100644 --- a/CHANGES +++ b/CHANGES @@ -580,4 +580,5 @@ [0.17.3] - Incremental infrastructure update logic +- Keep eventlogs only for a week diff --git a/src/cron.js b/src/cron.js index d18ed95e9..c6b19dca7 100644 --- a/src/cron.js +++ b/src/cron.js @@ -13,6 +13,7 @@ var apps = require('./apps.js'), config = require('./config.js'), CronJob = require('cron').CronJob, debug = require('debug')('box:cron'), + eventlog = require('./eventlog.js'), janitor = require('./janitor.js'), scheduler = require('./scheduler.js'), settings = require('./settings.js'), @@ -27,7 +28,8 @@ var gAutoupdaterJob = null, gDockerVolumeCleanerJob = null, gSchedulerSyncJob = null, gCertificateRenewJob = null, - gCheckDiskSpaceJob = null; + gCheckDiskSpaceJob = null, + gCleanupEventlogJob = null; var NOOP_CALLBACK = function (error) { if (error) console.error(error); }; var AUDIT_SOURCE = { userId: null, username: 'cron' }; @@ -104,6 +106,14 @@ function recreateJobs(unusedTimeZone, callback) { timeZone: allSettings[settings.TIME_ZONE_KEY] }); + if (gCleanupEventlogJob) gCleanupEventlogJob.stop(); + gCleanupEventlogJob = new CronJob({ + cronTime: '00 */30 * * * *', // every 30 minutes + onTick: eventlog.cleanup, + start: true, + timeZone: allSettings[settings.TIME_ZONE_KEY] + }); + if (gDockerVolumeCleanerJob) gDockerVolumeCleanerJob.stop(); gDockerVolumeCleanerJob = new CronJob({ cronTime: '00 00 */12 * * *', // every 12 hours @@ -194,6 +204,9 @@ function uninitialize(callback) { if (gCleanupTokensJob) gCleanupTokensJob.stop(); gCleanupTokensJob = null; + if (gCleanupEventlogJob) gCleanupEventlogJob.stop(); + gCleanupEventlogJob = null; + if (gDockerVolumeCleanerJob) gDockerVolumeCleanerJob.stop(); gDockerVolumeCleanerJob = null; diff --git a/src/eventlog.js b/src/eventlog.js index ee618df77..bec0462e3 100644 --- a/src/eventlog.js +++ b/src/eventlog.js @@ -6,6 +6,7 @@ exports = module.exports = { add: add, get: get, getAllPaged: getAllPaged, + cleanup: cleanup, // keep in sync with webadmin index.js filter ACTION_ACTIVATE: 'cloudron.activate', @@ -100,3 +101,16 @@ function getAllPaged(action, search, page, perPage, callback) { callback(null, boxes); }); } + +function cleanup(callback) { + callback = callback || NOOP_CALLBACK; + + var d = new Date(); + d.setDate(d.getDate() - 7); // 7 days ago + + eventlogdb.delByCreationTime(d, function (error) { + if (error) return callback(new EventLogError(EventLogError.INTERNAL_ERROR, error)); + + callback(null); + }); +} diff --git a/src/eventlogdb.js b/src/eventlogdb.js index c4fc565f6..c368c9c5d 100644 --- a/src/eventlogdb.js +++ b/src/eventlogdb.js @@ -5,6 +5,7 @@ exports = module.exports = { getAllPaged: getAllPaged, add: add, count: count, + delByCreationTime: delByCreationTime, _clear: clear }; @@ -13,7 +14,8 @@ var assert = require('assert'), database = require('./database.js'), DatabaseError = require('./databaseerror'), mysql = require('mysql'), - safe = require('safetydance'); + safe = require('safetydance'), + util = require('util'); var EVENTLOGS_FIELDS = [ 'id', 'action', 'source', 'data', 'creationTime' ].join(','); @@ -102,3 +104,13 @@ function clear(callback) { }); } +function delByCreationTime(creationTime, callback) { + assert(util.isDate(creationTime)); + assert.strictEqual(typeof callback, 'function'); + + database.query('DELETE FROM eventlog WHERE creationTime < ?', [ creationTime ], function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(error); + }); +} diff --git a/src/test/database-test.js b/src/test/database-test.js index 0dc06c5db..516035afc 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -1173,6 +1173,19 @@ describe('database', function () { done(); }); }); + + it('delByCreationTime succeeds', function (done) { + eventlogdb.delByCreationTime(new Date(), function (error) { + expect(error).to.be(null); + + eventlogdb.getAllPaged(null, null, 1, 1, function (error, results) { + expect(error).to.be(null); + expect(results.length).to.be(0); + + done(); + }); + }); + }); }); describe('mailboxes', function () { diff --git a/src/test/eventlog-test.js b/src/test/eventlog-test.js index 0bb67a15f..0aa6ff698 100644 --- a/src/test/eventlog-test.js +++ b/src/test/eventlog-test.js @@ -78,4 +78,19 @@ describe('Eventlog', function () { done(); }); }); + + it('cleans up token', function (done) { + eventlog.cleanup(function (error) { + expect(error).to.be(null); + + eventlog.get(eventId, function (error, result) { // should not have deleted it + expect(error).to.be(null); + expect(result.id).to.be(eventId); + expect(result.action).to.be('some.event'); + expect(result.creationTime).to.be.a(Date); + + done(); + }); + }); + }); });