コード例 #1
0
  // TODO: needs to be InetAddress[]
  public InetAddress resolvePublishHostAddresses(String publishHosts[]) throws IOException {
    if (publishHosts == null) {
      if (GLOBAL_NETWORK_PUBLISHHOST_SETTING.exists(settings)
          || GLOBAL_NETWORK_HOST_SETTING.exists(settings)) {
        // if we have settings use them (we have a fallback to GLOBAL_NETWORK_HOST_SETTING inline
        publishHosts =
            GLOBAL_NETWORK_PUBLISHHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY);
      } else {
        // next check any registered custom resolvers
        for (CustomNameResolver customNameResolver : customNameResolvers) {
          InetAddress addresses[] = customNameResolver.resolveDefault();
          if (addresses != null) {
            return addresses[0];
          }
        }
        // we know it's not here. get the defaults
        publishHosts =
            GLOBAL_NETWORK_PUBLISHHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY);
      }
    }

    InetAddress addresses[] = resolveInetAddresses(publishHosts);
    // TODO: allow publishing multiple addresses
    // for now... the hack begins

    // 1. single wildcard address, probably set by network.host: expand to all interface addresses.
    if (addresses.length == 1 && addresses[0].isAnyLocalAddress()) {
      HashSet<InetAddress> all = new HashSet<>(Arrays.asList(NetworkUtils.getAllAddresses()));
      addresses = all.toArray(new InetAddress[all.size()]);
    }

    // 2. try to deal with some (mis)configuration
    for (InetAddress address : addresses) {
      // check if its multicast: flat out mistake
      if (address.isMulticastAddress()) {
        throw new IllegalArgumentException(
            "publish address: {"
                + NetworkAddress.format(address)
                + "} is invalid: multicast address");
      }
      // check if its a wildcard address: this is only ok if its the only address!
      // (if it was a single wildcard address, it was replaced by step 1 above)
      if (address.isAnyLocalAddress()) {
        throw new IllegalArgumentException(
            "publish address: {"
                + NetworkAddress.format(address)
                + "} is wildcard, but multiple addresses specified: this makes no sense");
      }
    }

    // 3. if we end out with multiple publish addresses, select by preference.
    // don't warn the user, or they will get confused by bind_host vs publish_host etc.
    if (addresses.length > 1) {
      List<InetAddress> sorted = new ArrayList<>(Arrays.asList(addresses));
      NetworkUtils.sortAddresses(sorted);
      addresses = new InetAddress[] {sorted.get(0)};
    }
    return addresses[0];
  }
コード例 #2
0
 /** resolves a single host specification */
 private InetAddress[] resolveInternal(String host) throws IOException {
   if ((host.startsWith("#") && host.endsWith("#"))
       || (host.startsWith("_") && host.endsWith("_"))) {
     host = host.substring(1, host.length() - 1);
     // allow custom resolvers to have special names
     for (CustomNameResolver customNameResolver : customNameResolvers) {
       InetAddress addresses[] = customNameResolver.resolveIfPossible(host);
       if (addresses != null) {
         return addresses;
       }
     }
     switch (host) {
       case "local":
         return NetworkUtils.getLoopbackAddresses();
       case "local:ipv4":
         return NetworkUtils.filterIPV4(NetworkUtils.getLoopbackAddresses());
       case "local:ipv6":
         return NetworkUtils.filterIPV6(NetworkUtils.getLoopbackAddresses());
       case "site":
         return NetworkUtils.getSiteLocalAddresses();
       case "site:ipv4":
         return NetworkUtils.filterIPV4(NetworkUtils.getSiteLocalAddresses());
       case "site:ipv6":
         return NetworkUtils.filterIPV6(NetworkUtils.getSiteLocalAddresses());
       case "global":
         return NetworkUtils.getGlobalAddresses();
       case "global:ipv4":
         return NetworkUtils.filterIPV4(NetworkUtils.getGlobalAddresses());
       case "global:ipv6":
         return NetworkUtils.filterIPV6(NetworkUtils.getGlobalAddresses());
       default:
         /* an interface specification */
         if (host.endsWith(":ipv4")) {
           host = host.substring(0, host.length() - 5);
           return NetworkUtils.filterIPV4(NetworkUtils.getAddressesForInterface(host));
         } else if (host.endsWith(":ipv6")) {
           host = host.substring(0, host.length() - 5);
           return NetworkUtils.filterIPV6(NetworkUtils.getAddressesForInterface(host));
         } else {
           return NetworkUtils.getAddressesForInterface(host);
         }
     }
   }
   return InetAddress.getAllByName(host);
 }
コード例 #3
0
  /**
   * Resolves {@code bindHosts} to a list of internet addresses. The list will not contain duplicate
   * addresses.
   *
   * @param bindHosts list of hosts to bind to. this may contain special pseudo-hostnames such as
   *     _local_ (see the documentation). if it is null, it will be populated based on global
   *     default settings.
   * @return unique set of internet addresses
   */
  public InetAddress[] resolveBindHostAddresses(String bindHosts[]) throws IOException {
    // first check settings
    if (bindHosts == null) {
      if (GLOBAL_NETWORK_BINDHOST_SETTING.exists(settings)
          || GLOBAL_NETWORK_HOST_SETTING.exists(settings)) {
        // if we have settings use them (we have a fallback to GLOBAL_NETWORK_HOST_SETTING inline
        bindHosts = GLOBAL_NETWORK_BINDHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY);
      } else {
        // next check any registered custom resolvers
        for (CustomNameResolver customNameResolver : customNameResolvers) {
          InetAddress addresses[] = customNameResolver.resolveDefault();
          if (addresses != null) {
            return addresses;
          }
        }
        // we know it's not here. get the defaults
        bindHosts = GLOBAL_NETWORK_BINDHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY);
      }
    }

    InetAddress addresses[] = resolveInetAddresses(bindHosts);

    // try to deal with some (mis)configuration
    for (InetAddress address : addresses) {
      // check if its multicast: flat out mistake
      if (address.isMulticastAddress()) {
        throw new IllegalArgumentException(
            "bind address: {" + NetworkAddress.format(address) + "} is invalid: multicast address");
      }
      // check if its a wildcard address: this is only ok if its the only address!
      if (address.isAnyLocalAddress() && addresses.length > 1) {
        throw new IllegalArgumentException(
            "bind address: {"
                + NetworkAddress.format(address)
                + "} is wildcard, but multiple addresses specified: this makes no sense");
      }
    }
    return addresses;
  }