418 lines
12 KiB
JavaScript
418 lines
12 KiB
JavaScript
// 系统检测工具类
|
|
import { exec } from 'child_process';
|
|
import axios from 'axios';
|
|
import fs from 'fs';
|
|
import os from 'os';
|
|
import path from 'path';
|
|
import net from 'net';
|
|
import { ipcRenderer } from 'electron';
|
|
import iconv from 'iconv-lite';
|
|
|
|
// 系统检测日志记录
|
|
async function logSystemCheck(message) {
|
|
console.log(`[System Check] ${message}`);
|
|
}
|
|
|
|
// 发送消息到主进程
|
|
function sendMessage(data) {
|
|
ipcRenderer.send('send-message', JSON.stringify(data));
|
|
}
|
|
|
|
// 响应系统检测数据
|
|
function respondSystemCheckData(data) {
|
|
const response = {
|
|
status: true,
|
|
msg: '请求获取设备信息成功',
|
|
data: data
|
|
};
|
|
process.send(JSON.stringify(response));
|
|
}
|
|
|
|
// 检查系统主机名
|
|
export async function checkSystemHostName(params) {
|
|
const testItem = '系统主机名';
|
|
const description = '获取当前使用计算机的主机名';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
try {
|
|
const hostname = os.hostname();
|
|
await logSystemCheck(`HOSTNAME: ${hostname}`);
|
|
result = hostname || '无法获取主机名';
|
|
if (!hostname) suggestion = '暂时获取不了主机名';
|
|
} catch (error) {
|
|
result = '获取失败';
|
|
suggestion = error.message;
|
|
}
|
|
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
};
|
|
}
|
|
|
|
// 检查网络连接状态
|
|
export async function checkNetworkConnectionState(params) {
|
|
const testItem = '客户端网络状态';
|
|
const description = '获取客户端网络是否通畅';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
try {
|
|
const response = await axios.get('https://www.baidu.com', { timeout: 5000 });
|
|
if (response.status === 200) {
|
|
result = '网络通畅';
|
|
} else {
|
|
result = '网络不通';
|
|
suggestion = '请检查网线是否正确插拔';
|
|
}
|
|
await logSystemCheck(response.status === 200 ? '网络通畅' : '网络不通');
|
|
} catch (error) {
|
|
result = '网络不通';
|
|
suggestion = '请检查网络连接';
|
|
await logSystemCheck(`networkstate_error: 网络连通 ${error.message}`);
|
|
}
|
|
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
};
|
|
}
|
|
|
|
// 检查系统防火墙状态
|
|
export async function checkSystemFirewallStatus(params) {
|
|
const testItem = '检查防火墙设置';
|
|
const description = '检查防火墙有没有开启';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
return new Promise((resolve) => {
|
|
exec('netsh advfirewall show currentprofile', async (error, stdout, stderr) => {
|
|
if (error || stderr) {
|
|
await logSystemCheck(`error: ${error?.message || stderr}`);
|
|
resolve({
|
|
status: false,
|
|
msg: '未知错误',
|
|
data: {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
const isEnabled = stdout.includes('State ON');
|
|
await logSystemCheck(`防火墙状态: ${isEnabled ? '开启' : '关闭'}`);
|
|
result = isEnabled ? '开启' : '关闭';
|
|
if (!isEnabled) suggestion = '请自行百度开启防火墙的方法';
|
|
|
|
resolve({
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
// 检查核心程序文件
|
|
export async function checkCoreProgramFiles(params) {
|
|
const testItem = '核心文件';
|
|
const description = '检查核心启动文件是否存在';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
try {
|
|
const corePath = path.join(process.cwd(), 'release', '1.0.0', 'win-unpacked', '云企通安全云锁客户端.exe');
|
|
const exists = fs.existsSync(corePath);
|
|
await logSystemCheck(`核心文件是否存在: ${exists ? '存在' : '不存在'}`);
|
|
result = exists ? '存在' : '不存在';
|
|
if (!exists) suggestion = '请前去官网下载程序,然后重新安装';
|
|
} catch (error) {
|
|
result = '检查失败';
|
|
suggestion = error.message;
|
|
}
|
|
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
};
|
|
}
|
|
|
|
// 检查系统驱动
|
|
export async function checkSystemDriver(params) {
|
|
const testItem = '检查驱动';
|
|
const description = '检查驱动是否存在';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
try {
|
|
const driverPath = 'C://Windows//System32//drivers//usbip_vhci_ude.sys';
|
|
const exists = fs.existsSync(driverPath);
|
|
await logSystemCheck(`驱动文件是否存在: ${exists ? '存在' : '不存在'}`);
|
|
result = exists ? '存在' : '不存在';
|
|
if (!exists) suggestion = '请重新安装程序试试';
|
|
} catch (error) {
|
|
result = '检查失败';
|
|
suggestion = error.message;
|
|
}
|
|
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
};
|
|
}
|
|
|
|
// 检查系统测试模式
|
|
export async function checkSystemTestMode(params) {
|
|
const testItem = '测试模式';
|
|
const description = '检查测试模式是否开启,如果电脑为win7,则需要开启测试模式';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
return new Promise((resolve) => {
|
|
exec('bcdedit', async (error, stdout) => {
|
|
if (error) {
|
|
await logSystemCheck(`执行错误: ${error.message}`);
|
|
resolve({
|
|
status: false,
|
|
msg: '未知错误',
|
|
data: {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
let testMode = '';
|
|
const lines = stdout.split('\n');
|
|
for (let line of lines) {
|
|
if (line.includes('testsigning')) {
|
|
testMode = line.split(' ').pop().trim() === 'Yes' ? '是' : '否';
|
|
break;
|
|
}
|
|
}
|
|
|
|
result = testMode || '否';
|
|
if (result === '否') suggestion = '请在命令行执行命令开启';
|
|
|
|
resolve({
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
// 检查系统证书
|
|
export async function checkSystemCertificate(params) {
|
|
const testItem = '检查证书';
|
|
const description = '检查证书是否存在';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
return new Promise((resolve) => {
|
|
if (os.platform() === 'win32' && os.release().startsWith('7')) {
|
|
result = '存在';
|
|
resolve({
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
});
|
|
return;
|
|
}
|
|
|
|
exec('certutil -store root "USBIP Test"', async (error, stdout, stderr) => {
|
|
if (error || stderr) {
|
|
await logSystemCheck(`执行错误: ${error?.message || stderr}`);
|
|
resolve({
|
|
status: false,
|
|
msg: '未知错误',
|
|
data: {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
const exists = stdout.includes('USBIP Test');
|
|
await logSystemCheck(`证书是否存在: ${exists ? '存在' : '不存在'}`);
|
|
result = exists ? '存在' : '不存在';
|
|
if (!exists) suggestion = '请重新安装程序试试';
|
|
|
|
resolve({
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
// 检查端口服务
|
|
export async function checkPortService(port, host = '127.0.0.1') {
|
|
return new Promise((resolve) => {
|
|
const socket = new net.Socket();
|
|
const timeout = 2000;
|
|
|
|
socket.setTimeout(timeout);
|
|
socket.on('connect', () => {
|
|
socket.destroy();
|
|
resolve(true);
|
|
});
|
|
|
|
socket.on('timeout', () => {
|
|
socket.destroy();
|
|
resolve(false);
|
|
});
|
|
|
|
socket.on('error', () => {
|
|
resolve(false);
|
|
});
|
|
|
|
socket.connect(port, host);
|
|
});
|
|
}
|
|
|
|
// 检查系统管理员权限
|
|
export async function checkSystemAdminRights(params) {
|
|
const testItem = '管理员权限';
|
|
const description = '检查当前用户是否拥有管理员权限';
|
|
let result = '';
|
|
let suggestion = '';
|
|
|
|
return new Promise((resolve) => {
|
|
exec('net session', async (error) => {
|
|
await logSystemCheck(`当前访问是否具有管理员权限: ${error ? '没有' : '有'}`);
|
|
result = error ? '没有' : '有';
|
|
if (error) suggestion = '请点击右键以管理员权限打开本程序';
|
|
|
|
resolve({
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: testItem,
|
|
project_description: description,
|
|
checkout_result: result,
|
|
repairing_suggestion: suggestion
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
// 检查程序完整性
|
|
export async function checkApplicationIntegrity(params) {
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: '程序完整',
|
|
project_description: '检查程序文件是否完整',
|
|
checkout_result: '完整',
|
|
repairing_suggestion: ''
|
|
};
|
|
}
|
|
|
|
// 执行系统检测
|
|
export async function performSystemCheck(params) {
|
|
await logSystemCheck(`checkout_type: ${params.checkout_type}`);
|
|
|
|
try {
|
|
switch (params.checkout_type) {
|
|
case 'host_name':
|
|
return await checkSystemHostName(params);
|
|
case 'network_state':
|
|
return await checkNetworkConnectionState(params);
|
|
case 'firewall_status':
|
|
return await checkSystemFirewallStatus(params);
|
|
case 'files_exist':
|
|
return await checkCoreProgramFiles(params);
|
|
case 'certificate_exist':
|
|
return await checkSystemCertificate(params);
|
|
case 'test_pattern':
|
|
return await checkSystemTestMode(params);
|
|
case 'drive_exist':
|
|
return await checkSystemDriver(params);
|
|
case 'ownership':
|
|
return await checkSystemAdminRights(params);
|
|
case 'web_serve':
|
|
const webStatus = await checkPortService(25525);
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: 'web服务',
|
|
project_description: '检查web服务是否开启成功',
|
|
checkout_result: webStatus ? '已开启' : '关闭',
|
|
repairing_suggestion: webStatus ? '' : '请重启程序尝试一下'
|
|
};
|
|
case 'socket_serve':
|
|
const socketStatus = await checkPortService(801);
|
|
return {
|
|
user_id: params.user_id || '',
|
|
type: params.type,
|
|
checkout_type: params.checkout_type,
|
|
test_item: 'socket服务',
|
|
project_description: '检查socket服务是否开启成功',
|
|
checkout_result: socketStatus ? '已开启' : '关闭',
|
|
repairing_suggestion: socketStatus ? '' : '请重启程序尝试一下'
|
|
};
|
|
case 'program_integrity':
|
|
return await checkApplicationIntegrity(params);
|
|
default:
|
|
return {
|
|
status: false,
|
|
msg: '不存在的检测类型',
|
|
data: { user_id: params.user_id || '' }
|
|
};
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
status: false,
|
|
msg: `检测失败: ${error.message}`,
|
|
data: { user_id: params.user_id || '' }
|
|
};
|
|
}
|
|
} |