package com.netifera.platform.net.dns.tools;
import java.net.UnknownHostException;
import java.util.List;
import org.xbill.DNS.Name;
import org.xbill.DNS.TextParseException;
import com.netifera.platform.api.probe.IProbe;
import com.netifera.platform.api.tools.ITool;
import com.netifera.platform.api.tools.IToolContext;
import com.netifera.platform.api.tools.ToolException;
import com.netifera.platform.net.dns.internal.tools.Activator;
import com.netifera.platform.net.dns.model.AAAARecordEntity;
import com.netifera.platform.net.dns.model.ARecordEntity;
import com.netifera.platform.net.dns.service.nameresolver.INameResolver;
import com.netifera.platform.net.model.HostEntity;
import com.netifera.platform.tools.RequiredOptionMissingException;
import com.netifera.platform.util.addresses.inet.IPv4Address;
import com.netifera.platform.util.addresses.inet.IPv6Address;
import com.netifera.platform.util.addresses.inet.InternetAddress;
public class AddHostByName implements ITool {
private Name name;
private INameResolver resolver;
private IToolContext context;
private long realm;
public void toolRun(IToolContext context) throws ToolException {
this.context = context;
// XXX hardcode local probe as realm
IProbe probe = Activator.getInstance().getProbeManager().getLocalProbe();
realm = probe.getEntity().getId();
setupToolOptions();
context.setTitle("Resolve name "+name);
try {
List<String> nameServers = resolver.getNameServersForDomain(name.toString());
if (nameServers.size()>0)
Activator.getInstance().getDomainEntityFactory().createDomain(realm, context.getSpaceId(), name.toString());
List<InternetAddress> addresses = resolver.getAddressesByName(name.toString());
for (InternetAddress address: addresses) {
context.info(name+" has address "+address);
HostEntity entity = null;
if (address instanceof IPv6Address) {
AAAARecordEntity recordEntity = Activator.getInstance().getDomainEntityFactory().createAAAARecord(realm, context.getSpaceId(), name.toString(), (IPv6Address)address);
entity = recordEntity.getAddressEntity().getHost();
} else {
ARecordEntity recordEntity = Activator.getInstance().getDomainEntityFactory().createARecord(realm, context.getSpaceId(), name.toString(), (IPv4Address)address);
entity = recordEntity.getAddressEntity().getHost();
}
entity.addTag("Target");
entity.update();
}
} catch (UnknownHostException e) {
context.error("Unknown host: "+name);
} catch (TextParseException e) {
/* cannot happen */
}
}
private void setupToolOptions() throws ToolException {
resolver = Activator.getInstance().getNameResolver();
if (resolver == null) {
throw new ToolException("No Resolver service available");
}
String nameString = (String) context.getConfiguration().get("name");
if (nameString == null || nameString.length() == 0) {
throw new RequiredOptionMissingException("name");
}
if (nameString.endsWith(".")) {
nameString = nameString.substring(0,nameString.length()-1);
}
try {
name = new Name(nameString);
} catch (TextParseException e) {
throw new ToolException("Malformed host name: '"+nameString+"'", e);
}
}
}