package com.hubspot.blazar.util;
import com.google.common.base.Optional;
import com.google.inject.BindingAnnotation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
public class HostUtils {
private static final Logger LOG = LoggerFactory.getLogger(HostUtils.class);
@BindingAnnotation
@Retention(RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
public @interface Host {}
@BindingAnnotation
@Retention(RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
public @interface Port {}
public static Optional<String> getHostName() {
try {
InetAddress address = InetAddress.getLocalHost();
return Optional.fromNullable(address.getHostName());
} catch (Throwable t) {
LOG.error("Error find host name", t);
return Optional.absent();
}
}
public static Optional<String> getHostAddress() {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface current = interfaces.nextElement();
if (!current.isUp() || current.isLoopback() || current.isVirtual()) {
continue;
}
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress currentAddr = addresses.nextElement();
if (!currentAddr.isLoopbackAddress() && currentAddr instanceof Inet4Address) {
return Optional.of(currentAddr.getHostAddress());
}
}
}
} catch (Throwable t) {
LOG.error("Error finding host address", t);
}
return Optional.absent();
}
private HostUtils() {
throw new AssertionError();
}
}