From 0e77a94ec70ba0f6f64d5572bcec0c9a23dfd0f6 Mon Sep 17 00:00:00 2001 From: MasterAcnolo <68693319+MasterAcnolo@users.noreply.github.com> Date: Sun, 26 Jul 2026 09:37:27 +0200 Subject: [PATCH] feat: enhance logger by displaying systeminfo at start of the app --- main.js | 6 +- server/logger.js | 4 +- server/sysinfo.js | 142 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 server/sysinfo.js diff --git a/main.js b/main.js index 47cc446..2ffb95f 100644 --- a/main.js +++ b/main.js @@ -37,7 +37,7 @@ app.setAppUserModelId("com.masteracnolo.freedomloader"); /** * Load the app dependencies for hardware choice */ -const { logger, logSessionStart, logSessionEnd } = require("./server/logger"); +const { logger, logSessionStart, logSessionEnd, logDir } = require("./server/logger"); const { configFeatures } = require("./config"); /** @@ -79,7 +79,7 @@ const { updateYtDlp } = require("./app/ytDlpUpdater"); const { createMainWindow, getMainWindow } = require("./app/windowManager"); const { registerIpcHandlers } = require("./app/ipcHandlers"); const { createSplashWindow, closeSplashWindow, setSplashProgress } = require("./app/splashManager"); -const { userThemesPath, initUserThemes, isWindows, validateBinaries } = require("./server/helpers/path.helpers"); +const { userThemesPath, initUserThemes, isWindows, validateBinaries, defaultDownloadFolder } = require("./server/helpers/path.helpers"); /** @@ -99,7 +99,7 @@ app.on("second-instance", () => { }); app.whenReady().then(async () => { - logSessionStart(); + logSessionStart(logDir, defaultDownloadFolder); createSplashWindow(); diff --git a/server/logger.js b/server/logger.js index 6ce86dc..345db9d 100644 --- a/server/logger.js +++ b/server/logger.js @@ -5,6 +5,7 @@ const path = require("path"); const os = require("os"); const config = require("../config"); const {isWindows} = require("./helpers/path.helpers"); +const { logSystemInfo } = require("./sysinfo"); // Logs folder in Windows const logDir = isWindows ? path.join(os.homedir(), "AppData", "Local", "FreedomLoader", "logs") : path.join(process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share"), "FreedomLoader", "logs"); @@ -52,9 +53,10 @@ const logger = createLogger({ /** * Start Log Session */ -function logSessionStart() { +function logSessionStart(logDir, downloadPath) { logger.info(`--- Starting session: ${new Date().toISOString()} ---`); logger.info(`Application Version: ${config.version}`) + logSystemInfo(logger, logDir, downloadPath) } /** diff --git a/server/sysinfo.js b/server/sysinfo.js new file mode 100644 index 0000000..f129bd0 --- /dev/null +++ b/server/sysinfo.js @@ -0,0 +1,142 @@ +const os = require("os"); +const fs = require("fs"); +const { execSync } = require("child_process"); +const { app } = require("electron"); + +/** + * Reads /etc/os-release to get the Linux distribution name + */ +function getLinuxDistro() { + try { + const content = fs.readFileSync("/etc/os-release", "utf-8"); + const pretty = content.match(/^PRETTY_NAME="?(.+?)"?$/m); + if (pretty) return pretty[1]; + const name = content.match(/^NAME="?(.+?)"?$/m); + return name ? name[1] : "Unknown Linux"; + } catch { + return "Unknown Linux"; + } +} + +/** + * Reads the package-type file written by electron-builder + * to determine how the app was distributed (rpm, snap, AppImage, deb...) + */ +function getPackageType() { + try { + const pkgTypePath = require("path").join(process.resourcesPath, "package-type"); + if (fs.existsSync(pkgTypePath)) { + return fs.readFileSync(pkgTypePath, "utf-8").trim(); + } + } catch { /* ignore */ } + return "unknown"; +} + +/** + * Checks if Firefox is installed on the current platform + */ +function detectFirefox() { + const platform = process.platform; + + if (platform === "win32") { + const paths = [ + "C:\\Program Files\\Mozilla Firefox\\firefox.exe", + "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", + `${process.env.LOCALAPPDATA}\\Mozilla Firefox\\firefox.exe`, + ]; + return paths.some(p => fs.existsSync(p)); + } + + if (platform === "linux") { + const paths = [ + "/usr/bin/firefox", + "/usr/bin/firefox-esr", + "/usr/local/bin/firefox", + "/snap/bin/firefox", + "/var/lib/flatpak/exports/bin/org.mozilla.firefox", + `${os.homedir()}/.local/share/flatpak/exports/bin/org.mozilla.firefox`, + ]; + if (paths.some(p => fs.existsSync(p))) return true; + try { execSync("which firefox", { stdio: "ignore" }); return true; } catch { return false; } + } + + return false; +} + +/** + * Builds the system info object logged at startup + * + * @param {string} logDir - path to the log directory + * @param {string} downloadPath - current configured download path + */ +function getSystemInfo(logDir, downloadPath) { + const platform = process.platform; + const cpus = os.cpus(); + const totalMem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(1); + const freeMem = (os.freemem() / 1024 / 1024 / 1024).toFixed(1); + + let platformLabel; + if (platform === "win32") { + platformLabel = `Windows (${os.release()})`; + } else if (platform === "linux") { + platformLabel = `Linux — ${getLinuxDistro()}`; + } else { + platformLabel = `${platform} ${os.release()} (unsupported)`; + } + + const info = { + "Platform": platformLabel, + "Architecture": os.arch(), + "CPU": cpus.length ? `${cpus[0].model.trim()} (${cpus.length} cores)` : "Unknown", + "Memory": `${freeMem} GB free / ${totalMem} GB total`, + "Locale": app.getLocale(), + "Electron": process.versions.electron, + "Node": process.versions.node, + "Packaged": String(app.isPackaged), + "Package type": app.isPackaged ? getPackageType() : "dev", + "Firefox present": detectFirefox() ? "Yes" : "No — cookie features unavailable", + "Log directory": logDir, + "Download path": downloadPath, + }; + + // Linux-specific extras + if (platform === "linux") { + const sessionType = process.env.XDG_SESSION_TYPE || "unknown"; + const waylandDisplay = process.env.WAYLAND_DISPLAY; + const x11Display = process.env.DISPLAY; + + info["Display server"] = waylandDisplay + ? `Wayland (${waylandDisplay})` + : x11Display + ? `X11 (${x11Display})` + : sessionType !== "unknown" + ? sessionType + : "unknown"; + + info["Desktop env"] = process.env.XDG_CURRENT_DESKTOP || process.env.DESKTOP_SESSION || "unknown"; + } + + return info; +} + +/** + * Logs system info at application startup + * + * @param {object} logger - winston logger instance + * @param {string} logDir - path to the log directory + * @param {string} downloadPath - current configured download path + */ +function logSystemInfo(logger, logDir, downloadPath) { + const info = getSystemInfo(logDir, downloadPath); + const maxKeyLen = Math.max(...Object.keys(info).map(k => k.length)); + + logger.info("=".repeat(60)); + logger.info("SYSTEM INFO"); + logger.info("=".repeat(60)); + for (const [key, val] of Object.entries(info)) { + logger.info(` ${key.padEnd(maxKeyLen)} : ${val}`); + } + logger.info("=".repeat(60)); +} + +module.exports = { logSystemInfo }; \ No newline at end of file