diff --git a/migrations/20180813045043-settings-set-default-intervalSecs.js b/migrations/20180813045043-settings-set-default-intervalSecs.js new file mode 100644 index 000000000..c4239e254 --- /dev/null +++ b/migrations/20180813045043-settings-set-default-intervalSecs.js @@ -0,0 +1,16 @@ +'use strict'; + +exports.up = function(db, callback) { + db.all('SELECT value FROM settings WHERE name="backup_config"', function (error, results) { + if (error || results.length === 0) return callback(error); + + var backupConfig = JSON.parse(results[0].value); + backupConfig.intervalSecs = 24 * 60 * 60; + db.runSql('UPDATE settings SET value=? WHERE name="backup_config"', [ JSON.stringify(backupConfig) ], callback); + + }); +}; + +exports.down = function(db, callback) { + callback(); +}; diff --git a/src/backups.js b/src/backups.js index 78e39d5a2..e5002e503 100644 --- a/src/backups.js +++ b/src/backups.js @@ -124,6 +124,8 @@ function testConfig(backupConfig, callback) { if (backupConfig.format !== 'tgz' && backupConfig.format !== 'rsync') return callback(new BackupsError(BackupsError.BAD_FIELD, 'unknown format')); + if (backupConfig.intervalSecs < 6 * 60 * 60) return callback(new BackupsError(BackupsError.BAD_FIELD, 'Interval must be atleast 6 hours')); + api(backupConfig.provider).testConfig(backupConfig, callback); } @@ -984,12 +986,16 @@ function ensureBackup(auditSource, callback) { return callback(error); // no point trying to backup if appstore is down } - if (backups.length !== 0 && (new Date() - new Date(backups[0].creationTime) < 23 * 60 * 60 * 1000)) { // ~1 day ago - debug('Previous backup was %j, no need to backup now', backups[0]); - return callback(null); - } + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(error); - backup(auditSource, callback); + if (backups.length !== 0 && (new Date() - new Date(backups[0].creationTime) < (backupConfig.intervalSecs - 3600) * 1000)) { // adjust 1 hour + debug('Previous backup was %j, no need to backup now', backups[0]); + return callback(null); + } + + backup(auditSource, callback); + }); }); } diff --git a/src/routes/settings.js b/src/routes/settings.js index 5e7bd3963..a464e7e02 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -158,6 +158,7 @@ function setBackupConfig(req, res, next) { if (typeof req.body.provider !== 'string') return next(new HttpError(400, 'provider is required')); if (typeof req.body.retentionSecs !== 'number') return next(new HttpError(400, 'retentionSecs is required')); + if (typeof req.body.intervalSecs !== 'number') return next(new HttpError(400, 'intervalSecs is required')); if ('key' in req.body && typeof req.body.key !== 'string') return next(new HttpError(400, 'key must be a string')); if ('syncConcurrency' in req.body) { if (typeof req.body.syncConcurrency !== 'number') return next(new HttpError(400, 'syncConcurrency must be a positive integer')); diff --git a/src/settings.js b/src/settings.js index 3055fc424..04e65ff05 100644 --- a/src/settings.js +++ b/src/settings.js @@ -90,7 +90,8 @@ var gDefaults = (function () { provider: 'filesystem', key: '', backupFolder: '/var/backups', - retentionSecs: 172800 + retentionSecs: 2 * 24 * 60 * 60, // 2 days + intervalSecs: 24 * 60 * 60 // ~1 day }; result[exports.UPDATE_CONFIG_KEY] = { prerelease: false }; result[exports.APPSTORE_CONFIG_KEY] = {};