Copyright 2010 the original author or authors. 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.
/** * Copyright 2010 the original author or authors. * * 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 org.I0Itec.zkclient; import java.io.IOException; import java.net.ConnectException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; public class NetworkUtil { public final static String OVERWRITE_HOSTNAME_SYSTEM_PROPERTY = "zkclient.hostname.overwritten"; public static String[] getLocalHostNames() { final Set<String> hostNames = new HashSet<String>(); // we add localhost to this set manually, because if the ip 127.0.0.1 is // configured with more than one name in the /etc/hosts, only the first // name // is returned hostNames.add("localhost"); try { final Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); for (final Enumeration<NetworkInterface> ifaces = networkInterfaces; ifaces.hasMoreElements();) { final NetworkInterface iface = ifaces.nextElement(); InetAddress ia = null; for (final Enumeration<InetAddress> ips = iface.getInetAddresses(); ips.hasMoreElements();) { ia = ips.nextElement(); hostNames.add(ia.getCanonicalHostName()); hostNames.add(ipToString(ia.getAddress())); } } } catch (final SocketException e) { throw new RuntimeException("unable to retrieve host names of localhost"); } return hostNames.toArray(new String[hostNames.size()]); } private static String ipToString(final byte[] bytes) { final StringBuffer addrStr = new StringBuffer(); for (int cnt = 0; cnt < bytes.length; cnt++) { final int uByte = bytes[cnt] < 0 ? bytes[cnt] + 256 : bytes[cnt]; addrStr.append(uByte); if (cnt < 3) addrStr.append('.'); } return addrStr.toString(); } public static int hostNamesInList(final String serverList, final String[] hostNames) { final String[] serverNames = serverList.split(","); for (int i = 0; i < hostNames.length; i++) { final String hostname = hostNames[i]; for (int j = 0; j < serverNames.length; j++) { final String serverNameAndPort = serverNames[j]; final String serverName = serverNameAndPort.split(":")[0]; if (serverName.equalsIgnoreCase(hostname)) { return j; } } } return -1; } public static boolean hostNameInArray(final String[] hostNames, final String hostName) { for (final String name : hostNames) { if (name.equalsIgnoreCase(hostName)) { return true; } } return false; } public static boolean isPortFree(int port) { try { Socket socket = new Socket("localhost", port); socket.close(); return false; } catch (ConnectException e) { return true; } catch (SocketException e) { if (e.getMessage().equals("Connection reset by peer")) { return true; } throw new RuntimeException(e); } catch (UnknownHostException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } public static String getLocalhostName() { String property = System.getProperty(OVERWRITE_HOSTNAME_SYSTEM_PROPERTY); if (property != null && property.trim().length() > 0) { return property; } try { return InetAddress.getLocalHost().getHostName(); } catch (final UnknownHostException e) { throw new RuntimeException("unable to retrieve localhost name"); } } }