From fa701621787c708641b1c4d541e78e86f487d7ad Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Wed, 19 Aug 2015 01:26:36 -0400 Subject: [PATCH] Log network configuration at debug level --- .../common/network/IfConfig.java | 167 ++++++++++++++++++ .../common/network/NetworkService.java | 1 + 2 files changed, 168 insertions(+) create mode 100644 core/src/main/java/org/elasticsearch/common/network/IfConfig.java diff --git a/core/src/main/java/org/elasticsearch/common/network/IfConfig.java b/core/src/main/java/org/elasticsearch/common/network/IfConfig.java new file mode 100644 index 00000000000..6603ab52ce6 --- /dev/null +++ b/core/src/main/java/org/elasticsearch/common/network/IfConfig.java @@ -0,0 +1,167 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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.elasticsearch.common.network; + +import org.elasticsearch.common.logging.ESLogger; +import org.elasticsearch.common.logging.Loggers; + +import java.io.IOException; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.List; +import java.util.Locale; + +/** + * Simple class to log {@code ifconfig}-style output at DEBUG logging. + */ +final class IfConfig { + + private static final ESLogger logger = Loggers.getLogger(IfConfig.class); + private static final String INDENT = " "; + + /** log interface configuration at debug level, if its enabled */ + static void logIfNecessary() { + if (logger.isDebugEnabled()) { + try { + doLogging(); + } catch (IOException | SecurityException e) { + logger.warn("unable to gather network information", e); + } + } + } + + /** perform actual logging: might throw exception if things go wrong */ + private static void doLogging() throws IOException { + StringBuilder msg = new StringBuilder(); + for (NetworkInterface nic : NetworkUtils.getInterfaces()) { + msg.append(System.lineSeparator()); + + // ordinary name + msg.append(nic.getName()); + msg.append(System.lineSeparator()); + + // display name (e.g. on windows) + if (!nic.getName().equals(nic.getDisplayName())) { + msg.append(INDENT); + msg.append(nic.getDisplayName()); + msg.append(System.lineSeparator()); + } + + // addresses: v4 first, then v6 + List addresses = nic.getInterfaceAddresses(); + for (InterfaceAddress address : addresses) { + if (address.getAddress() instanceof Inet6Address == false) { + msg.append(INDENT); + msg.append(formatAddress(address)); + msg.append(System.lineSeparator()); + } + } + + for (InterfaceAddress address : addresses) { + if (address.getAddress() instanceof Inet6Address) { + msg.append(INDENT); + msg.append(formatAddress(address)); + msg.append(System.lineSeparator()); + } + } + + // hardware address + byte hardware[] = nic.getHardwareAddress(); + if (hardware != null) { + msg.append(INDENT); + msg.append("hardware "); + for (int i = 0; i < hardware.length; i++) { + if (i > 0) { + msg.append(":"); + } + msg.append(String.format(Locale.ROOT, "%02X", hardware[i])); + } + msg.append(System.lineSeparator()); + } + + // attributes + msg.append(INDENT); + msg.append(formatFlags(nic)); + msg.append(System.lineSeparator()); + } + logger.debug("configuration:" + System.lineSeparator() + "{}", msg.toString()); + } + + /** format internet address: java's default doesn't include everything useful */ + private static String formatAddress(InterfaceAddress interfaceAddress) throws IOException { + StringBuilder sb = new StringBuilder(); + + InetAddress address = interfaceAddress.getAddress(); + if (address instanceof Inet6Address) { + sb.append("inet6 "); + sb.append(address.toString().substring(1)); + sb.append(" prefixlen:"); + sb.append(interfaceAddress.getNetworkPrefixLength()); + } else { + sb.append("inet "); + sb.append(address.toString().substring(1)); + int netmask = 0xFFFFFFFF << (32 - interfaceAddress.getNetworkPrefixLength()); + sb.append(" netmask:" + InetAddress.getByAddress(new byte[] { + (byte)(netmask >>> 24), + (byte)(netmask >>> 16 & 0xFF), + (byte)(netmask >>> 8 & 0xFF), + (byte)(netmask & 0xFF) + }).toString().substring(1)); + InetAddress broadcast = interfaceAddress.getBroadcast(); + if (broadcast != null) { + sb.append(" broadcast:" + broadcast.toString().substring(1)); + } + } + if (address.isLoopbackAddress()) { + sb.append(" scope:host"); + } else if (address.isLinkLocalAddress()) { + sb.append(" scope:link"); + } else if (address.isSiteLocalAddress()) { + sb.append(" scope:site"); + } + return sb.toString(); + } + + /** format network interface flags */ + private static String formatFlags(NetworkInterface nic) throws SocketException { + StringBuilder flags = new StringBuilder(); + if (nic.isUp()) { + flags.append("UP "); + } + if (nic.supportsMulticast()) { + flags.append("MULTICAST "); + } + if (nic.isLoopback()) { + flags.append("LOOPBACK "); + } + if (nic.isPointToPoint()) { + flags.append("POINTOPOINT "); + } + if (nic.isVirtual()) { + flags.append("VIRTUAL "); + } + flags.append("mtu:" + nic.getMTU()); + flags.append(" index:" + nic.getIndex()); + return flags.toString(); + } +} diff --git a/core/src/main/java/org/elasticsearch/common/network/NetworkService.java b/core/src/main/java/org/elasticsearch/common/network/NetworkService.java index 9f6b77aa90d..0e49c1b1118 100644 --- a/core/src/main/java/org/elasticsearch/common/network/NetworkService.java +++ b/core/src/main/java/org/elasticsearch/common/network/NetworkService.java @@ -82,6 +82,7 @@ public class NetworkService extends AbstractComponent { @Inject public NetworkService(Settings settings) { super(settings); + IfConfig.logIfNecessary(); InetSocketTransportAddress.setResolveAddress(settings.getAsBoolean("network.address.serialization.resolve", false)); }