diff --git a/Makefile b/Makefile index 97c152f..ee3e2c8 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-mosdns -PKG_VERSION:=1.2 +PKG_VERSION:=1.3 PKG_RELEASE:=1 LUCI_TITLE:=LuCI Support for mosdns @@ -9,8 +9,9 @@ LUCI_PKGARCH:=all LUCI_DEPENDS:=+mosdns +jsonfilter +bash +v2ray-geoip +v2ray-geosite define Package/$(PKG_NAME)/conffiles -/etc/mosdns/config_custom.yaml /etc/config/mosdns +/etc/mosdns/config_custom.yaml +/etc/mosdns/rule endef include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luasrc/controller/mosdns.lua b/luasrc/controller/mosdns.lua index 8050df0..c8f0ad1 100644 --- a/luasrc/controller/mosdns.lua +++ b/luasrc/controller/mosdns.lua @@ -10,7 +10,7 @@ function index() page.acl_depends = { "luci-app-mosdns" } entry({"admin", "services", "mosdns", "basic"}, cbi("mosdns/basic"), _("Basic Setting"), 1).leaf = true - entry({"admin", "services", "mosdns", "whitelist"}, cbi("mosdns/whitelist"), _("ADblock whitelist"), 2).leaf = true + entry({"admin", "services", "mosdns", "rule_list"}, cbi("mosdns/rule_list"), _("Rule List"), 2).leaf = true entry({"admin", "services", "mosdns", "update"}, cbi("mosdns/update"), _("Geodata Update"), 3).leaf = true entry({"admin", "services", "mosdns", "log"}, cbi("mosdns/log"), _("Logs"), 4).leaf = true entry({"admin", "services", "mosdns", "status"}, call("act_status")).leaf = true diff --git a/luasrc/model/cbi/mosdns/basic.lua b/luasrc/model/cbi/mosdns/basic.lua index 542a261..1324d53 100644 --- a/luasrc/model/cbi/mosdns/basic.lua +++ b/luasrc/model/cbi/mosdns/basic.lua @@ -11,9 +11,9 @@ s.anonymous = true enable = s:option(Flag, "enabled", translate("Enable")) enable.rmempty = false -configfile = s:option(ListValue, "configfile", translate("MosDNS Config File")) -configfile:value("/etc/mosdns/config.yaml", translate("Def Config")) -configfile:value("/etc/mosdns/config_custom.yaml", translate("Cus Config")) +configfile = s:option(ListValue, "configfile", translate("Config File")) +configfile:value("/etc/mosdns/config.yaml", translate("Default Config")) +configfile:value("/etc/mosdns/config_custom.yaml", translate("Custom Config")) configfile.default = "/etc/mosdns/config.yaml" listenport = s:option(Value, "listen_port", translate("Listen port")) @@ -30,9 +30,9 @@ loglevel:value("error", translate("Error")) loglevel.default = "error" loglevel:depends( "configfile", "/etc/mosdns/config.yaml") -logfile = s:option(Value, "logfile", translate("MosDNS Log File")) -logfile.placeholder = "/dev/null" -logfile.default = "/dev/null" +logfile = s:option(Value, "logfile", translate("Log File")) +logfile.placeholder = "/tmp/mosdns.log" +logfile.default = "/tmp/mosdns.log" logfile:depends( "configfile", "/etc/mosdns/config.yaml") dnsforward = s:option(Value, "dns_forward", translate("Remote DNS")) diff --git a/luasrc/model/cbi/mosdns/rule_list.lua b/luasrc/model/cbi/mosdns/rule_list.lua new file mode 100644 index 0000000..6da04d7 --- /dev/null +++ b/luasrc/model/cbi/mosdns/rule_list.lua @@ -0,0 +1,59 @@ +local datatypes = require "luci.cbi.datatypes" + +local white_list_file = "/etc/mosdns/rule/whitelist.txt" +local block_list_file = "/etc/mosdns/rule/blocklist.txt" + +m = Map("mosdns") + +s = m:section(TypedSection, "mosdns", translate("Black and White List Settings")) +s.anonymous = true + +s:tab("white_list", translate("White Lists")) +s:tab("block_list", translate("Block Lists")) + +o = s:taboption("white_list", TextValue, "whitelist", "", "" .. translate("These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(white_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(white_list_file , value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(white_list_file , "") end +o.validate = function(self, value) + local hosts= {} + string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(hosts, w) end) + for index, host in ipairs(hosts) do + if host:find("#") and host:find("#") == 1 then + return value + end + if not datatypes.hostname(host) then + return nil, host .. " " .. translate("Not valid domain name, Please Re-enter.") + end + end + return value +end + +o = s:taboption("block_list", TextValue, "blocklist", "", "" .. translate("These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(block_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(block_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(block_list_file, "") end +o.validate = function(self, value) + local hosts= {} + string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(hosts, w) end) + for index, host in ipairs(hosts) do + if host:find("#") and host:find("#") == 1 then + return value + end + if not datatypes.hostname(host) then + return nil, host .. " " .. translate("Not valid domain name, Please Re-enter.") + end + end + return value +end + +local apply = luci.http.formvalue("cbi.apply") +if apply then + luci.sys.exec("/etc/init.d/mosdns reload") +end + +return m diff --git a/luasrc/model/cbi/mosdns/update.lua b/luasrc/model/cbi/mosdns/update.lua index ce5aff9..4f71de6 100644 --- a/luasrc/model/cbi/mosdns/update.lua +++ b/luasrc/model/cbi/mosdns/update.lua @@ -1,6 +1,6 @@ m = Map("mosdns") -s = m:section(TypedSection, "mosdns", translate("Geodata Update")) +s = m:section(TypedSection, "mosdns", translate("Update GeoIP & GeoSite dat")) s.addremove = false s.anonymous = true @@ -18,7 +18,7 @@ o:value("6", translate("Every Saturday")) o:value("7", translate("Every Sunday")) o.default = "*" -update_time = s:option(ListValue, "geo_update_day_time", translate("Update Time (Every Day)")) +update_time = s:option(ListValue, "geo_update_day_time", translate("Update Time")) for t = 0, 23 do update_time:value(t, t..":00") end diff --git a/luasrc/model/cbi/mosdns/whitelist.lua b/luasrc/model/cbi/mosdns/whitelist.lua deleted file mode 100644 index 8478051..0000000 --- a/luasrc/model/cbi/mosdns/whitelist.lua +++ /dev/null @@ -1,26 +0,0 @@ -m = Map("mosdns") - -s = m:section(TypedSection, "mosdns", translate("ADblock whitelist")) -s.addremove = false -s.anonymous = true - -config = s:option(TextValue, "whitelist") -config.description = translate("ADblock whitelist only apply to 'Def Config' profiles.") -config.template = "cbi/tvalue" -config.rows = 25 - -function config.cfgvalue(self, section) - return nixio.fs.readfile("/etc/mosdns/whitelist.txt") -end - -function config.write(self, section, value) - value = value:gsub("\r\n?", "\n") - nixio.fs.writefile("/etc/mosdns/whitelist.txt", value) -end - -local apply = luci.http.formvalue("cbi.apply") -if apply then - luci.sys.exec("/etc/init.d/mosdns reload") -end - -return m diff --git a/po/zh-cn/mosdns.po b/po/zh-cn/mosdns.po index a3ba814..94b90ec 100644 --- a/po/zh-cn/mosdns.po +++ b/po/zh-cn/mosdns.po @@ -1,9 +1,6 @@ msgid "Basic Setting" msgstr "基本设置" -msgid "Manual Configuration" -msgstr "手动配置" - msgid "MosDNS is a 'programmable' DNS forwarder." msgstr "MosDNS 是一个插件化的 DNS 转发/分流器。" @@ -32,19 +29,13 @@ msgid "Enable DNS ADblock" msgstr "启用 DNS 广告过滤" msgid "View the Custom YAML Configuration file used by this MosDNS. You can edit it as you own need." -msgstr "注意!此页的更改仅当 'MosDNS 配置文件选择' 为 '自定义配置' 时才会生效" - -msgid "ADblock whitelist only apply to 'Def Config' profiles." -msgstr "注意!广告过滤白名单仅当 'MosDNS 配置文件选择' 为 '内置预设' 时才会生效" - -msgid "ADblock whitelist" -msgstr "广告白名单" +msgstr "注意!此页的更改仅当配置文件为 “自定义” 时才会生效" msgid "Geodata Update" -msgstr "数据库更新" +msgstr "更新数据库" -msgid "Update Time (Every Day)" -msgstr "更新时间(每天)" +msgid "Update Time" +msgstr "更新时间" msgid "Update Cycle" msgstr "更新周期" @@ -80,19 +71,19 @@ msgid "Check And Update" msgstr "检查并更新" msgid "Enable Auto Database Update" -msgstr "启用数据库自动更新" +msgstr "启用自动更新" -msgid "MosDNS Config File" -msgstr "MosDNS 配置文件选择" +msgid "Config File" +msgstr "配置文件" -msgid "Def Config" +msgid "Default Config" msgstr "内置预设" -msgid "Cus Config" -msgstr "自定义配置" +msgid "Custom Config" +msgstr "自定义" -msgid "MosDNS Log File" -msgstr "MosDNS 日志文件" +msgid "Log File" +msgstr "日志文件" msgid "Remote DNS" msgstr "远程 DNS" @@ -111,3 +102,27 @@ msgstr "日志" msgid "Clear logs" msgstr "清空日志" + +msgid "Rule List" +msgstr "规则列表" + +msgid "Black and White List Settings" +msgstr "自定义黑白名单" + +msgid "
The list of rules only apply to 'Default Config' profiles." +msgstr "
规则列表仅适用于 “内置预设” 配置文件" + +msgid "White Lists" +msgstr "白名单" + +msgid "These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com." +msgstr "加入的域名始终允许 DNS 解析,且优先级最高(每行只能输入一个域名)" + +msgid "Block Lists" +msgstr "黑名单" + +msgid "These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com." +msgstr "加入的域名将屏蔽 DNS 解析(每行只能输入一个域名)" + +msgid "Not valid domain name, Please Re-enter." +msgstr "不是有效域名,请重新输入" diff --git a/root/etc/init.d/mosdns b/root/etc/init.d/mosdns index ac53c13..ae9b00c 100755 --- a/root/etc/init.d/mosdns +++ b/root/etc/init.d/mosdns @@ -5,12 +5,9 @@ START=91 USE_PROCD=1 -##### ONLY CHANGE THIS BLOCK ###### -PROG=/usr/bin/mosdns # where is mosdns -RES_DIR=/etc/mosdns/ # resource dir / working dir / the dir where you store ip/domain lists -CONF=$(uci -q get mosdns.mosdns.configfile) # where is the config file, it can be a relative path to $RES_DIR +PROG=/usr/bin/mosdns +CONF=$(uci -q get mosdns.mosdns.configfile) CRON_FILE=/etc/crontabs/root -##### ONLY CHANGE THIS BLOCK ###### inital_conf() { config_load "mosdns" @@ -48,7 +45,6 @@ reload_others() { reload_service() { stop sleep 1 - echo "MosDNS is restarted!" start } @@ -64,15 +60,13 @@ delcron() { } start_service() { - - # Reading config inital_conf [ $enabled != 1 ] && return 1 delcron setcron echo '' > $(uci -q get mosdns.mosdns.logfile) procd_open_instance mosdns - procd_set_param command $PROG -dir $RES_DIR -c "$CONF" + procd_set_param command $PROG -c "$CONF" procd_set_param user root procd_set_param stdout 1 procd_set_param stderr 1 @@ -85,14 +79,10 @@ start_service() { redirect_setting reload_others fi - echo "MosDNS turn on" } stop_service() { - pgrep -f /usr/bin/mosdns | xargs kill -9 - echo "MosDNS turn off" - configfile=$(uci -q get mosdns.mosdns.configfile) if [ "${configfile}" = "/etc/mosdns/config.yaml" ]; then config_load "mosdns" @@ -101,5 +91,4 @@ stop_service() { reload_others fi delcron - } diff --git a/root/etc/mosdns/config.yaml b/root/etc/mosdns/config.yaml index bf7e555..0d5a8b6 100644 --- a/root/etc/mosdns/config.yaml +++ b/root/etc/mosdns/config.yaml @@ -27,6 +27,7 @@ plugin: - forward_local - _return - if: + - query_is_blocklist_domain - query_is_ad_domain exec: - _block_with_nxdomain @@ -80,7 +81,13 @@ plugin: type: query_matcher args: domain: - - "ext:./whitelist.txt" + - "ext:/etc/mosdns/rule/whitelist.txt" + + - tag: query_is_blocklist_domain + type: query_matcher + args: + domain: + - "ext:/etc/mosdns/rule/blocklist.txt" - tag: forward_remote type: fast_forward diff --git a/root/etc/mosdns/rule/blocklist.txt b/root/etc/mosdns/rule/blocklist.txt new file mode 100644 index 0000000..e69de29 diff --git a/root/etc/mosdns/whitelist.txt b/root/etc/mosdns/rule/whitelist.txt similarity index 100% rename from root/etc/mosdns/whitelist.txt rename to root/etc/mosdns/rule/whitelist.txt