XNSim/XNSimHtml/routes/system-info.js
2025-04-28 12:25:20 +08:00

87 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;