settings: move backup settings
This commit is contained in:
+89
-4
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user