Skip to content

Commit de83032

Browse files
committed
feat(mtu): fully implement MTU resolver file export settings and persist outputs in app storage folder
1 parent db80c5f commit de83032

5 files changed

Lines changed: 62 additions & 2 deletions

File tree

android/app/src/main/java/com/masterdns/vpn/service/MasterDnsVpnService.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import android.os.ParcelFileDescriptor
99
import android.os.PowerManager
1010
import android.util.Log
1111
import androidx.core.app.NotificationCompat
12+
import com.google.gson.Gson
13+
import com.google.gson.reflect.TypeToken
1214
import com.masterdns.vpn.App
1315
import com.masterdns.vpn.MainActivity
1416
import com.masterdns.vpn.R
@@ -100,10 +102,29 @@ class MasterDnsVpnService : VpnService() {
100102

101103
val configFile = File(configDir, "client_config.toml")
102104
val resolversFile = File(configDir, "client_resolvers.txt")
105+
val advanced = parseAdvanced(profile.advancedJson).toMutableMap()
106+
val saveMtuToFile = advanced["SAVE_MTU_SERVERS_TO_FILE"].equals("true", ignoreCase = true)
107+
var runtimeProfile = profile
108+
if (saveMtuToFile) {
109+
val mtuDir = File(getExternalFilesDir(null), "masterdnsvpn_mtu")
110+
if (!mtuDir.exists()) {
111+
mtuDir.mkdirs()
112+
}
113+
val fileName = advanced["MTU_SERVERS_FILE_NAME"]
114+
?.trim()
115+
?.ifBlank { "masterdnsvpn_success_test_{time}.log" }
116+
?: "masterdnsvpn_success_test_{time}.log"
117+
val cleanName = File(fileName).name
118+
val outputPath = File(mtuDir, cleanName).absolutePath
119+
advanced["MTU_SERVERS_FILE_NAME"] = outputPath
120+
runtimeProfile = profile.copy(advancedJson = Gson().toJson(advanced))
121+
VpnManager.appendLog("MTU results folder: ${mtuDir.absolutePath}")
122+
VpnManager.appendLog("MTU results file pattern: $outputPath")
123+
}
103124

104125
configFile.writeText(
105126
ConfigGenerator.generateConfig(
106-
profile = profile,
127+
profile = runtimeProfile,
107128
listenPort = socksPort,
108129
listenIpOverride = listenIpOverride,
109130
protocolOverride = protocolOverride
@@ -346,6 +367,15 @@ class MasterDnsVpnService : VpnService() {
346367
}
347368
}
348369

370+
private fun parseAdvanced(json: String): Map<String, String> {
371+
return try {
372+
val type = object : TypeToken<Map<String, String>>() {}.type
373+
Gson().fromJson<Map<String, String>>(json, type) ?: emptyMap()
374+
} catch (_: Exception) {
375+
emptyMap()
376+
}
377+
}
378+
349379
private suspend fun ensureSocksPortAvailable(port: Int) {
350380
if (!isLocalPortInUse(port)) return
351381
VpnManager.appendLog("SOCKS5 port $port is busy, attempting to free it...")

android/app/src/main/java/com/masterdns/vpn/ui/profiles/ProfilesScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,11 @@ private val IMPORT_ADVANCED_KEYS = setOf(
553553
"MTU_TEST_TIMEOUT",
554554
"MTU_TEST_PARALLELISM",
555555
"SAVE_MTU_SERVERS_TO_FILE",
556+
"MTU_SERVERS_FILE_NAME",
557+
"MTU_SERVERS_FILE_FORMAT",
558+
"MTU_USING_SECTION_SEPARATOR_TEXT",
559+
"MTU_REMOVED_SERVER_LOG_FORMAT",
560+
"MTU_ADDED_SERVER_LOG_FORMAT",
556561
"TUNNEL_READER_WORKERS",
557562
"TUNNEL_WRITER_WORKERS",
558563
"TUNNEL_PROCESS_WORKERS",

android/app/src/main/java/com/masterdns/vpn/ui/settings/SettingsScreen.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private val configFields = listOf(
110110
"Resolver",
111111
"RESOLVER_BALANCING_STRATEGY",
112112
"RESOLVER_BALANCING_STRATEGY",
113-
"1=RoundRobin, 2=LowestLatency, 3=LeastLoss, 4=Sticky",
113+
"1=Random, 2=Round Robin, 3=Least Loss, 4=Lowest Latency",
114114
keyboardType = KeyboardType.Number
115115
),
116116
SettingField("Resolver", "PACKET_DUPLICATION_COUNT", "PACKET_DUPLICATION_COUNT", "Runtime packet duplication count", keyboardType = KeyboardType.Number),
@@ -132,6 +132,11 @@ private val configFields = listOf(
132132
SettingField("MTU", "MTU_TEST_TIMEOUT", "MTU_TEST_TIMEOUT", "Probe timeout seconds", keyboardType = KeyboardType.Decimal),
133133
SettingField("MTU", "MTU_TEST_PARALLELISM", "MTU_TEST_PARALLELISM", "Parallel probe workers", keyboardType = KeyboardType.Number),
134134
SettingField("MTU", "SAVE_MTU_SERVERS_TO_FILE", "SAVE_MTU_SERVERS_TO_FILE", "Persist successful MTU resolvers to file", type = FieldType.BOOL),
135+
SettingField("MTU", "MTU_SERVERS_FILE_NAME", "MTU_SERVERS_FILE_NAME", "Output file name/path for MTU results"),
136+
SettingField("MTU", "MTU_SERVERS_FILE_FORMAT", "MTU_SERVERS_FILE_FORMAT", "Format: {IP} {UP_MTU} {DOWN-MTU}"),
137+
SettingField("MTU", "MTU_USING_SECTION_SEPARATOR_TEXT", "MTU_USING_SECTION_SEPARATOR_TEXT", "Optional separator text between sections"),
138+
SettingField("MTU", "MTU_REMOVED_SERVER_LOG_FORMAT", "MTU_REMOVED_SERVER_LOG_FORMAT", "Log format when resolver is removed"),
139+
SettingField("MTU", "MTU_ADDED_SERVER_LOG_FORMAT", "MTU_ADDED_SERVER_LOG_FORMAT", "Log format when resolver is re-added"),
135140
SettingField("Runtime", "TUNNEL_READER_WORKERS", "TUNNEL_READER_WORKERS", "Reader worker count", keyboardType = KeyboardType.Number),
136141
SettingField("Runtime", "TUNNEL_WRITER_WORKERS", "TUNNEL_WRITER_WORKERS", "Writer worker count", keyboardType = KeyboardType.Number),
137142
SettingField("Runtime", "TUNNEL_PROCESS_WORKERS", "TUNNEL_PROCESS_WORKERS", "Processor worker count", keyboardType = KeyboardType.Number),
@@ -521,6 +526,11 @@ private fun defaultValuesFor(profile: ProfileEntity): Map<String, String> {
521526
put("MTU_TEST_TIMEOUT", adv("MTU_TEST_TIMEOUT", "2.0"))
522527
put("MTU_TEST_PARALLELISM", adv("MTU_TEST_PARALLELISM", "32"))
523528
put("SAVE_MTU_SERVERS_TO_FILE", adv("SAVE_MTU_SERVERS_TO_FILE", "false"))
529+
put("MTU_SERVERS_FILE_NAME", adv("MTU_SERVERS_FILE_NAME", "masterdnsvpn_mtu/masterdnsvpn_success_test_{time}.log"))
530+
put("MTU_SERVERS_FILE_FORMAT", adv("MTU_SERVERS_FILE_FORMAT", "{IP} - UP: {UP_MTU} DOWN: {DOWN-MTU}"))
531+
put("MTU_USING_SECTION_SEPARATOR_TEXT", adv("MTU_USING_SECTION_SEPARATOR_TEXT", ""))
532+
put("MTU_REMOVED_SERVER_LOG_FORMAT", adv("MTU_REMOVED_SERVER_LOG_FORMAT", "Resolver {IP} removed at {TIME} due to {CAUSE}"))
533+
put("MTU_ADDED_SERVER_LOG_FORMAT", adv("MTU_ADDED_SERVER_LOG_FORMAT", "Resolver {IP} added back at {TIME} (UP {UP_MTU}, DOWN {DOWN_MTU})"))
524534
put("TUNNEL_READER_WORKERS", adv("TUNNEL_READER_WORKERS", "5"))
525535
put("TUNNEL_WRITER_WORKERS", adv("TUNNEL_WRITER_WORKERS", "5"))
526536
put("TUNNEL_PROCESS_WORKERS", adv("TUNNEL_PROCESS_WORKERS", "5"))

android/app/src/main/java/com/masterdns/vpn/ui/settings/SettingsViewModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ class SettingsViewModel @Inject constructor(
180180
"MTU_TEST_TIMEOUT",
181181
"MTU_TEST_PARALLELISM",
182182
"SAVE_MTU_SERVERS_TO_FILE",
183+
"MTU_SERVERS_FILE_NAME",
184+
"MTU_SERVERS_FILE_FORMAT",
185+
"MTU_USING_SECTION_SEPARATOR_TEXT",
186+
"MTU_REMOVED_SERVER_LOG_FORMAT",
187+
"MTU_ADDED_SERVER_LOG_FORMAT",
183188
"TUNNEL_READER_WORKERS",
184189
"TUNNEL_WRITER_WORKERS",
185190
"TUNNEL_PROCESS_WORKERS",
@@ -220,6 +225,11 @@ class SettingsViewModel @Inject constructor(
220225
"MTU_TEST_TIMEOUT",
221226
"MTU_TEST_PARALLELISM",
222227
"SAVE_MTU_SERVERS_TO_FILE",
228+
"MTU_SERVERS_FILE_NAME",
229+
"MTU_SERVERS_FILE_FORMAT",
230+
"MTU_USING_SECTION_SEPARATOR_TEXT",
231+
"MTU_REMOVED_SERVER_LOG_FORMAT",
232+
"MTU_ADDED_SERVER_LOG_FORMAT",
223233
"TUNNEL_READER_WORKERS",
224234
"TUNNEL_WRITER_WORKERS",
225235
"TUNNEL_PROCESS_WORKERS",

android/app/src/main/java/com/masterdns/vpn/util/ConfigGenerator.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ object ConfigGenerator {
8181
appendLine("MTU_TEST_TIMEOUT = ${cfg("MTU_TEST_TIMEOUT", "2.0")}")
8282
appendLine("MTU_TEST_PARALLELISM = ${cfg("MTU_TEST_PARALLELISM", "32")}")
8383
appendLine("SAVE_MTU_SERVERS_TO_FILE = ${cfg("SAVE_MTU_SERVERS_TO_FILE", "false")}")
84+
appendLine("MTU_SERVERS_FILE_NAME = \"${escapeToml(cfg("MTU_SERVERS_FILE_NAME", "masterdnsvpn_mtu/masterdnsvpn_success_test_{time}.log"))}\"")
85+
appendLine("MTU_SERVERS_FILE_FORMAT = \"${escapeToml(cfg("MTU_SERVERS_FILE_FORMAT", "{IP} - UP: {UP_MTU} DOWN: {DOWN-MTU}"))}\"")
86+
appendLine("MTU_USING_SECTION_SEPARATOR_TEXT = \"${escapeToml(cfg("MTU_USING_SECTION_SEPARATOR_TEXT", ""))}\"")
87+
appendLine("MTU_REMOVED_SERVER_LOG_FORMAT = \"${escapeToml(cfg("MTU_REMOVED_SERVER_LOG_FORMAT", "Resolver {IP} removed at {TIME} due to {CAUSE}"))}\"")
88+
appendLine("MTU_ADDED_SERVER_LOG_FORMAT = \"${escapeToml(cfg("MTU_ADDED_SERVER_LOG_FORMAT", "Resolver {IP} added back at {TIME} (UP {UP_MTU}, DOWN {DOWN_MTU})"))}\"")
8489
appendLine()
8590

8691
// Section 7: Runtime Workers

0 commit comments

Comments
 (0)