This commit is contained in:
qaq
2025-06-19 11:28:04 +08:00
parent 6df61832b9
commit bd799d3f07
13 changed files with 2410 additions and 470 deletions
@@ -1,5 +1,6 @@
package com.admin.common.utils;
import com.admin.common.dto.GostConfigDto;
import com.admin.common.dto.GostDto;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -16,10 +17,35 @@ public class GostUtil {
public static GostDto SaveConfig(String addr, String secret) {
JSONObject data = new JSONObject();
data.put("format", "json");
if (!addr.contains("[") && addr.indexOf(':') != addr.lastIndexOf(':')) {
// 这是IPv6地址,找到最后一个冒号(端口分隔符)
int lastColonIndex = addr.lastIndexOf(':');
String ipPart = addr.substring(0, lastColonIndex);
String portPart = addr.substring(lastColonIndex);
addr = "[" + ipPart + "]" + portPart;
}
String url = "https://" + addr + "/api/config?format=json";
return HttpUtils.post(url, data, secret);
}
public static GostConfigDto GetConfig(String addr, String secret) {
JSONObject data = new JSONObject();
data.put("format", "json");
if (!addr.contains("[") && addr.indexOf(':') != addr.lastIndexOf(':')) {
// 这是IPv6地址,找到最后一个冒号(端口分隔符)
int lastColonIndex = addr.lastIndexOf(':');
String ipPart = addr.substring(0, lastColonIndex);
String portPart = addr.substring(lastColonIndex);
addr = "[" + ipPart + "]" + portPart;
}
String url = "https://" + addr + "/api/config?format=json";
return HttpUtils.get(url, secret);
}
/**
* 添加限流器配置
@@ -1,5 +1,6 @@
package com.admin.common.utils;
import com.admin.common.dto.GostConfigDto;
import com.admin.common.dto.GostDto;
import com.admin.common.task.SaveConfigAsync;
import com.admin.config.RestTemplateConfig;
@@ -145,6 +146,32 @@ public class HttpUtils implements ApplicationContextAware {
return restTemplate;
}
@SneakyThrows
public static GostConfigDto get(String url, String secret) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
String auth = secret + ":" + secret;
String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
headers.set("Authorization", "Basic " + encodedAuth);
RestTemplate restTemplate = createRestTemplateWithTimeout();
HttpEntity<Object> entity = new HttpEntity<>("", headers);
try {
ResponseEntity<GostConfigDto> response = restTemplate.exchange(
url,
HttpMethod.GET,
entity,
GostConfigDto.class
);
return response.getBody();
} catch (Exception e) {
e.printStackTrace();
GostConfigDto gostDto = new GostConfigDto();
return gostDto;
}
}
@SneakyThrows
public static GostDto post(String url, Object requestBody, String secret) {
HttpHeaders headers = new HttpHeaders();
@@ -99,6 +99,7 @@ public class ForwardServiceImpl extends ServiceImpl<ForwardMapper, Forward> impl
// 6. 调用Gost服务创建转发
R gostResult = createGostServices(forward, tunnel, permissionResult.getLimiter());
if (gostResult.getCode() != 0) {
this.removeById(forward.getId());
return gostResult;
@@ -538,13 +539,11 @@ public class ForwardServiceImpl extends ServiceImpl<ForwardMapper, Forward> impl
if (tunnel.getType() == TUNNEL_TYPE_TUNNEL_FORWARD) {
R chainResult = createChainService(inNode, serviceName, tunnel.getOutIp(), forward.getOutPort(), tunnel.getProtocol());
if (chainResult.getCode() != 0) {
updateForwardStatusToError(forward);
return chainResult;
}
R remoteResult = createRemoteService(tunnel.getOutNodeId().intValue(), serviceName, forward, tunnel.getProtocol());
if (remoteResult.getCode() != 0) {
updateForwardStatusToError(forward);
return remoteResult;
}
@@ -553,7 +552,6 @@ public class ForwardServiceImpl extends ServiceImpl<ForwardMapper, Forward> impl
// 创建主服务
R serviceResult = createMainService(inNode, serviceName, forward, limiter, tunnel.getType());
if (serviceResult.getCode() != 0) {
updateForwardStatusToError(forward);
return serviceResult;
}
return R.ok();
@@ -187,14 +187,12 @@ public class SpeedLimitServiceImpl extends ServiceImpl<SpeedLimitMapper, SpeedLi
// 3. 获取隧道信息
Tunnel tunnel = tunnelService.getById(speedLimit.getTunnelId());
if (tunnel == null) {
return R.err(ERROR_TUNNEL_NOT_EXISTS);
this.removeById(id);
return R.ok();
}
// 4. 调用Gost API删除限速器
R gostResult = deleteGostLimiter(id, tunnel);
if (gostResult.getCode() != 0) {
return gostResult;
}
deleteGostLimiter(id, tunnel);
// 5. 删除限速规则
boolean result = this.removeById(id);
@@ -1,8 +1,30 @@
package com.admin;
import com.admin.common.dto.ConfigItem;
import com.admin.common.dto.GostConfigDto;
import com.admin.common.dto.GostDto;
import com.admin.common.utils.GostUtil;
import com.admin.entity.Forward;
import com.admin.entity.Node;
import com.admin.entity.SpeedLimit;
import com.admin.service.ForwardService;
import com.admin.service.NodeService;
import com.admin.service.SpeedLimitService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.xmlunit.util.Nodes;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
@SpringBootTest
class AdminApplicationTests {
}