From 01f10d74ec5f8c6ded49d3f6191aa41147612dde Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 20:28:29 +0800 Subject: [PATCH] update-10.09 --- aria2/files/aria2.init | 2 +- luci-app-nft-qos/po/bn_BD/nft-qos.po | 14 +- luci-app-passwall/Makefile | 4 +- .../luasrc/controller/passwall.lua | 1 + .../cbi/passwall/client/node_subscribe.lua | 65 +++--- .../passwall/client/node_subscribe_config.lua | 103 +++++++++ .../luasrc/view/passwall/global/status.htm | 19 +- .../luasrc/view/passwall/global/status2.htm | 6 +- luci-app-passwall/po/zh-cn/passwall.po | 13 +- .../root/usr/share/passwall/0_default_config | 2 - .../root/usr/share/passwall/app.sh | 26 ++- .../root/usr/share/passwall/subscribe.lua | 202 ++++++++++-------- .../resources/view/smartdns/smartdns.js | 3 +- 13 files changed, 291 insertions(+), 169 deletions(-) create mode 100644 luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua diff --git a/aria2/files/aria2.init b/aria2/files/aria2.init index d80d4b1f2..8062593bc 100644 --- a/aria2/files/aria2.init +++ b/aria2/files/aria2.init @@ -313,7 +313,7 @@ aria2_start() { config_list_foreach "$section" "header" append_header config_list_foreach "$section" "extra_settings" append_setting - cd /usr/share/aria2 && sh ./tracker.sh + cd /usr/share/aria2 && sh ./tracker.sh >/dev/null 2>&1 cat /usr/share/aria2/aria2.conf > "$config_file" echo '' >> "$config_file" sed '/^$/d' "$config_file_tmp" >> "$config_file" diff --git a/luci-app-nft-qos/po/bn_BD/nft-qos.po b/luci-app-nft-qos/po/bn_BD/nft-qos.po index 8e9adf37d..655296aa0 100644 --- a/luci-app-nft-qos/po/bn_BD/nft-qos.po +++ b/luci-app-nft-qos/po/bn_BD/nft-qos.po @@ -1,8 +1,14 @@ msgid "" msgstr "" +"PO-Revision-Date: 2021-10-08 17:53+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" "Language: bn_BD\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" #: applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm:136 #: applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm:155 @@ -92,12 +98,12 @@ msgstr "" #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:156 #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:244 msgid "Hostname" -msgstr "" +msgstr "হোস্টনেম" #: applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm:134 #: applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm:153 msgid "IP Address" -msgstr "" +msgstr "আইপি এড্রেস" #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:128 #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:161 @@ -128,7 +134,7 @@ msgstr "" #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:248 msgid "MAC Address" -msgstr "" +msgstr "MAC অ্যাড্রেস" #: applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm:48 msgid "MB" @@ -165,7 +171,7 @@ msgstr "" #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:197 msgid "Protocol" -msgstr "" +msgstr "প্রোটোকল" #: applications/luci-app-nft-qos/luasrc/controller/nft-qos.lua:21 #: applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua:24 diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index bdf675a8f..6abb8b53f 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -6,9 +6,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=4.37 +PKG_VERSION:=4.38 PKG_RELEASE:=1 -#20210928 +#20211008 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Brook \ diff --git a/luci-app-passwall/luasrc/controller/passwall.lua b/luci-app-passwall/luasrc/controller/passwall.lua index 4035fb84e..b37e4a18c 100644 --- a/luci-app-passwall/luasrc/controller/passwall.lua +++ b/luci-app-passwall/luasrc/controller/passwall.lua @@ -38,6 +38,7 @@ function index() entry({"admin", "services", appname, "app_update"}, cbi(appname .. "/client/app_update"), _("App Update"), 95).leaf = true entry({"admin", "services", appname, "rule"}, cbi(appname .. "/client/rule"), _("Rule Manage"), 96).leaf = true entry({"admin", "services", appname, "rule_list"}, cbi(appname .. "/client/rule_list"), _("Rule List Manage"), 97).leaf = true + entry({"admin", "services", appname, "node_subscribe_config"}, cbi(appname .. "/client/node_subscribe_config")).leaf = true entry({"admin", "services", appname, "node_config"}, cbi(appname .. "/client/node_config")).leaf = true entry({"admin", "services", appname, "shunt_rules"}, cbi(appname .. "/client/shunt_rules")).leaf = true entry({"admin", "services", appname, "acl"}, cbi(appname .. "/client/acl"), _("Access control"), 98).leaf = true diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua index d88b004e4..b1a96c8bd 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua @@ -40,26 +40,6 @@ o = s:option(Flag, "subscribe_proxy", translate("Subscribe via proxy")) o.default = 0 o.rmempty = false ----- Enable auto update subscribe -o = s:option(Flag, "auto_update_subscribe", - translate("Enable auto update subscribe")) -o.default = 0 -o.rmempty = false - ----- Week update rules -o = s:option(ListValue, "week_update_subscribe", translate("Week update rules")) -o:value(7, translate("Every day")) -for e = 1, 6 do o:value(e, translate("Week") .. e) end -o:value(0, translate("Week") .. translate("day")) -o.default = 0 -o:depends("auto_update_subscribe", true) - ----- Day update rules -o = s:option(ListValue, "time_update_subscribe", translate("Day update rules")) -for e = 0, 23 do o:value(e, e .. translate("oclock")) end -o.default = 0 -o:depends("auto_update_subscribe", true) - o = s:option(ListValue, "filter_keyword_mode", translate("Filter keyword Mode")) o:value("0", translate("Close")) o:value("1", translate("Discard List")) @@ -69,10 +49,6 @@ o = s:option(DynamicList, "filter_discard_list", translate("Discard List")) o = s:option(DynamicList, "filter_keep_list", translate("Keep List")) -o = s:option(Flag, "allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) -o.default = "1" -o.rmempty = false - if #ss_aead_type > 0 then o = s:option(ListValue, "ss_aead_type", translate("SS AEAD Node Use Type")) for key, value in pairs(ss_aead_type) do @@ -87,14 +63,6 @@ if #trojan_type > 0 then end end ----- Manual subscription -o = s:option(Button, "_update", translate("Manual subscription")) -o.inputstyle = "apply" -function o.write(e, e) - luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start log > /dev/null 2>&1 &") - luci.http.redirect(api.url("log")) -end - ---- Subscribe Delete All o = s:option(Button, "_stop", translate("Delete All Subscribe Node")) o.inputstyle = "remove" @@ -102,22 +70,30 @@ function o.write(e, e) luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate > /dev/null 2>&1") end -s = m:section(TypedSection, "subscribe_list", "", - "" .. translate( - "Please input the subscription url first, save and submit before updating. If you subscribe to update, it is recommended to delete all subscriptions and then re-subscribe.") .. - "") +s = m:section(TypedSection, "subscribe_list", "", "" .. translate("Please input the subscription url first, save and submit before manual subscription.") .. "") s.addremove = true s.anonymous = true s.sortable = true s.template = "cbi/tblsection" +s.extedit = api.url("node_subscribe_config", "%s") -o = s:option(Flag, "enabled", translate("Enabled")) -o.default = "1" -o.rmempty = false - -o = s:option(Value, "remark", translate("Subscribe Remark")) +o = s:option(Value, "remark", translate("Remarks")) o.width = "auto" o.rmempty = false +o.validate = function(self, value, t) + if value then + local count = 0 + m.uci:foreach(appname, "subscribe_list", function(e) + if e[".name"] ~= t and e["remark"] == value then + count = count + 1 + end + end) + if count > 0 then + return nil, translate("This remark already exists, please change a new remark.") + end + return value + end +end o = s:option(DummyValue, "_node_count") o.rawhtml = true @@ -143,4 +119,11 @@ function o.write(t, n) luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate " .. remark .. " > /dev/null 2>&1") end +o = s:option(Button, "_update", translate("Manual subscription")) +o.inputstyle = "apply" +function o.write(t, n) + luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start " .. n .. " > /dev/null 2>&1 &") + luci.http.redirect(api.url("log")) +end + return m diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua new file mode 100644 index 000000000..a8f632389 --- /dev/null +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua @@ -0,0 +1,103 @@ +local api = require "luci.model.cbi.passwall.api.api" +local appname = api.appname +local sys = api.sys +local has_ss = api.is_finded("ss-redir") +local has_ss_rust = api.is_finded("sslocal") +local has_trojan_plus = api.is_finded("trojan-plus") +local has_v2ray = api.is_finded("v2ray") +local has_xray = api.is_finded("xray") +local has_trojan_go = api.is_finded("trojan-go") +local ss_aead_type = {} +local trojan_type = {} +if has_ss then + ss_aead_type[#ss_aead_type + 1] = "shadowsocks-libev" +end +if has_ss_rust then + ss_aead_type[#ss_aead_type + 1] = "shadowsocks-rust" +end +if has_trojan_plus then + trojan_type[#trojan_type + 1] = "trojan-plus" +end +if has_v2ray then + trojan_type[#trojan_type + 1] = "v2ray" + ss_aead_type[#ss_aead_type + 1] = "v2ray" +end +if has_xray then + trojan_type[#trojan_type + 1] = "xray" + ss_aead_type[#ss_aead_type + 1] = "xray" +end +if has_trojan_go then + trojan_type[#trojan_type + 1] = "trojan-go" +end + +m = Map(appname) + +s = m:section(NamedSection, arg[1]) +s.addremove = false +s.dynamic = false + +o = s:option(Value, "remark", translate("Subscribe Remark")) +o.rmempty = false + +o = s:option(TextValue, "url", translate("Subscribe URL")) +o.rows = 5 +o.rmempty = false + +o = s:option(Flag, "allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) +o.default = "1" +o.rmempty = false + +o = s:option(ListValue, "filter_keyword_mode", translate("Filter keyword Mode")) +o.default = "3" +o:value("0", translate("Close")) +o:value("1", translate("Discard List")) +o:value("2", translate("Keep List")) +o:value("3", translate("Use global config")) + +o = s:option(DynamicList, "filter_discard_list", translate("Discard List")) +o:depends("filter_keyword_mode", "1") + +o = s:option(DynamicList, "filter_keep_list", translate("Keep List")) +o:depends("filter_keyword_mode", "2") + +if #ss_aead_type > 0 then + o = s:option(ListValue, "ss_aead_type", translate("SS AEAD Node Use Type")) + o.default = "global" + o:value("global", translate("Use global config")) + for key, value in pairs(ss_aead_type) do + o:value(value, translate(value:gsub("^%l",string.upper))) + end +end + +if #trojan_type > 0 then + o = s:option(ListValue, "trojan_type", translate("Trojan Node Use Type")) + o.default = "global" + o:value("global", translate("Use global config")) + for key, value in pairs(trojan_type) do + o:value(value, translate(value:gsub("^%l",string.upper))) + end +end + +---- Enable auto update subscribe +o = s:option(Flag, "auto_update", translate("Enable auto update subscribe")) +o.default = 0 +o.rmempty = false + +---- Week update rules +o = s:option(ListValue, "week_update", translate("Week update rules")) +o:value(7, translate("Every day")) +for e = 1, 6 do o:value(e, translate("Week") .. e) end +o:value(0, translate("Week") .. translate("day")) +o.default = 0 +o:depends("auto_update", true) + +---- Day update rules +o = s:option(ListValue, "time_update", translate("Day update rules")) +for e = 0, 23 do o:value(e, e .. translate("oclock")) end +o.default = 0 +o:depends("auto_update", true) + +o = s:option(Value, "user_agent", translate("User-Agent")) +o.default = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" + +return m diff --git a/luci-app-passwall/luasrc/view/passwall/global/status.htm b/luci-app-passwall/luasrc/view/passwall/global/status.htm index 8ea709e1e..90c5c202d 100644 --- a/luci-app-passwall/luasrc/view/passwall/global/status.htm +++ b/luci-app-passwall/luasrc/view/passwall/global/status.htm @@ -23,7 +23,6 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md overflow-y: hidden; border: 1px solid rgba(0,0,0,.05); border-radius: .375rem; - background-color: #fff; box-shadow: 0 0 2rem 0 rgba(136,152,170,.15); } .img-con { @@ -131,7 +130,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- +
@@ -139,7 +138,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
-
+
@@ -151,11 +150,11 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
-
+
- +
@@ -163,11 +162,11 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
-
+
- +
@@ -175,11 +174,11 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
-
+
- +
@@ -192,7 +191,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- +
diff --git a/luci-app-passwall/luasrc/view/passwall/global/status2.htm b/luci-app-passwall/luasrc/view/passwall/global/status2.htm index 7b4f6d20f..abbabff0f 100644 --- a/luci-app-passwall/luasrc/view/passwall/global/status2.htm +++ b/luci-app-passwall/luasrc/view/passwall/global/status2.htm @@ -91,7 +91,7 @@ local status = api.uci_get_type("global_other", "status", "") <%:Baidu Connection%>
- +
@@ -100,7 +100,7 @@ local status = api.uci_get_type("global_other", "status", "") <%:Google Connection%>
- +
@@ -118,7 +118,7 @@ local status = api.uci_get_type("global_other", "status", "") <%:Instagram Connection%>
- +
diff --git a/luci-app-passwall/po/zh-cn/passwall.po b/luci-app-passwall/po/zh-cn/passwall.po index 679e63d7f..b7ed9c091 100644 --- a/luci-app-passwall/po/zh-cn/passwall.po +++ b/luci-app-passwall/po/zh-cn/passwall.po @@ -913,8 +913,8 @@ msgstr "订阅备注(机场)" msgid "Subscribe URL" msgstr "订阅网址" -msgid "Please input the subscription url first, save and submit before updating. If you subscribe to update, it is recommended to delete all subscriptions and then re-subscribe." -msgstr "请输入订阅网址保存应用后再更新,如果订阅节点更新了,建议删除所有订阅,然后重新订阅。" +msgid "Please input the subscription url first, save and submit before manual subscription." +msgstr "请输入订阅网址保存应用后再手动订阅。" msgid "Subscribe via proxy" msgstr "通过代理订阅" @@ -931,6 +931,9 @@ msgstr "删除所有订阅节点" msgid "Delete the subscribed node" msgstr "删除已订阅的节点" +msgid "This remark already exists, please change a new remark." +msgstr "此备注已存在,请改一个新的备注。" + msgid "Filter keyword Mode" msgstr "过滤关键字模式" @@ -940,6 +943,12 @@ msgstr "丢弃列表" msgid "Keep List" msgstr "保留列表" +msgid "Use global config" +msgstr "使用全局配置" + +msgid "User-Agent" +msgstr "用户代理(User-Agent)" + msgid "Add" msgstr "添加" diff --git a/luci-app-passwall/root/usr/share/passwall/0_default_config b/luci-app-passwall/root/usr/share/passwall/0_default_config index 2c4960f84..ae38e75bc 100644 --- a/luci-app-passwall/root/usr/share/passwall/0_default_config +++ b/luci-app-passwall/root/usr/share/passwall/0_default_config @@ -65,8 +65,6 @@ config global_app config global_subscribe option subscribe_proxy '0' - option auto_update_subscribe '0' - option allowInsecure '1' option filter_keyword_mode '1' list filter_discard_list '过期时间' list filter_discard_list '剩余流量' diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index 0cb2ead95..16242cfa6 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -949,7 +949,7 @@ clean_crontab() { #sed -i "/${CONFIG}/d" /etc/crontabs/root >/dev/null 2>&1 sed -i "/$(echo "/etc/init.d/${CONFIG}" | sed 's#\/#\\\/#g')/d" /etc/crontabs/root >/dev/null 2>&1 sed -i "/$(echo "lua ${APP_PATH}/rule_update.lua log" | sed 's#\/#\\\/#g')/d" /etc/crontabs/root >/dev/null 2>&1 - sed -i "/$(echo "lua ${APP_PATH}/subscribe.lua start log" | sed 's#\/#\\\/#g')/d" /etc/crontabs/root >/dev/null 2>&1 + sed -i "/$(echo "lua ${APP_PATH}/subscribe.lua start" | sed 's#\/#\\\/#g')/d" /etc/crontabs/root >/dev/null 2>&1 } start_crontab() { @@ -986,16 +986,20 @@ start_crontab() { echo "$t lua $APP_PATH/rule_update.lua log > /dev/null 2>&1 &" >>/etc/crontabs/root echolog "配置定时任务:自动更新规则。" fi - - autoupdatesubscribe=$(config_t_get global_subscribe auto_update_subscribe) - weekupdatesubscribe=$(config_t_get global_subscribe week_update_subscribe) - dayupdatesubscribe=$(config_t_get global_subscribe time_update_subscribe) - if [ "$autoupdatesubscribe" = "1" ]; then - local t="0 $dayupdatesubscribe * * $weekupdatesubscribe" - [ "$weekupdatesubscribe" = "7" ] && t="0 $dayupdatesubscribe * * *" - echo "$t lua $APP_PATH/subscribe.lua start log > /dev/null 2>&1 &" >>/etc/crontabs/root - echolog "配置定时任务:自动更新节点订阅。" - fi + + for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do + cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1) + remark=$(config_n_get $item remark) + auto_update=$(config_n_get $item auto_update) + week_update=$(config_n_get $item week_update) + time_update=$(config_n_get $item time_update) + if [ "$auto_update" = "1" ]; then + local t="0 $time_update * * $week_update" + [ "$week_update" = "7" ] && t="0 $time_update * * *" + echo "$t lua $APP_PATH/subscribe.lua start $cfgid > /dev/null 2>&1 &" >>/etc/crontabs/root + echolog "配置定时任务:自动更新【$remark】订阅。" + fi + done if [ "$NO_PROXY" == 0 ]; then start_daemon=$(config_t_get global_delay start_daemon 0) diff --git a/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/luci-app-passwall/root/usr/share/passwall/subscribe.lua index f988a2645..f8123d69f 100755 --- a/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -19,19 +19,42 @@ local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string. local jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify local b64decode = nixio.bin.b64decode local uci = luci.model.uci.cursor() -local allowInsecure_default = uci:get_bool(appname, "@global_subscribe[0]", "allowInsecure") -local ss_aead_type = uci:get(appname, "@global_subscribe[0]", "ss_aead_type") or "shadowsocks-libev" -local trojan_type = uci:get(appname, "@global_subscribe[0]", "trojan_type") or "trojan-plus" +uci:revert(appname) + local has_ss = api.is_finded("ss-redir") local has_ss_rust = api.is_finded("sslocal") local has_trojan_plus = api.is_finded("trojan-plus") local has_v2ray = api.is_finded("v2ray") local has_xray = api.is_finded("xray") local has_trojan_go = api.is_finded("trojan-go") -uci:revert(appname) +local allowInsecure_default = true +local ss_aead_type_default = uci:get(appname, "@global_subscribe[0]", "ss_aead_type") or "shadowsocks-libev" +local trojan_type_default = uci:get(appname, "@global_subscribe[0]", "trojan_type") or "trojan-plus" +-- 判断是否过滤节点关键字 +local filter_keyword_mode_default = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0" +local filter_keyword_discard_list_default = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {} +local filter_keyword_keep_list_default = uci:get(appname, "@global_subscribe[0]", "filter_keep_list") or {} +local function is_filter_keyword(value) + if filter_keyword_mode_default == "1" then + for k,v in ipairs(filter_keyword_discard_list_default) do + if value:find(v) then + return true + end + end + elseif filter_keyword_mode_default == "2" then + local result = true + for k,v in ipairs(filter_keyword_keep_list_default) do + if value:find(v) then + result = false + end + end + return result + end + return false +end local nodeResult = {} -- update result -local arg2 = arg[2] +local debug = false local ss_rust_encrypt_method_list = { "aes-128-gcm", "aes-256-gcm", "chacha20-ietf-poly1305" @@ -39,7 +62,7 @@ local ss_rust_encrypt_method_list = { local log = function(...) local result = os.date("%Y-%m-%d %H:%M:%S: ") .. table.concat({...}, " ") - if arg2 == "print" then + if debug == true then print(result) else local f, err = io.open("/var/log/" .. appname .. ".log", "a") @@ -259,29 +282,6 @@ do end end --- 判断是否过滤节点关键字 -local filter_keyword_mode = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0" -local filter_keyword_discard_list = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {} -local filter_keyword_keep_list = uci:get(appname, "@global_subscribe[0]", "filter_keep_list") or {} -local function is_filter_keyword(value) - if filter_keyword_mode == "1" then - for k,v in ipairs(filter_keyword_discard_list) do - if value:find(v) then - return true - end - end - elseif filter_keyword_mode == "2" then - local result = true - for k,v in ipairs(filter_keyword_keep_list) do - if value:find(v) then - result = false - end - end - return result - end - return false -end - -- 分割字符串 local function split(full, sep) if full then @@ -490,15 +490,15 @@ local function processData(szType, content, add_mode, add_from) end end if flag then - if ss_aead_type == "shadowsocks-libev" and has_ss then + if ss_aead_type_default == "shadowsocks-libev" and has_ss then result.type = "SS" - elseif ss_aead_type == "shadowsocks-rust" and has_ss_rust then + elseif ss_aead_type_default == "shadowsocks-rust" and has_ss_rust then result.type = 'SS-Rust' - elseif ss_aead_type == "v2ray" and has_v2ray and not result.plugin then + elseif ss_aead_type_default == "v2ray" and has_v2ray and not result.plugin then result.type = 'V2ray' result.protocol = 'shadowsocks' result.transport = 'tcp' - elseif ss_aead_type == "xray" and has_xray and not result.plugin then + elseif ss_aead_type_default == "xray" and has_xray and not result.plugin then result.type = 'Xray' result.protocol = 'shadowsocks' result.transport = 'tcp' @@ -568,15 +568,15 @@ local function processData(szType, content, add_mode, add_from) result.tls_serverName = peer and peer or sni result.tls_allowInsecure = allowInsecure and "1" or "0" end - if trojan_type == "trojan-plus" and has_trojan_plus then + if trojan_type_default == "trojan-plus" and has_trojan_plus then result.type = "Trojan-Plus" - elseif trojan_type == "v2ray" and has_v2ray then + elseif trojan_type_default == "v2ray" and has_v2ray then result.type = 'V2ray' result.protocol = 'trojan' - elseif trojan_type == "xray" and has_xray then + elseif trojan_type_default == "xray" and has_xray then result.type = 'Xray' result.protocol = 'trojan' - elseif trojan_type == "trojan-go" and has_trojan_go then + elseif trojan_type_default == "trojan-go" and has_trojan_go then result.type = 'Trojan-Go' end elseif szType == "trojan-go" then @@ -758,14 +758,12 @@ local function processData(szType, content, add_mode, add_from) end -- curl -local function curl(url, file) - local ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" - local a = "" - if luci.sys.call('curl --help all | grep "\\-\\-retry-all-errors" > /dev/null') == 0 then - a = "--retry-all-errors" +local function curl(url, file, ua) + if not ua or ua == "" then + ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" end local stdout = "" - local cmd = string.format('curl -skL --user-agent "%s" --retry 3 --connect-timeout 3 %s "%s"', ua, a, url) + local cmd = string.format('curl -skL --user-agent "%s" --retry 3 --connect-timeout 3 "%s"', ua, url) if file then cmd = cmd .. " -o " .. file stdout = luci.sys.call(cmd .. " > /dev/null") @@ -779,7 +777,7 @@ local function curl(url, file) if uci:get(appname, "@global_subscribe[0]", "subscribe_proxy") or "0" == "1" and uci:get(appname, "@global[0]", "enabled") or "0" == "1" then log('通过代理订阅失败,尝试关闭代理订阅。') luci.sys.call("/etc/init.d/" .. appname .. " stop > /dev/null") - stdout = luci.sys.exec(string.format('curl -skL --user-agent "%s" -k --retry 3 --connect-timeout 3 %s "%s"', ua, a, url)) + stdout = luci.sys.exec(string.format('curl -skL --user-agent "%s" -k --retry 3 --connect-timeout 3 "%s"', ua, url)) end end return trim(stdout) @@ -797,7 +795,13 @@ local function truncate_nodes(add_from) config.set(config) else if config.currentNode.add_mode == "2" then - config.set(config, "nil") + if add_from then + if config.currentNode.add_from and config.currentNode.add_from == add_from then + config.set(config, "nil") + end + else + config.set(config, "nil") + end if config.id then uci:delete(appname, config.id) end @@ -1068,45 +1072,64 @@ end local execute = function() do + local subscribe_list = {} local retry = {} - uci:foreach(appname, "subscribe_list", function(obj) - local enabled = obj.enabled or nil - if enabled and enabled == "1" then - local remark = obj.remark - local url = obj.url - log('正在订阅: ' .. url) - local raw = curl(url, "/tmp/" .. remark) - if raw == 0 then - local f = io.open("/tmp/" .. remark, "r") - local stdout = f:read("*all") - f:close() - raw = trim(stdout) - os.remove("/tmp/" .. remark) - parse_link(raw, "2", remark) - else - retry[#retry + 1] = obj - end + if arg[2] then + subscribe_list[#subscribe_list + 1] = uci:get_all(appname, arg[2]) or {} + end + + for index, value in ipairs(subscribe_list) do + local remark = value.remark + local url = value.url + if value.allowInsecure and value.allowInsecure ~= "1" then + allowInsecure_default = nil end - end) + local filter_keyword_mode = value.filter_keyword_mode or "3" + if filter_keyword_mode == "0" then + filter_keyword_mode_default = "0" + elseif filter_keyword_mode == "1" then + filter_keyword_mode_default = "1" + filter_keyword_discard_list_default = value.filter_discard_list or {} + elseif filter_keyword_mode == "2" then + filter_keyword_mode_default = "2" + filter_keyword_keep_list_default = value.filter_keep_list or {} + end + local ss_aead_type = value.ss_aead_type or "global" + if ss_aead_type ~= "global" then + ss_aead_type_default = ss_aead_type + end + local trojan_type = value.trojan_type or "global" + if trojan_type ~= "global" then + trojan_type_default = trojan_type + end + local ua = value.user_agent + log('正在订阅:【' .. remark .. '】' .. url) + local raw = curl(url, "/tmp/" .. remark, ua) + if raw == 0 then + local f = io.open("/tmp/" .. remark, "r") + local stdout = f:read("*all") + f:close() + raw = trim(stdout) + os.remove("/tmp/" .. remark) + parse_link(raw, "2", remark) + else + retry[#retry + 1] = value + end + allowInsecure_default = true + filter_keyword_mode_default = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0" + filter_keyword_discard_list_default = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {} + filter_keyword_keep_list_default = uci:get(appname, "@global_subscribe[0]", "filter_keep_list") or {} + ss_aead_type_default = uci:get(appname, "@global_subscribe[0]", "ss_aead_type") or "shadowsocks-libev" + trojan_type_default = uci:get(appname, "@global_subscribe[0]", "trojan_type") or "trojan-plus" + end + if #retry > 0 then - if (uci:get(appname, "@global_subscribe[0]", "subscribe_proxy") or "0") == "1" and (uci:get(appname, "@global[0]", "enabled") or "0") == "1" then - log('通过代理订阅失败,尝试关闭代理订阅。') - luci.sys.call("/etc/init.d/" .. appname .. " stop > /dev/null") - for index, value in ipairs(retry) do - log('正在订阅: ' .. value.url) - local raw = curl(value.url, "/tmp/" .. value.remark) - if raw == 0 then - local f = io.open("/tmp/" .. value.remark, "r") - local stdout = f:read("*all") - f:close() - raw = trim(stdout) - os.remove("/tmp/" .. value.remark) - parse_link(raw, "2", value.remark) - else - log(value.remark .. '订阅失败,可能是订阅地址失效,或是网络问题,请检测。') - end + for index, value in ipairs(retry) do + if (uci:get(appname, "@global_subscribe[0]", "subscribe_proxy") or "0") == "1" and (uci:get(appname, "@global[0]", "enabled") or "0") == "1" then + log(value.remark .. '订阅失败,请尝试关闭代理后再订阅。') + else + log(value.remark .. '订阅失败,可能是订阅地址失效,或是网络问题,请诊断!') end - luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &") end end update_node(0) @@ -1115,18 +1138,13 @@ end if arg[1] then if arg[1] == "start" then - local count = luci.sys.exec("echo -n $(uci show " .. appname .. " | grep @subscribe_list | grep -c \"enabled='1'\")") - if count and tonumber(count) > 0 then - log('开始订阅...') - xpcall(execute, function(e) - log(e) - log(debug.traceback()) - log('发生错误, 正在恢复服务') - end) - log('订阅完毕...') - else - log('未设置订阅或未启用订阅, 请检查设置...') - end + log('开始订阅...') + xpcall(execute, function(e) + log(e) + log(debug.traceback()) + log('发生错误, 正在恢复服务') + end) + log('订阅完毕...') elseif arg[1] == "add" then local f = assert(io.open("/tmp/links.conf", 'r')) local content = f:read('*all') diff --git a/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js b/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js index 549482b46..da0b97442 100644 --- a/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js +++ b/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js @@ -22,6 +22,7 @@ 'require uci'; 'require form'; 'require rpc'; +'require view'; var conf = 'smartdns'; var callServiceList = rpc.declare({ @@ -115,7 +116,7 @@ function smartdnsRenderStatus(res) { return renderHTML; } -return L.view.extend({ +return view.extend({ load: function () { return Promise.all([ uci.load('smartdns'),