// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by 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. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.utils.net; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.lang.reflect.Array; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URISyntaxException; import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Formatter; import java.util.List; import java.util.Random; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import com.cloud.utils.IteratorUtil; import com.cloud.utils.Pair; import com.cloud.utils.script.Script; public class NetUtils { protected final static Logger s_logger = Logger.getLogger(NetUtils.class); public final static String HTTP_PORT = "80"; public final static int VPN_PORT = 500; public final static int VPN_NATT_PORT = 4500; public final static int VPN_L2TP_PORT = 1701; public final static String UDP_PROTO = "udp"; public final static String TCP_PROTO = "tcp"; public final static String ANY_PROTO = "any"; public final static String ICMP_PROTO = "icmp"; public final static String ALL_PROTO = "all"; public final static String ALL_CIDRS = "0.0.0.0/0"; private final static Random _rand = new Random(System.currentTimeMillis()); public static long createSequenceBasedMacAddress(long macAddress) { return macAddress | 0x060000000000l | (((long) _rand.nextInt(32768) << 25) & 0x00fffe000000l); } public static String getHostName() { try { InetAddress localAddr = InetAddress.getLocalHost(); if (localAddr != null) { return localAddr.getHostName(); } } catch (UnknownHostException e) { s_logger.warn("UnknownHostException when trying to get host name. ", e); } return "localhost"; } public static InetAddress getLocalInetAddress() { try { return InetAddress.getLocalHost(); } catch (UnknownHostException e) { s_logger.warn("UnknownHostException in getLocalInetAddress().", e); return null; } } public static String resolveToIp(String host) { try { InetAddress addr = InetAddress.getByName(host); return ipFromInetAddress(addr); } catch (UnknownHostException e) { s_logger.warn("Unable to resolve " + host + " to IP due to UnknownHostException"); return null; } } public static InetAddress[] getAllLocalInetAddresses() { List<InetAddress> addrList = new ArrayList<InetAddress>(); try { for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { if (ifc.isUp() && !ifc.isVirtual()) { for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { addrList.add(addr); } } } } catch (SocketException e) { s_logger.warn("SocketException in getAllLocalInetAddresses().", e); } InetAddress[] addrs = new InetAddress[addrList.size()]; if (addrList.size() > 0) { System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); } return addrs; } public static String[] getLocalCidrs() { String defaultHostIp = getDefaultHostIp(); List<String> cidrList = new ArrayList<String>(); try { for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { if (ifc.isUp() && !ifc.isVirtual() && !ifc.isLoopback()) { for (InterfaceAddress address : ifc.getInterfaceAddresses()) { InetAddress addr = address.getAddress(); int prefixLength = address.getNetworkPrefixLength(); if (prefixLength < 32 && prefixLength > 0) { String ip = ipFromInetAddress(addr); if(ip.equalsIgnoreCase(defaultHostIp)) cidrList.add(ipAndNetMaskToCidr(ip, getCidrNetmask(prefixLength))); } } } } } catch (SocketException e) { s_logger.warn("UnknownHostException in getLocalCidrs().", e); } return cidrList.toArray(new String[0]); } private static boolean isWindows() { String os = System.getProperty("os.name"); if(os != null && os.startsWith("Windows")) return true; return false; } public static String getDefaultHostIp() { if(isWindows()) { Pattern pattern = Pattern.compile("\\s*0.0.0.0\\s*0.0.0.0\\s*(\\S*)\\s*(\\S*)\\s*"); try { Process result = Runtime.getRuntime().exec("route print -4"); BufferedReader output = new BufferedReader (new InputStreamReader(result.getInputStream())); String line = output.readLine(); while(line != null){ Matcher matcher = pattern.matcher(line); if (matcher.find()) { return matcher.group(2); } line = output.readLine(); } } catch( Exception e ) { } return null; } else { NetworkInterface nic = null; String pubNic = getDefaultEthDevice(); if (pubNic == null) { return null; } try { nic = NetworkInterface.getByName(pubNic); } catch (final SocketException e) { return null; } String[] info = NetUtils.getNetworkParams(nic); return info[0]; } } public static String getDefaultEthDevice() { String defaultRoute = Script.runSimpleBashScript("/sbin/route | grep default"); if (defaultRoute == null) { return null; } String[] defaultRouteList = defaultRoute.split("\\s+"); if (defaultRouteList.length != 8) { return null; } return defaultRouteList[7]; } public static InetAddress getFirstNonLoopbackLocalInetAddress() { InetAddress[] addrs = getAllLocalInetAddresses(); if (addrs != null) { for (InetAddress addr : addrs) { if (s_logger.isInfoEnabled()) { s_logger.info("Check local InetAddress : " + addr.toString() + ", total count :" + addrs.length); } if (!addr.isLoopbackAddress()) { return addr; } } } s_logger.warn("Unable to determine a non-loopback address, local inet address count :" + addrs.length); return null; } public static InetAddress[] getInterfaceInetAddresses(String ifName) { List<InetAddress> addrList = new ArrayList<InetAddress>(); try { for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { if (ifc.isUp() && !ifc.isVirtual() && ifc.getName().equals(ifName)) { for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { addrList.add(addr); } } } } catch (SocketException e) { s_logger.warn("SocketException in getAllLocalInetAddresses().", e); } InetAddress[] addrs = new InetAddress[addrList.size()]; if (addrList.size() > 0) { System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); } return addrs; } public static String getLocalIPString() { InetAddress addr = getLocalInetAddress(); if (addr != null) { return ipFromInetAddress(addr); } return new String("127.0.0.1"); } public static String ipFromInetAddress(InetAddress addr) { assert (addr != null); byte[] ipBytes = addr.getAddress(); StringBuffer sb = new StringBuffer(); sb.append(ipBytes[0] & 0xff).append("."); sb.append(ipBytes[1] & 0xff).append("."); sb.append(ipBytes[2] & 0xff).append("."); sb.append(ipBytes[3] & 0xff); return sb.toString(); } public static boolean isLocalAddress(InetAddress addr) { InetAddress[] addrs = getAllLocalInetAddresses(); if (addrs != null) { for (InetAddress self : addrs) { if (self.equals(addr)) { return true; } } } return false; } public static boolean isLocalAddress(String strAddress) { InetAddress addr; try { addr = InetAddress.getByName(strAddress); return isLocalAddress(addr); } catch (UnknownHostException e) { } return false; } public static String getMacAddress(InetAddress address) { StringBuffer sb = new StringBuffer(); Formatter formatter = new Formatter(sb); try { NetworkInterface ni = NetworkInterface.getByInetAddress(address); byte[] mac = ni.getHardwareAddress(); for (int i = 0; i < mac.length; i++) { formatter.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""); } } catch (SocketException e) { s_logger.error("SocketException when trying to retrieve MAC address", e); } return sb.toString(); } public static long getMacAddressAsLong(InetAddress address) { long macAddressAsLong = 0; try { NetworkInterface ni = NetworkInterface.getByInetAddress(address); byte[] mac = ni.getHardwareAddress(); for (int i = 0; i < mac.length; i++) { macAddressAsLong |= ((long) (mac[i] & 0xff) << (mac.length - i - 1) * 8); } } catch (SocketException e) { s_logger.error("SocketException when trying to retrieve MAC address", e); } return macAddressAsLong; } public static boolean ipRangesOverlap(String startIp1, String endIp1, String startIp2, String endIp2) { long startIp1Long = ip2Long(startIp1); long endIp1Long = startIp1Long; if (endIp1 != null) { endIp1Long = ip2Long(endIp1); } long startIp2Long = ip2Long(startIp2); long endIp2Long = startIp2Long; if (endIp2 != null) { endIp2Long = ip2Long(endIp2); } if (startIp1Long == startIp2Long || startIp1Long == endIp2Long || endIp1Long == startIp2Long || endIp1Long == endIp2Long) { return true; } else if (startIp1Long > startIp2Long && startIp1Long < endIp2Long) { return true; } else if (endIp1Long > startIp2Long && endIp1Long < endIp2Long) { return true; } else if (startIp2Long > startIp1Long && startIp2Long < endIp1Long) { return true; } else if (endIp2Long > startIp1Long && endIp2Long < endIp1Long) { return true; } else { return false; } } public static long ip2Long(String ip) { String[] tokens = ip.split("[.]"); assert (tokens.length == 4); long result = 0; for (int i = 0; i < tokens.length; i++) { try { result = (result << 8) | Integer.parseInt(tokens[i]); } catch (NumberFormatException e) { throw new RuntimeException("Incorrect number", e); } } return result; } public static String long2Ip(long ip) { StringBuilder result = new StringBuilder(15); result.append((ip >> 24 & 0xff)).append("."); result.append((ip >> 16 & 0xff)).append("."); result.append((ip >> 8 & 0xff)).append("."); result.append(ip & 0xff); return result.toString(); } public static long mac2Long(String macAddress) { String[] tokens = macAddress.split(":"); assert (tokens.length == 6); long result = 0; for (int i = 0; i < tokens.length; i++) { result = result << 8; result |= Integer.parseInt(tokens[i], 16); } return result; } public static String[] getNicParams(String nicName) { try { NetworkInterface nic = NetworkInterface.getByName(nicName); return getNetworkParams(nic); } catch (SocketException e) { return null; } } public static String[] getNetworkParams(NetworkInterface nic) { List<InterfaceAddress> addrs = nic.getInterfaceAddresses(); if (addrs == null || addrs.size() == 0) { return null; } InterfaceAddress addr = null; for (InterfaceAddress iaddr : addrs) { InetAddress inet = iaddr.getAddress(); if (!inet.isLinkLocalAddress() && !inet.isLoopbackAddress() && !inet.isMulticastAddress() && inet.getAddress().length == 4) { addr = iaddr; break; } } if (addr == null) { return null; } String[] result = new String[3]; result[0] = addr.getAddress().getHostAddress(); try { byte[] mac = nic.getHardwareAddress(); result[1] = byte2Mac(mac); } catch (Exception e) { } result[2] = prefix2Netmask(addr.getNetworkPrefixLength()); return result; } public static String prefix2Netmask(short prefix) { long addr = 0; for (int i = 0; i < prefix; i++) { addr = addr | (1 << (31 - i)); } return long2Ip(addr); } public static String byte2Mac(byte[] m) { StringBuilder result = new StringBuilder(17); Formatter formatter = new Formatter(result); formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", m[0], m[1], m[2], m[3], m[4], m[5]); return result.toString(); } public static String long2Mac(long macAddress) { StringBuilder result = new StringBuilder(17); Formatter formatter = new Formatter(result); formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", (macAddress >> 40) & 0xff, (macAddress >> 32) & 0xff, (macAddress >> 24) & 0xff, (macAddress >> 16) & 0xff, (macAddress >> 8) & 0xff, (macAddress & 0xff)); return result.toString(); } public static boolean isValidPrivateIp(String ipAddress, String guestIPAddress) { InetAddress privIp = parseIpAddress(ipAddress); if (privIp == null) { return false; } if (!privIp.isSiteLocalAddress()) { return false; } String firstGuestOctet = "10"; if (guestIPAddress != null && !guestIPAddress.isEmpty()) { String[] guestIPList = guestIPAddress.split("\\."); firstGuestOctet = guestIPList[0]; } String[] ipList = ipAddress.split("\\."); if (!ipList[0].equals(firstGuestOctet)) { return false; } return true; } public static boolean isSiteLocalAddress(String ipAddress) { if (ipAddress == null) { return false; } else { InetAddress ip = parseIpAddress(ipAddress); return ip.isSiteLocalAddress(); } } public static boolean validIpRange(String startIP, String endIP) { if (endIP == null || endIP.isEmpty()) { return true; } long startIPLong = NetUtils.ip2Long(startIP); long endIPLong = NetUtils.ip2Long(endIP); return (startIPLong <= endIPLong); } public static boolean isValidIp(final String ip) { final String[] ipAsList = ip.split("\\."); // The IP address must have four octets if (Array.getLength(ipAsList) != 4) { return false; } for (int i = 0; i < 4; i++) { // Each octet must be an integer final String octetString = ipAsList[i]; int octet; try { octet = Integer.parseInt(octetString); } catch (final Exception e) { return false; } // Each octet must be between 0 and 255, inclusive if (octet < 0 || octet > 255) { return false; } // Each octetString must have between 1 and 3 characters if (octetString.length() < 1 || octetString.length() > 3) { return false; } } // IP is good, return true return true; } public static boolean isValidCIDR(final String cidr) { if (cidr == null || cidr.isEmpty()) { return false; } String[] cidrPair = cidr.split("\\/"); if (cidrPair.length != 2) { return false; } String cidrAddress = cidrPair[0]; String cidrSize = cidrPair[1]; if (!isValidIp(cidrAddress)) { return false; } int cidrSizeNum = -1; try { cidrSizeNum = Integer.parseInt(cidrSize); } catch (Exception e) { return false; } if (cidrSizeNum < 0 || cidrSizeNum > 32) { return false; } return true; } public static boolean isValidNetmask(String netmask) { if (!isValidIp(netmask)) { return false; } long ip = ip2Long(netmask); int count = 0; boolean finished = false; for (int i = 31; i >= 0; i--) { if (((ip >> i) & 0x1) == 0) { finished = true; } else { if (finished) { return false; } count += 1; } } if (count == 0) { return false; } return true; } private static InetAddress parseIpAddress(String address) { StringTokenizer st = new StringTokenizer(address, "."); byte[] bytes = new byte[4]; if (st.countTokens() == 4) { try { for (int i = 0; i < 4; i++) { bytes[i] = (byte) Integer.parseInt(st.nextToken()); } return InetAddress.getByAddress(address, bytes); } catch (NumberFormatException nfe) { return null; } catch (UnknownHostException uhe) { return null; } } return null; } public static String getCidrFromGatewayAndNetmask(String gatewayStr, String netmaskStr) { long netmask = ip2Long(netmaskStr); long gateway = ip2Long(gatewayStr); long firstPart = gateway & netmask; long size = getCidrSize(netmaskStr); return long2Ip(firstPart) + "/" + size; } public static String[] getIpRangeFromCidr(String cidr, long size) { assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; String[] result = new String[2]; long ip = ip2Long(cidr); long startNetMask = ip2Long(getCidrNetmask(size)); long start = (ip & startNetMask) + 1; long end = start; end = end >> (32 - size); end++; end = (end << (32 - size)) - 2; result[0] = long2Ip(start); result[1] = long2Ip(end); return result; } public static Set<Long> getAllIpsFromCidr(String cidr, long size) { assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; Set<Long> result = new TreeSet<Long>(); long ip = ip2Long(cidr); long startNetMask = ip2Long(getCidrNetmask(size)); long start = (ip & startNetMask) + 2; long end = start; end = end >> (32 - size); end++; end = (end << (32 - size)) - 2; while (start <= end) { result.add(start); start++; } return result; } /** * Given a cidr, this method returns an ip address within the range but * is not in the avoid list. * * @param startIp ip that the cidr starts with * @param size size of the cidr * @param avoid set of ips to avoid * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. */ public static long getRandomIpFromCidr(String startIp, int size, Set<Long> avoid) { return getRandomIpFromCidr(ip2Long(startIp), size, avoid); } /** * Given a cidr, this method returns an ip address within the range but * is not in the avoid list. * * @param startIp ip that the cidr starts with * @param size size of the cidr * @param avoid set of ips to avoid * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. */ public static long getRandomIpFromCidr(long cidr, int size, Set<Long> avoid) { assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; long startNetMask = ip2Long(getCidrNetmask(size)); long startIp = (cidr & startNetMask) + 2; int range = 1 << (32 - size); if (avoid.size() > range) { return -1; } for (int i = 0; i < range; i++) { int next = _rand.nextInt(range); if (!avoid.contains(startIp + next)) { return startIp + next; } } return -1; } public static String getIpRangeStartIpFromCidr(String cidr, long size) { long ip = ip2Long(cidr); long startNetMask = ip2Long(getCidrNetmask(size)); long start = (ip & startNetMask) + 1; return long2Ip(start); } public static String getIpRangeEndIpFromCidr(String cidr, long size) { long ip = ip2Long(cidr); long startNetMask = ip2Long(getCidrNetmask(size)); long start = (ip & startNetMask) + 1; long end = start; end = end >> (32 - size); end++; end = (end << (32 - size)) - 2; return long2Ip(end); } public static boolean sameSubnet(final String ip1, final String ip2, final String netmask) { if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { return true; } String subnet1 = NetUtils.getSubNet(ip1, netmask); String subnet2 = NetUtils.getSubNet(ip2, netmask); return (subnet1.equals(subnet2)); } public static boolean sameSubnetCIDR(final String ip1, final String ip2, final long cidrSize) { if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { return true; } String subnet1 = NetUtils.getCidrSubNet(ip1, cidrSize); String subnet2 = NetUtils.getCidrSubNet(ip2, cidrSize); return (subnet1.equals(subnet2)); } public static String getSubNet(String ip, String netmask) { long ipAddr = ip2Long(ip); long subnet = ip2Long(netmask); long result = ipAddr & subnet; return long2Ip(result); } public static String getCidrSubNet(String ip, long cidrSize) { long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); String netmask = NetUtils.long2Ip(numericNetmask); return getSubNet(ip, netmask); } public static String ipAndNetMaskToCidr(String ip, String netmask) { long ipAddr = ip2Long(ip); long subnet = ip2Long(netmask); long result = ipAddr & subnet; int bits = (subnet == 0) ? 0 : 1; long subnet2 = subnet; while ((subnet2 = (subnet2 >> 1) & subnet) != 0) { bits++; } return long2Ip(result) + "/" + Integer.toString(bits); } public static String[] ipAndNetMaskToRange(String ip, String netmask) { long ipAddr = ip2Long(ip); long subnet = ip2Long(netmask); long start = (ipAddr & subnet) + 1; long end = start; int bits = (subnet == 0) ? 0 : 1; while ((subnet = (subnet >> 1) & subnet) != 0) { bits++; } end = end >> (32 - bits); end++; end = (end << (32 - bits)) - 2; return new String[] { long2Ip(start), long2Ip(end) }; } public static Pair<String, Integer> getCidr(String cidr) { String[] tokens = cidr.split("/"); return new Pair<String, Integer>(tokens[0], Integer.parseInt(tokens[1])); } public static boolean isNetworkAWithinNetworkB(String cidrA, String cidrB) { Long[] cidrALong = cidrToLong(cidrA); Long[] cidrBLong = cidrToLong(cidrB); if (cidrALong == null || cidrBLong == null) { return false; } long shift = 32 - cidrBLong[1]; return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); } public static Long[] cidrToLong(String cidr) { if (cidr == null || cidr.isEmpty()) { return null; } String[] cidrPair = cidr.split("\\/"); if (cidrPair.length != 2) { return null; } String cidrAddress = cidrPair[0]; String cidrSize = cidrPair[1]; if (!isValidIp(cidrAddress)) { return null; } int cidrSizeNum = -1; try { cidrSizeNum = Integer.parseInt(cidrSize); } catch (Exception e) { return null; } long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); long ipAddr = ip2Long(cidrAddress); Long[] cidrlong = { ipAddr & numericNetmask, (long) cidrSizeNum }; return cidrlong; } public static String getCidrSubNet(String cidr) { if (cidr == null || cidr.isEmpty()) { return null; } String[] cidrPair = cidr.split("\\/"); if (cidrPair.length != 2) { return null; } String cidrAddress = cidrPair[0]; String cidrSize = cidrPair[1]; if (!isValidIp(cidrAddress)) { return null; } int cidrSizeNum = -1; try { cidrSizeNum = Integer.parseInt(cidrSize); } catch (Exception e) { return null; } long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); String netmask = NetUtils.long2Ip(numericNetmask); return getSubNet(cidrAddress, netmask); } public static String getCidrNetmask(long cidrSize) { long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); return long2Ip(numericNetmask); } public static String getCidrNetmask(String cidr) { String[] cidrPair = cidr.split("\\/"); long guestCidrSize = Long.parseLong(cidrPair[1]); return getCidrNetmask(guestCidrSize); } public static String cidr2Netmask(String cidr) { String[] tokens = cidr.split("\\/"); return getCidrNetmask(Integer.parseInt(tokens[1])); } public static long getCidrSize(String netmask) { long ip = ip2Long(netmask); int count = 0; for (int i = 0; i < 32; i++) { if (((ip >> i) & 0x1) == 0) { count++; } else { break; } } return 32 - count; } public static boolean isValidPort(String p) { try { int port = Integer.parseInt(p); return !(port > 65535 || port < 1); } catch (NumberFormatException e) { return false; } } public static boolean isValidPort(int p) { return !(p > 65535 || p < 1); } public static boolean isValidLBPort(String p) { try { int port = Integer.parseInt(p); return !(port > 65535 || port < 1); } catch (NumberFormatException e) { return false; } } public static boolean isValidProto(String p) { String proto = p.toLowerCase(); return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO)); } public static boolean isValidSecurityGroupProto(String p) { String proto = p.toLowerCase(); return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO) || proto.equals(ALL_PROTO)); } public static boolean isValidAlgorithm(String p) { String algo = p.toLowerCase(); return (algo.equals("roundrobin") || algo.equals("leastconn") || algo.equals("source")); } public static String getLinkLocalNetMask() { return "255.255.0.0"; } public static String getLinkLocalGateway() { return "169.254.0.1"; } public static String getLinkLocalCIDR() { return "169.254.0.0/16"; } public static String[] getLinkLocalIPRange(int size) { if (size > 16 || size <= 0) { return null; } /* reserve gateway */ String[] range = getIpRangeFromCidr(getLinkLocalGateway(), 32 - size); if (range[0].equalsIgnoreCase(getLinkLocalGateway())) { /* remove the gateway */ long ip = ip2Long(range[0]); ip += 1; range[0] = long2Ip(ip); } return range; } public static String getLinkLocalIpEnd() { String[] cidrPair = getLinkLocalCIDR().split("\\/"); String cidr = cidrPair[0]; return getIpRangeEndIpFromCidr(cidr, 32 - Long.parseLong(cidrPair[1])); } public static String portRangeToString(int portRange[]) { return Integer.toString(portRange[0]) + ":" + Integer.toString(portRange[1]); } // test only private static void configLog4j() { URL configUrl = System.class.getResource("/conf/log4j-cloud.xml"); if (configUrl != null) { System.out.println("Configure log4j using log4j-cloud.xml"); try { File file = new File(configUrl.toURI()); System.out.println("Log4j configuration from : " + file.getAbsolutePath()); DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); } catch (URISyntaxException e) { System.out.println("Unable to convert log4j configuration Url to URI"); } // DOMConfigurator.configure(configUrl); } else { System.out.println("Configure log4j with default properties"); } } public static boolean verifyDomainNameLabel(String hostName, boolean isHostName) { // must be between 1 and 63 characters long and may contain only the ASCII letters 'a' through 'z' (in a // case-insensitive manner), // the digits '0' through '9', and the hyphen ('-'). // Can not start with a hyphen and digit, and must not end with a hyphen // If it's a host name, don't allow to start with digit if (hostName.length() > 63 || hostName.length() < 1) { s_logger.warn("Domain name label must be between 1 and 63 characters long"); return false; } else if (!hostName.toLowerCase().matches("[a-z0-9-]*")) { s_logger.warn("Domain name label may contain only the ASCII letters 'a' through 'z' (in a case-insensitive manner)"); return false; } else if (hostName.startsWith("-") || hostName.endsWith("-")) { s_logger.warn("Domain name label can not start with a hyphen and digit, and must not end with a hyphen"); return false; } else if (isHostName && hostName.matches("^[0-9-].*")) { s_logger.warn("Host name can't start with digit"); return false; } return true; } public static boolean verifyDomainName(String domainName) { // don't allow domain name length to exceed 190 chars (190 + 63 (max host name length) = 253 = max domainName length if (domainName.length() < 1 || domainName.length() > 190) { s_logger.trace("Domain name must be between 1 and 190 characters long"); return false; } if (domainName.startsWith(".") || domainName.endsWith(".")) { s_logger.trace("Domain name can't start or end with ."); return false; } String[] domainNameLabels = domainName.split("\\."); for (int i = 0; i < domainNameLabels.length; i++) { if (!verifyDomainNameLabel(domainNameLabels[i], false)) { s_logger.warn("Domain name label " + domainNameLabels[i] + " is incorrect"); return false; } } return true; } public static String getDhcpRange(String cidr) { String[] splitResult = cidr.split("\\/"); long size = Long.valueOf(splitResult[1]); return NetUtils.getIpRangeStartIpFromCidr(splitResult[0], size); } public static boolean validateGuestCidr(String cidr) { // RFC 1918 - The Internet Assigned Numbers Authority (IANA) has reserved the // following three blocks of the IP address space for private internets: // 10.0.0.0 - 10.255.255.255 (10/8 prefix) // 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) // 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) String cidr1 = "10.0.0.0/8"; String cidr2 = "172.16.0.0/12"; String cidr3 = "192.168.0.0/16"; if (!isValidCIDR(cidr)) { s_logger.warn("Cidr " + cidr + " is not valid"); return false; } if (isNetworkAWithinNetworkB(cidr, cidr1) || isNetworkAWithinNetworkB(cidr, cidr2) || isNetworkAWithinNetworkB(cidr, cidr3)) { return true; } else { s_logger.warn("cidr " + cidr + " is not RFC 1918 compliant"); return false; } } public static boolean verifyInstanceName(String instanceName) { //instance name for cloudstack vms shouldn't contain - and spaces if (instanceName.contains("-") || instanceName.contains(" ") || instanceName.contains("+")) { s_logger.warn("Instance name can not contain hyphen, spaces and \"+\" char"); return false; } return true; } }