Merge pull request #12979 from rmuir/ifconfig
Log network configuration at debug level
This commit is contained in:
commit
bbf669506b
|
@ -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<InterfaceAddress> 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();
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue