/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.statistics.util;
import org.dspace.core.ConfigurationManager;
import org.xbill.DNS.*;
import java.io.IOException;
/**
* XBill DNS resolver to retrieve hostnames for client IP addresses.
* TODO: deal with IPv6 addresses.
*
* @author kevinvandevelde at atmire.com
* @author ben at atmire.com
*/
public class DnsLookup {
/**
* Resolve an IP address to a host name.
*
* @param hostIp dotted decimal IPv4 address.
* @return name if resolved, or the address.
* @throws IOException from infrastructure.
*/
public static String reverseDns(String hostIp) throws IOException {
Resolver res = new ExtendedResolver();
// set the timeout, defaults to 200 milliseconds
int timeout = ConfigurationManager.getIntProperty("usage-statistics", "resolver.timeout", 200);
res.setTimeout(0, timeout);
Name name = ReverseMap.fromAddress(hostIp);
int type = Type.PTR;
int dclass = DClass.IN;
Record rec = Record.newRecord(name, type, dclass);
Message query = Message.newQuery(rec);
Message response = res.send(query);
Record[] answers = response.getSectionArray(Section.ANSWER);
if (answers.length == 0)
{
return hostIp;
}
else
{
return answers[0].rdataToString();
}
}
/**
* Resolve a host name to an IPv4 address.
*
* @param hostname
* hostname to resolve to IP
* @return IPv4 address
* @throws IOException from infrastructure or no resolution.
*/
public static String forward(String hostname)
throws IOException
{
Resolver res = new ExtendedResolver();
int timeout = ConfigurationManager.getIntProperty("usage-statistics",
"resolver.timeout", 200);
res.setTimeout(0, timeout);
Name name = Name.fromString(hostname, Name.root);
Record rec = Record.newRecord(name, Type.A, DClass.IN);
Message query = Message.newQuery(rec);
Message response = res.send(query);
Record[] answers = response.getSectionArray(Section.ANSWER);
if (answers.length == 0)
{
throw new IOException("Unresolvable host name (empty response)");
}
String resolution = null;
for (Record answer : answers)
{
if (answer.getType() == Type.A)
{
resolution = answer.rdataToString();
break;
}
}
if (null == resolution)
{
throw new IOException("Unresolvable host name (no A record)");
}
return resolution;
}
}