2017-10-21 21:10:33 -04:00
|
|
|
"use strict";
|
|
|
|
|
2018-04-02 20:46:46 -04:00
|
|
|
const dateUtils = require('./date_utils');
|
2018-04-01 21:27:46 -04:00
|
|
|
const optionService = require('./options');
|
2017-10-14 23:31:44 -04:00
|
|
|
const fs = require('fs-extra');
|
2017-10-23 23:30:23 -04:00
|
|
|
const dataDir = require('./data_dir');
|
2017-10-24 22:17:48 -04:00
|
|
|
const log = require('./log');
|
2018-04-01 21:27:46 -04:00
|
|
|
const syncMutexService = require('./sync_mutex');
|
2018-03-28 23:41:22 -04:00
|
|
|
const cls = require('./cls');
|
2022-01-17 23:47:26 +01:00
|
|
|
const sql = require('./sql');
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2020-06-20 12:31:38 +02:00
|
|
|
function regularBackup() {
|
2020-07-04 00:20:23 +02:00
|
|
|
cls.init(() => {
|
|
|
|
periodBackup('lastDailyBackupDate', 'daily', 24 * 3600);
|
2018-07-30 16:40:50 +02:00
|
|
|
|
2020-07-04 00:20:23 +02:00
|
|
|
periodBackup('lastWeeklyBackupDate', 'weekly', 7 * 24 * 3600);
|
2018-07-30 16:40:50 +02:00
|
|
|
|
2020-07-04 00:20:23 +02:00
|
|
|
periodBackup('lastMonthlyBackupDate', 'monthly', 30 * 24 * 3600);
|
|
|
|
});
|
2018-07-30 16:40:50 +02:00
|
|
|
}
|
|
|
|
|
2021-10-11 22:30:23 +02:00
|
|
|
function isBackupEnabled(backupType) {
|
|
|
|
const optionName = `${backupType}BackupEnabled`;
|
|
|
|
|
|
|
|
return optionService.getOptionBool(optionName);
|
|
|
|
}
|
|
|
|
|
|
|
|
function periodBackup(optionName, backupType, periodInSeconds) {
|
|
|
|
if (!isBackupEnabled(backupType)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-12-10 12:56:59 -05:00
|
|
|
const now = new Date();
|
2021-10-11 22:30:23 +02:00
|
|
|
const lastBackupDate = dateUtils.parseDateTime(optionService.getOption(optionName));
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2021-10-11 22:30:23 +02:00
|
|
|
if (now.getTime() - lastBackupDate.getTime() > periodInSeconds * 1000) {
|
|
|
|
backupNow(backupType);
|
2017-12-10 12:56:59 -05:00
|
|
|
|
2020-06-20 12:31:38 +02:00
|
|
|
optionService.setOption(optionName, dateUtils.utcNowDateTime());
|
2017-10-14 23:31:44 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-02 23:13:55 +02:00
|
|
|
async function backupNow(name) {
|
2022-01-17 23:47:26 +01:00
|
|
|
// we don't want to back up DB in the middle of sync with potentially inconsistent DB state
|
2020-06-20 23:09:34 +02:00
|
|
|
return await syncMutexService.doExclusively(async () => {
|
2018-07-30 16:40:50 +02:00
|
|
|
const backupFile = `${dataDir.BACKUP_DIR}/backup-${name}.db`;
|
2017-10-24 22:17:48 -04:00
|
|
|
|
2022-01-17 23:47:26 +01:00
|
|
|
await sql.copyDatabase(backupFile);
|
2020-05-29 21:55:08 +02:00
|
|
|
|
2020-06-20 23:09:34 +02:00
|
|
|
log.info("Created backup at " + backupFile);
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2020-05-29 21:55:08 +02:00
|
|
|
return backupFile;
|
2017-10-14 23:31:44 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-10-28 12:23:11 -04:00
|
|
|
if (!fs.existsSync(dataDir.BACKUP_DIR)) {
|
|
|
|
fs.mkdirSync(dataDir.BACKUP_DIR, 0o700);
|
|
|
|
}
|
|
|
|
|
2017-10-14 23:31:44 -04:00
|
|
|
module.exports = {
|
2020-06-02 23:13:55 +02:00
|
|
|
backupNow,
|
2020-07-02 22:57:17 +02:00
|
|
|
regularBackup
|
2020-05-29 21:55:08 +02:00
|
|
|
};
|