luci-app-mosdns: allow add multiple AD rule sources #118

This commit is contained in:
sbwml 2023-09-21 17:36:14 +08:00
parent 1eb43a6ead
commit fb013521e7
5 changed files with 79 additions and 36 deletions

View File

@ -169,9 +169,8 @@ o = s:taboption("advanced", Flag, "adblock", translate("Enable DNS ADblock"))
o:depends("configfile", "/etc/mosdns/config.yaml") o:depends("configfile", "/etc/mosdns/config.yaml")
o.default = false o.default = false
o = s:taboption("advanced", Value, "ad_source", translate("ADblock Source"), translate("When using custom rule sources, use the rule types supported by MosDNS")) 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)."))
o:depends("adblock", "1") o:depends("adblock", "1")
o.default = "https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt"
o:value("geosite.dat", "v2ray-geosite") o:value("geosite.dat", "v2ray-geosite")
o:value("https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt", "anti-AD") o:value("https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt", "anti-AD")
o:value("https://raw.githubusercontent.com/ookangzheng/dbl-oisd-nl/master/dbl_light.txt", "oisd (small)") o:value("https://raw.githubusercontent.com/ookangzheng/dbl-oisd-nl/master/dbl_light.txt", "oisd (small)")

View File

@ -73,8 +73,8 @@ msgstr "启用 DNS 广告过滤"
msgid "ADblock Source" msgid "ADblock Source"
msgstr "广告过滤规则来源" msgstr "广告过滤规则来源"
msgid "When using custom rule sources, use the rule types supported by MosDNS" msgid "When using custom rule sources, please use rule types supported by MosDNS (domain lists)."
msgstr "使用自定义规则来源时,请使用 MosDNS 支持的规则类型" msgstr "使用自定义规则来源时,请使用 MosDNS 支持的规则类型(域名列表)"
msgid "Restart-Service" msgid "Restart-Service"
msgstr "重启服务" msgstr "重启服务"

View File

@ -67,9 +67,9 @@ get_config() {
init_yaml() { init_yaml() {
TMPDIR=$(mktemp -d) || exit 1 TMPDIR=$(mktemp -d) || exit 1
adlist=$($MOSDNS_SCRIPT ad)
[ $enable_pipeline -eq 1 ] && enable_pipeline=true || enable_pipeline=false [ $enable_pipeline -eq 1 ] && enable_pipeline=true || enable_pipeline=false
[ $insecure_skip_verify -eq 1 ] && insecure_skip_verify=true || insecure_skip_verify=false [ $insecure_skip_verify -eq 1 ] && insecure_skip_verify=true || insecure_skip_verify=false
# HTTP/3
[ $enable_http3_local -eq 1 ] && enable_http3_local=true || enable_http3_local=false [ $enable_http3_local -eq 1 ] && enable_http3_local=true || enable_http3_local=false
[ $enable_http3_remote -eq 1 ] && enable_http3_remote=true || enable_http3_remote=false [ $enable_http3_remote -eq 1 ] && enable_http3_remote=true || enable_http3_remote=false
if [ $enable_http3_local = true ]; then if [ $enable_http3_local = true ]; then
@ -80,6 +80,7 @@ init_yaml() {
[ -n "$address" ] && echo ${domain#*://} $address >> $RULE_HOSTS [ -n "$address" ] && echo ${domain#*://} $address >> $RULE_HOSTS
done done
fi fi
# Write parameters
[ "$custom_local_dns" -eq 1 ] && \ [ "$custom_local_dns" -eq 1 ] && \
local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s max_conns: '${max_conns}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: '${enable_http3_local}'\n",s,$i,s,s,s,s,s,s}' s=' ') || \ local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s max_conns: '${max_conns}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: '${enable_http3_local}'\n",s,$i,s,s,s,s,s,s}' s=' ') || \
local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n",s,$i,s}' s=' ') local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n",s,$i,s}' s=' ')
@ -90,20 +91,29 @@ init_yaml() {
s,minimal_ttl_custom,$minimal_ttl_custom,g; \ s,minimal_ttl_custom,$minimal_ttl_custom,g; \
s,maximum_ttl_custom,$maximum_ttl_custom,g; \ s,maximum_ttl_custom,$maximum_ttl_custom,g; \
s,concurrent_num,$concurrent,g;s,api_port,$listen_port_api,g; \ s,concurrent_num,$concurrent,g;s,api_port,$listen_port_api,g; \
s,adblock,$adlist,g;s,remote_dns_pipeline,$enable_pipeline,g" $DEFAULT_CONF > $CONF s,remote_dns_pipeline,$enable_pipeline,g" $DEFAULT_CONF > $CONF
# Adlist
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 "${local_dns}" > $TMPDIR/local_dns.txt
echo "${remote_dns}" > $TMPDIR/remote_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 sed -i -e '/- addr: local_dns/{r '$TMPDIR/local_dns.txt -e';d};/- addr: remote_dns/{r '$TMPDIR/remote_dns.txt -e';d}' $CONF
# Cache dump
[ "$dump_file" -eq 1 ] && sed -i "/lazy_cache_ttl/a\ dump_file: $DUMP_FILE\n dump_interval: $dump_interval" $CONF [ "$dump_file" -eq 1 ] && sed -i "/lazy_cache_ttl/a\ dump_file: $DUMP_FILE\n dump_interval: $dump_interval" $CONF
[ "$dump_file" -eq 1 ] && [ ! -f $DUMP_FILE ] && cp -a $DUMP_FILE_DEFAULT $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 [ "$dump_file" -eq 0 ] && \cp -a $DUMP_FILE_DEFAULT $DUMP_FILE
# ECS
if [ "$enable_ecs_remote" -eq 1 ]; then if [ "$enable_ecs_remote" -eq 1 ]; then
ecs_remote=$(sh $MOSDNS_SCRIPT ecs_remote) ecs_remote=$(sh $MOSDNS_SCRIPT ecs_remote)
sed -i "s,ecs_remote,$ecs_remote,g" $CONF sed -i "s,ecs_remote,$ecs_remote,g" $CONF
else else
sed -i "/ecs_remote/d;" $CONF sed -i "/ecs_remote/d;" $CONF
fi fi
# DNS Leak
[ $dns_leak -eq 1 ] && sed -i "s,primary: query_is_local_ip,primary: query_is_remote,g" $CONF [ $dns_leak -eq 1 ] && sed -i "s,primary: query_is_local_ip,primary: query_is_remote,g" $CONF
# Cloudflare IP
if [ $cloudflare -eq 1 ]; then if [ $cloudflare -eq 1 ]; then
cloudflare_ip=$(sh $MOSDNS_SCRIPT cloudflare) cloudflare_ip=$(sh $MOSDNS_SCRIPT cloudflare)
sed -i "s/CLOUDFLARE_IP/$cloudflare_ip/g" $CONF sed -i "s/CLOUDFLARE_IP/$cloudflare_ip/g" $CONF
@ -193,11 +203,22 @@ start_service() {
[ "$redirect" -ne 1 ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting [ "$redirect" -ne 1 ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting
[ "$redirect" -eq 1 ] && redirect_setting [ "$redirect" -eq 1 ] && redirect_setting
reload_dnsmasq reload_dnsmasq
# Update Adlist
update_list=0 update_list=0
[ "$adblock" -eq 1 ] && [ "$ad_source" != "geosite.dat" ] && { if [ "$adblock" -eq 1 ]; then
[ -s "/etc/mosdns/rule/adlist.txt" ] && [ -f "/etc/mosdns/rule/.ad_source" ] && url_adlist=$(cat /etc/mosdns/rule/.ad_source) || update_list=1 if [ -f "/etc/mosdns/rule/.ad_source" ]; then
[ "$ad_source" != "$url_adlist" ] && update_list=1 for url in $ad_source;
} do
[ "$url" = "geosite.dat" ] && continue
if [ $(grep -c "$url" "/etc/mosdns/rule/.ad_source") -eq 0 ]; then
update_list=1
break
fi
done
else
update_list=1
fi
fi
[ "$update_list" -eq 1 ] && $MOSDNS_SCRIPT adlist_update &> /dev/null & [ "$update_list" -eq 1 ] && $MOSDNS_SCRIPT adlist_update &> /dev/null &
} }

View File

@ -66,7 +66,7 @@ plugins:
type: domain_set type: domain_set
args: args:
files: files:
- "adblock" ADBLOCK_LIST
- tag: local_ptr - tag: local_ptr
type: domain_set type: domain_set

View File

@ -29,37 +29,60 @@ interface_dns() (
fi fi
) )
ad_block() ( get_adlist() (
adblock=$(uci -q get mosdns.config.adblock) adblock=$(uci -q get mosdns.config.adblock)
if [ "$adblock" = 1 ]; then if [ "$adblock" = 1 ]; then
mkdir -p /etc/mosdns/rule/adlist
ad_source=$(uci -q get mosdns.config.ad_source) ad_source=$(uci -q get mosdns.config.ad_source)
if [ "$ad_source" = "geosite.dat" ]; then for url in $ad_source;
echo "/var/mosdns/geosite_category-ads-all.txt" do
else if [ $(echo $url) = 'geosite.dat' ]; then
echo "/etc/mosdns/rule/adlist.txt" echo " - \"/var/mosdns/geosite_category-ads-all.txt\""
fi else
echo " - \"/etc/mosdns/rule/adlist/$(basename $url)\""
[ ! -f "/etc/mosdns/rule/adlist/$(basename $url)" ] && touch /etc/mosdns/rule/adlist/$(basename $url)
fi
done
else else
touch /var/disable-ads.txt ; echo "/var/disable-ads.txt" rm -rf /etc/mosdns/rule/adlist /etc/mosdns/rule/.ad_source /etc/mosdns/rule/adlist.txt
touch /var/disable-ads.txt
echo " - \"/var/disable-ads.txt\""
fi fi
) )
adlist_update() ( adlist_update() (
[ $(uci -q get mosdns.config.adblock) -eq 0 ] && exit 0
ad_source=$(uci -q get mosdns.config.ad_source) ad_source=$(uci -q get mosdns.config.ad_source)
[ "$ad_source" = "geosite.dat" ] || [ -z "$ad_source" ] && exit 0
AD_TMPDIR=$(mktemp -d) || exit 1 AD_TMPDIR=$(mktemp -d) || exit 1
if echo "$ad_source" | grep -Eq "^https://raw.githubusercontent.com" ; then google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204)
google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204) mirror=""
[ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" : > /etc/mosdns/rule/.ad_source
fi has_update=0
echo -e "\e[1;32mDownloading $mirror$ad_source\e[0m" for url in $ad_source;
curl --connect-timeout 60 -m 90 --ipv4 -kfSLo "$AD_TMPDIR/adlist.txt" "$mirror$ad_source" do
if [ "$url" != "geosite.dat" ]; then
echo "$url" >> /etc/mosdns/rule/.ad_source
filename=$(basename $url)
if echo "$url" | grep -Eq "^https://raw.githubusercontent.com" ; then
[ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/"
fi
echo -e "\e[1;32mDownloading $mirror$url\e[0m"
curl --connect-timeout 5 -m 90 --ipv4 -kfSLo "$AD_TMPDIR/$filename" "$mirror$url"
has_update=1
fi
done
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo -e "\e[1;31mRules download failed.\e[0m"
rm -rf "$AD_TMPDIR" rm -rf "$AD_TMPDIR"
exit 1 exit 1
else else
\cp "$AD_TMPDIR/adlist.txt" /etc/mosdns/rule/adlist.txt [ $has_update -eq 1 ] && {
echo "$ad_source" > /etc/mosdns/rule/.ad_source mkdir -p /etc/mosdns/rule/adlist
rm -rf "$AD_TMPDIR" rm -rf /etc/mosdns/rule/adlist/*
\cp $AD_TMPDIR/* /etc/mosdns/rule/adlist
rm -rf "$AD_TMPDIR"
restart_service
}
fi fi
) )
@ -69,11 +92,11 @@ geodat_update() (
[ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" [ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/"
# geoip.dat - cn-private # geoip.dat - cn-private
echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat\e[0m" echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat\e[0m"
curl --connect-timeout 60 -m 900 --ipv4 -kfSLo "$TMPDIR/geoip.dat" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat" curl --connect-timeout 5 -m 60 --ipv4 -kfSLo "$TMPDIR/geoip.dat" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat"
[ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1
# checksum - geoip.dat # checksum - geoip.dat
echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum\e[0m" echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum\e[0m"
curl --connect-timeout 60 -m 900 --ipv4 -kfSLo "$TMPDIR/geoip.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum" curl --connect-timeout 5 -m 10 --ipv4 -kfSLo "$TMPDIR/geoip.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum"
[ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1
if [ "$(sha256sum "$TMPDIR/geoip.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geoip.dat.sha256sum" | awk '{print $1}')" ]; then if [ "$(sha256sum "$TMPDIR/geoip.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geoip.dat.sha256sum" | awk '{print $1}')" ]; then
echo -e "\e[1;31mgeoip.dat checksum error\e[0m" echo -e "\e[1;31mgeoip.dat checksum error\e[0m"
@ -83,11 +106,11 @@ geodat_update() (
# geosite.dat # geosite.dat
echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\e[0m" echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\e[0m"
curl --connect-timeout 60 -m 900 --ipv4 -kfSLo "$TMPDIR/geosite.dat" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" curl --connect-timeout 5 -m 120 --ipv4 -kfSLo "$TMPDIR/geosite.dat" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
[ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1
# checksum - geosite.dat # checksum - geosite.dat
echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum\e[0m" echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum\e[0m"
curl --connect-timeout 60 -m 900 --ipv4 -kfSLo "$TMPDIR/geosite.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum" curl --connect-timeout 5 -m 10 --ipv4 -kfSLo "$TMPDIR/geosite.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum"
[ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1
if [ "$(sha256sum "$TMPDIR/geosite.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geosite.dat.sha256sum" | awk '{print $1}')" ]; then if [ "$(sha256sum "$TMPDIR/geosite.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geosite.dat.sha256sum" | awk '{print $1}')" ]; then
echo -e "\e[1;31mgeosite.dat checksum error\e[0m" echo -e "\e[1;31mgeosite.dat checksum error\e[0m"
@ -124,7 +147,7 @@ v2dat_dump() {
# default config # default config
v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat
v2dat unpack geosite -o /var/mosdns -f cn -f 'geolocation-!cn' $v2dat_dir/geosite.dat v2dat unpack geosite -o /var/mosdns -f cn -f 'geolocation-!cn' $v2dat_dir/geosite.dat
[ "$adblock" -eq 1 ] && [ "$ad_source" = "geosite.dat" ] && v2dat unpack geosite -o /var/mosdns -f category-ads-all $v2dat_dir/geosite.dat [ "$adblock" -eq 1 ] && [ $(echo $ad_source | grep -c geosite.dat) -ge '1' ] && v2dat unpack geosite -o /var/mosdns -f category-ads-all $v2dat_dir/geosite.dat
else else
# custom config # custom config
v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat
@ -144,8 +167,8 @@ case $script_action in
"dns") "dns")
interface_dns interface_dns
;; ;;
"ad") "adlist")
ad_block get_adlist
;; ;;
"geodata") "geodata")
geodat_update && adlist_update && restart_service geodat_update && adlist_update && restart_service
@ -154,7 +177,7 @@ case $script_action in
logfile_path logfile_path
;; ;;
"adlist_update") "adlist_update")
adlist_update && restart_service adlist_update
;; ;;
"ecs_remote") "ecs_remote")
ecs_remote ecs_remote