settings: move backup settings

This commit is contained in:
Girish Ramakrishnan
2023-08-04 11:24:28 +05:30
parent 77c66d9a02
commit e73b75e4b5
20 changed files with 535 additions and 580 deletions
+89 -4
View File
@@ -27,6 +27,12 @@ exports = module.exports = {
validateEncryptionPassword,
testConfig,
getPolicy,
setPolicy,
getConfig,
setConfig,
remount,
getMountStatus,
@@ -45,6 +51,7 @@ exports = module.exports = {
const assert = require('assert'),
BoxError = require('./boxerror.js'),
constants = require('./constants.js'),
cron = require('./cron.js'),
CronJob = require('cron').CronJob,
crypto = require('crypto'),
database = require('./database.js'),
@@ -58,7 +65,8 @@ const assert = require('assert'),
safe = require('safetydance'),
settings = require('./settings.js'),
storage = require('./storage.js'),
tasks = require('./tasks.js');
tasks = require('./tasks.js'),
_ = require('underscore');
const BACKUPS_FIELDS = [ 'id', 'remotePath', 'label', 'identifier', 'creationTime', 'packageVersion', 'type', 'dependsOnJson', 'state', 'manifestJson', 'format', 'preserveSecs', 'encryptionVersion' ];
@@ -240,7 +248,7 @@ async function startBackupTask(auditSource) {
let error = locker.lock(locker.OP_FULL_BACKUP);
if (error) throw new BoxError(BoxError.BAD_STATE, `Cannot backup now: ${error.message}`);
const backupConfig = await settings.getBackupConfig();
const backupConfig = await getConfig();
const memoryLimit = backupConfig.limits?.memoryLimit ? Math.max(backupConfig.limits.memoryLimit/1024/1024, 800) : 800;
@@ -352,7 +360,7 @@ async function validateEncryptionPassword(password) {
async function remount(auditSource) {
assert.strictEqual(typeof auditSource, 'object');
const backupConfig = await settings.getBackupConfig();
const backupConfig = await getConfig();
const func = storage.api(backupConfig.provider);
if (!func) throw new BoxError(BoxError.BAD_FIELD, 'unknown storage provider');
@@ -361,7 +369,7 @@ async function remount(auditSource) {
}
async function getMountStatus() {
const backupConfig = await settings.getBackupConfig();
const backupConfig = await getConfig();
let hostPath;
if (mounts.isManagedProvider(backupConfig.provider)) {
@@ -376,3 +384,80 @@ async function getMountStatus() {
return await mounts.getStatus(backupConfig.provider, hostPath); // { state, message }
}
async function getPolicy() {
const result = await settings.getJson(settings.BACKUP_POLICY_KEY);
return result || {
retention: { keepWithinSecs: 2 * 24 * 60 * 60 }, // 2 days
schedule: '00 00 23 * * *' // every day at 11pm
};
}
async function setPolicy(policy) {
assert.strictEqual(typeof policy, 'object');
const error = await validatePolicy(policy);
if (error) throw error;
await settings.setJson(settings.BACKUP_POLICY_KEY, policy);
await cron.backupPolicyChanged(policy);
}
async function getConfig() {
const value = await settings.getJson(settings.BACKUP_CONFIG_KEY);
return value || {
provider: 'filesystem',
backupFolder: paths.DEFAULT_BACKUP_DIR,
format: 'tgz',
encryption: null,
};
}
async function setConfig(backupConfig) {
assert.strictEqual(typeof backupConfig, 'object');
const oldConfig = await getConfig();
injectPrivateFields(backupConfig, oldConfig);
if (mounts.isManagedProvider(backupConfig.provider)) {
let error = mounts.validateMountOptions(backupConfig.provider, backupConfig.mountOptions);
if (error) throw error;
[error] = await safe(mounts.tryAddMount(mounts.mountObjectFromBackupConfig(backupConfig), { timeout: 10 })); // 10 seconds
if (error) {
if (mounts.isManagedProvider(oldConfig.provider)) { // put back the old mount configuration
debug('setBackupConfig: rolling back to previous mount configuration');
await safe(mounts.tryAddMount(mounts.mountObjectFromBackupConfig(oldConfig), { timeout: 10 }));
}
throw error;
}
}
const error = await testConfig(backupConfig);
if (error) throw error;
if ('password' in backupConfig) { // user set password
const error = await validateEncryptionPassword(backupConfig.password);
if (error) throw error;
backupConfig.encryption = generateEncryptionKeysSync(backupConfig.password);
delete backupConfig.password;
}
// if any of these changes, we have to clear the cache
if (!_.isEqual(_.omit(backupConfig, 'limits'), _.omit(oldConfig, 'limits'))) {
debug('setBackupConfig: clearing backup cache');
cleanupCacheFilesSync();
}
await settings.setJson(settings.BACKUP_CONFIG_KEY, backupConfig);
if (mounts.isManagedProvider(oldConfig.provider) && !mounts.isManagedProvider(backupConfig.provider)) {
debug('setBackupConfig: removing old backup mount point');
await safe(mounts.removeMount(mounts.mountObjectFromBackupConfig(oldConfig)));
}
}