package com.netifera.platform.net.http.tools;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
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.service.nameresolver.INameResolver;
import com.netifera.platform.net.http.internal.tools.Activator;
import com.netifera.platform.net.http.web.model.WebSiteEntity;
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;
import com.netifera.platform.util.locators.TCPSocketLocator;
import com.netifera.platform.util.patternmatching.InternetAddressMatcher;
public class AddWebSite implements ITool {
private String url;
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();
context.setTitle("Add web site");
setupToolOptions();
try {
URI actualURL = new URI(url);
context.setTitle("Add web site "+actualURL);
int port = actualURL.getPort() == -1 ? 80 : actualURL.getPort();
String hostname = actualURL.getHost();
List<InternetAddress> addresses;
if (InternetAddressMatcher.matches(hostname)) {
addresses = new ArrayList<InternetAddress>(1);
addresses.add(InternetAddress.fromString(hostname));
} else {
try {
addresses = resolver.getAddressesByName(hostname);
} catch (UnknownHostException e) {
context.error("Unknown host: "+actualURL.getHost());
return;
} catch (TextParseException e) {
context.error("Unable to parse host: "+actualURL.getHost());
return;
}
for (InternetAddress address : addresses) {
context.info(hostname+" has address "+address);
if (address instanceof IPv6Address) {
Activator.getInstance().getDomainEntityFactory().createAAAARecord(realm, context.getSpaceId(), hostname, (IPv6Address)address);
} else {
Activator.getInstance().getDomainEntityFactory().createARecord(realm, context.getSpaceId(), hostname, (IPv4Address)address);
}
}
}
for (InternetAddress address : addresses) {
WebSiteEntity entity = Activator.getInstance().getWebEntityFactory().createWebSite(realm, context.getSpaceId(), new TCPSocketLocator(address, port), hostname);
entity.addTag("Target");
entity.update();
}
// TODO: add credentials if any
} catch (URISyntaxException e) {
context.error("Malformed URL: " + url);
} finally {
context.done();
}
}
private void setupToolOptions() throws RequiredOptionMissingException {
resolver = Activator.getInstance().getNameResolver();
url = (String) context.getConfiguration().get("url");
if (url == null) {
throw new RequiredOptionMissingException("url");
}
}
}