From a670175e01ddc9af17b6f279156e6b4ca64a2817 Mon Sep 17 00:00:00 2001 From: PatrickRL <121479313+PatrickRL@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:11:30 +0100 Subject: [PATCH] ADD: Stereum Log Backup (#2127) * ADD: stereum log backup automatically creates backups of the log file option to configure how many backups are stored * changed backup function backups are now created when the main log file reaches 1MB and a new log file gets created * implemented requested changes --- launcher/src/background.js | 30 +++++++- .../UI/setting-page/SettingScreen.vue | 2 + .../UI/setting-page/components/LogBackups.vue | 75 +++++++++++++++++++ launcher/src/store/theFooter.js | 1 + 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 launcher/src/components/UI/setting-page/components/LogBackups.vue diff --git a/launcher/src/background.js b/launcher/src/background.js index 7cb346241..00364aa04 100755 --- a/launcher/src/background.js +++ b/launcher/src/background.js @@ -15,7 +15,7 @@ import { AuthenticationService } from "./backend/AuthenticationService.js"; import { TekuGasLimitConfig } from "./backend/TekuGasLimitConfig.js"; import { SSHService } from "./backend/SSHService.js"; import path from "path"; -import { readFileSync } from "fs"; +import { readFileSync, existsSync, mkdirSync, renameSync, readdir, rmSync } from "fs"; import url from "url"; import checkSigningKeys from "./backend/web3/CSM.js"; const isDevelopment = process.env.NODE_ENV !== "production"; @@ -37,6 +37,34 @@ const stereumUpdater = new StereumUpdater(log, createWindow, isDevelopment); stereumUpdater.initUpdater(); log.transports.console.level = process.env.LOG_LEVEL || "info"; log.transports.file.level = "debug"; +log.transports.file.archiveLogFn = async (file) => { + file = file.toString(); + const info = path.parse(file); + let backupPath = info.dir + "/backups/"; + if (!existsSync(backupPath)) { + mkdirSync(backupPath); + } + + renameSync(file, `${backupPath}main-${Date.now()}.log`); + + let backupLogs = []; + + const storedConfig = await storageService.readConfig(); + + readdir(backupPath, (err, files) => { + files.forEach((file) => { + backupLogs.push(file); + }); + if (backupLogs.length > storedConfig.logBackups.value) { + backupLogs.reverse(); + for (let i = storedConfig.logBackups.value; i < backupLogs.length; i++) { + rmSync(backupPath + backupLogs[i], { force: true }, (err) => { + if (err) throw err; + }); + } + } + }); +}; let remoteHost = {}; diff --git a/launcher/src/components/UI/setting-page/SettingScreen.vue b/launcher/src/components/UI/setting-page/SettingScreen.vue index 9db029303..c446088e4 100644 --- a/launcher/src/components/UI/setting-page/SettingScreen.vue +++ b/launcher/src/components/UI/setting-page/SettingScreen.vue @@ -35,6 +35,7 @@ import OutputOptions from "./components/OutputOptions.vue"; import LanguageBtn from "./components/LanguageBtn.vue"; import CreditButtons from "./section/CreditButtons.vue"; import IdleTimer from "./components/IdleTimer.vue"; +import LogBackups from "./components/LogBackups.vue"; import IdleTimerTime from "./components/IdleTimerTime.vue"; import { ref, computed, onMounted } from "vue"; import CreditBtn from "./components/CreditBtn.vue"; @@ -105,6 +106,7 @@ const itemConfigurations = computed(() => { { title: "Credits", component: CreditButtons }, { title: "Idle Timeout", component: IdleTimer }, { title: "Idle Timeout Time (in minutes)", component: IdleTimerTime }, + { title: "Stereum Log Backups", component: LogBackups }, ]; } else if (mainBox.value === "audio") { items = [ diff --git a/launcher/src/components/UI/setting-page/components/LogBackups.vue b/launcher/src/components/UI/setting-page/components/LogBackups.vue new file mode 100644 index 000000000..8800c83c0 --- /dev/null +++ b/launcher/src/components/UI/setting-page/components/LogBackups.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/launcher/src/store/theFooter.js b/launcher/src/store/theFooter.js index 7e9bded3a..1aba25d02 100644 --- a/launcher/src/store/theFooter.js +++ b/launcher/src/store/theFooter.js @@ -22,6 +22,7 @@ export const useFooter = defineStore("theFooter", { volState: false, idleTimer: false, idleTimerTime: 5, + logBackups: 3, }; }, getters: {},