XNSim/XNSimHtml/routes/system-info.js

87 lines
3.1 KiB
JavaScript
Raw Normal View History

2025-04-28 12:25:20 +08:00
const express = require('express');
const router = express.Router();
const si = require('systeminformation');
const os = require('os');
const fs = require('fs').promises;
// 获取系统信息的API
router.get('/system-info', async (req, res) => {
try {
// 获取基本系统信息
const [osInfo, cpuInfo, memInfo, diskInfo, networkStats] = await Promise.all([
si.osInfo(),
si.cpu(),
si.mem(),
si.fsSize(),
si.networkStats()
]);
// 获取各个CPU核心的使用率
const cpuCoreUsage = await si.currentLoad();
// 检测隔离的CPU核心
let isolatedCores = [];
try {
// 在Linux系统上通过读取/sys/devices/system/cpu/isolated文件获取隔离的CPU核心
if (os.platform() === 'linux') {
const isolatedContent = await fs.readFile('/sys/devices/system/cpu/isolated', 'utf8');
if (isolatedContent && isolatedContent.trim() !== '') {
// 处理如"0-2,4,6-8"这样的格式
const ranges = isolatedContent.trim().split(',');
for (const range of ranges) {
if (range.includes('-')) {
const [start, end] = range.split('-').map(Number);
for (let i = start; i <= end; i++) {
isolatedCores.push(i);
}
} else {
isolatedCores.push(Number(range));
}
}
}
}
} catch (error) {
console.warn('无法读取隔离CPU信息:', error);
}
// 计算内存使用率(使用第一种方式,与资源管理器一致)
const memoryUsedPercent = Math.round((memInfo.total - memInfo.available) / memInfo.total * 100);
// 计算网络带宽 (Mbps)
const downloadBandwidth = (networkStats[0].rx_sec / 1024 / 1024) * 8; // 下载带宽 Mbps
const uploadBandwidth = (networkStats[0].tx_sec / 1024 / 1024) * 8; // 上传带宽 Mbps
// 构造响应数据
const systemInfo = {
os: `${osInfo.distro} ${osInfo.release} ${osInfo.arch}`,
kernel: `${osInfo.kernel}`, // 添加内核版本
cpuCores: cpuInfo.cores,
ipAddress: Object.values(os.networkInterfaces())
.flat()
.filter(item => !item.internal && item.family === 'IPv4')
.map(item => item.address)[0] || 'Unknown',
isolatedCores: isolatedCores,
// 指标数据
metrics: {
'内存使用率': memoryUsedPercent,
'磁盘使用率': Math.round(diskInfo[0].used / diskInfo[0].size * 100),
'网络带宽': 0, // 占位符,前端不会使用这个值
'下载带宽': Math.round(downloadBandwidth * 10) / 10, // 保留一位小数的Mbps值
'上传带宽': Math.round(uploadBandwidth * 10) / 10 // 保留一位小数的Mbps值
}
};
// 添加每个CPU核心的使用率
for (let i = 0; i < cpuInfo.cores; i++) {
systemInfo.metrics[`CPU${i}使用率`] = Math.round(cpuCoreUsage.cpus[i].load);
}
res.json(systemInfo);
} catch (error) {
console.error('获取系统信息失败:', error);
res.status(500).json({ error: '获取系统信息失败', message: error.message });
}
});
module.exports = router;