156 lines
4.7 KiB
C#
156 lines
4.7 KiB
C#
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;
|
||
}
|