using CoreAgent.Domain.Interfaces.System; using CoreAgent.Domain.Interfaces.System.Command; using CoreAgent.Domain.Models.System; using Microsoft.Extensions.Logging; namespace CoreAgent.Infrastructure.Services.System; /// /// 设备服务实现 /// public class DeviceService : IDeviceService { private readonly ILogger _logger; private readonly ISystemCommandExecutor _commandExecutor; public DeviceService( ILogger logger, ISystemCommandExecutor commandExecutor) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _commandExecutor = commandExecutor ?? throw new ArgumentNullException(nameof(commandExecutor)); } /// /// 获取设备序列号(SN) /// /// 设备信息 public async Task GetSerialNumberAsync() { try { _logger.LogDebug("开始获取设备序列号"); // 根据操作系统选择不同的命令 string command = GetSerialNumberCommand(); var result = await _commandExecutor.ExecuteCommandAsync(command, new CancellationTokenSource(), 5000); if (result.IsSuccess) { var serialNumber = ParseSerialNumber(result.Output); if (serialNumber != null) { _logger.LogInformation("成功获取设备序列号: {SerialNumber}", serialNumber); return new DeviceInfo { IsSuccess = true, SerialNumber = serialNumber, Timestamp = DateTime.UtcNow }; } else { _logger.LogWarning("解析设备序列号失败,输出内容: {Output}", result.Output); return new DeviceInfo { IsSuccess = false, SerialNumber = "UNKNOWN", Timestamp = DateTime.UtcNow }; } } else { _logger.LogError("获取设备序列号失败: {Error}", result.Error); return new DeviceInfo { IsSuccess = false, SerialNumber = "UNKNOWN", Timestamp = DateTime.UtcNow }; } } catch (Exception ex) { _logger.LogError(ex, "获取设备序列号时发生异常"); return new DeviceInfo { IsSuccess = false, SerialNumber = "ERROR", Timestamp = DateTime.UtcNow }; } } /// /// 获取设备序列号(SN)- 同步版本 /// /// 设备信息 public DeviceInfo GetSerialNumber() { try { _logger.LogDebug("开始获取设备序列号(同步)"); // 根据操作系统选择不同的命令 string command = GetSerialNumberCommand(); // 使用同步方式执行命令 var task = _commandExecutor.ExecuteCommandAsync(command, new CancellationTokenSource(), 5000); task.Wait(); var result = task.Result; if (result.IsSuccess) { var serialNumber = ParseSerialNumber(result.Output); if (serialNumber != null) { _logger.LogInformation("成功获取设备序列号: {SerialNumber}", serialNumber); return new DeviceInfo { IsSuccess = true, SerialNumber = serialNumber, Timestamp = DateTime.UtcNow }; } else { _logger.LogWarning("解析设备序列号失败,输出内容: {Output}", result.Output); return new DeviceInfo { IsSuccess = false, SerialNumber = "UNKNOWN", Timestamp = DateTime.UtcNow }; } } else { _logger.LogError("获取设备序列号失败: {Error}", result.Error); return new DeviceInfo { IsSuccess = false, SerialNumber = "UNKNOWN", Timestamp = DateTime.UtcNow }; } } catch (Exception ex) { _logger.LogError(ex, "获取设备序列号时发生异常"); return new DeviceInfo { IsSuccess = false, SerialNumber = "ERROR", Timestamp = DateTime.UtcNow }; } } /// /// 根据操作系统获取序列号命令 /// /// 命令字符串 private string GetSerialNumberCommand() { if (OperatingSystem.IsWindows()) { // Windows系统获取序列号命令 return "wmic bios get serialnumber /value"; } else if (OperatingSystem.IsLinux()) { // Linux系统获取序列号命令 return "smartctl -i /dev/nvme0n1|grep Serial"; } else { // 其他系统使用通用命令 return "echo UNKNOWN"; } } /// /// 解析序列号输出 /// /// 命令输出 /// 解析后的序列号,失败时返回null private string? ParseSerialNumber(string output) { if (string.IsNullOrWhiteSpace(output)) { return null; } // 清理输出内容 var lines = output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { var trimmedLine = line.Trim(); if (OperatingSystem.IsWindows()) { // Windows输出格式: SerialNumber=XXXXXXXX if (trimmedLine.StartsWith("SerialNumber=", StringComparison.OrdinalIgnoreCase)) { var serialNumber = trimmedLine.Substring("SerialNumber=".Length).Trim(); return string.IsNullOrWhiteSpace(serialNumber) ? null : serialNumber; } } else if (OperatingSystem.IsLinux()) { // Linux输出格式: Serial Number: xxxxxxxx if (trimmedLine.StartsWith("Serial Number:", StringComparison.OrdinalIgnoreCase)) { var serialNumber = trimmedLine.Substring("Serial Number:".Length).Trim(); return string.IsNullOrWhiteSpace(serialNumber) ? null : serialNumber; } } } return null; } }