Skip to content

Commit

Permalink
ADD: Stereum Log Backup (#2127)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
PatrickRL authored Dec 9, 2024
1 parent a497df5 commit a670175
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 1 deletion.
30 changes: 29 additions & 1 deletion launcher/src/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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 = {};

Expand Down
2 changes: 2 additions & 0 deletions launcher/src/components/UI/setting-page/SettingScreen.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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 = [
Expand Down
75 changes: 75 additions & 0 deletions launcher/src/components/UI/setting-page/components/LogBackups.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<template>
<div class="LogBacksups-parent w-full h-full justify-center items-center flex">
<input
type="number"
:value="footerStore.logBackups"
class="lang-btn-parent w-full h-full bg-[#33393E] rounded-md flex justify-center items-center cursor-pointer border border-[#33393E] uppercase pl-3 pr-3 text-gray-200 text-base"
@change="onChange($event)"
/>
</div>
</template>

<script setup>
import { onMounted } from "vue";
import ControlService from "@/store/ControlService";
import { useFooter } from "@/store/theFooter";
const footerStore = useFooter();
const checkSettings = async () => {
try {
const savedConfig = await ControlService.readConfig();
if (typeof savedConfig.logBackups.value !== "undefined") {
footerStore.logBackups = savedConfig.logBackups.value;
} else {
updateSettings(5);
}
} catch (error) {
console.error("Failed to load saved settings:", error);
}
};
const updateSettings = async (logBackup) => {
try {
const prevConf = await ControlService.readConfig();
const conf = {
...prevConf,
logBackups: { value: logBackup },
};
await ControlService.writeConfig(conf);
useFooter.logBackups = logBackup;
checkSettings();
} catch (error) {
console.error("Failed to update settings:", error);
}
};
const onChange = async (event) => {
if (event.target.value == "" || event.target.value < 3) {
event.target.value = 3;
}
updateSettings(event.target.value);
};
onMounted(() => {
checkSettings();
});
</script>

<style scoped>
input[type="number"] {
text-align: center;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.LogBacksups-parent {
display: flex;
align-items: center;
justify-content: center;
}
</style>
1 change: 1 addition & 0 deletions launcher/src/store/theFooter.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export const useFooter = defineStore("theFooter", {
volState: false,
idleTimer: false,
idleTimerTime: 5,
logBackups: 3,
};
},
getters: {},
Expand Down

0 comments on commit a670175

Please sign in to comment.