Commit 156b0c27 authored by Max Lv's avatar Max Lv

refine DNS settings

parent ca995962
...@@ -73,6 +73,9 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -73,6 +73,9 @@ class ShadowsocksNatService extends Service with BaseService {
private val mStartForegroundSignature = Array[Class[_]](classOf[Int], classOf[Notification]) private val mStartForegroundSignature = Array[Class[_]](classOf[Int], classOf[Notification])
private val mStopForegroundSignature = Array[Class[_]](classOf[Boolean]) private val mStopForegroundSignature = Array[Class[_]](classOf[Boolean])
private val mSetForegroundSignature = Array[Class[_]](classOf[Boolean]) private val mSetForegroundSignature = Array[Class[_]](classOf[Boolean])
private val mSetForegroundArgs = new Array[AnyRef](1)
private val mStartForegroundArgs = new Array[AnyRef](2)
private val mStopForegroundArgs = new Array[AnyRef](1)
var closeReceiver: BroadcastReceiver = null var closeReceiver: BroadcastReceiver = null
var connReceiver: BroadcastReceiver = null var connReceiver: BroadcastReceiver = null
...@@ -84,20 +87,21 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -84,20 +87,21 @@ class ShadowsocksNatService extends Service with BaseService {
private var mSetForeground: Method = null private var mSetForeground: Method = null
private var mStartForeground: Method = null private var mStartForeground: Method = null
private var mStopForeground: Method = null private var mStopForeground: Method = null
private var mSetForegroundArgs = new Array[AnyRef](1)
private var mStartForegroundArgs = new Array[AnyRef](2)
private var mStopForegroundArgs = new Array[AnyRef](1)
private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication] private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication]
private val dnsAddressCache = new SparseArray[String] private val dnsAddressCache = new SparseArray[String]
def getNetId(network: Network): Int = {
network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int]
}
def restoreDnsForAllNetwork() { def restoreDnsForAllNetwork() {
val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager] val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager]
val networks = manager.getAllNetworks val networks = manager.getAllNetworks
val cmdBuf = new ArrayBuffer[String]() val cmdBuf = new ArrayBuffer[String]()
networks.foreach(network => { networks.foreach(network => {
val netId = DnsUtils.getNetId(network) val netId = getNetId(network)
val oldDns = dnsAddressCache.get(netId) val oldDns = dnsAddressCache.get(netId)
if (oldDns != null) { if (oldDns != null) {
cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, oldDns)) cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, oldDns))
...@@ -114,9 +118,8 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -114,9 +118,8 @@ class ShadowsocksNatService extends Service with BaseService {
networks.foreach(network => { networks.foreach(network => {
val networkInfo = manager.getNetworkInfo(network) val networkInfo = manager.getNetworkInfo(network)
if (networkInfo.isAvailable) { if (networkInfo.isAvailable) {
val netId = DnsUtils.getNetId(network) val netId = getNetId(network)
try { val curDnsList = manager.getLinkProperties(network).getDnsServers
val curDnsList = DnsUtils.getDnsServers(manager, network)
if (curDnsList != null) { if (curDnsList != null) {
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
val curDns = curDnsList.asScala.map(ip => ip.getHostAddress).mkString(" ") val curDns = curDnsList.asScala.map(ip => ip.getHostAddress).mkString(" ")
...@@ -125,11 +128,6 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -125,11 +128,6 @@ class ShadowsocksNatService extends Service with BaseService {
cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, dns)) cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, dns))
} }
} }
} catch {
case ex: Exception =>
cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, dns))
Log.e(TAG, "Unable to get DNS info", ex)
}
} }
}) })
if (cmdBuf.nonEmpty) Console.runRootCommand(cmdBuf.toArray) if (cmdBuf.nonEmpty) Console.runRootCommand(cmdBuf.toArray)
......
package com.github.shadowsocks.utils
import java.net.InetAddress
import android.net.{Network, ConnectivityManager}
object DnsUtils {
def getDnsServers(mgr: ConnectivityManager, network: Network): java.util.List[InetAddress] = {
val getLinkProperties = mgr.getClass.getMethod("getLinkProperties", network.getClass)
getLinkProperties.invoke(mgr, network).asInstanceOf[java.util.List[InetAddress]]
}
def getNetId(network: Network): Int = {
network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int]
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment