/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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.apache.geode.distributed.internal.membership.gms; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.apache.logging.log4j.Logger; import org.apache.geode.GemFireConfigException; import org.apache.geode.internal.net.SocketCreator; public class GMSUtil { public static List<InetSocketAddress> parseLocators(String locatorsString, String bindAddress) { InetAddress addr = null; try { if (bindAddress == null || bindAddress.trim().length() == 0) { addr = SocketCreator.getLocalHost(); } else { addr = InetAddress.getByName(bindAddress); } } catch (UnknownHostException e) { // ignore } return parseLocators(locatorsString, addr); } public static List<InetSocketAddress> parseLocators(String locatorsString, InetAddress bindAddress) { List<InetSocketAddress> result = new ArrayList<>(2); String host; int port; boolean checkLoopback = (bindAddress != null); boolean isLoopback = (checkLoopback && bindAddress.isLoopbackAddress()); StringTokenizer parts = new StringTokenizer(locatorsString, ","); while (parts.hasMoreTokens()) { try { String str = parts.nextToken(); host = str.substring(0, str.indexOf('[')); int idx = host.lastIndexOf('@'); if (idx < 0) { idx = host.lastIndexOf(':'); } String start = host.substring(0, idx > -1 ? idx : host.length()); if (start.indexOf(':') >= 0) { // a single numeric ipv6 address idx = host.lastIndexOf('@'); } if (idx >= 0) { host = host.substring(idx + 1, host.length()); } int startIdx = str.indexOf('[') + 1; int endIdx = str.indexOf(']'); port = Integer.parseInt(str.substring(startIdx, endIdx)); InetSocketAddress isa = new InetSocketAddress(host, port); if (checkLoopback) { if (isLoopback && !isa.getAddress().isLoopbackAddress()) { throw new GemFireConfigException( "This process is attempting to join with a loopback address (" + bindAddress + ") using a locator that does not have a local address (" + isa + "). On Unix this usually means that /etc/hosts is misconfigured."); } } result.add(isa); } catch (NumberFormatException e) { // this shouldn't happen because the config has already been parsed and // validated } } return result; } /** * replaces all occurrences of a given string in the properties argument with the given value */ public static String replaceStrings(String properties, String property, String value) { StringBuilder sb = new StringBuilder(); int start = 0; int index = properties.indexOf(property); while (index != -1) { sb.append(properties.substring(start, index)); sb.append(value); start = index + property.length(); index = properties.indexOf(property, start); } sb.append(properties.substring(start)); return sb.toString(); } /** * Formats the bytes in a buffer into hex octets, 50 per line */ public static String formatBytes(byte[] buf, int startIndex, int length) { StringBuilder w = new StringBuilder(20000); int count = 0; for (int i = startIndex; i < length; i++, count++) { String s = Integer.toHexString(buf[i] & 0xff); if (s.length() == 1) { w.append('0'); } w.append(s).append(' '); if ((count % 50) == 49) { w.append("\n"); } } return w.toString(); } }