Try various ways to get the dns settings
This commit is contained in:
parent
32b27c53e0
commit
d5cca3b3a4
|
@ -4,14 +4,18 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.LineNumberReader;
|
import java.io.LineNumberReader;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.net.DatagramPacket;
|
import java.net.DatagramPacket;
|
||||||
import java.net.DatagramSocket;
|
import java.net.DatagramSocket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
import de.measite.minidns.Record.CLASS;
|
import de.measite.minidns.Record.CLASS;
|
||||||
import de.measite.minidns.Record.TYPE;
|
import de.measite.minidns.Record.TYPE;
|
||||||
|
|
||||||
|
@ -130,6 +134,33 @@ public class Client {
|
||||||
* @return The server array.
|
* @return The server array.
|
||||||
*/
|
*/
|
||||||
public String[] findDNS() {
|
public String[] findDNS() {
|
||||||
|
String[] result = findDNSByReflection();
|
||||||
|
if (result != null) {
|
||||||
|
Log.d("minidns/client",
|
||||||
|
"Got DNS servers via reflection: " + Arrays.toString(result));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = findDNSByExec();
|
||||||
|
if (result != null) {
|
||||||
|
Log.d("minidns/client",
|
||||||
|
"Got DNS servers via exec: " + Arrays.toString(result));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback for ipv4 and ipv6 connectivity
|
||||||
|
// see https://developers.google.com/speed/public-dns/docs/using
|
||||||
|
Log.d("minidns/client",
|
||||||
|
"No DNS found? Using fallback [8.8.8.8, [2001:4860:4860::8888]]");
|
||||||
|
|
||||||
|
return new String[]{"8.8.8.8", "[2001:4860:4860::8888]"};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to retrieve the list of dns server by executing getprop.
|
||||||
|
* @return Array of servers, or null on failure.
|
||||||
|
*/
|
||||||
|
protected String[] findDNSByExec() {
|
||||||
try {
|
try {
|
||||||
Process process = Runtime.getRuntime().exec("getprop");
|
Process process = Runtime.getRuntime().exec("getprop");
|
||||||
InputStream inputStream = process.getInputStream();
|
InputStream inputStream = process.getInputStream();
|
||||||
|
@ -147,6 +178,18 @@ public class Client {
|
||||||
if (property.endsWith(".dns") || property.endsWith(".dns1") ||
|
if (property.endsWith(".dns") || property.endsWith(".dns1") ||
|
||||||
property.endsWith(".dns2") || property.endsWith(".dns3") ||
|
property.endsWith(".dns2") || property.endsWith(".dns3") ||
|
||||||
property.endsWith(".dns4")) {
|
property.endsWith(".dns4")) {
|
||||||
|
|
||||||
|
// normalize the address
|
||||||
|
|
||||||
|
InetAddress ip = InetAddress.getByName(value);
|
||||||
|
|
||||||
|
if (ip == null) continue;
|
||||||
|
|
||||||
|
value = ip.getHostAddress();
|
||||||
|
|
||||||
|
if (value == null) continue;
|
||||||
|
if (value.length() == 0) continue;
|
||||||
|
|
||||||
server.add(value);
|
server.add(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,4 +201,50 @@ public class Client {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to retrieve the list of dns server by calling SystemProperties.
|
||||||
|
* @return Array of servers, or null on failure.
|
||||||
|
*/
|
||||||
|
protected String[] findDNSByReflection() {
|
||||||
|
try {
|
||||||
|
Class<?> SystemProperties =
|
||||||
|
Class.forName("android.os.SystemProperties");
|
||||||
|
Method method = SystemProperties.getMethod("get",
|
||||||
|
new Class[] { String.class });
|
||||||
|
|
||||||
|
ArrayList<String> servers = new ArrayList<String>(5);
|
||||||
|
|
||||||
|
for (String propKey : new String[] {
|
||||||
|
"net.dns1", "net.dns2", "net.dns3", "net.dns4"}) {
|
||||||
|
|
||||||
|
String value = (String)method.invoke(null, propKey);
|
||||||
|
|
||||||
|
if (value == null) continue;
|
||||||
|
if (value.length() == 0) continue;
|
||||||
|
if (servers.contains(value)) continue;
|
||||||
|
|
||||||
|
InetAddress ip = InetAddress.getByName(value);
|
||||||
|
|
||||||
|
if (ip == null) continue;
|
||||||
|
|
||||||
|
value = ip.getHostAddress();
|
||||||
|
|
||||||
|
if (value == null) continue;
|
||||||
|
if (value.length() == 0) continue;
|
||||||
|
if (servers.contains(value)) continue;
|
||||||
|
|
||||||
|
servers.add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (servers.size() > 0) {
|
||||||
|
return servers.toArray(new String[servers.size()]);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// we might trigger some problems this way
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue