package com.netifera.platform.net.dns.internal.service;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.SocketException;
import java.util.StringTokenizer;
import org.osgi.service.component.ComponentContext;
import com.netifera.platform.api.log.ILogManager;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.net.dns.service.client.ExtendedResolver;
import com.netifera.platform.net.dns.service.client.SimpleResolver;
import com.netifera.platform.net.dns.service.nameresolver.NameResolver;
import com.netifera.platform.net.sockets.ISocketEngineService;
import com.netifera.platform.net.sockets.UDPChannel;
import com.netifera.platform.util.addresses.inet.InternetAddress;
import com.netifera.platform.util.locators.UDPSocketLocator;
public class NameResolverService extends NameResolver {
private ISocketEngineService socketEngine;
private ILogger logger;
protected void setSocketEngine(ISocketEngineService socketEngine) {
this.socketEngine = socketEngine;
}
protected void unsetSocketEngine(ISocketEngineService socketEngine) {
this.socketEngine = null;
}
protected void setLogManager(ILogManager logManager) {
logger = logManager.getLogger("Name Resolver");
}
protected void unsetLogManager(ILogManager logManager) {
logger = null;
}
private void addNameServer(String nameServer) throws IOException {
InternetAddress address = InternetAddress.fromString(nameServer);
try {
UDPChannel channel = socketEngine.openUDP();
channel.connect(new UDPSocketLocator(address, 53));
SimpleResolver simpleResolver = new SimpleResolver(channel);
simpleResolver.setLogger(logger);
resolver.addResolver(simpleResolver);
logger.debug("added nameserver " + nameServer);
} catch (SocketException e) { // Network is unreachable
logger.error("could not add nameserver " + nameServer, e);
}
}
private boolean activateUnix() {
boolean activated = false;
InputStream in = null;
try {
try {
in = new FileInputStream("/peludo/osfs/etc/resolv.conf");
} catch (IOException e) {
in = new FileInputStream("/etc/resolv.conf");
}
try {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("nameserver")) {
StringTokenizer st = new StringTokenizer(line);
st.nextToken(); /* skip "nameserver" string */
String nameserver = st.nextToken();
addNameServer(nameserver);
logger.info("nameserver "+nameserver);
activated = true;
}
}
} catch (IOException e) {
logger.error("I/O error parsing resolv.conf", e);
} finally {
try {
in.close();
} catch (IOException e) {
logger.error("I/O error closing resolv.conf", e);
}
}
} catch (FileNotFoundException e) {
logger.error("File /etc/resolv.conf not found. Cannot initialize name resolver service.");
}
return activated;
}
protected void activate(ComponentContext context) {
resolver = new ExtendedResolver();
//FIXME Unix only
activateUnix();
if (resolver.getResolvers().length == 0) {
logger.warning("Could not find any system nameserver, try to add a default one");
try {
addNameServer("208.67.222.222"); // resolver1.opendns.com
} catch (IOException e) {
logger.error("Could not add default nameserver. Cannot initialize name resolver service.");
}
}
assert resolver.getResolvers().length != 0 : "NameResolverService: no resolvers found. (imminent ArrayIndexOutOfBoundsException in ExtendedResolver)";
}
protected void deactivate(ComponentContext context) {
try {
shutdown();
} catch (IOException e) {
logger.error("I/O error shutdowing resolver service", e);
}
}
}