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/scan")] [Authorize] public class AmtScanController : ControllerBase { private readonly IAmtScanService _scanService; private readonly AppDbContext _db; private readonly ILogger _logger; public AmtScanController(IAmtScanService scanService, AppDbContext db, ILogger logger) { _scanService = scanService; _db = db; _logger = logger; } /// /// 开始扫描 /// [HttpPost("start")] public async Task StartScan([FromBody] ScanRequest request) { if (string.IsNullOrEmpty(request.NetworkSegment) || string.IsNullOrEmpty(request.SubnetMask)) { return BadRequest(ApiResponse.Fail(400, "网段地址和子网掩码不能为空")); } var taskId = await _scanService.StartScanAsync(request.NetworkSegment, request.SubnetMask); return Ok(ApiResponse.Success(new { taskId })); } /// /// 获取扫描状态 /// [HttpGet("status/{taskId}")] public IActionResult GetScanStatus(string taskId) { var status = _scanService.GetScanStatus(taskId); if (status == null) { return NotFound(ApiResponse.Fail(404, "扫描任务不存在")); } return Ok(ApiResponse.Success(status)); } /// /// 取消扫描 /// [HttpPost("cancel/{taskId}")] public IActionResult CancelScan(string taskId) { _scanService.CancelScan(taskId); return Ok(ApiResponse.Success(null, "扫描已取消")); } /// /// 测试单个IP的AMT端口(调试用) /// [HttpGet("test/{ip}")] [AllowAnonymous] public async Task TestSingleIp(string ip) { var result = await _scanService.TestSingleIpAsync(ip); return Ok(ApiResponse.Success(result)); } /// /// 手动添加测试设备到数据库(调试用) /// [HttpPost("add-test-device/{ip}")] [AllowAnonymous] public async Task AddTestDevice(string ip) { var existing = await _db.AmtPendingDevices_new .FirstOrDefaultAsync(d => d.IpAddress == ip); if (existing != null) { return Ok(ApiResponse.Success(existing, "设备已存在")); } var device = new AmtPendingDevice_new { IpAddress = ip, AmtVersion = "Unknown", ProvisioningState = "Pre", Source = "test", CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow }; _db.AmtPendingDevices_new.Add(device); await _db.SaveChangesAsync(); return Ok(ApiResponse.Success(device, "测试设备已添加")); } /// /// 测试WS-Man连接(调试用) /// [HttpPost("test-wsman")] [AllowAnonymous] public async Task TestWsman([FromBody] TestWsmanRequest request) { try { var wsmanService = HttpContext.RequestServices.GetRequiredService(); var info = await wsmanService.GetSystemInfoAsync(request.Ip, request.Username, request.Password); if (info != null) { return Ok(ApiResponse.Success(new { success = true, uuid = info.Uuid, hostname = info.Hostname, manufacturer = info.Manufacturer, model = info.Model, serialNumber = info.SerialNumber })); } return Ok(ApiResponse.Success(new { success = false, error = "无法获取设备信息" })); } catch (Exception ex) { return Ok(ApiResponse.Success(new { success = false, error = ex.Message })); } } } public class TestWsmanRequest { public string Ip { get; set; } = string.Empty; public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; } public class ScanRequest { public string NetworkSegment { get; set; } = string.Empty; public string SubnetMask { get; set; } = string.Empty; }