using AmtScanner.Api.Data; using AmtScanner.Api.Models; using AmtScanner.Api.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace AmtScanner.Api.Controllers; [ApiController] [Route("api/amt-network")] [Authorize] public class AmtNetworkController : ControllerBase { private readonly AppDbContext _db; private readonly IAmtNetworkService _networkService; private readonly ILogger _logger; public AmtNetworkController(AppDbContext db, IAmtNetworkService networkService, ILogger logger) { _db = db; _networkService = networkService; _logger = logger; } /// /// 获取设备网络配置 /// [HttpGet("{uuid}/config")] public async Task GetNetworkConfig(string uuid) { var device = await _db.AmtDevices_new.FindAsync(uuid); if (device == null) { return NotFound(ApiResponse.Fail(404, "设备不存在")); } if (string.IsNullOrEmpty(device.AmtUsername) || string.IsNullOrEmpty(device.AmtPassword)) { return BadRequest(ApiResponse.Fail(400, "设备未配置 AMT 凭据")); } try { var config = await _networkService.GetNetworkConfigAsync( device.IpAddress, device.AmtUsername, device.AmtPassword); if (config == null) { return BadRequest(ApiResponse.Fail(400, "无法获取网络配置")); } return Ok(ApiResponse.Success(config)); } catch (Exception ex) { _logger.LogError(ex, "获取网络配置失败: {Uuid}", uuid); return BadRequest(ApiResponse.Fail(400, $"获取网络配置失败: {ex.Message}")); } } /// /// 设置设备静态 IP /// [HttpPost("{uuid}/static-ip")] public async Task SetStaticIp(string uuid, [FromBody] SetStaticIpRequest request) { var device = await _db.AmtDevices_new.FindAsync(uuid); if (device == null) { return NotFound(ApiResponse.Fail(404, "设备不存在")); } if (string.IsNullOrEmpty(device.AmtUsername) || string.IsNullOrEmpty(device.AmtPassword)) { return BadRequest(ApiResponse.Fail(400, "设备未配置 AMT 凭据")); } try { var success = await _networkService.SetStaticIpAsync( device.IpAddress, device.AmtUsername, device.AmtPassword, request.IpAddress, request.SubnetMask, request.Gateway, request.PrimaryDns, request.SecondaryDns); if (!success) { return BadRequest(ApiResponse.Fail(400, "设置静态 IP 失败")); } // 更新数据库中的 IP 信息 device.IpAddress = request.IpAddress; device.SubnetMask = request.SubnetMask; device.Gateway = request.Gateway; device.UpdatedAt = DateTime.UtcNow; await _db.SaveChangesAsync(); return Ok(ApiResponse.Success(null, "静态 IP 设置成功")); } catch (Exception ex) { _logger.LogError(ex, "设置静态 IP 失败: {Uuid}", uuid); return BadRequest(ApiResponse.Fail(400, $"设置静态 IP 失败: {ex.Message}")); } } /// /// 设置设备为 DHCP 模式 /// [HttpPost("{uuid}/dhcp")] public async Task SetDhcp(string uuid) { var device = await _db.AmtDevices_new.FindAsync(uuid); if (device == null) { return NotFound(ApiResponse.Fail(404, "设备不存在")); } if (string.IsNullOrEmpty(device.AmtUsername) || string.IsNullOrEmpty(device.AmtPassword)) { return BadRequest(ApiResponse.Fail(400, "设备未配置 AMT 凭据")); } try { var success = await _networkService.SetDhcpModeAsync( device.IpAddress, device.AmtUsername, device.AmtPassword); if (!success) { return BadRequest(ApiResponse.Fail(400, "设置 DHCP 模式失败")); } return Ok(ApiResponse.Success(null, "DHCP 模式设置成功")); } catch (Exception ex) { _logger.LogError(ex, "设置 DHCP 模式失败: {Uuid}", uuid); return BadRequest(ApiResponse.Fail(400, $"设置 DHCP 模式失败: {ex.Message}")); } } } public class SetStaticIpRequest { public string IpAddress { get; set; } = string.Empty; public string SubnetMask { get; set; } = string.Empty; public string? Gateway { get; set; } public string? PrimaryDns { get; set; } public string? SecondaryDns { get; set; } }