diff --git a/common/src/main/java/io/wdd/common/utils/OctopusObjectMapperConfig.java b/common/src/main/java/io/wdd/common/utils/OctopusObjectMapperConfig.java index a5d4fd8..7971f25 100644 --- a/common/src/main/java/io/wdd/common/utils/OctopusObjectMapperConfig.java +++ b/common/src/main/java/io/wdd/common/utils/OctopusObjectMapperConfig.java @@ -1,5 +1,6 @@ package io.wdd.common.utils; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; @@ -17,7 +18,7 @@ public class OctopusObjectMapperConfig { return jacksonObjectMapperBuilder -> { //若POJO对象的属性值为null,序列化时不进行显示 - //jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); + jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); //针对于Date类型,文本格式化 jacksonObjectMapperBuilder.simpleDateFormat("yyyy-MM-dd"); diff --git a/server/src/main/java/io/wdd/func/controller/XrayController.java b/server/src/main/java/io/wdd/func/controller/XrayController.java index fb61ffa..e688fc1 100644 --- a/server/src/main/java/io/wdd/func/controller/XrayController.java +++ b/server/src/main/java/io/wdd/func/controller/XrayController.java @@ -1,6 +1,7 @@ package io.wdd.func.controller; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.wdd.common.beans.response.R; @@ -17,9 +18,9 @@ import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.*; @RestController @RequestMapping("/server/func/xray") +@Api(tags = "Xray控制") public class XrayController { - @Resource XrayCoreService xrayCoreService; @@ -31,11 +32,16 @@ public class XrayController { @ApiOperation("[解析] - 解析代理链字符串") public R>> transformProxyChainString( @ApiParam(name = "proxyChainList", value = "代理链字符串,seoul2->tokyo2, 多条链使用,分隔") - @RequestParam("proxyChainList") List proxyChainList + @RequestParam("proxyChainList") List proxyChainList, + @ApiParam(name = "isTopicName", value = "是否使用AgentTopicName, 默认为AgentName") + @RequestParam(value = "isTopicName", required = false, defaultValue = "false") boolean isTopicName ) { return R.ok( - xrayCoreService.transformProxyChainString(proxyChainList) + xrayCoreService.transformProxyChainString( + proxyChainList, + isTopicName + ) ); } @@ -44,12 +50,17 @@ public class XrayController { @ApiOperation("[解析] - 代理链完整配置") public R> debugProxyChainString( @ApiParam(name = "proxyChainList", value = "代理链字符串,seoul2->tokyo2, 多条链使用,分隔") - @RequestParam("proxyChainList") List proxyChainList + @RequestParam("proxyChainList") List proxyChainList, + @ApiParam(name = "isTopicName", value = "是否使用AgentTopicName, 默认为AgentName") + @RequestParam(value = "isTopicName", required = false, defaultValue = "false") boolean isTopicName ) { return R.ok( xrayCoreService.generateXrayConfigFromNodeList( - xrayCoreService.transformProxyChainString(proxyChainList) + xrayCoreService.transformProxyChainString( + proxyChainList, + isTopicName + ) ) ); } @@ -67,7 +78,7 @@ public class XrayController { @ApiOperation("[缓存] - 获取代理链缓存") public R> getProxyNodeListCache() { - return R.ok(ProxyNodeMap); + return R.ok(PROXY_NODE_TOPIC_NAME_MAP); } diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java b/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java index 21ecc91..19fac0b 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.ProxyNodeStaticMap; +import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.PROXY_NODE_INDEX_MAP; /** @@ -91,10 +91,10 @@ class Graph { for (int heigh = 0; heigh < height; heigh++) { List list = adj_matrix.get(heigh); - System.out.print("FROM [ " + ProxyNodeStaticMap.get(heigh) + " ] ==> "); + System.out.print("FROM [ " + PROXY_NODE_INDEX_MAP.get(heigh) + " ] ==> "); for (int width = 0; width < weight; width++) { if (list.get(width) != 0) { - System.out.print(ProxyNodeStaticMap.get(width) + ": " + list.get(width) + "\t"); + System.out.print(PROXY_NODE_INDEX_MAP.get(width) + ": " + list.get(width) + "\t"); } } System.out.print("\n"); diff --git a/server/src/main/java/io/wdd/func/xray/persisit/XrayDBOperator.java b/server/src/main/java/io/wdd/func/xray/persisit/XrayDBOperator.java index 3e6b443..1477682 100644 --- a/server/src/main/java/io/wdd/func/xray/persisit/XrayDBOperator.java +++ b/server/src/main/java/io/wdd/func/xray/persisit/XrayDBOperator.java @@ -15,8 +15,7 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.ProxyNodeMap; -import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.ProxyNodeStaticMap; +import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.*; import static io.wdd.rpc.init.AcceptAgentInitInfo.ALL_SERVER_CITY_INDEX; /** @@ -110,21 +109,26 @@ public class XrayDBOperator { // 缓存内容 - ProxyNodeMap.clear(); - ProxyNodeStaticMap.clear(); + PROXY_NODE_MAP.clear(); + PROXY_NODE_TOPIC_NAME_MAP.clear(); + PROXY_NODE_INDEX_MAP.clear(); proxyNodeList .stream() .forEach( proxyNode -> { - ProxyNodeMap.put( + PROXY_NODE_TOPIC_NAME_MAP.put( proxyNode.getAgentTopicName(), proxyNode ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( proxyNode.getNum(), proxyNode ); + PROXY_NODE_MAP.put( + proxyNode.getAgentName(), + proxyNode + ); } ); diff --git a/server/src/main/java/io/wdd/func/xray/persisit/cache/ProxyNodeCache.java b/server/src/main/java/io/wdd/func/xray/persisit/cache/ProxyNodeCache.java index c727fbc..b9aa04b 100644 --- a/server/src/main/java/io/wdd/func/xray/persisit/cache/ProxyNodeCache.java +++ b/server/src/main/java/io/wdd/func/xray/persisit/cache/ProxyNodeCache.java @@ -7,13 +7,18 @@ import java.util.HashMap; public class ProxyNodeCache { + /** + * 保存 AgentName - ProxyNode 的全局缓存 + */ + public static final HashMap PROXY_NODE_MAP = new HashMap<>(); + /** * 保存 AgentTopicName - ProxyNode 的全局缓存 */ - public static final HashMap ProxyNodeMap = new HashMap<>(); + public static final HashMap PROXY_NODE_TOPIC_NAME_MAP = new HashMap<>(); - public static final HashMap ProxyNodeStaticMap = new HashMap<>(); + public static final HashMap PROXY_NODE_INDEX_MAP = new HashMap<>(); public static ProxyNode chengdu; public static ProxyNode shanghai; @@ -139,43 +144,43 @@ public class ProxyNodeCache { .agentTopicName("Seoul-arm64-02-oracle") .build(); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( chengdu.getNum(), chengdu ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( hongkong.getNum(), hongkong ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( shanghai.getNum(), shanghai ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( seoul2.getNum(), seoul2 ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( tokyo2.getNum(), tokyo2 ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( phoenix2.getNum(), phoenix2 ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( london2.getNum(), london2 ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( chengduAgent.getNum(), chengduAgent ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( tokyoDev.getNum(), tokyoDev ); - ProxyNodeStaticMap.put( + PROXY_NODE_INDEX_MAP.put( seoul5.getNum(), seoul5 ); diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java b/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java index d3d50cf..4184431 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java @@ -12,9 +12,10 @@ public interface XrayCoreService { * 解析代理链字符串,返回完整的代理列表 * * @param proxyChainList 代理链字符串 + * @param isTopicName * @return */ - List> transformProxyChainString(List proxyChainList); + List> transformProxyChainString(List proxyChainList, boolean isTopicName); List generateXrayConfigFromNodeList(List> allNetworkPathList); diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java b/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java index 8b64058..94884a2 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java @@ -25,7 +25,8 @@ import static io.wdd.func.xray.beans.config.InboundVmessHTTPTemplateClass.Inboun import static io.wdd.func.xray.beans.config.InboundVmessHTTPTemplateClass.ListenAddress; import static io.wdd.func.xray.beans.config.LogTemplateClass.LogTemplate; import static io.wdd.func.xray.beans.config.OutboundVmessHTTPTemplateClass.*; -import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.ProxyNodeMap; +import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.PROXY_NODE_MAP; +import static io.wdd.func.xray.persisit.cache.ProxyNodeCache.PROXY_NODE_TOPIC_NAME_MAP; import static io.wdd.func.xray.service.XrayConfigPersistor.cleanVersion; @Service @@ -41,20 +42,28 @@ public class XrayCoreServiceImpl implements XrayCoreService { private static final String ProxyChainSplitor = "->"; @Override - public List> transformProxyChainString(List proxyChainList) { + public List> transformProxyChainString(List proxyChainList, boolean isTopicName) { - - proxyChainList + return proxyChainList .stream() .map( proxyChain -> Arrays .stream(proxyChain.split(ProxyChainSplitor)) + .map( + // 此处获取到的就是 每一个节点的名称 + // AgentName 或者 AgentTopicName + agentKindOfName -> { + if (isTopicName) { + return PROXY_NODE_TOPIC_NAME_MAP.get(agentKindOfName); + } else { + return PROXY_NODE_MAP.get(agentKindOfName); + } + } + ) .collect(Collectors.toList()) ) .collect(Collectors.toList()); - return null; - } @Override @@ -99,6 +108,7 @@ public class XrayCoreServiceImpl implements XrayCoreService { networkPathList -> networkPathList.stream() ) .collect(Collectors.toSet()); + // 返回所有的配置 return proxyNodeSet .stream() @@ -114,7 +124,7 @@ public class XrayCoreServiceImpl implements XrayCoreService { xrayDBOperator.CacheAllProxyNodeInfo(); - return ProxyNodeMap; + return PROXY_NODE_TOPIC_NAME_MAP; } private void generateXrayJsonSinglePath(List networkPathList) {