From 1881fb0710f7e8574d0aa239879da08a5ba2c2d8 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Wed, 1 Mar 2023 14:46:20 +0800 Subject: [PATCH] =?UTF-8?q?[server][=20xray]-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wdd/func/controller/XrayController.java | 42 ++++++++++++-- .../func/xray/beans/node/XrayConfigInfo.java | 3 + .../xray/service/XrayConfigDistribute.java | 5 +- .../xray/service/XrayConfigPersistor.java | 1 + .../func/xray/service/XrayCoreService.java | 15 ++++- .../xray/service/XrayCoreServiceImpl.java | 55 +++++++++++++++---- .../java/io/wdd/server/XrayGenerateTest.java | 2 +- 7 files changed, 100 insertions(+), 23 deletions(-) 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 f6da205..eaeaab0 100644 --- a/server/src/main/java/io/wdd/func/controller/XrayController.java +++ b/server/src/main/java/io/wdd/func/controller/XrayController.java @@ -1,17 +1,20 @@ package io.wdd.func.controller; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.wdd.common.beans.response.R; import io.wdd.func.xray.beans.node.ProxyNode; +import io.wdd.func.xray.beans.node.XrayConfigInfo; import io.wdd.func.xray.service.XrayConfigDistribute; import io.wdd.func.xray.service.XrayCoreService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import static io.wdd.func.xray.beans.node.ProxyNodeSet.*; @@ -26,10 +29,39 @@ public class XrayController { @Resource XrayConfigDistribute xrayConfigDistribute; + + @PostMapping("/chain/transform") + @ApiOperation("[解析] - 解析代理链字符串") + public R>> transformProxyChainString( + @ApiParam(name = "proxyChainList", value = "代理链字符串,seoul2->tokyo2, 多条链使用,分隔") + @RequestParam("proxyChainList") List proxyChainList + ) { + + return R.ok( + xrayCoreService.transformProxyChainString(proxyChainList) + ); + + } + + @PostMapping("/chain/debug") + @ApiOperation("[解析] - 代理链完整配置") + public R> debugProxyChainString( + @ApiParam(name = "proxyChainList", value = "代理链字符串,seoul2->tokyo2, 多条链使用,分隔") + @RequestParam("proxyChainList") List proxyChainList + ) { + + return R.ok( + xrayCoreService.generateXrayConfigFromNodeList( + xrayCoreService.transformProxyChainString(proxyChainList) + ) + ); + } + + @GetMapping("/test") public void test() { - ArrayList> allNetworkPathList = new ArrayList<>(); + List> allNetworkPathList = new ArrayList<>(); ArrayList pathA = new ArrayList<>( Arrays.asList( @@ -73,7 +105,7 @@ public class XrayController { // allNetworkPathList.add(pathB); // allNetworkPathList.add(pathC); - xrayCoreService.generateXrayJsonFromNodeList(allNetworkPathList); + xrayCoreService.generateXrayConfigFromNodeList(allNetworkPathList); xrayConfigDistribute.uploadXrayConfigToOSS(allNetworkPathList.get(0)); diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/XrayConfigInfo.java b/server/src/main/java/io/wdd/func/xray/beans/node/XrayConfigInfo.java index c3b08b7..090088c 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/XrayConfigInfo.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/XrayConfigInfo.java @@ -3,6 +3,7 @@ package io.wdd.func.xray.beans.node; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.wdd.func.oss.config.OctopusObjectSummary; +import io.wdd.func.xray.beans.xray.XrayConfig; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -26,6 +27,8 @@ public class XrayConfigInfo { @ApiModelProperty("保存生成的XrayConfig文件,全路径") File xrayConfigFile; + @ApiModelProperty("生成的实际的xray的配置内容") + XrayConfig xrayConfig; @ApiModelProperty("xray config file的对象存储的相关信息") OctopusObjectSummary objectSummary; diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayConfigDistribute.java b/server/src/main/java/io/wdd/func/xray/service/XrayConfigDistribute.java index 2c1a25f..2343bb5 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayConfigDistribute.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayConfigDistribute.java @@ -93,7 +93,6 @@ public class XrayConfigDistribute { "grep", "-c", "active (running)" - ) ); @@ -114,7 +113,7 @@ public class XrayConfigDistribute { @Resource AsyncExecutionService executionService; - public void uploadXrayConfigToOSS(ArrayList networkPathList) { + public void uploadXrayConfigToOSS(List networkPathList) { // 所有的文件全部存储至一个对象存储的后端中 OssConfig ossConfig = ossBackendSelect.oneRandom(); @@ -143,7 +142,7 @@ public class XrayConfigDistribute { ); } - public void buildXrayUpdateResult(ArrayList networkPathList) { + public void buildXrayUpdateResult(List networkPathList) { String formatTimeString = TimeUtils.currentFormatTimeString(); diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayConfigPersistor.java b/server/src/main/java/io/wdd/func/xray/service/XrayConfigPersistor.java index 100a8ec..692b7da 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayConfigPersistor.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayConfigPersistor.java @@ -78,6 +78,7 @@ public class XrayConfigPersistor { XrayConfigInfo xrayConfigInfo = new XrayConfigInfo(); xrayConfigInfo.setXrayConfigFile(xrayConfigFile); xrayConfigInfo.setXrayConfigFileName(fileName); + xrayConfigInfo.setXrayConfig(xrayConfig); return xrayConfigInfo; 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 8f5b12a..5326601 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 @@ -1,12 +1,21 @@ package io.wdd.func.xray.service; import io.wdd.func.xray.beans.node.ProxyNode; +import io.wdd.func.xray.beans.node.XrayConfigInfo; -import java.util.ArrayList; -import java.util.LinkedList; +import java.util.List; public interface XrayCoreService { - void generateXrayJsonFromNodeList(ArrayList> allNetworkPathList); + /** + * 解析代理链字符串,返回完整的代理列表 + * + * @param proxyChainList 代理链字符串 + * @return + */ + List> transformProxyChainString(List proxyChainList); + + + 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 0e15ff0..ef748cd 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 @@ -17,9 +17,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; import static io.wdd.func.xray.beans.config.InboundVmessHTTPTemplateClass.InboundVmessHTTPTemplate; import static io.wdd.func.xray.beans.config.InboundVmessHTTPTemplateClass.ListenAddress; @@ -34,15 +33,37 @@ public class XrayCoreServiceImpl implements XrayCoreService { @Resource XrayConfigPersistor xrayConfigPersistor; + private static final String ProxyChainSplitor = "->"; + @Override - public void generateXrayJsonFromNodeList(ArrayList> allNetworkPathList) { + public List> transformProxyChainString(List proxyChainList) { + + + proxyChainList + .stream() + .map( + proxyChain -> Arrays + .stream(proxyChain.split(ProxyChainSplitor)) + .collect(Collectors.toList()) + ) + .collect(Collectors.toList()); + + return null; + + } + + @Override + public List generateXrayConfigFromNodeList(List> allNetworkPathList) { // 需要根据所有的交叉链路进行计算 // A -> B -> C -> D // B -> D // A -> B -> F - // B点需要具有 4对inbound和outbound对 + // A点需要具有 2对inbound和outbound对 + // B点需要具有 3对inbound和outbound对 // C点需要具有 2对inbound和outbound对 + // D点需要具有 2对inbound和outbound对 + // F点需要具有 1对inbound和outbound对 // 解析所有的Node对 @@ -66,10 +87,24 @@ public class XrayCoreServiceImpl implements XrayCoreService { } ); + // 拿到所有的proxyNode + Set proxyNodeSet = allNetworkPathList + .stream() + .flatMap( + networkPathList -> networkPathList.stream() + ) + .collect(Collectors.toSet()); + // 返回所有的配置 + return proxyNodeSet + .stream() + .map( + ProxyNode::getXrayConfigInfo + ) + .collect(Collectors.toList()); } - private void generateXrayJsonSinglePath(ArrayList networkPathList) { + private void generateXrayJsonSinglePath(List networkPathList) { int pathLength = networkPathList.size(); // 采用 VMESS + websocket的形式形成 链状代理 @@ -125,9 +160,7 @@ public class XrayCoreServiceImpl implements XrayCoreService { } - - - private XrayConfig doBuildXrayConfig(boolean isOutBoundFree, String tag, ClientObject clientObject, int port, ArrayList networkPathList, int pos) { + private XrayConfig doBuildXrayConfig(boolean isOutBoundFree, String tag, ClientObject clientObject, int port, List networkPathList, int pos) { XrayConfig xrayConfig = new XrayConfig(); @@ -204,7 +237,7 @@ public class XrayCoreServiceImpl implements XrayCoreService { xrayConfig.setRouting(routingObject); } - private void buildOutbound(XrayConfig xrayConfig, ArrayList networkPathList, int pos, ClientObject clientObject, String tag, Integer port) { + private void buildOutbound(XrayConfig xrayConfig, List networkPathList, int pos, ClientObject clientObject, String tag, Integer port) { io.wdd.func.xray.beans.xray.protocol.outbound.VMESS vmessOutbound = new io.wdd.func.xray.beans.xray.protocol.outbound.VMESS(); try { BeanUtils.copyProperties( @@ -291,7 +324,7 @@ public class XrayCoreServiceImpl implements XrayCoreService { * @param networkPathList 网络路径节点 * @return 路径Tag */ - private String generatePathTag(ArrayList networkPathList) { + private String generatePathTag(List networkPathList) { StringBuilder sb = new StringBuilder(); networkPathList diff --git a/server/src/test/java/io/wdd/server/XrayGenerateTest.java b/server/src/test/java/io/wdd/server/XrayGenerateTest.java index 89e1ce5..179c8b5 100644 --- a/server/src/test/java/io/wdd/server/XrayGenerateTest.java +++ b/server/src/test/java/io/wdd/server/XrayGenerateTest.java @@ -15,7 +15,7 @@ public class XrayGenerateTest { @Test public void go(){ - xrayCoreService.generateXrayJsonFromNodeList(null); + xrayCoreService.generateXrayConfigFromNodeList(null); } }