IPv6 support (#3773)
* IPv6 support * AddressServerParamCheckUtil 合并到 IpUtil 及一些修改 * 解决魔法值 * 修改隐患 * 调整使用了类似 ip.indexOf(":") 查找是否有端口的地方的逻辑, 一些 ":" 替换为常量 * 删除无用测试 * IpUtil 改名 为 IPUtil, 涉及IP的相关方法名修改,涉及到的调用修改,检测IP的地方调用的isIPv4改为isIP. 修改涉及IP的字段长度及相关升级更新的sql * no message * no message * no message * no message * 获取本机IP时,如果本机IP是IPv6并且包含网卡信息(V6地址中最后面的百分号和百分号后面的内容)则去除网卡信息 * 解决 AvoidComplexConditionRule(请不要在条件中使用复杂的表达式) * 移除无用代码 * 添加注释 * 调整code style, 调整获取本机IP的逻辑
This commit is contained in:
parent
6ddfa3e997
commit
538509502f
@ -18,6 +18,7 @@ package com.alibaba.nacos.address.component;
|
||||
|
||||
import com.alibaba.nacos.address.constant.AddressServerConstants;
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.naming.core.Instance;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -85,14 +86,11 @@ public class AddressServerGeneratorManager {
|
||||
}
|
||||
|
||||
private String[] generateIpAndPort(String ip) {
|
||||
|
||||
int index = ip.indexOf(AddressServerConstants.IP_PORT_SEPARATOR);
|
||||
if (index != -1) {
|
||||
|
||||
return new String[] {ip.substring(0, index), ip.substring(index + 1)};
|
||||
String[] result = IPUtil.splitIPPortStr(ip);
|
||||
if (result.length != IPUtil.SPLIT_IP_PORT_RESULT_LENGTH) {
|
||||
return new String[] {result[0], String.valueOf(AddressServerConstants.DEFAULT_SERVER_PORT)};
|
||||
}
|
||||
|
||||
return new String[] {ip, String.valueOf(AddressServerConstants.DEFAULT_SERVER_PORT)};
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -38,11 +38,6 @@ public interface AddressServerConstants {
|
||||
*/
|
||||
String DEFAULT_PRODUCT = "nacos";
|
||||
|
||||
/**
|
||||
* the separator between ip and port.
|
||||
*/
|
||||
String IP_PORT_SEPARATOR = ":";
|
||||
|
||||
/**
|
||||
* the separator for service name between raw service name and group.
|
||||
*/
|
||||
|
@ -20,9 +20,9 @@ import com.alibaba.nacos.address.component.AddressServerGeneratorManager;
|
||||
import com.alibaba.nacos.address.component.AddressServerManager;
|
||||
import com.alibaba.nacos.address.constant.AddressServerConstants;
|
||||
import com.alibaba.nacos.address.misc.Loggers;
|
||||
import com.alibaba.nacos.address.util.AddressServerParamCheckUtil;
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.naming.pojo.healthcheck.AbstractHealthChecker;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.naming.core.Cluster;
|
||||
import com.alibaba.nacos.naming.core.Instance;
|
||||
import com.alibaba.nacos.naming.core.Service;
|
||||
@ -87,8 +87,8 @@ public class AddressServerClusterController {
|
||||
clusterObj.setHealthChecker(new AbstractHealthChecker.None());
|
||||
serviceManager.createServiceIfAbsent(Constants.DEFAULT_NAMESPACE_ID, serviceName, false, clusterObj);
|
||||
String[] ipArray = addressServerManager.splitIps(ips);
|
||||
String checkResult = AddressServerParamCheckUtil.checkIps(ipArray);
|
||||
if (AddressServerParamCheckUtil.CHECK_OK.equals(checkResult)) {
|
||||
String checkResult = IPUtil.checkIPs(ipArray);
|
||||
if (IPUtil.checkOK(checkResult)) {
|
||||
List<Instance> instanceList = addressServerGeneratorManager
|
||||
.generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray);
|
||||
for (Instance instance : instanceList) {
|
||||
@ -143,8 +143,8 @@ public class AddressServerClusterController {
|
||||
} else {
|
||||
// delete specified ip list
|
||||
String[] ipArray = addressServerManager.splitIps(ips);
|
||||
String checkResult = AddressServerParamCheckUtil.checkIps(ipArray);
|
||||
if (AddressServerParamCheckUtil.CHECK_OK.equals(checkResult)) {
|
||||
String checkResult = IPUtil.checkIPs(ipArray);
|
||||
if (IPUtil.checkOK(checkResult)) {
|
||||
List<Instance> instanceList = addressServerGeneratorManager
|
||||
.generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray);
|
||||
serviceManager.removeInstance(Constants.DEFAULT_NAMESPACE_ID, serviceName, false,
|
||||
|
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.alibaba.nacos.address.util;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Provides a unified tool class for address server parameter verification.
|
||||
*
|
||||
* @author pbting
|
||||
* @date 2019-06-19 11:19 AM
|
||||
* @since 1.1.0
|
||||
*/
|
||||
public class AddressServerParamCheckUtil {
|
||||
|
||||
public static final String CHECK_OK = "ok";
|
||||
|
||||
public static final String ILLEGAL_IP_PREFIX = "illegal ip: ";
|
||||
|
||||
private static final String IP_REGEX = "(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}";
|
||||
|
||||
private static final Pattern IP_PATTERN = Pattern.compile(IP_REGEX);
|
||||
|
||||
/**
|
||||
* Check ips.
|
||||
*
|
||||
* @param ips ips
|
||||
* @return 'ok' if check passed, otherwise illegal ip
|
||||
*/
|
||||
public static String checkIps(String... ips) {
|
||||
|
||||
if (ips == null || ips.length == 0) {
|
||||
|
||||
return CHECK_OK;
|
||||
}
|
||||
// illegal response
|
||||
StringBuilder illegalResponse = new StringBuilder();
|
||||
for (String ip : ips) {
|
||||
Matcher matcher = IP_PATTERN.matcher(ip);
|
||||
if (matcher.matches()) {
|
||||
continue;
|
||||
}
|
||||
illegalResponse.append(ip + ",");
|
||||
}
|
||||
|
||||
if (illegalResponse.length() == 0) {
|
||||
return CHECK_OK;
|
||||
}
|
||||
|
||||
return ILLEGAL_IP_PREFIX + illegalResponse.substring(0, illegalResponse.length() - 1);
|
||||
}
|
||||
}
|
@ -16,17 +16,17 @@
|
||||
|
||||
package com.alibaba.nacos.address;
|
||||
|
||||
import com.alibaba.nacos.address.util.AddressServerParamCheckUtil;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ParamCheckUtilTests {
|
||||
|
||||
@Test
|
||||
public void checkIps() {
|
||||
public void checkIPs() {
|
||||
String[] ips = {"127.0.0.1"};
|
||||
System.out.println(AddressServerParamCheckUtil.checkIps(ips));
|
||||
System.out.println(IPUtil.checkIPs(ips));
|
||||
|
||||
String[] illlegalIps = {"127.100.19", "127.0.0.1"};
|
||||
System.err.println(AddressServerParamCheckUtil.checkIps(illlegalIps));
|
||||
System.err.println(IPUtil.checkIPs(illlegalIps));
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ import com.alibaba.nacos.common.http.param.Query;
|
||||
import com.alibaba.nacos.common.lifecycle.Closeable;
|
||||
import com.alibaba.nacos.common.notify.NotifyCenter;
|
||||
import com.alibaba.nacos.common.utils.IoUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.StringUtils;
|
||||
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||
import org.slf4j.Logger;
|
||||
@ -87,9 +88,9 @@ public class ServerListManager implements Closeable {
|
||||
this.isStarted = true;
|
||||
List<String> serverAddrs = new ArrayList<String>();
|
||||
for (String serverAddr : fixed) {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
String[] serverAddrArr = IPUtil.splitIPPortStr(serverAddr);
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
serverAddrs.add(serverAddrArr[0] + IPUtil.IP_PORT_SPLITER + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(serverAddr);
|
||||
}
|
||||
@ -156,9 +157,10 @@ public class ServerListManager implements Closeable {
|
||||
if (serverAddr.startsWith(HTTPS) || serverAddr.startsWith(HTTP)) {
|
||||
serverAddrs.add(serverAddr);
|
||||
} else {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
String[] serverAddrArr = IPUtil.splitIPPortStr(serverAddr);
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(HTTP + serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
serverAddrs.add(HTTP + serverAddrArr[0] + IPUtil.IP_PORT_SPLITER + ParamUtil
|
||||
.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(HTTP + serverAddr);
|
||||
}
|
||||
@ -355,10 +357,10 @@ public class ServerListManager implements Closeable {
|
||||
List<String> result = new ArrayList<String>(lines.size());
|
||||
for (String serverAddr : lines) {
|
||||
if (StringUtils.isNotBlank(serverAddr)) {
|
||||
String[] ipPort = serverAddr.trim().split(":");
|
||||
String[] ipPort = IPUtil.splitIPPortStr(serverAddr.trim());
|
||||
String ip = ipPort[0].trim();
|
||||
if (ipPort.length == 1) {
|
||||
result.add(ip + ":" + ParamUtil.getDefaultServerPort());
|
||||
result.add(ip + IPUtil.IP_PORT_SPLITER + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
result.add(serverAddr);
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
package com.alibaba.nacos.client.config.utils;
|
||||
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.common.utils.IpUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
@ -190,7 +190,7 @@ public class ParamUtils {
|
||||
}
|
||||
String[] ipsArr = betaIps.split(",");
|
||||
for (String ip : ipsArr) {
|
||||
if (!IpUtils.isIpv4(ip)) {
|
||||
if (!IPUtil.isIP(ip)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid");
|
||||
}
|
||||
}
|
||||
|
@ -45,6 +45,7 @@ import com.alibaba.nacos.common.http.param.Query;
|
||||
import com.alibaba.nacos.common.lifecycle.Closeable;
|
||||
import com.alibaba.nacos.common.utils.HttpMethod;
|
||||
import com.alibaba.nacos.common.utils.IoUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
import com.alibaba.nacos.common.utils.StringUtils;
|
||||
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||
@ -588,8 +589,8 @@ public class NamingProxy implements Closeable {
|
||||
if (curServer.startsWith(UtilAndComs.HTTPS) || curServer.startsWith(UtilAndComs.HTTP)) {
|
||||
url = curServer + api;
|
||||
} else {
|
||||
if (!curServer.contains(UtilAndComs.SERVER_ADDR_IP_SPLITER)) {
|
||||
curServer = curServer + UtilAndComs.SERVER_ADDR_IP_SPLITER + serverPort;
|
||||
if (!IPUtil.containsPort(curServer)) {
|
||||
curServer = curServer + IPUtil.IP_PORT_SPLITER + serverPort;
|
||||
}
|
||||
url = NamingHttpClientManager.getInstance().getPrefix() + curServer + api;
|
||||
}
|
||||
|
@ -51,8 +51,6 @@ public class UtilAndComs {
|
||||
|
||||
public static final String NACOS_NAMING_LOG_LEVEL = "com.alibaba.nacos.naming.log.level";
|
||||
|
||||
public static final String SERVER_ADDR_IP_SPLITER = ":";
|
||||
|
||||
public static final int DEFAULT_CLIENT_BEAT_THREAD_COUNT =
|
||||
Runtime.getRuntime().availableProcessors() > 1 ? Runtime.getRuntime().availableProcessors() / 2 : 1;
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.common.tls;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IpUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -38,7 +38,7 @@ public final class SelfHostnameVerifier implements HostnameVerifier {
|
||||
|
||||
private static ConcurrentHashMap<String, Boolean> hosts = new ConcurrentHashMap<String, Boolean>();
|
||||
|
||||
private static final String[] LOCALHOST_HOSTNAME = new String[] {"localhost", "127.0.0.1"};
|
||||
private static final String[] LOCALHOST_HOSTNAME = new String[] {"localhost", IPUtil.localHostIP()};
|
||||
|
||||
public SelfHostnameVerifier(HostnameVerifier hv) {
|
||||
this.hv = hv;
|
||||
@ -49,22 +49,22 @@ public final class SelfHostnameVerifier implements HostnameVerifier {
|
||||
if (LOCALHOST_HOSTNAME[0].equalsIgnoreCase(hostname) || LOCALHOST_HOSTNAME[1].equals(hostname)) {
|
||||
return true;
|
||||
}
|
||||
if (isIpv4(hostname)) {
|
||||
if (isIP(hostname)) {
|
||||
return true;
|
||||
}
|
||||
return hv.verify(hostname, session);
|
||||
}
|
||||
|
||||
private static boolean isIpv4(String host) {
|
||||
private static boolean isIP(String host) {
|
||||
if (host == null || host.isEmpty()) {
|
||||
LOGGER.warn("host is empty, isIPv4 = false");
|
||||
LOGGER.warn("host is empty, isIP = false");
|
||||
return false;
|
||||
}
|
||||
Boolean cacheHostVerify = hosts.get(host);
|
||||
if (cacheHostVerify != null) {
|
||||
return cacheHostVerify;
|
||||
}
|
||||
boolean isIp = IpUtils.isIpv4(host);
|
||||
boolean isIp = IPUtil.isIP(host);
|
||||
hosts.putIfAbsent(host, isIp);
|
||||
return isIp;
|
||||
}
|
||||
|
222
common/src/main/java/com/alibaba/nacos/common/utils/IPUtil.java
Normal file
222
common/src/main/java/com/alibaba/nacos/common/utils/IPUtil.java
Normal file
@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.alibaba.nacos.common.utils;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* ip tool.
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings({"checkstyle:AbbreviationAsWordInName", "PMD.ClassNamingShouldBeCamelRule"})
|
||||
public class IPUtil {
|
||||
|
||||
public static final boolean PREFER_IPV6_ADDRESSES = Boolean.parseBoolean(System.getProperty("java.net.preferIPv6Addresses"));
|
||||
|
||||
public static final String IPV6_START_MARK = "[";
|
||||
|
||||
public static final String IPV6_END_MARK = "]";
|
||||
|
||||
public static final String ILLEGAL_IP_PREFIX = "illegal ip: ";
|
||||
|
||||
public static final String IP_PORT_SPLITER = ":";
|
||||
|
||||
public static final int SPLIT_IP_PORT_RESULT_LENGTH = 2;
|
||||
|
||||
public static final String PERCENT_SIGN_IN_IPV6 = "%";
|
||||
|
||||
private static final String LOCAL_HOST_IP_V4 = "127.0.0.1";
|
||||
|
||||
private static final String LOCAL_HOST_IP_V6 = "[::1]";
|
||||
|
||||
private static Pattern ipv4Pattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
|
||||
|
||||
private static final int IPV4_ADDRESS_LENGTH = 4;
|
||||
|
||||
private static final int IPV6_ADDRESS_LENGTH = 16;
|
||||
|
||||
private static final String CHECK_OK = "ok";
|
||||
|
||||
/**
|
||||
* get localhost ip.
|
||||
* @return java.lang.String
|
||||
*/
|
||||
public static String localHostIP() {
|
||||
if (PREFER_IPV6_ADDRESSES) {
|
||||
return LOCAL_HOST_IP_V6;
|
||||
}
|
||||
return LOCAL_HOST_IP_V4;
|
||||
}
|
||||
|
||||
/**
|
||||
* check whether the ip address is IPv4.
|
||||
*
|
||||
* @param addr ip address
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isIPv4(String addr) {
|
||||
try {
|
||||
return InetAddress.getByName(addr).getAddress().length == IPV4_ADDRESS_LENGTH;
|
||||
} catch (UnknownHostException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check whether the ip address is IPv6.
|
||||
*
|
||||
* @param addr ip address
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isIPv6(String addr) {
|
||||
try {
|
||||
return InetAddress.getByName(addr).getAddress().length == IPV6_ADDRESS_LENGTH;
|
||||
} catch (UnknownHostException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check whether the str is ip address (IPv4 or IPv6).
|
||||
*
|
||||
* @param addr ip address str
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isIP(String addr) {
|
||||
try {
|
||||
InetAddress.getByName(addr);
|
||||
return true;
|
||||
} catch (UnknownHostException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the address contains a port.
|
||||
* 2020/9/3 14:53
|
||||
* @param address address string
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean containsPort(String address) {
|
||||
return splitIPPortStr(address).length == SPLIT_IP_PORT_RESULT_LENGTH;
|
||||
}
|
||||
|
||||
/**
|
||||
* Split IP and port strings, support IPv4 and IPv6, IP in IPv6 must be enclosed with [].
|
||||
*
|
||||
* @param str ip and port string
|
||||
* @return java.lang.String[]
|
||||
*/
|
||||
public static String[] splitIPPortStr(String str) {
|
||||
if (StringUtils.isBlank(str)) {
|
||||
throw new IllegalArgumentException("ip and port string cannot be empty!");
|
||||
}
|
||||
String[] serverAddrArr;
|
||||
if (str.startsWith(IPV6_START_MARK) && StringUtils.containsIgnoreCase(str, IPV6_END_MARK)) {
|
||||
if (str.endsWith(IPV6_END_MARK)) {
|
||||
serverAddrArr = new String[1];
|
||||
serverAddrArr[0] = str;
|
||||
} else {
|
||||
serverAddrArr = new String[2];
|
||||
serverAddrArr[0] = str.substring(0, (str.indexOf(IPV6_END_MARK) + 1));
|
||||
serverAddrArr[1] = str.substring((str.indexOf(IPV6_END_MARK) + 2));
|
||||
}
|
||||
if (!isIPv6(serverAddrArr[0])) {
|
||||
throw new IllegalArgumentException("The IPv6 address(\"" + serverAddrArr[0] + "\") is incorrect.");
|
||||
}
|
||||
} else {
|
||||
serverAddrArr = str.split(":");
|
||||
if (serverAddrArr.length > SPLIT_IP_PORT_RESULT_LENGTH) {
|
||||
throw new IllegalArgumentException("The IP address(\"" + str
|
||||
+ "\") is incorrect. If it is an IPv6 address, please use [] to enclose the IP part!");
|
||||
}
|
||||
if (!isIPv4(serverAddrArr[0])) {
|
||||
throw new IllegalArgumentException("The IPv4 address(\"" + serverAddrArr[0] + "\") is incorrect.");
|
||||
}
|
||||
}
|
||||
return serverAddrArr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the IP from the string containing the IP address.
|
||||
* @param str string containing IP address
|
||||
* @return java.lang.String
|
||||
*/
|
||||
public static String getIPFromString(String str) {
|
||||
if (StringUtils.isBlank(str)) {
|
||||
return "";
|
||||
}
|
||||
String result = "";
|
||||
if (StringUtils.containsIgnoreCase(str, IPV6_START_MARK) && StringUtils.containsIgnoreCase(str, IPV6_END_MARK)) {
|
||||
result = str.substring(str.indexOf(IPV6_START_MARK), (str.indexOf(IPV6_END_MARK) + 1));
|
||||
if (!isIPv6(result)) {
|
||||
result = "";
|
||||
}
|
||||
} else {
|
||||
Matcher m = ipv4Pattern.matcher(str);
|
||||
if (m.find()) {
|
||||
result = m.group();
|
||||
if (!isIPv4(result)) {
|
||||
result = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check ips.
|
||||
*
|
||||
* @param ips ips
|
||||
* @return 'ok' if check passed, otherwise illegal ip
|
||||
*/
|
||||
public static String checkIPs(String... ips) {
|
||||
|
||||
if (ips == null || ips.length == 0) {
|
||||
|
||||
return CHECK_OK;
|
||||
}
|
||||
// illegal response
|
||||
StringBuilder illegalResponse = new StringBuilder();
|
||||
for (String ip : ips) {
|
||||
if (IPUtil.isIP(ip)) {
|
||||
continue;
|
||||
}
|
||||
illegalResponse.append(ip + ",");
|
||||
}
|
||||
|
||||
if (illegalResponse.length() == 0) {
|
||||
return CHECK_OK;
|
||||
}
|
||||
|
||||
return ILLEGAL_IP_PREFIX + illegalResponse.substring(0, illegalResponse.length() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether checkIPs result is "ok".
|
||||
* @param checkIPsResult checkIPs result
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean checkOK(String checkIPsResult) {
|
||||
return CHECK_OK.equals(checkIPsResult);
|
||||
}
|
||||
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.alibaba.nacos.common.utils;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* ip tool.
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class IpUtils {
|
||||
|
||||
private static final Pattern IPV4_PATTERN = Pattern
|
||||
.compile("^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$");
|
||||
|
||||
private static final Pattern IPV6_PATTERN = Pattern.compile("^([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$");
|
||||
|
||||
public static boolean isIpv4(String addr) {
|
||||
return isMatch(addr, IPV4_PATTERN);
|
||||
}
|
||||
|
||||
public static boolean isIpv6(String addr) {
|
||||
return isMatch(addr, IPV6_PATTERN);
|
||||
}
|
||||
|
||||
private static boolean isMatch(String data, Pattern pattern) {
|
||||
if (StringUtils.isBlank(data)) {
|
||||
return false;
|
||||
}
|
||||
Matcher mat = pattern.matcher(data);
|
||||
return mat.find();
|
||||
}
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.alibaba.nacos.common.utils;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* test IpUtil.
|
||||
* @ClassName: IpUtilTest
|
||||
* @date 2020/9/3 10:31
|
||||
*/
|
||||
@SuppressWarnings("checkstyle:AbbreviationAsWordInName")
|
||||
public class IPUtilTest {
|
||||
|
||||
@Test
|
||||
public void testIsIPv4() {
|
||||
Assert.assertTrue(IPUtil.isIPv4("127.0.0.1"));
|
||||
Assert.assertFalse(IPUtil.isIPv4("[::1]"));
|
||||
Assert.assertFalse(IPUtil.isIPv4("asdfasf"));
|
||||
Assert.assertFalse(IPUtil.isIPv4("ffgertert"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsIPv6() {
|
||||
Assert.assertTrue(IPUtil.isIPv6("[::1]"));
|
||||
Assert.assertFalse(IPUtil.isIPv6("127.0.0.1"));
|
||||
Assert.assertFalse(IPUtil.isIPv6("er34234"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsIP() {
|
||||
Assert.assertTrue(IPUtil.isIP("[::1]"));
|
||||
Assert.assertTrue(IPUtil.isIP("127.0.0.1"));
|
||||
Assert.assertFalse(IPUtil.isIP("er34234"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetIPFromString() {
|
||||
Assert.assertEquals("[::1]", IPUtil.getIPFromString("http://[::1]:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3"));
|
||||
Assert.assertEquals("[::1]", IPUtil.getIPFromString(
|
||||
"jdbc:mysql://[::1]:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000"
|
||||
+ "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC"));
|
||||
Assert.assertEquals("127.0.0.1",
|
||||
IPUtil.getIPFromString("http://127.0.0.1:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3"));
|
||||
Assert.assertEquals("127.0.0.1", IPUtil.getIPFromString(
|
||||
"jdbc:mysql://127.0.0.1:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000"
|
||||
+ "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC"));
|
||||
|
||||
Assert.assertEquals("",
|
||||
IPUtil.getIPFromString("http://[dddd]:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3"));
|
||||
Assert.assertEquals("", IPUtil.getIPFromString(
|
||||
"jdbc:mysql://[127.0.0.1]:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000"
|
||||
+ "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC"));
|
||||
Assert.assertEquals("", IPUtil.getIPFromString(
|
||||
"jdbc:mysql://666.288.333.444:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000"
|
||||
+ "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSplitIpPort() {
|
||||
checkSplitIPPortStr("[::1]:88", false, "[::1]", "88");
|
||||
checkSplitIPPortStr("[::1]", false, "[::1]");
|
||||
checkSplitIPPortStr("127.0.0.1:88", false, "127.0.0.1", "88");
|
||||
checkSplitIPPortStr("127.0.0.1", false, "127.0.0.1");
|
||||
checkSplitIPPortStr("[2001:db8:0:0:1:0:0:1]:88", false, "[2001:db8:0:0:1:0:0:1]", "88");
|
||||
checkSplitIPPortStr("[2001:0db8:0:0:1:0:0:1]:88", false, "[2001:0db8:0:0:1:0:0:1]", "88");
|
||||
checkSplitIPPortStr("[2001:db8::1:0:0:1]:88", false, "[2001:db8::1:0:0:1]", "88");
|
||||
checkSplitIPPortStr("[2001:db8::0:1:0:0:1]:88", false, "[2001:db8::0:1:0:0:1]", "88");
|
||||
checkSplitIPPortStr("[2001:0db8::1:0:0:1]:88", false, "[2001:0db8::1:0:0:1]", "88");
|
||||
checkSplitIPPortStr("[2001:db8:0:0:1::1]:88", false, "[2001:db8:0:0:1::1]", "88");
|
||||
checkSplitIPPortStr("[2001:db8:0000:0:1::1]:88", false, "[2001:db8:0000:0:1::1]", "88");
|
||||
checkSplitIPPortStr("[2001:DB8:0:0:1::1]:88", false, "[2001:DB8:0:0:1::1]", "88");
|
||||
checkSplitIPPortStr("[fe80::3ce6:7132:808e:707a%19]:88", false, "[fe80::3ce6:7132:808e:707a%19]", "88");
|
||||
|
||||
checkSplitIPPortStr("::1:88", true);
|
||||
checkSplitIPPortStr("[::1:88", true);
|
||||
checkSplitIPPortStr("[127.0.0.1]:88", true);
|
||||
}
|
||||
|
||||
/**
|
||||
* checkSplitIpPortStr.
|
||||
* 2020/9/4 14:12
|
||||
* @param addr addr
|
||||
* @param isEx isEx
|
||||
* @param equalsStrs equalsStrs
|
||||
*/
|
||||
public static void checkSplitIPPortStr(String addr, boolean isEx, String... equalsStrs) {
|
||||
try {
|
||||
String[] array = IPUtil.splitIPPortStr(addr);
|
||||
Assert.assertTrue(array.length == equalsStrs.length);
|
||||
if (array.length > 1) {
|
||||
Assert.assertTrue(array[0].equals(equalsStrs[0]));
|
||||
Assert.assertTrue(array[1].equals(equalsStrs[1]));
|
||||
} else {
|
||||
Assert.assertTrue(array[0].equals(equalsStrs[0]));
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
if (!isEx) {
|
||||
// No exception is expected here, but an exception has occurred
|
||||
Assert.assertTrue("Unexpected exception", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -24,11 +24,10 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
@ -83,8 +82,6 @@ public class ExternalDataSourceServiceImpl implements DataSourceService {
|
||||
|
||||
private volatile int masterIndex;
|
||||
|
||||
private static Pattern ipPattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
queryTimeout = ConvertUtils.toInt(System.getProperty("QUERYTIMEOUT"), 3);
|
||||
@ -190,10 +187,10 @@ public class ExternalDataSourceServiceImpl implements DataSourceService {
|
||||
if (!isHealthList.get(i)) {
|
||||
if (i == masterIndex) {
|
||||
// The master is unhealthy.
|
||||
return "DOWN:" + getIpFromUrl(dataSourceList.get(i).getJdbcUrl());
|
||||
return "DOWN:" + IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl());
|
||||
} else {
|
||||
// The slave is unhealthy.
|
||||
return "WARN:" + getIpFromUrl(dataSourceList.get(i).getJdbcUrl());
|
||||
return "WARN:" + IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -201,16 +198,6 @@ public class ExternalDataSourceServiceImpl implements DataSourceService {
|
||||
return "UP";
|
||||
}
|
||||
|
||||
private String getIpFromUrl(String url) {
|
||||
|
||||
Matcher m = ipPattern.matcher(url);
|
||||
if (m.find()) {
|
||||
return m.group();
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
static String defaultIfNull(String value, String defaultValue) {
|
||||
return null == value ? defaultValue : value;
|
||||
}
|
||||
@ -269,10 +256,10 @@ public class ExternalDataSourceServiceImpl implements DataSourceService {
|
||||
} catch (DataAccessException e) {
|
||||
if (i == masterIndex) {
|
||||
FATAL_LOG.error("[db-error] master db {} down.",
|
||||
getIpFromUrl(dataSourceList.get(i).getJdbcUrl()));
|
||||
IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl()));
|
||||
} else {
|
||||
FATAL_LOG.error("[db-error] slave db {} down.",
|
||||
getIpFromUrl(dataSourceList.get(i).getJdbcUrl()));
|
||||
IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl()));
|
||||
}
|
||||
isHealthList.set(i, Boolean.FALSE);
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.config.server.utils;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -40,7 +41,7 @@ public class SystemConfig {
|
||||
if (StringUtils.isNotEmpty(address)) {
|
||||
return address;
|
||||
} else {
|
||||
address = "127.0.0.1";
|
||||
address = IPUtil.localHostIP();
|
||||
}
|
||||
try {
|
||||
Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
|
||||
|
@ -17,6 +17,7 @@
|
||||
package com.alibaba.nacos.core.cluster;
|
||||
|
||||
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.core.utils.Loggers;
|
||||
import com.alibaba.nacos.sys.utils.ApplicationUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -41,8 +42,6 @@ import java.util.stream.Collectors;
|
||||
*/
|
||||
public class MemberUtils {
|
||||
|
||||
private static final String SEMICOLON = ":";
|
||||
|
||||
private static final String TARGET_MEMBER_CONNECT_REFUSE_ERRMSG = "Connection refused";
|
||||
|
||||
private static ServerMemberManager manager;
|
||||
@ -79,8 +78,8 @@ public class MemberUtils {
|
||||
|
||||
String address = member;
|
||||
int port = defaultPort;
|
||||
if (address.contains(SEMICOLON)) {
|
||||
String[] info = address.split(SEMICOLON);
|
||||
String[] info = IPUtil.splitIPPortStr(address);
|
||||
if (info.length > 1) {
|
||||
address = info[0];
|
||||
port = Integer.parseInt(info[1]);
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ package com.alibaba.nacos.core.distributed.raft;
|
||||
import com.alibaba.nacos.common.JustForTest;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
import com.alibaba.nacos.common.utils.ConvertUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.LoggerUtils;
|
||||
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||
import com.alibaba.nacos.consistency.LogProcessor;
|
||||
@ -163,7 +164,7 @@ public class JRaftServer {
|
||||
RaftExecutor.init(config);
|
||||
|
||||
final String self = config.getSelfMember();
|
||||
String[] info = self.split(":");
|
||||
String[] info = IPUtil.splitIPPortStr(self);
|
||||
selfIp = info[0];
|
||||
selfPort = Integer.parseInt(info[1]);
|
||||
localPeerId = PeerId.parsePeer(self);
|
||||
|
@ -113,6 +113,13 @@ public class WebUtils {
|
||||
try {
|
||||
value = HttpUtils.decode(new String(value.getBytes(StandardCharsets.UTF_8), encoding), encoding);
|
||||
} catch (UnsupportedEncodingException ignore) {
|
||||
} catch (Exception ex) {
|
||||
// If the value contains a special character without encoding (such as "[IPv6]"),
|
||||
// a URLDecoder exception is thrown, which is ignored and the original value is returned
|
||||
final String seq = "URLDecoder";
|
||||
if (!StringUtils.contains(ex.toString(), seq)) {
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
return value.trim();
|
||||
}
|
||||
|
27
distribution/conf/1.4.0-ipv6_support-update.sql
Normal file
27
distribution/conf/1.4.0-ipv6_support-update.sql
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
ALTER TABLE `config_info_tag`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `his_config_info`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `config_info`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `config_info_beta`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
@ -27,7 +27,7 @@ CREATE TABLE `config_info` (
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
`src_user` text COMMENT 'source user',
|
||||
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
|
||||
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||
`app_name` varchar(128) DEFAULT NULL,
|
||||
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||
`c_desc` varchar(256) DEFAULT NULL,
|
||||
@ -72,7 +72,7 @@ CREATE TABLE `config_info_beta` (
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
`src_user` text COMMENT 'source user',
|
||||
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
|
||||
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
||||
@ -94,7 +94,7 @@ CREATE TABLE `config_info_tag` (
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
`src_user` text COMMENT 'source user',
|
||||
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
|
||||
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
|
||||
@ -150,7 +150,7 @@ CREATE TABLE `his_config_info` (
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`src_user` text,
|
||||
`src_ip` varchar(20) DEFAULT NULL,
|
||||
`src_ip` varchar(50) DEFAULT NULL,
|
||||
`op_type` char(10) DEFAULT NULL,
|
||||
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||
PRIMARY KEY (`nid`),
|
||||
|
@ -27,7 +27,7 @@ CREATE TABLE config_info (
|
||||
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
src_user varchar(128) DEFAULT NULL,
|
||||
src_ip varchar(20) DEFAULT NULL,
|
||||
src_ip varchar(50) DEFAULT NULL,
|
||||
c_desc varchar(256) DEFAULT NULL,
|
||||
c_use varchar(64) DEFAULT NULL,
|
||||
effect varchar(64) DEFAULT NULL,
|
||||
@ -52,7 +52,7 @@ CREATE TABLE his_config_info (
|
||||
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
|
||||
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
|
||||
src_user varchar(128),
|
||||
src_ip varchar(20) DEFAULT NULL,
|
||||
src_ip varchar(50) DEFAULT NULL,
|
||||
op_type char(10) DEFAULT NULL,
|
||||
constraint hisconfiginfo_nid_key PRIMARY KEY (nid));
|
||||
|
||||
@ -73,7 +73,7 @@ CREATE TABLE config_info_beta (
|
||||
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
src_user varchar(128),
|
||||
src_ip varchar(20) DEFAULT NULL,
|
||||
src_ip varchar(50) DEFAULT NULL,
|
||||
constraint configinfobeta_id_key PRIMARY KEY (id),
|
||||
constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
|
||||
|
||||
@ -89,7 +89,7 @@ CREATE TABLE config_info_tag (
|
||||
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||
src_user varchar(128),
|
||||
src_ip varchar(20) DEFAULT NULL,
|
||||
src_ip varchar(50) DEFAULT NULL,
|
||||
constraint configinfotag_id_key PRIMARY KEY (id),
|
||||
constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));
|
||||
|
||||
@ -210,3 +210,19 @@ CREATE TABLE permissions (
|
||||
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
|
||||
|
||||
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
|
||||
|
||||
|
||||
/******************************************/
|
||||
/* ipv6 support */
|
||||
/******************************************/
|
||||
ALTER TABLE `config_info_tag`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `his_config_info`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `config_info`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
||||
|
||||
ALTER TABLE `config_info_beta`
|
||||
MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`;
|
@ -17,6 +17,7 @@
|
||||
package com.alibaba.nacos.naming.cluster;
|
||||
|
||||
import com.alibaba.nacos.common.notify.NotifyCenter;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
import com.alibaba.nacos.core.cluster.Member;
|
||||
import com.alibaba.nacos.core.cluster.MembersChangeEvent;
|
||||
@ -124,10 +125,11 @@ public class ServerListManager extends MemberChangeListener {
|
||||
Loggers.SRV_LOG.warn("received malformed distro map data: {}", config);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
String[] info = IPUtil.splitIPPortStr(params[1]);
|
||||
Member server = Optional.ofNullable(memberManager.find(params[1]))
|
||||
.orElse(Member.builder().ip(params[1].split(UtilsAndCommons.IP_PORT_SPLITER)[0]).state(NodeState.UP)
|
||||
.port(Integer.parseInt(params[1].split(UtilsAndCommons.IP_PORT_SPLITER)[1])).build());
|
||||
.orElse(Member.builder().ip(info[0]).state(NodeState.UP)
|
||||
.port(Integer.parseInt(info[1])).build());
|
||||
|
||||
server.setExtendVal(MemberMetaDataConstants.SITE_KEY, params[0]);
|
||||
server.setExtendVal(MemberMetaDataConstants.WEIGHT, params.length == 4 ? Integer.parseInt(params[3]) : 1);
|
||||
@ -212,7 +214,7 @@ public class ServerListManager extends MemberChangeListener {
|
||||
}
|
||||
|
||||
if (allServers.size() > 0 && !ApplicationUtils.getLocalAddress()
|
||||
.contains(UtilsAndCommons.LOCAL_HOST_IP)) {
|
||||
.contains(IPUtil.localHostIP())) {
|
||||
for (Member server : allServers) {
|
||||
if (Objects.equals(server.getAddress(), ApplicationUtils.getLocalAddress())) {
|
||||
continue;
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.naming.consistency.persistent.raft;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.exception.runtime.NacosRuntimeException;
|
||||
import com.alibaba.nacos.common.http.Callback;
|
||||
@ -1003,8 +1004,8 @@ public class RaftCore implements Closeable {
|
||||
* @return api url
|
||||
*/
|
||||
public static String buildUrl(String ip, String api) {
|
||||
if (!ip.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
ip = ip + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(ip)) {
|
||||
ip = ip + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
return "http://" + ip + ApplicationUtils.getContextPath() + api;
|
||||
}
|
||||
|
@ -16,10 +16,10 @@
|
||||
|
||||
package com.alibaba.nacos.naming.consistency.persistent.raft;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.sys.utils.ApplicationUtils;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
import com.alibaba.nacos.naming.misc.HttpClient;
|
||||
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -45,8 +45,8 @@ public class RaftProxy {
|
||||
*/
|
||||
public void proxyGet(String server, String api, Map<String, String> params) throws Exception {
|
||||
// do proxy
|
||||
if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
server = server + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(server)) {
|
||||
server = server + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
String url = "http://" + server + ApplicationUtils.getContextPath() + api;
|
||||
|
||||
@ -67,8 +67,8 @@ public class RaftProxy {
|
||||
*/
|
||||
public void proxy(String server, String api, Map<String, String> params, HttpMethod method) throws Exception {
|
||||
// do proxy
|
||||
if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
server = server + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(server)) {
|
||||
server = server + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
String url = "http://" + server + ApplicationUtils.getContextPath() + api;
|
||||
RestResult<String> result;
|
||||
@ -103,8 +103,8 @@ public class RaftProxy {
|
||||
public void proxyPostLarge(String server, String api, String content, Map<String, String> headers)
|
||||
throws Exception {
|
||||
// do proxy
|
||||
if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
server = server + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(server)) {
|
||||
server = server + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
String url = "http://" + server + ApplicationUtils.getContextPath() + api;
|
||||
|
||||
|
@ -18,6 +18,7 @@ package com.alibaba.nacos.naming.core;
|
||||
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
import com.alibaba.nacos.naming.healthcheck.HealthCheckStatus;
|
||||
import com.alibaba.nacos.naming.misc.Loggers;
|
||||
@ -60,9 +61,6 @@ public class Instance extends com.alibaba.nacos.api.naming.pojo.Instance impleme
|
||||
|
||||
private String app;
|
||||
|
||||
private static final Pattern IP_PATTERN = Pattern
|
||||
.compile("(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):?(\\d{1,5})?");
|
||||
|
||||
private static final Pattern ONLY_DIGIT_AND_DOT = Pattern.compile("(\\d|\\.)+");
|
||||
|
||||
private static final String SPLITER = "_";
|
||||
@ -119,19 +117,19 @@ public class Instance extends com.alibaba.nacos.api.naming.pojo.Instance impleme
|
||||
}
|
||||
|
||||
String provider = ipAddressAttributes[0];
|
||||
Matcher matcher = IP_PATTERN.matcher(provider);
|
||||
if (!matcher.matches()) {
|
||||
String[] providerAddr;
|
||||
try {
|
||||
providerAddr = IPUtil.splitIPPortStr(provider);
|
||||
} catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
int expectedGroupCount = 2;
|
||||
|
||||
int port = 0;
|
||||
if (NumberUtils.isNumber(matcher.group(expectedGroupCount))) {
|
||||
port = Integer.parseInt(matcher.group(expectedGroupCount));
|
||||
if (providerAddr.length == IPUtil.SPLIT_IP_PORT_RESULT_LENGTH && NumberUtils.isNumber(providerAddr[1])) {
|
||||
port = Integer.parseInt(providerAddr[1]);
|
||||
}
|
||||
|
||||
Instance instance = new Instance(matcher.group(1), port);
|
||||
Instance instance = new Instance(providerAddr[0], port);
|
||||
|
||||
// 7 possible formats of config:
|
||||
// ip:port
|
||||
@ -360,8 +358,7 @@ public class Instance extends com.alibaba.nacos.api.naming.pojo.Instance impleme
|
||||
*/
|
||||
public void validate() throws NacosException {
|
||||
if (onlyContainsDigitAndDot()) {
|
||||
Matcher matcher = IP_PATTERN.matcher(getIp() + ":" + getPort());
|
||||
if (!matcher.matches()) {
|
||||
if (!IPUtil.containsPort(getIp() + IPUtil.IP_PORT_SPLITER + getPort())) {
|
||||
throw new NacosException(NacosException.INVALID_PARAM,
|
||||
"instance format invalid: Your IP address is spelled incorrectly");
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ package com.alibaba.nacos.naming.core;
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.naming.utils.NamingUtils;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
import com.alibaba.nacos.core.cluster.Member;
|
||||
import com.alibaba.nacos.core.cluster.ServerMemberManager;
|
||||
@ -956,8 +957,8 @@ public class ServiceManager implements RecordListener<Service> {
|
||||
contained = false;
|
||||
List<Instance> instances = service.allIPs();
|
||||
for (Instance instance : instances) {
|
||||
if (containedInstance.contains(":")) {
|
||||
if (StringUtils.equals(instance.getIp() + ":" + instance.getPort(), containedInstance)) {
|
||||
if (IPUtil.containsPort(containedInstance)) {
|
||||
if (StringUtils.equals(instance.getIp() + IPUtil.IP_PORT_SPLITER + instance.getPort(), containedInstance)) {
|
||||
contained = true;
|
||||
break;
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.naming.healthcheck;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.http.Callback;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
@ -135,7 +136,7 @@ public class ClientBeatCheckTask implements Runnable {
|
||||
.appendParam("ephemeral", "true").appendParam("clusterName", instance.getClusterName())
|
||||
.appendParam("serviceName", service.getName()).appendParam("namespaceId", service.getNamespaceId());
|
||||
|
||||
String url = "http://127.0.0.1:" + ApplicationUtils.getPort() + ApplicationUtils.getContextPath()
|
||||
String url = "http://" + IPUtil.localHostIP() + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort() + ApplicationUtils.getContextPath()
|
||||
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + "/instance?" + request.toUrl();
|
||||
|
||||
// delete instance asynchronously:
|
||||
|
@ -17,6 +17,7 @@
|
||||
package com.alibaba.nacos.naming.misc;
|
||||
|
||||
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.http.Callback;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
@ -202,8 +203,8 @@ public class NamingProxy {
|
||||
|
||||
RestResult<String> result;
|
||||
|
||||
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(curServer)) {
|
||||
curServer = curServer + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
|
||||
result = HttpClient.httpGet("http://" + curServer + api, headers, params);
|
||||
@ -244,8 +245,8 @@ public class NamingProxy {
|
||||
|
||||
RestResult<String> result;
|
||||
|
||||
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(curServer)) {
|
||||
curServer = curServer + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
|
||||
if (isPost) {
|
||||
@ -294,8 +295,8 @@ public class NamingProxy {
|
||||
|
||||
RestResult<String> result;
|
||||
|
||||
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
if (!IPUtil.containsPort(curServer)) {
|
||||
curServer = curServer + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
|
||||
if (isPost) {
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.naming.misc;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.sys.utils.ApplicationUtils;
|
||||
import com.alibaba.nacos.sys.utils.InetUtils;
|
||||
|
||||
@ -32,23 +33,7 @@ public class NetUtils {
|
||||
* @return local server address
|
||||
*/
|
||||
public static String localServer() {
|
||||
return InetUtils.getSelfIP() + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Transfer int to IP.
|
||||
*
|
||||
* @param ip ip int
|
||||
* @return IP string
|
||||
*/
|
||||
public static String num2ip(int ip) {
|
||||
int[] b = new int[4];
|
||||
|
||||
b[0] = (ip >> 24) & 0xff;
|
||||
b[1] = (ip >> 16) & 0xff;
|
||||
b[2] = (ip >> 8) & 0xff;
|
||||
b[3] = ip & 0xff;
|
||||
return b[0] + "." + b[1] + "." + b[2] + "." + b[3];
|
||||
return InetUtils.getSelfIP() + IPUtil.IP_PORT_SPLITER + ApplicationUtils.getPort();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.naming.misc;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.sys.utils.ApplicationUtils;
|
||||
import com.alibaba.nacos.common.http.Callback;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
@ -45,7 +46,7 @@ public class ServerStatusSynchronizer implements Synchronizer {
|
||||
String url = "http://" + serverIP + ":" + ApplicationUtils.getPort() + ApplicationUtils.getContextPath()
|
||||
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + "/operator/server/status";
|
||||
|
||||
if (serverIP.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
if (IPUtil.containsPort(serverIP)) {
|
||||
url = "http://" + serverIP + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
|
||||
+ "/operator/server/status";
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package com.alibaba.nacos.naming.misc;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.common.http.Callback;
|
||||
import com.alibaba.nacos.common.model.RestResult;
|
||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||
@ -46,7 +47,7 @@ public class ServiceStatusSynchronizer implements Synchronizer {
|
||||
String url = "http://" + serverIP + ":" + ApplicationUtils.getPort() + ApplicationUtils.getContextPath()
|
||||
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + "/service/status";
|
||||
|
||||
if (serverIP.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
|
||||
if (IPUtil.containsPort(serverIP)) {
|
||||
url = "http://" + serverIP + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
|
||||
+ "/service/status";
|
||||
}
|
||||
|
@ -95,10 +95,6 @@ public class UtilsAndCommons {
|
||||
|
||||
public static final String CACHE_KEY_SPLITER = "@@@@";
|
||||
|
||||
public static final String LOCAL_HOST_IP = "127.0.0.1";
|
||||
|
||||
public static final String IP_PORT_SPLITER = ":";
|
||||
|
||||
public static final int MAX_PUBLISH_WAIT_TIME_MILLIS = 5000;
|
||||
|
||||
public static final String VERSION_STRING_SYNTAX = "[0-9]+\\.[0-9]+\\.[0-9]+";
|
||||
|
@ -18,6 +18,7 @@ package com.alibaba.nacos.sys.utils;
|
||||
|
||||
import com.alibaba.nacos.common.notify.NotifyCenter;
|
||||
import com.alibaba.nacos.common.notify.SlowEvent;
|
||||
import com.alibaba.nacos.common.utils.IPUtil;
|
||||
import com.alibaba.nacos.sys.env.Constants;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.NetworkInterface;
|
||||
@ -33,8 +35,6 @@ import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.alibaba.nacos.sys.env.Constants.IP_ADDRESS;
|
||||
import static com.alibaba.nacos.sys.env.Constants.NACOS_SERVER_IP;
|
||||
@ -51,12 +51,6 @@ public class InetUtils {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(InetUtils.class);
|
||||
|
||||
private static final String NUM = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
|
||||
|
||||
private static final String IP_REGEX = "^" + NUM + "\\." + NUM + "\\." + NUM + "\\." + NUM + "$";
|
||||
|
||||
private static final Pattern IP_PATTERN = Pattern.compile(IP_REGEX);
|
||||
|
||||
private static String selfIP;
|
||||
|
||||
private static boolean useOnlySiteLocalInterface = false;
|
||||
@ -87,10 +81,10 @@ public class InetUtils {
|
||||
if (StringUtils.isBlank(nacosIP)) {
|
||||
nacosIP = ApplicationUtils.getProperty(IP_ADDRESS);
|
||||
}
|
||||
|
||||
boolean illegalIP = !StringUtils.isBlank(nacosIP) && !(isIP(nacosIP) || isDomain(nacosIP));
|
||||
if (illegalIP) {
|
||||
throw new RuntimeException("nacos address " + nacosIP + " is not ip");
|
||||
if (!StringUtils.isBlank(nacosIP)) {
|
||||
if (!(IPUtil.isIP(nacosIP) || isDomain(nacosIP))) {
|
||||
throw new RuntimeException("nacos address " + nacosIP + " is not ip");
|
||||
}
|
||||
}
|
||||
String tmpSelfIP = nacosIP;
|
||||
if (StringUtils.isBlank(tmpSelfIP)) {
|
||||
@ -117,7 +111,14 @@ public class InetUtils {
|
||||
tmpSelfIP = Objects.requireNonNull(findFirstNonLoopbackAddress()).getHostAddress();
|
||||
}
|
||||
}
|
||||
|
||||
if (IPUtil.PREFER_IPV6_ADDRESSES && !tmpSelfIP.startsWith(IPUtil.IPV6_START_MARK) && !tmpSelfIP
|
||||
.endsWith(IPUtil.IPV6_END_MARK)) {
|
||||
tmpSelfIP = IPUtil.IPV6_START_MARK + tmpSelfIP + IPUtil.IPV6_END_MARK;
|
||||
if (StringUtils.contains(tmpSelfIP, IPUtil.PERCENT_SIGN_IN_IPV6)) {
|
||||
tmpSelfIP = tmpSelfIP.substring(0, tmpSelfIP.indexOf(IPUtil.PERCENT_SIGN_IN_IPV6))
|
||||
+ IPUtil.IPV6_END_MARK;
|
||||
}
|
||||
}
|
||||
if (!Objects.equals(selfIP, tmpSelfIP) && Objects.nonNull(selfIP)) {
|
||||
IPChangeEvent event = new IPChangeEvent();
|
||||
event.setOldIP(selfIP);
|
||||
@ -155,12 +156,13 @@ public class InetUtils {
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (!ignoreInterface(ifc.getDisplayName())) {
|
||||
for (Enumeration<InetAddress> addrs = ifc.getInetAddresses(); addrs.hasMoreElements(); ) {
|
||||
InetAddress address = addrs.nextElement();
|
||||
if (address instanceof Inet4Address && !address.isLoopbackAddress() && isPreferredAddress(
|
||||
address)) {
|
||||
boolean isLegalIpVersion = IPUtil.PREFER_IPV6_ADDRESSES ? address instanceof Inet6Address
|
||||
: address instanceof Inet4Address;
|
||||
if (isLegalIpVersion && !address.isLoopbackAddress() && isPreferredAddress(address)) {
|
||||
LOG.debug("Found non-loopback interface: " + ifc.getDisplayName());
|
||||
result = address;
|
||||
}
|
||||
@ -216,11 +218,6 @@ public class InetUtils {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isIP(String str) {
|
||||
Matcher matcher = IP_PATTERN.matcher(str);
|
||||
return matcher.matches();
|
||||
}
|
||||
|
||||
/**
|
||||
* juege str is right domain.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user