mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-13 20:46:38 +08:00
支持节点双栈IP字段
This commit is contained in:
@@ -16,6 +16,10 @@ public class NodeDto {
|
|||||||
@NotBlank(message = "服务器ip不能为空")
|
@NotBlank(message = "服务器ip不能为空")
|
||||||
private String serverIp;
|
private String serverIp;
|
||||||
|
|
||||||
|
private String serverIpV4;
|
||||||
|
|
||||||
|
private String serverIpV6;
|
||||||
|
|
||||||
@NotBlank(message = "可用端口不能为空")
|
@NotBlank(message = "可用端口不能为空")
|
||||||
private String port;
|
private String port;
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ public class NodeUpdateDto {
|
|||||||
@NotBlank(message = "服务器ip不能为空")
|
@NotBlank(message = "服务器ip不能为空")
|
||||||
private String serverIp;
|
private String serverIp;
|
||||||
|
|
||||||
|
private String serverIpV4;
|
||||||
|
|
||||||
|
private String serverIpV6;
|
||||||
|
|
||||||
@NotBlank(message = "可用port不能为空")
|
@NotBlank(message = "可用port不能为空")
|
||||||
private String port;
|
private String port;
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ public class Node extends BaseEntity {
|
|||||||
|
|
||||||
private String serverIp;
|
private String serverIp;
|
||||||
|
|
||||||
|
private String serverIpV4;
|
||||||
|
|
||||||
|
private String serverIpV6;
|
||||||
|
|
||||||
private String version;
|
private String version;
|
||||||
|
|
||||||
private String port;
|
private String port;
|
||||||
@@ -45,5 +49,4 @@ public class Node extends BaseEntity {
|
|||||||
* Lower value appears first.
|
* Lower value appears first.
|
||||||
*/
|
*/
|
||||||
private Integer inx;
|
private Integer inx;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,12 +56,19 @@ public class NodeServiceImpl extends ServiceImpl<NodeMapper, Node> implements No
|
|||||||
@Override
|
@Override
|
||||||
public R createNode(NodeDto nodeDto) {
|
public R createNode(NodeDto nodeDto) {
|
||||||
validatePortRange(nodeDto.getPort());
|
validatePortRange(nodeDto.getPort());
|
||||||
|
|
||||||
|
String normalizedV4 = normalizeV4(nodeDto.getServerIpV4(), nodeDto.getServerIp());
|
||||||
|
String normalizedV6 = normalizeV6(nodeDto.getServerIpV6(), nodeDto.getServerIp());
|
||||||
|
String primaryServerIp = pickPrimaryServerIp(normalizedV4, normalizedV6, nodeDto.getServerIp());
|
||||||
|
|
||||||
Node node = new Node();
|
Node node = new Node();
|
||||||
node.setSecret(IdUtil.simpleUUID());
|
node.setSecret(IdUtil.simpleUUID());
|
||||||
node.setStatus(0);
|
node.setStatus(0);
|
||||||
node.setPort(nodeDto.getPort());
|
node.setPort(nodeDto.getPort());
|
||||||
node.setName(nodeDto.getName());
|
node.setName(nodeDto.getName());
|
||||||
node.setServerIp(nodeDto.getServerIp());
|
node.setServerIp(primaryServerIp);
|
||||||
|
node.setServerIpV4(normalizedV4);
|
||||||
|
node.setServerIpV6(normalizedV6);
|
||||||
long currentTime = System.currentTimeMillis();
|
long currentTime = System.currentTimeMillis();
|
||||||
node.setCreatedTime(currentTime);
|
node.setCreatedTime(currentTime);
|
||||||
node.setUpdatedTime(currentTime);
|
node.setUpdatedTime(currentTime);
|
||||||
@@ -390,10 +397,17 @@ public class NodeServiceImpl extends ServiceImpl<NodeMapper, Node> implements No
|
|||||||
|
|
||||||
private Node buildUpdateNode(NodeUpdateDto nodeUpdateDto) {
|
private Node buildUpdateNode(NodeUpdateDto nodeUpdateDto) {
|
||||||
validatePortRange(nodeUpdateDto.getPort());
|
validatePortRange(nodeUpdateDto.getPort());
|
||||||
|
|
||||||
|
String normalizedV4 = normalizeV4(nodeUpdateDto.getServerIpV4(), nodeUpdateDto.getServerIp());
|
||||||
|
String normalizedV6 = normalizeV6(nodeUpdateDto.getServerIpV6(), nodeUpdateDto.getServerIp());
|
||||||
|
String primaryServerIp = pickPrimaryServerIp(normalizedV4, normalizedV6, nodeUpdateDto.getServerIp());
|
||||||
|
|
||||||
Node node = new Node();
|
Node node = new Node();
|
||||||
node.setId(nodeUpdateDto.getId());
|
node.setId(nodeUpdateDto.getId());
|
||||||
node.setName(nodeUpdateDto.getName());
|
node.setName(nodeUpdateDto.getName());
|
||||||
node.setServerIp(nodeUpdateDto.getServerIp());
|
node.setServerIp(primaryServerIp);
|
||||||
|
node.setServerIpV4(normalizedV4);
|
||||||
|
node.setServerIpV6(normalizedV6);
|
||||||
node.setPort(nodeUpdateDto.getPort());
|
node.setPort(nodeUpdateDto.getPort());
|
||||||
node.setHttp(nodeUpdateDto.getHttp());
|
node.setHttp(nodeUpdateDto.getHttp());
|
||||||
node.setTls(nodeUpdateDto.getTls());
|
node.setTls(nodeUpdateDto.getTls());
|
||||||
@@ -405,6 +419,48 @@ public class NodeServiceImpl extends ServiceImpl<NodeMapper, Node> implements No
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String pickPrimaryServerIp(String serverIpV4, String serverIpV6, String fallback) {
|
||||||
|
if (StrUtil.isNotBlank(serverIpV4)) {
|
||||||
|
return serverIpV4.trim();
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(serverIpV6)) {
|
||||||
|
return serverIpV6.trim();
|
||||||
|
}
|
||||||
|
return fallback != null ? fallback.trim() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String normalizeV4(String serverIpV4, String legacyServerIp) {
|
||||||
|
if (StrUtil.isNotBlank(serverIpV4)) {
|
||||||
|
return serverIpV4.trim();
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(legacyServerIp) && looksLikeIpv4(legacyServerIp.trim())) {
|
||||||
|
return legacyServerIp.trim();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String normalizeV6(String serverIpV6, String legacyServerIp) {
|
||||||
|
if (StrUtil.isNotBlank(serverIpV6)) {
|
||||||
|
return serverIpV6.trim();
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(legacyServerIp) && looksLikeIpv6(legacyServerIp.trim())) {
|
||||||
|
return legacyServerIp.trim();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean looksLikeIpv4(String value) {
|
||||||
|
// 仅用于判定地址族(不解析域名)
|
||||||
|
Pattern ipv4 = Pattern.compile("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
|
||||||
|
return ipv4.matcher(value).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean looksLikeIpv6(String value) {
|
||||||
|
// 粗略判定 IPv6(与 GostUtil.processServerAddress 一致思路)
|
||||||
|
long colonCount = value.chars().filter(ch -> ch == ':').count();
|
||||||
|
return colonCount >= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void validatePortRange(String port) {
|
private void validatePortRange(String port) {
|
||||||
Pattern PORT_PATTERN = Pattern.compile( "([0-9]{1,5})(-([0-9]{1,5}))?");
|
Pattern PORT_PATTERN = Pattern.compile( "([0-9]{1,5})(-([0-9]{1,5}))?");
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ CREATE TABLE IF NOT EXISTS node (
|
|||||||
name VARCHAR(100) NOT NULL,
|
name VARCHAR(100) NOT NULL,
|
||||||
secret VARCHAR(100) NOT NULL,
|
secret VARCHAR(100) NOT NULL,
|
||||||
server_ip VARCHAR(100) NOT NULL,
|
server_ip VARCHAR(100) NOT NULL,
|
||||||
|
server_ip_v4 VARCHAR(100),
|
||||||
|
server_ip_v6 VARCHAR(100),
|
||||||
port TEXT NOT NULL,
|
port TEXT NOT NULL,
|
||||||
interface_name VARCHAR(200),
|
interface_name VARCHAR(200),
|
||||||
version VARCHAR(100),
|
version VARCHAR(100),
|
||||||
|
|||||||
Reference in New Issue
Block a user