using Microsoft.AspNetCore.Mvc; using LTEMvcApp.Models; using LTEMvcApp.Services; using Microsoft.Extensions.Logging; namespace LTEMvcApp.Controllers { /// /// IP组管理控制器 - 负责IP组网络启动、停止和Key管理 /// [ApiController] [Route("api/[controller]")] public class IpGroupController : ControllerBase { private readonly HttpClientService _httpClientService; private readonly ILogger _logger; // 存储IP组的Key配置 private static readonly Dictionary _ipGroupKeys = new(); public IpGroupController(HttpClientService httpClientService, ILogger logger) { _httpClientService = httpClientService; _logger = logger; } /// /// 保存IP组Key配置 /// /// IP组Key请求 /// 操作结果 [HttpPost("key")] public ActionResult SaveIpGroupKey([FromBody] IpGroupKeyRequest request) { if (string.IsNullOrEmpty(request.Ip)) return BadRequest("IP地址不能为空"); _ipGroupKeys[request.Ip] = request.Key ?? string.Empty; _logger.LogInformation("保存IP组Key: {Ip} -> {Key}", request.Ip, request.Key); return Ok(new { message = "IP组Key保存成功" }); } /// /// 启动IP组网络 /// /// 启动网络请求 /// 操作结果 [HttpPost("start")] public async Task StartIpGroup([FromBody] StartIpGroupRequest request) { if (string.IsNullOrEmpty(request.Ip)) return BadRequest("IP地址不能为空"); if (string.IsNullOrEmpty(request.Port)) return BadRequest("端口不能为空"); // 检查Key是否已配置 if (!_ipGroupKeys.TryGetValue(request.Ip, out var key) || string.IsNullOrEmpty(key)) return BadRequest("请先配置网络Key"); try { var apiUrl = $"http://{request.Ip}:{request.Port}/api/v1/CellularNetwork/start"; var command = new StartCellularNetworkCommand { Key = key }; _logger.LogInformation("启动IP组网络: {Ip}:{Port}, Key: {Key}", request.Ip, request.Port, key); var response = await _httpClientService.PostJsonAsync(apiUrl, command); _logger.LogInformation("IP组网络启动成功: {Response}", response); return Ok(new { message = "网络启动成功", response }); } catch (Exception ex) { _logger.LogError(ex, "启动IP组网络失败: {Ip}:{Port}", request.Ip, request.Port); return BadRequest($"启动网络失败: {ex.Message}"); } } /// /// 停止IP组网络 /// /// 停止网络请求 /// 操作结果 [HttpPost("stop")] public async Task StopIpGroup([FromBody] StopIpGroupRequest request) { if (string.IsNullOrEmpty(request.Ip)) return BadRequest("IP地址不能为空"); if (string.IsNullOrEmpty(request.Port)) return BadRequest("端口不能为空"); // 检查Key是否已配置 if (!_ipGroupKeys.TryGetValue(request.Ip, out var key) || string.IsNullOrEmpty(key)) return BadRequest("请先配置网络Key"); try { var apiUrl = $"http://{request.Ip}:{request.Port}/api/v1/CellularNetwork/stop"; var command = new StopCellularNetworkCommand { Key = key }; _logger.LogInformation("停止IP组网络: {Ip}:{Port}, Key: {Key}", request.Ip, request.Port, key); var response = await _httpClientService.PostJsonAsync(apiUrl, command); _logger.LogInformation("IP组网络停止成功: {Response}", response); return Ok(new { message = "网络停止成功", response }); } catch (Exception ex) { _logger.LogError(ex, "停止IP组网络失败: {Ip}:{Port}", request.Ip, request.Port); return BadRequest($"停止网络失败: {ex.Message}"); } } /// /// 获取IP组Key配置 /// /// IP地址 /// Key配置 [HttpGet("key/{ip}")] public ActionResult GetIpGroupKey(string ip) { if (string.IsNullOrEmpty(ip)) return BadRequest("IP地址不能为空"); var key = _ipGroupKeys.TryGetValue(ip, out var value) ? value : string.Empty; return Ok(new { ip, key }); } /// /// 获取所有IP组Key配置 /// /// 所有IP组Key配置 [HttpGet("keys")] public ActionResult GetAllIpGroupKeys() { return Ok(_ipGroupKeys); } /// /// 删除IP组Key配置 /// /// IP地址 /// 操作结果 [HttpDelete("key/{ip}")] public ActionResult DeleteIpGroupKey(string ip) { if (string.IsNullOrEmpty(ip)) return BadRequest("IP地址不能为空"); if (_ipGroupKeys.Remove(ip)) { _logger.LogInformation("删除IP组Key: {Ip}", ip); return Ok(new { message = "IP组Key删除成功" }); } else { return NotFound($"未找到IP地址为 {ip} 的Key配置"); } } /// /// 获取网络配置列表 /// /// IP地址 /// 端口 /// 网络配置列表 [HttpGet("network-config")] public async Task GetNetworkConfigs([FromQuery] string ip, [FromQuery] string port) { try { var apiUrl = $"http://{ip}:{port}/api/v1/NetworkConfig"; _logger.LogInformation("获取网络配置: {ApiUrl}", apiUrl); var response = await _httpClientService.GetAsync(apiUrl); _logger.LogInformation("网络配置获取成功"); return Ok(response); } catch (Exception ex) { _logger.LogError(ex, "获取网络配置失败: {Ip}:{Port}", ip, port); return BadRequest($"获取网络配置失败: {ex.Message}"); } } /// /// 添加网络配置(转发) /// [HttpPost("network-config")] public async Task AddNetworkConfig([FromQuery] string ip, [FromQuery] string port, [FromBody] object config) { if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(port)) return BadRequest("ip和port不能为空"); try { var apiUrl = $"http://{ip}:{port}/api/v1/NetworkConfig"; var response = await _httpClientService.PostJsonAsync(apiUrl, config); return Content(response, "application/json"); } catch (Exception ex) { _logger.LogError(ex, "添加网络配置失败: {Ip}:{Port}", ip, port); return BadRequest($"添加网络配置失败: {ex.Message}"); } } /// /// 删除网络配置(转发) /// [HttpDelete("network-config/{configKey}")] public async Task DeleteNetworkConfig(string configKey, [FromQuery] string ip, [FromQuery] string port) { if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(port)) return BadRequest("ip和port不能为空"); try { var apiUrl = $"http://{ip}:{port}/api/v1/NetworkConfig/{configKey}"; var response = await _httpClientService.DeleteAsync(apiUrl); return Content(response, "application/json"); } catch (Exception ex) { _logger.LogError(ex, "删除网络配置失败: {Ip}:{Port}", ip, port); return BadRequest($"删除网络配置失败: {ex.Message}"); } } } /// /// IP组Key请求 /// public class IpGroupKeyRequest { /// /// IP地址 /// public string Ip { get; set; } = string.Empty; /// /// Key值 /// public string? Key { get; set; } } /// /// 启动IP组请求 /// public class StartIpGroupRequest { /// /// IP地址 /// public string Ip { get; set; } = string.Empty; /// /// 端口 /// public string Port { get; set; } = string.Empty; } /// /// 停止IP组请求 /// public class StopIpGroupRequest { /// /// IP地址 /// public string Ip { get; set; } = string.Empty; /// /// 端口 /// public string Port { get; set; } = string.Empty; } }