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: {},