156 lines
4.7 KiB
C#
Raw 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.

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