content: /*
   * Copyright 1999-2018 Alibaba Group Holding Ltd.
   *
   * 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 com.alibaba.csp.sentinel.util;
  
  import java.net.Inet4Address;
  import java.net.InetAddress;
  import java.net.NetworkInterface;
  import java.util.Enumeration;
  
  import com.alibaba.csp.sentinel.log.RecordLog;
  
  /**
   * Get host name and ip of the host.
   *
   * @author leyou
   */
  public final class HostNameUtil {
  
      private static String ip;
      private static String hostName;
  
      static {
          try {
              // Init the host information.
              resolveHost();
          } catch (Exception e) {
              RecordLog.info("Failed to get local host", e);
          }
      }
  
      private static void resolveHost() throws Exception {
          InetAddress addr = InetAddress.getLocalHost();
          hostName = addr.getHostName();
          ip = addr.getHostAddress();
          if (addr.isLoopbackAddress()) {
              // find the first IPv4 Address that not loopback
              Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
              while (interfaces.hasMoreElements()) {
                  NetworkInterface in = interfaces.nextElement();
                  Enumeration<InetAddress> addrs = in.getInetAddresses();
                  while (addrs.hasMoreElements()) {
                      InetAddress address = addrs.nextElement();
                      if (!address.isLoopbackAddress() && address instanceof Inet4Address) {
                          ip = address.getHostAddress();
                      }
                  }
              }
          }
      }
  
      public static String getIp() {
          return ip;
      }
  
      public static String getHostName() {
          return hostName;
      }
  
      public static String getConfigString() {
          return "{\n"
              + "\t\"machine\": \"" + hostName + "\",\n"
              + "\t\"ip\": \"" + ip + "\"\n"
              + "}";
      }
  
      private HostNameUtil() {}
  }
  