Files
CDN-APP-INSIDER/models/reportManager.js
2024-05-08 01:12:12 +02:00

101 lines
3.6 KiB
JavaScript

const os = require('os');
const fs = require('fs');
const path = require('path');
const ip = require('ip');
const { logger, logRequestInfo, ErrorLogger } = require('../config/logs');
const packageJson = require('../package.json');
const si = require('systeminformation');
const fetch = require('node-fetch');
class SystemReport {
static async generate() {
const date = new Date();
date.setDate(date.getDate() - 1);
const previousDate = date.toISOString().split('T')[0];
const logFile = path.join(__dirname, '..', 'logs', `log-${previousDate}.log`);
const logs = fs.readFileSync(logFile, 'utf-8');
const internalErrors = logs.split('\n').filter(line => /\[38;5;9mInternal-Error/.test(line));
if (internalErrors.length === 0) {
logger.info('No internal errors in yesterday\'s logs. No report will be generated.');
return null;
}
function formatUptime(uptime) {
const days = Math.floor(uptime / (24 * 60 * 60));
uptime %= (24 * 60 * 60);
const hours = Math.floor(uptime / (60 * 60));
uptime %= (60 * 60);
const minutes = Math.floor(uptime / 60);
return `${days}d ${hours}h ${minutes}m`;
}
const osInfo = {
type: os.type(),
platform: os.platform(),
arch: os.arch(),
release: os.release(),
uptime: formatUptime(os.uptime()),
loadavg: os.loadavg().map(load => (load / os.cpus().length) * 100)
};
const networkInterfaces = os.networkInterfaces();
const serverUptime = os.uptime();
const systemLoad = os.loadavg();
const diskUsage = await si.fsSize();
const cpuTemperature = await si.cpuTemperature();
const userInfo = os.userInfo();
const systemInfo = {
memoryInfo: ((os.totalmem() - os.freemem()) / os.totalmem() * 100).toFixed(2),
cpuInfo: (os.cpus().length / os.cpus().length * 100).toFixed(2),
diskInfo: ((os.totalmem() - os.freemem()) / os.totalmem() * 100).toFixed(2),
ipAddress: ip.address(),
cdnVersion: packageJson.version,
osInfo: osInfo,
userInfo: userInfo,
errors: internalErrors,
networkInterfaces: networkInterfaces,
serverUptime: serverUptime,
systemLoad: systemLoad,
diskUsage: diskUsage,
cpuTemperature: cpuTemperature,
};
const filename = path.join(__dirname, '..', 'report', `report_${previousDate}_${ip.address()}.json`);
fs.writeFileSync(filename, JSON.stringify(systemInfo, null, 2));
logger.info("Preparing to send report...");
logger.info("Report:", JSON.stringify(systemInfo, null, 2));
try {
const response = await fetch('https://cdn-apollon-p198-61m1.dinawo.fr/api/report/receive', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(systemInfo)
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
} else {
const data = await response.json();
logger.info('Report sent successfully. Response data:', data);
}
} catch (error) {
console.error(error);
logger.error('Failed to send report. Error:', error);
}
return systemInfo;
}
}
module.exports = SystemReport;