2017-10-22 09:10:33 +08:00
|
|
|
"use strict";
|
|
|
|
|
2018-04-03 08:46:46 +08:00
|
|
|
const dateUtils = require('./date_utils');
|
2018-04-02 09:27:46 +08:00
|
|
|
const optionService = require('./options');
|
2017-10-15 11:31:44 +08:00
|
|
|
const fs = require('fs-extra');
|
2017-10-24 11:30:23 +08:00
|
|
|
const dataDir = require('./data_dir');
|
2017-10-25 10:17:48 +08:00
|
|
|
const log = require('./log');
|
2018-04-03 09:25:20 +08:00
|
|
|
const sqlInit = require('./sql_init');
|
2018-04-02 09:27:46 +08:00
|
|
|
const syncMutexService = require('./sync_mutex');
|
2018-03-29 11:41:22 +08:00
|
|
|
const cls = require('./cls');
|
2017-10-15 11:31:44 +08:00
|
|
|
|
|
|
|
async function regularBackup() {
|
2018-07-30 22:40:50 +08:00
|
|
|
await periodBackup('lastDailyBackupDate', 'daily', 24 * 3600);
|
|
|
|
|
|
|
|
await periodBackup('lastWeeklyBackupDate', 'weekly', 7 * 24 * 3600);
|
|
|
|
|
|
|
|
await periodBackup('lastMonthlyBackupDate', 'monthly', 30 * 24 * 3600);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function periodBackup(optionName, fileName, periodInSeconds) {
|
2017-12-11 01:56:59 +08:00
|
|
|
const now = new Date();
|
2018-07-30 22:40:50 +08:00
|
|
|
const lastDailyBackupDate = dateUtils.parseDateTime(await optionService.getOption(optionName));
|
2017-10-15 11:31:44 +08:00
|
|
|
|
2018-07-30 22:40:50 +08:00
|
|
|
if (now.getTime() - lastDailyBackupDate.getTime() > periodInSeconds * 1000) {
|
|
|
|
await backupNow(fileName);
|
2017-12-11 01:56:59 +08:00
|
|
|
|
2018-07-30 22:40:50 +08:00
|
|
|
await optionService.setOption(optionName, dateUtils.nowDate());
|
2017-10-15 11:31:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-30 22:40:50 +08:00
|
|
|
async function backupNow(name) {
|
2018-01-05 10:37:36 +08:00
|
|
|
// we don't want to backup DB in the middle of sync with potentially inconsistent DB state
|
2018-04-02 09:27:46 +08:00
|
|
|
await syncMutexService.doExclusively(async () => {
|
2018-07-30 22:40:50 +08:00
|
|
|
const backupFile = `${dataDir.BACKUP_DIR}/backup-${name}.db`;
|
2017-10-25 10:17:48 +08:00
|
|
|
|
2018-01-05 10:37:36 +08:00
|
|
|
fs.copySync(dataDir.DOCUMENT_PATH, backupFile);
|
2017-10-15 11:31:44 +08:00
|
|
|
|
2018-01-05 10:37:36 +08:00
|
|
|
log.info("Created backup at " + backupFile);
|
2017-10-15 11:31:44 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-10-29 00:23:11 +08:00
|
|
|
if (!fs.existsSync(dataDir.BACKUP_DIR)) {
|
|
|
|
fs.mkdirSync(dataDir.BACKUP_DIR, 0o700);
|
|
|
|
}
|
|
|
|
|
2018-04-03 09:25:20 +08:00
|
|
|
sqlInit.dbReady.then(() => {
|
2018-03-29 11:41:22 +08:00
|
|
|
setInterval(cls.wrap(regularBackup), 60 * 60 * 1000);
|
2017-10-29 00:23:11 +08:00
|
|
|
|
2017-12-04 08:18:33 +08:00
|
|
|
// kickoff backup immediately
|
2018-03-29 11:41:22 +08:00
|
|
|
setTimeout(cls.wrap(regularBackup), 1000);
|
2017-12-04 08:18:33 +08:00
|
|
|
});
|
2017-10-29 00:23:11 +08:00
|
|
|
|
2017-10-15 11:31:44 +08:00
|
|
|
module.exports = {
|
|
|
|
backupNow
|
|
|
|
};
|