package io.cattle.platform.util.net;
import org.apache.commons.lang3.tuple.Pair;
public class NetUtils {
public static long ip2Long(String ipAddress) {
String[] ipAddressInArray = ipAddress.split("[.]");
long result = 0;
for (int i = 3; i >= 0; i--) {
long ip = Long.parseLong(ipAddressInArray[3 - i]);
result |= ip << (i * 8);
}
return result;
}
public static String long2Ip(long ip) {
return ((ip >> 24) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + (ip & 0xFF);
}
public static String getDefaultGateway(String ipAddress, int cidrSize) {
long ip = ip2Long(ipAddress);
long mask = (long) Math.pow(2, 32 - cidrSize) - 1;
long gateway = (ip & ~mask) + 1;
return long2Ip(gateway);
}
public static String getDefaultStartAddress(String ipAddress, int cidrSize) {
long ip = ip2Long(ipAddress);
long mask = (long) Math.pow(2, 32 - cidrSize) - 1;
long start = (ip & ~mask) + 2;
return long2Ip(start);
}
public static String getDefaultEndAddress(String ipAddress, int cidrSize) {
long ip = ip2Long(ipAddress);
long mask = (long) Math.pow(2, 32 - cidrSize) - 1;
long end = (ip & ~mask) + (long) Math.pow(2, 32 - cidrSize) - 6;
return long2Ip(end);
}
public static boolean isIpInSubnet(String cidr, String ipAddress) {
Pair<String, Integer> cidrPair = getCidrAndSize(cidr);
String startIp = NetUtils.getDefaultStartAddress(cidrPair.getLeft(), cidrPair.getRight());
long start = NetUtils.ip2Long(startIp);
String endIp = NetUtils.getDefaultEndAddress(cidrPair.getLeft(), cidrPair.getRight());
long end = NetUtils.ip2Long(endIp);
long ip = NetUtils.ip2Long(ipAddress);
if (start <= ip && ip <= end)
return true;
return false;
}
public static Pair<String, Integer> getCidrAndSize(String cidrInput) {
String[] cidrAndSize = cidrInput.split("/");
return Pair.of(cidrAndSize[0], Integer.valueOf(cidrAndSize[1]));
}
}