[server][ xray]- 新增功能代码

This commit is contained in:
zeaslity
2023-03-01 14:46:20 +08:00
parent 3ef09ad74d
commit 1881fb0710
7 changed files with 100 additions and 23 deletions

View File

@@ -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<List<List<ProxyNode>>> transformProxyChainString(
@ApiParam(name = "proxyChainList", value = "代理链字符串seoul2->tokyo2, 多条链使用,分隔")
@RequestParam("proxyChainList") List<String> proxyChainList
) {
return R.ok(
xrayCoreService.transformProxyChainString(proxyChainList)
);
}
@PostMapping("/chain/debug")
@ApiOperation("[解析] - 代理链完整配置")
public R<List<XrayConfigInfo>> debugProxyChainString(
@ApiParam(name = "proxyChainList", value = "代理链字符串seoul2->tokyo2, 多条链使用,分隔")
@RequestParam("proxyChainList") List<String> proxyChainList
) {
return R.ok(
xrayCoreService.generateXrayConfigFromNodeList(
xrayCoreService.transformProxyChainString(proxyChainList)
)
);
}
@GetMapping("/test")
public void test() {
ArrayList<ArrayList<ProxyNode>> allNetworkPathList = new ArrayList<>();
List<List<ProxyNode>> allNetworkPathList = new ArrayList<>();
ArrayList<ProxyNode> 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));

View File

@@ -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;

View File

@@ -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<ProxyNode> networkPathList) {
public void uploadXrayConfigToOSS(List<ProxyNode> networkPathList) {
// 所有的文件全部存储至一个对象存储的后端中
OssConfig ossConfig = ossBackendSelect.oneRandom();
@@ -143,7 +142,7 @@ public class XrayConfigDistribute {
);
}
public void buildXrayUpdateResult(ArrayList<ProxyNode> networkPathList) {
public void buildXrayUpdateResult(List<ProxyNode> networkPathList) {
String formatTimeString = TimeUtils.currentFormatTimeString();

View File

@@ -78,6 +78,7 @@ public class XrayConfigPersistor {
XrayConfigInfo xrayConfigInfo = new XrayConfigInfo();
xrayConfigInfo.setXrayConfigFile(xrayConfigFile);
xrayConfigInfo.setXrayConfigFileName(fileName);
xrayConfigInfo.setXrayConfig(xrayConfig);
return xrayConfigInfo;

View File

@@ -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<ArrayList<ProxyNode>> allNetworkPathList);
/**
* 解析代理链字符串,返回完整的代理列表
*
* @param proxyChainList 代理链字符串
* @return
*/
List<List<ProxyNode>> transformProxyChainString(List<String> proxyChainList);
List<XrayConfigInfo> generateXrayConfigFromNodeList(List<List<ProxyNode>> allNetworkPathList);
}

View File

@@ -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<ArrayList<ProxyNode>> allNetworkPathList) {
public List<List<ProxyNode>> transformProxyChainString(List<String> proxyChainList) {
proxyChainList
.stream()
.map(
proxyChain -> Arrays
.stream(proxyChain.split(ProxyChainSplitor))
.collect(Collectors.toList())
)
.collect(Collectors.toList());
return null;
}
@Override
public List<XrayConfigInfo> generateXrayConfigFromNodeList(List<List<ProxyNode>> 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<ProxyNode> proxyNodeSet = allNetworkPathList
.stream()
.flatMap(
networkPathList -> networkPathList.stream()
)
.collect(Collectors.toSet());
// 返回所有的配置
return proxyNodeSet
.stream()
.map(
ProxyNode::getXrayConfigInfo
)
.collect(Collectors.toList());
}
private void generateXrayJsonSinglePath(ArrayList<ProxyNode> networkPathList) {
private void generateXrayJsonSinglePath(List<ProxyNode> 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<ProxyNode> networkPathList, int pos) {
private XrayConfig doBuildXrayConfig(boolean isOutBoundFree, String tag, ClientObject clientObject, int port, List<ProxyNode> 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<ProxyNode> networkPathList, int pos, ClientObject clientObject, String tag, Integer port) {
private void buildOutbound(XrayConfig xrayConfig, List<ProxyNode> 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<ProxyNode> networkPathList) {
private String generatePathTag(List<ProxyNode> networkPathList) {
StringBuilder sb = new StringBuilder();
networkPathList

View File

@@ -15,7 +15,7 @@ public class XrayGenerateTest {
@Test
public void go(){
xrayCoreService.generateXrayJsonFromNodeList(null);
xrayCoreService.generateXrayConfigFromNodeList(null);
}
}