From 7eef3b7e826033104ebefd71a33e41a6e72d906f Mon Sep 17 00:00:00 2001 From: Professor Fartsalot Date: Wed, 23 Jul 2025 04:18:30 -0400 Subject: [PATCH] Upload missing script from 8.2.0c's commit --- scripting/nodeJS/system_stats.js | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 scripting/nodeJS/system_stats.js diff --git a/scripting/nodeJS/system_stats.js b/scripting/nodeJS/system_stats.js new file mode 100644 index 0000000..bac3baa --- /dev/null +++ b/scripting/nodeJS/system_stats.js @@ -0,0 +1,104 @@ +const os = require('os'); +const fs = require('fs'); +const { execSync } = require('child_process'); +const mysql = require('mysql2'); + +// MySQL config +const db = mysql.createPool({ + host: 'localhost', + user: '', + password: '', + database: '', + port: 6969 +}); + +// Cache to store last known values +const lastValues = { + memory_used_gib: null, + memory_total_gib: null, + cpu_usage_percent: null, + cpu_frequency_x10: null, + cpu_temperature_c: null +}; + +function getMemoryInfoGiB() { + const totalGiB = Math.round(os.totalmem() / 1073741824); + const usedGiB = Math.round((os.totalmem() - os.freemem()) / 1073741824); + return { totalGiB, usedGiB }; +} + +function getCPUFrequencyMultiplied() { + const freqMHz = os.cpus()[0].speed; + const freqGHz = freqMHz / 1000; + return Math.round(freqGHz * 10); // e.g., 3.5 GHz → 35 +} + +function getCPUTemperatureC() { + try { + const output = execSync('sensors').toString(); + const match = output.match(/Tctl:\s+\+?(\d+(\.\d+)?)/) || + output.match(/Tdie:\s+\+?(\d+(\.\d+)?)/) || + output.match(/\+(\d+(\.\d+)?)°C/); + if (match) { + return Math.round(parseFloat(match[1])); + } + } catch (_) { + try { + const raw = fs.readFileSync('/sys/class/thermal/thermal_zone0/temp', 'utf8'); + return Math.round(parseInt(raw) / 1000); + } catch (_) { + return 0; + } + } + return 0; +} + +function getCPUUsage(callback) { + const start = os.cpus(); + + setTimeout(() => { + const end = os.cpus(); + let idleDiff = 0; + let totalDiff = 0; + + for (let i = 0; i < start.length; i++) { + const s = start[i].times; + const e = end[i].times; + const idle = e.idle - s.idle; + const total = (e.user - s.user) + (e.nice - s.nice) + + (e.sys - s.sys) + (e.irq - s.irq) + idle; + + idleDiff += idle; + totalDiff += total; + } + + const usage = Math.round(100 - (idleDiff / totalDiff) * 100); + callback(usage); + }, 1000); +} + +function updateIfChanged(table, newValue) { + if (lastValues[table] !== newValue) { + lastValues[table] = newValue; + const query = `UPDATE ${table} SET value = ? WHERE id = 1`; + db.query(query, [newValue], (err) => { + if (err) console.error(`DB error updating ${table}:`, err.message); + }); + } +} + +function collectAndUpdateStats() { + getCPUUsage((cpuUsage) => { + const { usedGiB, totalGiB } = getMemoryInfoGiB(); + const cpuFreq = getCPUFrequencyMultiplied(); + const cpuTemp = getCPUTemperatureC(); + + updateIfChanged('memory_used_gib', usedGiB); + updateIfChanged('memory_total_gib', totalGiB); + updateIfChanged('cpu_usage_percent', cpuUsage); + updateIfChanged('cpu_frequency_x10', cpuFreq); + updateIfChanged('cpu_temperature_c', cpuTemp); + }); +} + +setInterval(collectAndUpdateStats, 10000); // every 10 seconds \ No newline at end of file