diff --git a/luci-app-mosdns/Makefile b/luci-app-mosdns/Makefile index c08215f..7e0be77 100644 --- a/luci-app-mosdns/Makefile +++ b/luci-app-mosdns/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-mosdns -PKG_VERSION:=1.5.18 +PKG_VERSION:=1.5.19 PKG_RELEASE:=1 LUCI_TITLE:=LuCI Support for mosdns diff --git a/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua b/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua index 4af0903..cff0c60 100644 --- a/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua +++ b/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua @@ -22,14 +22,14 @@ o = s:taboption("basic", Flag, "enabled", translate("Enabled")) o.rmempty = false o = s:taboption("basic", ListValue, "configfile", translate("Config File")) -o:value("/etc/mosdns/config.yaml", translate("Default Config")) +o:value("/var/etc/mosdns.json", translate("Default Config")) o:value("/etc/mosdns/config_custom.yaml", translate("Custom Config")) -o.default = "/etc/mosdns/config.yaml" +o.default = "/var/etc/mosdns.json" o = s:taboption("basic", Value, "listen_port", translate("Listen port")) o.datatype = "and(port,min(1))" o.default = 5335 -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("basic", ListValue, "log_level", translate("Log Level")) o:value("debug", translate("Debug")) @@ -37,22 +37,22 @@ o:value("info", translate("Info")) o:value("warn", translate("Warning")) o:value("error", translate("Error")) o.default = "info" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") -o = s:taboption("basic", Value, "logfile", translate("Log File")) +o = s:taboption("basic", Value, "log_file", translate("Log File")) o.placeholder = "/var/log/mosdns.log" o.default = "/var/log/mosdns.log" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("basic", Flag, "redirect", translate("DNS Forward"), translate("Forward Dnsmasq Domain Name resolution requests to MosDNS")) o.default = true o = s:taboption("basic", Flag, "prefer_ipv4", translate("Remote DNS prefer IPv4"), translate("IPv4 is preferred for remote DNS resolution of dual-stack addresses, and is not affected when the destination is IPv6 only")) -o:depends( "configfile", "/etc/mosdns/config.yaml") +o:depends( "configfile", "/var/etc/mosdns.json") o.default = true o = s:taboption("basic", Flag, "custom_local_dns", translate("Custom China DNS"), translate("Follow WAN interface DNS if not enabled")) -o:depends( "configfile", "/etc/mosdns/config.yaml") +o:depends( "configfile", "/var/etc/mosdns.json") o.default = false o = s:taboption("basic", Flag, "apple_optimization", translate("Apple domains optimization"), translate("For Apple domains equipped with Chinese mainland CDN, always responsive to Chinese CDN IP addresses")) @@ -83,7 +83,7 @@ o:value("tls://9.9.9.9", translate("Quad9 Public DNS (9.9.9.9)")) o:value("tls://149.112.112.112", translate("Quad9 Public DNS (149.112.112.112)")) o:value("tls://208.67.222.222", translate("Cisco Public DNS (208.67.222.222)")) o:value("tls://208.67.220.220", translate("Cisco Public DNS (208.67.220.220)")) -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("basic", ListValue, "bootstrap_dns", translate("Bootstrap DNS servers"), translate("Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams")) o:value("119.29.29.29", translate("Tencent Public DNS (119.29.29.29)")) @@ -96,34 +96,34 @@ o:value("180.76.76.76", translate("Baidu Public DNS (180.76.76.76)")) o:value("8.8.8.8", translate("Google Public DNS (8.8.8.8)")) o:value("1.1.1.1", translate("CloudFlare Public DNS (1.1.1.1)")) o.default = "119.29.29.29" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") s:tab("advanced", translate("Advanced Options")) o = s:taboption("advanced", Value, "concurrent", translate("Concurrent"), translate("DNS query request concurrency, The number of upstream DNS servers that are allowed to initiate requests at the same time")) o.datatype = "and(uinteger,min(1),max(3))" o.default = "2" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Value, "idle_timeout", translate("Idle Timeout"), translate("DoH/TCP/DoT Connection Multiplexing idle timeout (default 30 seconds)")) o.datatype = "and(uinteger,min(1))" o.default = "30" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Flag, "enable_pipeline", translate("TCP/DoT Connection Multiplexing"), translate("Enable TCP/DoT RFC 7766 new Query Pipelining connection multiplexing mode")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Flag, "insecure_skip_verify", translate("Disable TLS Certificate"), translate("Disable TLS Servers certificate validation, Can be useful if system CA certificate expires or the system time is out of order")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Flag, "enable_ecs_remote", translate("Enable EDNS client subnet")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Value, "remote_ecs_ip", translate("IP Address"), translate("Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote DNS requests") .. '
' .. translate("This feature is typically used when using a self-built DNS server as an Remote DNS upstream (requires support from the upstream server)")) o.datatype = "ipaddr" @@ -132,22 +132,22 @@ o:depends("enable_ecs_remote", "1") o = s:taboption("advanced", Flag, "dns_leak", translate("Prevent DNS Leaks"), translate("Enable this option fallback policy forces forwarding to remote DNS")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Value, "cache_size", translate("DNS Cache Size"), translate("DNS cache size (in piece). To disable caching, please set to 0.")) o.datatype = "and(uinteger,min(0))" o.default = "8000" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") -o = s:taboption("advanced", Value, "cache_survival_time", translate("Lazy Cache TTL"), translate("Lazy cache survival time (in second). To disable Lazy Cache, please set to 0.")) +o = s:taboption("advanced", Value, "lazy_cache_ttl", translate("Lazy Cache TTL"), translate("Lazy cache survival time (in second). To disable Lazy Cache, please set to 0.")) o.datatype = "and(uinteger,min(0))" o.default = "86400" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Flag, "dump_file", translate("Cache Dump"), translate("Save the cache locally and reload the cache dump on the next startup")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Value, "dump_interval", translate("Auto Save Cache Interval")) o.datatype = "and(uinteger,min(0))" @@ -157,15 +157,15 @@ o:depends("dump_file", "1") o = s:taboption("advanced", Value, "minimal_ttl", translate("Minimum TTL"), translate("Modify the Minimum TTL value (seconds) for DNS answer results, 0 indicating no modification")) o.datatype = "and(uinteger,min(0),max(604800))" o.default = "0" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Value, "maximum_ttl", translate("Maximum TTL"), translate("Modify the Maximum TTL value (seconds) for DNS answer results, 0 indicating no modification")) o.datatype = "and(uinteger,min(0),max(604800))" o.default = "0" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("advanced", Flag, "adblock", translate("Enable DNS ADblock")) -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o.default = false o = s:taboption("advanced", DynamicList, "ad_source", translate("ADblock Source"), translate("When using custom rule sources, please use rule types supported by MosDNS (domain lists).") .. '
' .. translate("Support for local files, such as: file:///var/mosdns/example.txt")) @@ -201,17 +201,17 @@ s:tab("cloudflare", translate("Cloudflare Options")) o = s:taboption("cloudflare", Flag, "cloudflare", translate("Enabled"), translate("Match the parsing result with the Cloudflare IP ranges, and when there is a successful match, use the 'Custom IP' as the parsing result (experimental feature)")) o.rmempty = false o.default = false -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("cloudflare", DynamicList, "cloudflare_ip", translate("Custom IP")) o.datatype = "ipaddr" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("cloudflare", TextValue, "cloudflare_cidr", translate("Cloudflare IP Ranges")) o.description = translate("IPv4 CIDR:") .. [[https://www.cloudflare.com/ips-v4]] .. '
' .. translate("IPv6 CIDR:") .. [[https://www.cloudflare.com/ips-v6]] o.template = "cbi/tvalue" o.rows = 15 -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") function o.cfgvalue(self, section) return fs.readfile("/etc/mosdns/rule/cloudflare-cidr.txt") end @@ -225,12 +225,12 @@ s:tab("api", translate("API Options")) o = s:taboption("api", Value, "listen_port_api", translate("API Listen port")) o.datatype = "and(port,min(1))" o.default = 9091 -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") o = s:taboption("api", Button, "flush_cache", translate("Flush Cache"), translate("Flushing Cache will clear any IP addresses or DNS records from MosDNS cache")) o.rawhtml = true o.template = "mosdns/mosdns_flush_cache" -o:depends("configfile", "/etc/mosdns/config.yaml") +o:depends("configfile", "/var/etc/mosdns.json") s:tab("geodata", translate("GeoData Export")) diff --git a/luci-app-mosdns/root/etc/config/mosdns b/luci-app-mosdns/root/etc/config/mosdns index 8d3408c..603ab76 100644 --- a/luci-app-mosdns/root/etc/config/mosdns +++ b/luci-app-mosdns/root/etc/config/mosdns @@ -8,11 +8,11 @@ config mosdns 'config' option redirect '1' option prefer_ipv4 '1' option adblock '0' - option configfile '/etc/mosdns/config.yaml' + option configfile '/var/etc/mosdns.json' option log_level 'info' - option logfile '/var/log/mosdns.log' + option log_file '/var/log/mosdns.log' option cache_size '8000' - option cache_survival_time '86400' + option lazy_cache_ttl '86400' option dump_file '0' option concurrent '1' option idle_timeout '30' diff --git a/luci-app-mosdns/root/etc/init.d/mosdns b/luci-app-mosdns/root/etc/init.d/mosdns index 5f785b8..8670fb1 100755 --- a/luci-app-mosdns/root/etc/init.d/mosdns +++ b/luci-app-mosdns/root/etc/init.d/mosdns @@ -1,8 +1,7 @@ #!/bin/sh /etc/rc.common # # Copyright (C) 2020-2022, IrineSistiana -# -# Copyright (C) 2023, sbwml +# Copyright (C) 2023-2024, sbwml # # This file is part of mosdns. # @@ -28,7 +27,6 @@ CONF=$(uci -q get mosdns.config.configfile) CRON_FILE=/etc/crontabs/root DUMP_FILE=/etc/mosdns/cache.dump DUMP_FILE_DEFAULT=/usr/share/mosdns/cache.dump -DEFAULT_CONF=/usr/share/mosdns/default.yaml MOSDNS_SCRIPT=/usr/share/mosdns/mosdns.sh get_config() { @@ -36,7 +34,7 @@ get_config() { config_get adblock $1 adblock 0 config_get ad_source $1 ad_source "" config_get cache_size $1 cache_size 8000 - config_get cache_survival_time $1 cache_survival_time 86400 + config_get lazy_cache_ttl $1 lazy_cache_ttl 86400 config_get dump_file $1 dump_file 0 config_get dump_interval $1 dump_interval 3600 config_get enable_pipeline $1 enable_pipeline 0 @@ -44,10 +42,10 @@ get_config() { config_get geo_update_day_time $1 geo_update_day_time 2 config_get geo_update_week_time $1 geo_update_week_time "*" config_get listen_port $1 listen_port 5335 - config_get log_file $1 logfile "/var/log/mosdns.log" + config_get log_file $1 log_file "/var/log/mosdns.log" config_get log_level $1 log_level "info" - config_get maximum_ttl_custom $1 maximum_ttl 0 - config_get minimal_ttl_custom $1 minimal_ttl 0 + config_get minimal_ttl $1 minimal_ttl 0 + config_get maximum_ttl $1 maximum_ttl 0 config_get redirect $1 redirect 0 config_get prefer_ipv4 $1 prefer_ipv4 0 config_get remote_dns $1 remote_dns "tls://8.8.8.8 tls://1.1.1.1" @@ -62,84 +60,538 @@ get_config() { config_get remote_ecs_ip $1 remote_ecs_ip "110.34.181.1" config_get dns_leak $1 dns_leak 0 config_get cloudflare $1 cloudflare 0 + config_get cloudflare_ip $1 cloudflare_ip "" } -init_yaml() { - TMPDIR=$(mktemp -d) || exit 1 - [ $enable_pipeline -eq 1 ] && enable_pipeline=true || enable_pipeline=false - [ $insecure_skip_verify -eq 1 ] && insecure_skip_verify=true || insecure_skip_verify=false - # China DNS - if [ "$custom_local_dns" -eq 1 ]; then - local_dns=$($MOSDNS_SCRIPT dns | awk -v s=' ' '{ - for(i=1; i<=NF; i++) { - if ($i ~ /^h3:\/\//) { - printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: true\n",s,$i,s,s,s,s,s - } else { - printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n",s,$i,s,s,s,s - } - } - }') - else - local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n",s,$i,s}' s=' ') - fi - # Remote DNS - remote_dns=$(echo $remote_dns | awk -v s=' ' '{ - for(i=1; i<=NF; i++) { - if ($i ~ /^h3:\/\//) { - printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: true\n",s,$i,s,s,s,s,s - } else { - printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n",s,$i,s,s,s,s - } - } - }') - # Write parameters - sed "s,log_level,$log_level,g;s,log_file,$log_file,g; \ - s,listen_port,$listen_port,g;s,cache_size,$cache_size,g; \ - s,cache_survival_time,$cache_survival_time,g; \ - s,minimal_ttl_custom,$minimal_ttl_custom,g; \ - s,maximum_ttl_custom,$maximum_ttl_custom,g; \ - s,concurrent_num,$concurrent,g;s,api_port,$listen_port_api,g; \ - s,remote_dns_pipeline,$enable_pipeline,g" $DEFAULT_CONF > $CONF - # Apple optimization - [ "$apple_optimization" != 1 ] && sed -i '/- exec: \$query_is_apple_domain/,+1d' $CONF - # Adlist +generate_config() { + # jshn shell library + . /usr/share/libubox/jshn.sh + # json data + json_init + # log + json_add_object 'log' + json_add_string "level" "$log_level" + json_add_string "file" "$log_file" + json_close_object + # api + json_add_object 'api' + json_add_string "http" "0.0.0.0:$listen_port_api" + json_close_object + # include + json_add_array "include" + json_close_array + # plugins + json_add_array "plugins" + # plugin: geosite_cn + json_add_object + json_add_string "tag" "geosite_cn" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/var/mosdns/geosite_cn.txt" + json_close_array + json_close_object + json_close_object + # plugin: geoip_cn + json_add_object + json_add_string "tag" "geoip_cn" + json_add_string "type" "ip_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/var/mosdns/geoip_cn.txt" + json_close_array + json_close_object + json_close_object + # plugin: geosite_apple + json_add_object + json_add_string "tag" "geosite_apple" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/var/mosdns/geosite_apple.txt" + json_close_array + json_close_object + json_close_object + # plugin: geosite_no_cn + json_add_object + json_add_string "tag" "geosite_no_cn" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/var/mosdns/geosite_geolocation-!cn.txt" + json_close_array + json_close_object + json_close_object + # plugin: whitelist + json_add_object + json_add_string "tag" "whitelist" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/whitelist.txt" + json_close_array + json_close_object + json_close_object + # plugin: blocklist + json_add_object + json_add_string "tag" "blocklist" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/blocklist.txt" + json_close_array + json_close_object + json_close_object + # plugin: greylist + json_add_object + json_add_string "tag" "greylist" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/greylist.txt" + json_close_array + json_close_object + json_close_object + # plugin: ddnslist + json_add_object + json_add_string "tag" "ddnslist" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/ddnslist.txt" + json_close_array + json_close_object + json_close_object + # plugin: hosts + json_add_object + json_add_string "tag" "hosts" + json_add_string "type" "hosts" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/hosts.txt" + json_close_array + json_close_object + json_close_object + # plugin: redirect + json_add_object + json_add_string "tag" "redirect" + json_add_string "type" "redirect" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/redirect.txt" + json_close_array + json_close_object + json_close_object + # plugin: adlist + json_add_object + json_add_string "tag" "adlist" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" adlist=$($MOSDNS_SCRIPT adlist) - echo "${adlist}" > $TMPDIR/adlist_files.txt - sed -i -e '/ADBLOCK_LIST/{r '$TMPDIR/adlist_files.txt -e';d}' $CONF - # DNS - echo "${local_dns}" > $TMPDIR/local_dns.txt - echo "${remote_dns}" > $TMPDIR/remote_dns.txt - sed -i -e '/- addr: local_dns/{r '$TMPDIR/local_dns.txt -e';d};/- addr: remote_dns/{r '$TMPDIR/remote_dns.txt -e';d}' $CONF - # Convert HTTP/3 prefix format - sed -i 's/h3:\/\//https:\/\//g' $CONF - # Prefer IPv4 - [ $prefer_ipv4 -ne 1 ] && sed -i "/prefer_ipv4/d" $CONF - # Cache dump - [ "$dump_file" -eq 1 ] && sed -i "/lazy_cache_ttl/a\ dump_file: $DUMP_FILE\n dump_interval: $dump_interval" $CONF + for list in $adlist; do + json_add_string "" "$list" + done + json_close_array + json_close_object + json_close_object + # plugin: local_ptr + json_add_object + json_add_string "tag" "local_ptr" + json_add_string "type" "domain_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/local-ptr.txt" + json_close_array + json_close_object + json_close_object + # plugin: cloudflare_cidr + json_add_object + json_add_string "tag" "cloudflare_cidr" + json_add_string "type" "ip_set" + json_add_object "args" + json_add_array "files" + json_add_string "" "/etc/mosdns/rule/cloudflare-cidr.txt" + json_close_array + json_close_object + json_close_object + # plugin: lazy_cache + json_add_object + json_add_string "tag" "lazy_cache" + json_add_string "type" "cache" + json_add_object "args" + json_add_int "size" "$cache_size" + json_add_int "lazy_cache_ttl" "$lazy_cache_ttl" + [ "$dump_file" -eq 1 ] && { + json_add_string "dump_file" "/etc/mosdns/cache.dump" + json_add_int "dump_interval" "$dump_interval" + } + json_close_object + json_close_object + # plugin: forward_xinfeng_udp + json_add_object + json_add_string "tag" "forward_xinfeng_udp" + json_add_string "type" "forward" + json_add_object "args" + json_add_int "concurrent" 2 + json_add_array "upstreams" + json_add_object + json_add_string "addr" "114.114.114.114" + json_close_object + json_add_object + json_add_string "addr" "114.114.115.115" + json_close_object + json_close_array + json_close_object + json_close_object + # plugin: forward_local + json_add_object + json_add_string "tag" "forward_local" + json_add_string "type" "forward" + json_add_object "args" + json_add_int "concurrent" "$concurrent" + json_add_array "upstreams" + local_dns=$($MOSDNS_SCRIPT dns) + for addr in $local_dns; do + enable_http3=0 + if echo "$addr" | grep -q "^h3://"; then + enable_http3=1 + addr=$(echo $addr | sed 's/h3:\/\//https:\/\//g') + fi + json_add_object + json_add_string "addr" "$addr" + json_add_string "bootstrap" "$bootstrap_dns" + json_add_boolean "enable_pipeline" "$enable_pipeline" + json_add_boolean "insecure_skip_verify" "$insecure_skip_verify" + json_add_int "idle_timeout" "$idle_timeout" + [ "$enable_http3" -eq 1 ] && json_add_boolean "enable_http3" "1" + json_close_object + done + json_close_array + json_close_object + json_close_object + # plugin: forward_remote + json_add_object + json_add_string "tag" "forward_remote" + json_add_string "type" "forward" + json_add_object "args" + json_add_int "concurrent" "$concurrent" + json_add_array "upstreams" + for addr in $remote_dns; do + enable_http3=0 + if echo "$addr" | grep -q "^h3://"; then + enable_http3=1 + addr=$(echo $addr | sed 's/h3:\/\//https:\/\//g') + fi + json_add_object + json_add_string "addr" "$addr" + json_add_string "bootstrap" "$bootstrap_dns" + json_add_boolean "enable_pipeline" "$enable_pipeline" + json_add_boolean "insecure_skip_verify" "$insecure_skip_verify" + json_add_int "idle_timeout" "$idle_timeout" + [ "$enable_http3" -eq 1 ] && json_add_boolean "enable_http3" "1" + json_close_object + done + json_close_array + json_close_object + json_close_object + # plugin: forward_remote_upstream + json_add_object + json_add_string "tag" "forward_remote_upstream" + json_add_string "type" "sequence" + json_add_array "args" + [ "$prefer_ipv4" -eq 1 ] && { + json_add_object + json_add_string "exec" "prefer_ipv4" + json_close_object + } + [ "$enable_ecs_remote" -eq 1 ] && { + json_add_object + json_add_string "exec" "ecs $remote_ecs_ip" + json_close_object + } + json_add_object + json_add_string "exec" "\$forward_remote" + json_close_object + json_close_array + json_close_object + # plugin: modify_ttl + json_add_object + json_add_string "tag" "modify_ttl" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "exec" "ttl $minimal_ttl-$maximum_ttl" + json_close_object + json_close_array + json_close_object + # plugin: modify_ddns_ttl + json_add_object + json_add_string "tag" "modify_ddns_ttl" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "exec" "ttl 5-5" + json_close_object + json_close_array + json_close_object + # plugin: has_resp_sequence + json_add_object + json_add_string "tag" "has_resp_sequence" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$ddnslist" + json_add_string "exec" "\$modify_ddns_ttl" + json_close_object + json_add_object + json_add_string "matches" "!qname \$ddnslist" + json_add_string "exec" "\$modify_ttl" + json_close_object + [ "$cloudflare" -eq 1 ] && { + json_add_object + json_add_string "matches" "resp_ip \$cloudflare_cidr" + json_add_string "exec" "black_hole $cloudflare_ip" + json_close_object + } + json_add_object + json_add_string "matches" "has_resp" + json_add_string "exec" "accept" + json_close_object + json_close_array + json_close_object + # plugin: query_is_non_local_ip + json_add_object + json_add_string "tag" "query_is_non_local_ip" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "exec" "\$forward_local" + json_close_object + json_add_object + json_add_string "matches" "!resp_ip \$geoip_cn" + json_add_string "exec" "drop_resp" + json_close_object + json_close_array + json_close_object + # plugin: fallback + json_add_object + json_add_string "tag" "fallback" + json_add_string "type" "fallback" + json_add_object "args" + [ "$dns_leak" -eq 1 ] && json_add_string "primary" "forward_remote_upstream" || json_add_string "primary" "query_is_non_local_ip" + json_add_string "secondary" "forward_remote_upstream" + json_add_int "threshold" 500 + json_add_boolean "always_standby" 1 + json_close_object + json_close_object + # plugin: apple_domain_fallback + json_add_object + json_add_string "tag" "apple_domain_fallback" + json_add_string "type" "fallback" + json_add_object "args" + json_add_string "primary" "query_is_non_local_ip" + json_add_string "secondary" "forward_xinfeng_udp" + json_add_int "threshold" 100 + json_add_boolean "always_standby" 1 + json_close_object + json_close_object + # plugin: query_is_apple_domain + json_add_object + json_add_string "tag" "query_is_apple_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "!qname \$geosite_apple" + json_add_string "exec" "return" + json_close_object + json_add_object + json_add_string "exec" "\$apple_domain_fallback" + json_close_object + json_close_array + json_close_object + # plugin: query_is_ddns_domain + json_add_object + json_add_string "tag" "query_is_ddns_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$ddnslist" + json_add_string "exec" "\$forward_local" + json_close_object + json_close_array + json_close_object + # plugin: query_is_local_domain + json_add_object + json_add_string "tag" "query_is_local_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$geosite_cn" + json_add_string "exec" "\$forward_local" + json_close_object + json_close_array + json_close_object + # plugin: query_is_no_local_domain + json_add_object + json_add_string "tag" "query_is_no_local_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$geosite_no_cn" + json_add_string "exec" "\$forward_remote_upstream" + json_close_object + json_close_array + json_close_object + # plugin: query_is_whitelist_domain + json_add_object + json_add_string "tag" "query_is_whitelist_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$whitelist" + json_add_string "exec" "\$forward_local" + json_close_object + json_close_array + json_close_object + # plugin: query_is_greylist_domain + json_add_object + json_add_string "tag" "query_is_greylist_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$greylist" + json_add_string "exec" "\$forward_remote_upstream" + json_close_object + json_close_array + json_close_object + # plugin: query_is_reject_domain + json_add_object + json_add_string "tag" "query_is_reject_domain" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "matches" "qname \$blocklist" + json_add_string "exec" "reject 3" + json_close_object + json_add_object + json_add_string "matches" "qname \$adlist" + json_add_string "exec" "reject 3" + json_close_object + json_add_object + json_add_array "matches" + json_add_string "" "qtype 12" + json_add_string "" "qname \$local_ptr" + json_close_array + json_add_string "exec" "reject 3" + json_close_object + json_add_object + json_add_string "matches" "qtype 65" + json_add_string "exec" "reject 3" + json_close_object + json_close_array + json_close_object + # plugin: main_sequence + json_add_object + json_add_string "tag" "main_sequence" + json_add_string "type" "sequence" + json_add_array "args" + json_add_object + json_add_string "exec" "\$hosts" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_array "matches" + json_add_string "" "!qname \$ddnslist" + json_add_string "" "!qname \$blocklist" + json_add_string "" "!qname \$adlist" + json_add_string "" "!qname \$local_ptr" + json_close_array + json_add_string "exec" "\$lazy_cache" + json_close_object + json_add_object + json_add_string "exec" "\$redirect" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + [ "$apple_optimization" -eq 1 ] && { + json_add_string "exec" "\$query_is_apple_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + } + json_add_string "exec" "\$query_is_ddns_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$query_is_whitelist_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$query_is_reject_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$query_is_greylist_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$query_is_local_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$query_is_no_local_domain" + json_close_object + json_add_object + json_add_string "exec" "jump has_resp_sequence" + json_close_object + json_add_object + json_add_string "exec" "\$fallback" + json_close_object + json_close_array + json_close_object + # plugin: udp_server + json_add_object + json_add_string "tag" "udp_server" + json_add_string "type" "udp_server" + json_add_object "args" + json_add_string "entry" "main_sequence" + json_add_string "listen" ":$listen_port" + json_close_object + json_close_object + # plugin: tcp_server + json_add_object + json_add_string "tag" "tcp_server" + json_add_string "type" "tcp_server" + json_add_object "args" + json_add_string "entry" "main_sequence" + json_add_string "listen" ":$listen_port" + json_close_object + json_close_object + # close plugins array + json_close_array + # print json + json_dump > /var/etc/mosdns.json + + # init dump_file [ "$dump_file" -eq 1 ] && [ ! -f $DUMP_FILE ] && cp -a $DUMP_FILE_DEFAULT $DUMP_FILE [ "$dump_file" -eq 0 ] && \cp -a $DUMP_FILE_DEFAULT $DUMP_FILE - # ECS - if [ "$enable_ecs_remote" -eq 1 ]; then - sed -i "s,ecs_remote,ecs\ $remote_ecs_ip,g" $CONF - else - sed -i "/ecs_remote/d;" $CONF - fi - # DNS Leak - if [ $dns_leak -eq 1 ]; then - sed -i "s/primary: UNDEFINED/primary: forward_remote_upstream/g" $CONF - else - sed -i "s/primary: UNDEFINED/primary: query_is_non_local_ip/g" $CONF - fi - # Cloudflare IP - if [ $cloudflare -eq 1 ]; then - cloudflare_ip=$(sh $MOSDNS_SCRIPT cloudflare) - sed -i "s/CLOUDFLARE_IP/$cloudflare_ip/g" $CONF - else - sed -i '/\$cloudflare_cidr\|CLOUDFLARE_IP/d' $CONF - fi - # disable lazy_cache plugin when cache_size is 0 - [ $cache_size -eq 0 ] && sed -i -E ':l;N;/exec: \$lazy_cache/s/(\n[^\n]*){6}$//;bl' $CONF - rm -rf $TMPDIR } service_triggers() { @@ -155,7 +607,7 @@ restore_setting() { } redirect_setting() { - if [ "${CONF}" = "/etc/mosdns/config.yaml" ]; then + if [ "${CONF}" = "/var/etc/mosdns.json" ]; then sed -i "/list server/d" /etc/config/dhcp uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$listen_port" uci set dhcp.@dnsmasq[0].rebind_protection='0' @@ -203,13 +655,14 @@ start_service() { config_foreach get_config "mosdns" [ $enabled -ne 1 ] && return 1 delcron ; setcron - [ "${CONF}" = "/etc/mosdns/config.yaml" ] && init_yaml :> $($MOSDNS_SCRIPT logfile) if [ "${log_level}" = "error" ] || [ "${log_level}" = "warn" ]; then v2dat_dump > /dev/null 2>&1 else v2dat_dump >> $($MOSDNS_SCRIPT logfile) 2>&1 fi + [ "${CONF}" = "/var/etc/mosdns.json" ] && generate_config + procd_open_instance mosdns procd_set_param env QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING=true procd_set_param command $PROG start diff --git a/luci-app-mosdns/root/usr/share/mosdns/default.yaml b/luci-app-mosdns/root/usr/share/mosdns/default.yaml deleted file mode 100644 index a684438..0000000 --- a/luci-app-mosdns/root/usr/share/mosdns/default.yaml +++ /dev/null @@ -1,259 +0,0 @@ -log: - level: log_level - file: "log_file" - -api: - http: "0.0.0.0:api_port" - -include: [] - -plugins: - - tag: geosite_cn - type: domain_set - args: - files: - - "/var/mosdns/geosite_cn.txt" - - - tag: geoip_cn - type: ip_set - args: - files: - - "/var/mosdns/geoip_cn.txt" - - - tag: geosite_apple - type: domain_set - args: - files: - - "/var/mosdns/geosite_apple.txt" - - - tag: geosite_no_cn - type: domain_set - args: - files: - - "/var/mosdns/geosite_geolocation-!cn.txt" - - - tag: whitelist - type: domain_set - args: - files: - - "/etc/mosdns/rule/whitelist.txt" - - - tag: blocklist - type: domain_set - args: - files: - - "/etc/mosdns/rule/blocklist.txt" - - - tag: greylist - type: domain_set - args: - files: - - "/etc/mosdns/rule/greylist.txt" - - - tag: ddnslist - type: domain_set - args: - files: - - "/etc/mosdns/rule/ddnslist.txt" - - - tag: hosts - type: hosts - args: - files: - - "/etc/mosdns/rule/hosts.txt" - - - tag: redirect - type: redirect - args: - files: - - "/etc/mosdns/rule/redirect.txt" - - - tag: adlist - type: domain_set - args: - files: - ADBLOCK_LIST - - - tag: local_ptr - type: domain_set - args: - files: - - "/etc/mosdns/rule/local-ptr.txt" - - - tag: cloudflare_cidr - type: ip_set - args: - files: - - "/etc/mosdns/rule/cloudflare-cidr.txt" - - - tag: lazy_cache - type: cache - args: - size: cache_size - lazy_cache_ttl: cache_survival_time - - - tag: forward_xinfeng_udp - type: forward - args: - concurrent: 2 - upstreams: - - addr: "114.114.114.114" - - addr: "114.114.115.115" - - - tag: forward_local - type: forward - args: - concurrent: concurrent_num - upstreams: - - addr: local_dns - - - tag: forward_remote - type: forward - args: - concurrent: concurrent_num - upstreams: - - addr: remote_dns - - - tag: forward_remote_upstream - type: sequence - args: - - exec: prefer_ipv4 - - exec: ecs_remote - - exec: $forward_remote - - - tag: modify_ttl - type: sequence - args: - - exec: ttl minimal_ttl_custom-maximum_ttl_custom - - - tag: modify_ddns_ttl - type: sequence - args: - - exec: ttl 5-5 - - - tag: has_resp_sequence - type: sequence - args: - - matches: qname $ddnslist - exec: $modify_ddns_ttl - - matches: "!qname $ddnslist" - exec: $modify_ttl - - matches: "resp_ip $cloudflare_cidr" - exec: black_hole CLOUDFLARE_IP - - matches: has_resp - exec: accept - - - tag: query_is_non_local_ip - type: sequence - args: - - exec: $forward_local - - matches: "!resp_ip $geoip_cn" - exec: drop_resp - - - tag: fallback - type: fallback - args: - primary: UNDEFINED - secondary: forward_remote_upstream - threshold: 500 - always_standby: true - - - tag: apple_domain_fallback - type: fallback - args: - primary: query_is_non_local_ip - secondary: forward_xinfeng_udp - threshold: 100 - always_standby: true - - - tag: query_is_apple_domain - type: sequence - args: - - matches: "!qname $geosite_apple" - exec: return - - exec: $apple_domain_fallback - - - tag: query_is_ddns_domain - type: sequence - args: - - matches: qname $ddnslist - exec: $forward_local - - - tag: query_is_local_domain - type: sequence - args: - - matches: qname $geosite_cn - exec: $forward_local - - - tag: query_is_no_local_domain - type: sequence - args: - - matches: qname $geosite_no_cn - exec: $forward_remote_upstream - - - tag: query_is_whitelist_domain - type: sequence - args: - - matches: qname $whitelist - exec: $forward_local - - - tag: query_is_greylist_domain - type: sequence - args: - - matches: qname $greylist - exec: $forward_remote_upstream - - - tag: query_is_reject_domain - type: sequence - args: - - matches: qname $blocklist - exec: reject 3 - - matches: qname $adlist - exec: reject 3 - - matches: - - qtype 12 - - qname $local_ptr - exec: reject 3 - - matches: qtype 65 - exec: reject 3 - - - tag: main_sequence - type: sequence - args: - - exec: $hosts - - exec: jump has_resp_sequence - - matches: - - "!qname $ddnslist" - - "!qname $blocklist" - - "!qname $adlist" - - "!qname $local_ptr" - exec: $lazy_cache - - exec: $redirect - - exec: jump has_resp_sequence - - exec: $query_is_apple_domain - - exec: jump has_resp_sequence - - exec: $query_is_ddns_domain - - exec: jump has_resp_sequence - - exec: $query_is_whitelist_domain - - exec: jump has_resp_sequence - - exec: $query_is_reject_domain - - exec: jump has_resp_sequence - - exec: $query_is_greylist_domain - - exec: jump has_resp_sequence - - exec: $query_is_local_domain - - exec: jump has_resp_sequence - - exec: $query_is_no_local_domain - - exec: jump has_resp_sequence - - exec: $fallback - - - tag: udp_server - type: udp_server - args: - entry: main_sequence - listen: ":listen_port" - - - tag: tcp_server - type: tcp_server - args: - entry: main_sequence - listen: ":listen_port" diff --git a/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh b/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh index 4e6a5eb..d725e4a 100755 --- a/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh +++ b/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh @@ -4,8 +4,8 @@ script_action=${1} logfile_path() ( configfile=$(uci -q get mosdns.config.configfile) - if [ "$configfile" = "/etc/mosdns/config.yaml" ]; then - uci -q get mosdns.config.logfile + if [ "$configfile" = "/var/etc/mosdns.json" ]; then + uci -q get mosdns.config.log_file else [ ! -f /etc/mosdns/config_custom.yaml ] && exit 1 awk '/^log:/{f=1;next}f==1{if($0~/file:/){print;exit}if($0~/^[^ ]/)exit}' /etc/mosdns/config_custom.yaml | grep -Eo "/[^'\"]+" @@ -37,18 +37,18 @@ get_adlist() ( for url in $ad_source; do if [ $(echo $url) = 'geosite.dat' ]; then - echo " - \"/var/mosdns/geosite_category-ads-all.txt\"" + echo "/var/mosdns/geosite_category-ads-all.txt" elif echo "$url" | grep -Eq "^file://" ; then - echo " - \"$(echo "$url" | sed 's/file:\/\///')\"" + echo "$url" | sed 's/file:\/\///' else - echo " - \"/etc/mosdns/rule/adlist/$(basename $url)\"" + echo "/etc/mosdns/rule/adlist/$(basename $url)" [ ! -f "/etc/mosdns/rule/adlist/$(basename $url)" ] && touch /etc/mosdns/rule/adlist/$(basename $url) fi done else rm -rf /etc/mosdns/rule/adlist /etc/mosdns/rule/.ad_source - touch /var/disable-ads.txt - echo " - \"/var/disable-ads.txt\"" + touch /var/mosdns/disable-ads.txt + echo "/var/mosdns/disable-ads.txt" fi ) @@ -144,7 +144,7 @@ v2dat_dump() { configfile=$(uci -q get mosdns.config.configfile) mkdir -p /var/mosdns rm -f /var/mosdns/geo*.txt - if [ "$configfile" = "/etc/mosdns/config.yaml" ]; then + if [ "$configfile" = "/var/etc/mosdns.json" ]; then # default config v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat v2dat unpack geosite -o /var/mosdns -f cn -f apple -f 'geolocation-!cn' $v2dat_dir/geosite.dat @@ -160,10 +160,6 @@ v2dat_dump() { fi } -cloudflare_ip() { - uci -q get mosdns.config.cloudflare_ip -} - case $script_action in "dns") interface_dns @@ -186,9 +182,6 @@ case $script_action in "v2dat_dump") v2dat_dump ;; - "cloudflare") - cloudflare_ip - ;; "version") mosdns version ;;