From 4331a6b82cb067b016eb34e63711928f85d42005 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 17 Sep 2026 14:25:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B6=20Sync=202026-09-17=2014:25:52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../htdocs/luci-static/resources/fchomo.js | 13 ++++ .../luci-static/resources/view/fchomo/node.js | 21 +++++- luci-app-fchomo/po/templates/fchomo.pot | 67 +++++++++++-------- luci-app-fchomo/po/zh_Hans/fchomo.po | 67 +++++++++++-------- luci-app-fchomo/po/zh_Hant/fchomo.po | 67 +++++++++++-------- .../root/usr/share/rpcd/ucode/luci.fchomo | 14 ++++ luci-app-fwlive/Makefile | 4 +- luci-app-fwlive/README.md | 1 + .../luci-static/resources/fwlive/constants.js | 2 +- .../resources/fwlive/render-policy.js | 53 +++++++++++++++ .../resources/view/status/fwlive.js | 28 ++++---- .../luci/menu.d/luci-app-quickstart.json | 10 --- .../luci/menu.d/zz-luci-app-quickstart.json | 9 +++ 13 files changed, 240 insertions(+), 116 deletions(-) create mode 100644 luci-app-fwlive/htdocs/luci-static/resources/fwlive/render-policy.js delete mode 100644 luci-app-quickstart/root/usr/share/luci/menu.d/luci-app-quickstart.json create mode 100644 luci-app-quickstart/root/usr/share/luci/menu.d/zz-luci-app-quickstart.json diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js index be5df6670..2608ee75f 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js @@ -1402,6 +1402,16 @@ function yaml2json(content, command) { return callYaml2Json(content, command).then(res => res.result); } +function yamlfile2json(type, filename, command) { + const callYamlfile2Json = rpc.declare({ + object: 'luci.fchomo', + method: 'yamlfile2json', + params: ['type', 'filename', 'command'], + expect: { '': {} } + }); + + return callYamlfile2Json(type, filename, command).then(res => res.result); +} function isEmpty(res) { if (res == null) return true; // null, undefined @@ -1623,6 +1633,8 @@ function renderResDownload(section_id) { if (type === 'http') { return downloadFile(section_type, section_id, url, header).then((res) => { ui.addNotification(null, E('p', _('Download successful.')), 'info'); + if (this.callback) + this.callback(section_type, section_id); }).catch((e) => { ui.addNotification(null, E('p', _('Download failed: %s').format(e)), 'error'); }); @@ -2188,6 +2200,7 @@ return baseclass.extend({ shuffle, json2yaml, yaml2json, + yamlfile2json, isEmpty, removeBlankAttrs, toUciname, diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js index b98ce1934..9e771fa38 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js @@ -2701,7 +2701,26 @@ return view.extend({ so.modalonly = true; so = ss.option(form.DummyValue, '_update'); - so.cfgvalue = hm.renderResDownload; + so.cfgvalue = function(section_id, set_value) { + const section_type = this.section.sectiontype; + + // For providers that use private DNS to resolve node domains. + const command = '.dns | [keys[] | select(. == "proxy-server-nameserver" or . == "proxy-server-nameserver-policy" or . == "nameserver-policy")]'; + + this.callback = L.bind(function(command, section_type, section_id) { + return hm.yamlfile2json(section_type, section_id, command).then((res) => { + if (res.length > 0) { + const label = this.map.data.get(this.section.config, section_id, 'label'); + ui.addNotification(null, E('p', + _('Note: The subscription of provider %s is includes %s.').format(label || section_id, res.map(v => `dns.${v}`).join(', ')) + '
' + + _('Recommended to adjust Client DNS configuration based on actual conditions.')), + 'warning'); + } + }); + }, this, command); + + return hm.renderResDownload.apply(this, arguments); + } so.editable = true; so.modalonly = false; diff --git a/luci-app-fchomo/po/templates/fchomo.pot b/luci-app-fchomo/po/templates/fchomo.pot index b508e7fe6..a00f415eb 100644 --- a/luci-app-fchomo/po/templates/fchomo.pot +++ b/luci-app-fchomo/po/templates/fchomo.pot @@ -68,10 +68,10 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1117 #: htdocs/luci-static/resources/view/fchomo/client.js:1373 #: htdocs/luci-static/resources/view/fchomo/node.js:305 -#: htdocs/luci-static/resources/view/fchomo/node.js:2751 -#: htdocs/luci-static/resources/view/fchomo/node.js:2762 +#: htdocs/luci-static/resources/view/fchomo/node.js:2770 #: htdocs/luci-static/resources/view/fchomo/node.js:2781 -#: htdocs/luci-static/resources/view/fchomo/node.js:2792 +#: htdocs/luci-static/resources/view/fchomo/node.js:2800 +#: htdocs/luci-static/resources/view/fchomo/node.js:2811 msgid "-- Please choose --" msgstr "" @@ -230,7 +230,7 @@ msgstr "" msgid "Add a provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Add a proxy chain" msgstr "" @@ -803,11 +803,11 @@ msgstr "" msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2748 +#: htdocs/luci-static/resources/view/fchomo/node.js:2767 msgid "Destination provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2759 +#: htdocs/luci-static/resources/view/fchomo/node.js:2778 msgid "Destination proxy node" msgstr "" @@ -815,8 +815,8 @@ msgstr "" msgid "Dial fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 msgid "Different chain head/tail" msgstr "" @@ -905,11 +905,11 @@ msgstr "" msgid "Download bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1627 +#: htdocs/luci-static/resources/fchomo.js:1639 msgid "Download failed: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1625 +#: htdocs/luci-static/resources/fchomo.js:1635 msgid "Download successful." msgstr "" @@ -992,7 +992,7 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:267 #: htdocs/luci-static/resources/view/fchomo/node.js:2358 #: htdocs/luci-static/resources/view/fchomo/node.js:2640 -#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2754 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:274 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" @@ -1159,8 +1159,8 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:900 #: htdocs/luci-static/resources/view/fchomo/node.js:1414 #: htdocs/luci-static/resources/view/fchomo/node.js:1541 -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:302 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:316 msgid "Expecting: %s" @@ -1885,7 +1885,7 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1878 #: htdocs/luci-static/resources/view/fchomo/node.js:262 #: htdocs/luci-static/resources/view/fchomo/node.js:2353 -#: htdocs/luci-static/resources/view/fchomo/node.js:2730 +#: htdocs/luci-static/resources/view/fchomo/node.js:2749 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:269 msgid "Label" msgstr "" @@ -2336,10 +2336,14 @@ msgstr "" msgid "Not Installed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Not Running" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/node.js:2715 +msgid "Note: The subscription of provider %s is includes %s." +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/node.js:490 msgid "OFF" msgstr "" @@ -2409,7 +2413,7 @@ msgstr "" msgid "Only the address %s is valid." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1589 msgid "Open Dashboard" msgstr "" @@ -2702,7 +2706,7 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1112 #: htdocs/luci-static/resources/view/fchomo/node.js:2222 #: htdocs/luci-static/resources/view/fchomo/node.js:2231 -#: htdocs/luci-static/resources/view/fchomo/node.js:2741 +#: htdocs/luci-static/resources/view/fchomo/node.js:2760 msgid "Provider" msgstr "" @@ -2729,12 +2733,12 @@ msgid "Proxy MAC-s" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:225 -#: htdocs/luci-static/resources/view/fchomo/node.js:2740 +#: htdocs/luci-static/resources/view/fchomo/node.js:2759 msgid "Proxy Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2716 -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Proxy chain" msgstr "" @@ -2856,6 +2860,11 @@ msgstr "" msgid "Realm name pattern" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/node.js:2716 +msgid "" +"Recommended to adjust Client DNS configuration based on actual conditions." +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redir port" msgstr "" @@ -2880,7 +2889,7 @@ msgstr "" msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1572 +#: htdocs/luci-static/resources/fchomo.js:1582 #: htdocs/luci-static/resources/view/fchomo/client.js:970 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -3085,7 +3094,7 @@ msgstr "" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Running" msgstr "" @@ -3610,11 +3619,11 @@ msgstr "" msgid "Traffic pattern" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2778 +#: htdocs/luci-static/resources/view/fchomo/node.js:2797 msgid "Transit proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2789 +#: htdocs/luci-static/resources/view/fchomo/node.js:2808 msgid "Transit proxy node" msgstr "" @@ -3685,7 +3694,7 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1073 #: htdocs/luci-static/resources/view/fchomo/node.js:271 #: htdocs/luci-static/resources/view/fchomo/node.js:2362 -#: htdocs/luci-static/resources/view/fchomo/node.js:2739 +#: htdocs/luci-static/resources/view/fchomo/node.js:2758 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Type" msgstr "" @@ -3748,7 +3757,7 @@ msgstr "" msgid "UUID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1630 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Unable to download unsupported type: %s" msgstr "" @@ -3940,7 +3949,7 @@ msgid "Valid 16-digit Moon World ID and 10-digit Node ID of Moon Root server." msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:2368 -#: htdocs/luci-static/resources/view/fchomo/node.js:2745 +#: htdocs/luci-static/resources/view/fchomo/node.js:2764 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:330 msgid "Value" msgstr "" @@ -4249,7 +4258,7 @@ msgstr "" msgid "least one keypair required" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:2710 +#: htdocs/luci-static/resources/view/fchomo/node.js:2729 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:435 msgid "luci-app-tinyfilemanager is not installed, please install it first." msgstr "" @@ -4514,6 +4523,6 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1632 +#: htdocs/luci-static/resources/fchomo.js:1644 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/po/zh_Hans/fchomo.po b/luci-app-fchomo/po/zh_Hans/fchomo.po index 1d86ee1a8..f6a4cbdcb 100644 --- a/luci-app-fchomo/po/zh_Hans/fchomo.po +++ b/luci-app-fchomo/po/zh_Hans/fchomo.po @@ -75,10 +75,10 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1117 #: htdocs/luci-static/resources/view/fchomo/client.js:1373 #: htdocs/luci-static/resources/view/fchomo/node.js:305 -#: htdocs/luci-static/resources/view/fchomo/node.js:2751 -#: htdocs/luci-static/resources/view/fchomo/node.js:2762 +#: htdocs/luci-static/resources/view/fchomo/node.js:2770 #: htdocs/luci-static/resources/view/fchomo/node.js:2781 -#: htdocs/luci-static/resources/view/fchomo/node.js:2792 +#: htdocs/luci-static/resources/view/fchomo/node.js:2800 +#: htdocs/luci-static/resources/view/fchomo/node.js:2811 msgid "-- Please choose --" msgstr "-- 请选择 --" @@ -239,7 +239,7 @@ msgstr "新增 入站" msgid "Add a provider" msgstr "新增 供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Add a proxy chain" msgstr "新增 代理链" @@ -817,11 +817,11 @@ msgstr "从私钥派生" msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允许通过 WireGuard 转发的目的地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:2748 +#: htdocs/luci-static/resources/view/fchomo/node.js:2767 msgid "Destination provider" msgstr "落地供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:2759 +#: htdocs/luci-static/resources/view/fchomo/node.js:2778 msgid "Destination proxy node" msgstr "落地代理节点" @@ -829,8 +829,8 @@ msgstr "落地代理节点" msgid "Dial fields" msgstr "拨号字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 msgid "Different chain head/tail" msgstr "不同的链头/链尾" @@ -921,11 +921,11 @@ msgstr "下载带宽" msgid "Download bandwidth in Mbps." msgstr "下载带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1627 +#: htdocs/luci-static/resources/fchomo.js:1639 msgid "Download failed: %s" msgstr "下载失败: %s" -#: htdocs/luci-static/resources/fchomo.js:1625 +#: htdocs/luci-static/resources/fchomo.js:1635 msgid "Download successful." msgstr "下载成功。" @@ -1008,7 +1008,7 @@ msgstr "为空时回退" #: htdocs/luci-static/resources/view/fchomo/node.js:267 #: htdocs/luci-static/resources/view/fchomo/node.js:2358 #: htdocs/luci-static/resources/view/fchomo/node.js:2640 -#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2754 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:274 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" @@ -1181,8 +1181,8 @@ msgstr "预期状态" #: htdocs/luci-static/resources/view/fchomo/node.js:900 #: htdocs/luci-static/resources/view/fchomo/node.js:1414 #: htdocs/luci-static/resources/view/fchomo/node.js:1541 -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:302 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:316 msgid "Expecting: %s" @@ -1913,7 +1913,7 @@ msgstr "L2" #: htdocs/luci-static/resources/view/fchomo/client.js:1878 #: htdocs/luci-static/resources/view/fchomo/node.js:262 #: htdocs/luci-static/resources/view/fchomo/node.js:2353 -#: htdocs/luci-static/resources/view/fchomo/node.js:2730 +#: htdocs/luci-static/resources/view/fchomo/node.js:2749 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:269 msgid "Label" msgstr "标签" @@ -2368,10 +2368,14 @@ msgstr "正常" msgid "Not Installed" msgstr "未安装" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Not Running" msgstr "未在运行" +#: htdocs/luci-static/resources/view/fchomo/node.js:2715 +msgid "Note: The subscription of provider %s is includes %s." +msgstr "注意:供应商 %s 的订阅包含 %s。" + #: htdocs/luci-static/resources/view/fchomo/node.js:490 msgid "OFF" msgstr "" @@ -2441,7 +2445,7 @@ msgstr "只处理来自指定接口的流量。留空表示全部。" msgid "Only the address %s is valid." msgstr "只有地址 %s 是有效的。" -#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1589 msgid "Open Dashboard" msgstr "打开面板" @@ -2737,7 +2741,7 @@ msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启 #: htdocs/luci-static/resources/view/fchomo/client.js:1112 #: htdocs/luci-static/resources/view/fchomo/node.js:2222 #: htdocs/luci-static/resources/view/fchomo/node.js:2231 -#: htdocs/luci-static/resources/view/fchomo/node.js:2741 +#: htdocs/luci-static/resources/view/fchomo/node.js:2760 msgid "Provider" msgstr "供应商" @@ -2764,12 +2768,12 @@ msgid "Proxy MAC-s" msgstr "代理 MAC 地址" #: htdocs/luci-static/resources/view/fchomo/node.js:225 -#: htdocs/luci-static/resources/view/fchomo/node.js:2740 +#: htdocs/luci-static/resources/view/fchomo/node.js:2759 msgid "Proxy Node" msgstr "代理节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:2716 -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Proxy chain" msgstr "代理链" @@ -2891,6 +2895,11 @@ msgstr "Realm ID" msgid "Realm name pattern" msgstr "Realm 名称模式" +#: htdocs/luci-static/resources/view/fchomo/node.js:2716 +msgid "" +"Recommended to adjust Client DNS configuration based on actual conditions." +msgstr "建议根据实际情况调整客户端 DNS 配置。" + #: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redir port" msgstr "Redir 端口" @@ -2915,7 +2924,7 @@ msgstr "降低后台流量和网络配置刷新频率。" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1572 +#: htdocs/luci-static/resources/fchomo.js:1582 #: htdocs/luci-static/resources/view/fchomo/client.js:970 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -3120,7 +3129,7 @@ msgstr "规则集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Running" msgstr "正在运行" @@ -3651,11 +3660,11 @@ msgstr "Tproxy 端口" msgid "Traffic pattern" msgstr "流量模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:2778 +#: htdocs/luci-static/resources/view/fchomo/node.js:2797 msgid "Transit proxy group" msgstr "中转代理组" -#: htdocs/luci-static/resources/view/fchomo/node.js:2789 +#: htdocs/luci-static/resources/view/fchomo/node.js:2808 msgid "Transit proxy node" msgstr "中转代理节点" @@ -3726,7 +3735,7 @@ msgstr "关闭 TCP 中继。" #: htdocs/luci-static/resources/view/fchomo/client.js:1073 #: htdocs/luci-static/resources/view/fchomo/node.js:271 #: htdocs/luci-static/resources/view/fchomo/node.js:2362 -#: htdocs/luci-static/resources/view/fchomo/node.js:2739 +#: htdocs/luci-static/resources/view/fchomo/node.js:2758 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Type" msgstr "类型" @@ -3789,7 +3798,7 @@ msgstr "自动选择" msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1630 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Unable to download unsupported type: %s" msgstr "无法下载不支持的类型: %s" @@ -3981,7 +3990,7 @@ msgid "Valid 16-digit Moon World ID and 10-digit Node ID of Moon Root server." msgstr "有效的 16-位数 Moon World ID 和 10-位数 Moon Root 服务器 Node ID。" #: htdocs/luci-static/resources/view/fchomo/node.js:2368 -#: htdocs/luci-static/resources/view/fchomo/node.js:2745 +#: htdocs/luci-static/resources/view/fchomo/node.js:2764 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:330 msgid "Value" msgstr "可视化值" @@ -4290,7 +4299,7 @@ msgstr "" msgid "least one keypair required" msgstr "至少需要一对密钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:2710 +#: htdocs/luci-static/resources/view/fchomo/node.js:2729 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:435 msgid "luci-app-tinyfilemanager is not installed, please install it first." msgstr "luci-app-tinyfilemanager 未安装,请先安装它。" @@ -4555,7 +4564,7 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1632 +#: htdocs/luci-static/resources/fchomo.js:1644 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/po/zh_Hant/fchomo.po b/luci-app-fchomo/po/zh_Hant/fchomo.po index fa7d3d91f..9ed7297b6 100644 --- a/luci-app-fchomo/po/zh_Hant/fchomo.po +++ b/luci-app-fchomo/po/zh_Hant/fchomo.po @@ -75,10 +75,10 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1117 #: htdocs/luci-static/resources/view/fchomo/client.js:1373 #: htdocs/luci-static/resources/view/fchomo/node.js:305 -#: htdocs/luci-static/resources/view/fchomo/node.js:2751 -#: htdocs/luci-static/resources/view/fchomo/node.js:2762 +#: htdocs/luci-static/resources/view/fchomo/node.js:2770 #: htdocs/luci-static/resources/view/fchomo/node.js:2781 -#: htdocs/luci-static/resources/view/fchomo/node.js:2792 +#: htdocs/luci-static/resources/view/fchomo/node.js:2800 +#: htdocs/luci-static/resources/view/fchomo/node.js:2811 msgid "-- Please choose --" msgstr "-- 請選擇 --" @@ -239,7 +239,7 @@ msgstr "新增 入站" msgid "Add a provider" msgstr "新增 供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Add a proxy chain" msgstr "新增 代理鏈" @@ -817,11 +817,11 @@ msgstr "從私鑰派生" msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允許通過 WireGuard 轉發的目的位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:2748 +#: htdocs/luci-static/resources/view/fchomo/node.js:2767 msgid "Destination provider" msgstr "落地供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:2759 +#: htdocs/luci-static/resources/view/fchomo/node.js:2778 msgid "Destination proxy node" msgstr "落地代理節點" @@ -829,8 +829,8 @@ msgstr "落地代理節點" msgid "Dial fields" msgstr "撥號欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 msgid "Different chain head/tail" msgstr "不同的鏈頭/鏈尾" @@ -921,11 +921,11 @@ msgstr "下載頻寬" msgid "Download bandwidth in Mbps." msgstr "下載頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1627 +#: htdocs/luci-static/resources/fchomo.js:1639 msgid "Download failed: %s" msgstr "下載失敗: %s" -#: htdocs/luci-static/resources/fchomo.js:1625 +#: htdocs/luci-static/resources/fchomo.js:1635 msgid "Download successful." msgstr "下載成功。" @@ -1008,7 +1008,7 @@ msgstr "為空時回退" #: htdocs/luci-static/resources/view/fchomo/node.js:267 #: htdocs/luci-static/resources/view/fchomo/node.js:2358 #: htdocs/luci-static/resources/view/fchomo/node.js:2640 -#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2754 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:274 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" @@ -1181,8 +1181,8 @@ msgstr "預期狀態" #: htdocs/luci-static/resources/view/fchomo/node.js:900 #: htdocs/luci-static/resources/view/fchomo/node.js:1414 #: htdocs/luci-static/resources/view/fchomo/node.js:1541 -#: htdocs/luci-static/resources/view/fchomo/node.js:2771 -#: htdocs/luci-static/resources/view/fchomo/node.js:2801 +#: htdocs/luci-static/resources/view/fchomo/node.js:2790 +#: htdocs/luci-static/resources/view/fchomo/node.js:2820 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:302 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:316 msgid "Expecting: %s" @@ -1913,7 +1913,7 @@ msgstr "L2" #: htdocs/luci-static/resources/view/fchomo/client.js:1878 #: htdocs/luci-static/resources/view/fchomo/node.js:262 #: htdocs/luci-static/resources/view/fchomo/node.js:2353 -#: htdocs/luci-static/resources/view/fchomo/node.js:2730 +#: htdocs/luci-static/resources/view/fchomo/node.js:2749 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:269 msgid "Label" msgstr "標籤" @@ -2368,10 +2368,14 @@ msgstr "正常" msgid "Not Installed" msgstr "未安裝" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Not Running" msgstr "未在運作" +#: htdocs/luci-static/resources/view/fchomo/node.js:2715 +msgid "Note: The subscription of provider %s is includes %s." +msgstr "注意:供應商 %s 的訂閱包含 %s。" + #: htdocs/luci-static/resources/view/fchomo/node.js:490 msgid "OFF" msgstr "" @@ -2441,7 +2445,7 @@ msgstr "只處理來自指定介面的流量。留空表示全部。" msgid "Only the address %s is valid." msgstr "只有位址 %s 是有效的。" -#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1589 msgid "Open Dashboard" msgstr "打開面板" @@ -2737,7 +2741,7 @@ msgstr "協議參數。 如啟用會隨機浪費流量(在 v2ray 中預設為 #: htdocs/luci-static/resources/view/fchomo/client.js:1112 #: htdocs/luci-static/resources/view/fchomo/node.js:2222 #: htdocs/luci-static/resources/view/fchomo/node.js:2231 -#: htdocs/luci-static/resources/view/fchomo/node.js:2741 +#: htdocs/luci-static/resources/view/fchomo/node.js:2760 msgid "Provider" msgstr "供應商" @@ -2764,12 +2768,12 @@ msgid "Proxy MAC-s" msgstr "代理 MAC 位址" #: htdocs/luci-static/resources/view/fchomo/node.js:225 -#: htdocs/luci-static/resources/view/fchomo/node.js:2740 +#: htdocs/luci-static/resources/view/fchomo/node.js:2759 msgid "Proxy Node" msgstr "代理節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:2716 -#: htdocs/luci-static/resources/view/fchomo/node.js:2725 +#: htdocs/luci-static/resources/view/fchomo/node.js:2735 +#: htdocs/luci-static/resources/view/fchomo/node.js:2744 msgid "Proxy chain" msgstr "代理鏈" @@ -2891,6 +2895,11 @@ msgstr "Realm ID" msgid "Realm name pattern" msgstr "Realm 名稱模式" +#: htdocs/luci-static/resources/view/fchomo/node.js:2716 +msgid "" +"Recommended to adjust Client DNS configuration based on actual conditions." +msgstr "建議根據實際情況調整客戶端 DNS 配置。" + #: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redir port" msgstr "Redir 連接埠" @@ -2915,7 +2924,7 @@ msgstr "降低後台流量和網路配置刷新頻率。" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1572 +#: htdocs/luci-static/resources/fchomo.js:1582 #: htdocs/luci-static/resources/view/fchomo/client.js:970 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -3120,7 +3129,7 @@ msgstr "規則集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1585 +#: htdocs/luci-static/resources/fchomo.js:1595 msgid "Running" msgstr "正在運作" @@ -3651,11 +3660,11 @@ msgstr "Tproxy 連接埠" msgid "Traffic pattern" msgstr "流量模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:2778 +#: htdocs/luci-static/resources/view/fchomo/node.js:2797 msgid "Transit proxy group" msgstr "中轉代理組" -#: htdocs/luci-static/resources/view/fchomo/node.js:2789 +#: htdocs/luci-static/resources/view/fchomo/node.js:2808 msgid "Transit proxy node" msgstr "中轉代理節點" @@ -3726,7 +3735,7 @@ msgstr "關閉 TCP 中繼。" #: htdocs/luci-static/resources/view/fchomo/client.js:1073 #: htdocs/luci-static/resources/view/fchomo/node.js:271 #: htdocs/luci-static/resources/view/fchomo/node.js:2362 -#: htdocs/luci-static/resources/view/fchomo/node.js:2739 +#: htdocs/luci-static/resources/view/fchomo/node.js:2758 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Type" msgstr "類型" @@ -3789,7 +3798,7 @@ msgstr "自動選擇" msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1630 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Unable to download unsupported type: %s" msgstr "無法下載不支援的類型: %s" @@ -3981,7 +3990,7 @@ msgid "Valid 16-digit Moon World ID and 10-digit Node ID of Moon Root server." msgstr "有效的 16-位數 Moon World ID 和 10-位數 Moon Root 伺服器 Node ID。" #: htdocs/luci-static/resources/view/fchomo/node.js:2368 -#: htdocs/luci-static/resources/view/fchomo/node.js:2745 +#: htdocs/luci-static/resources/view/fchomo/node.js:2764 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:330 msgid "Value" msgstr "可視化值" @@ -4290,7 +4299,7 @@ msgstr "" msgid "least one keypair required" msgstr "至少需要一對密鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:2710 +#: htdocs/luci-static/resources/view/fchomo/node.js:2729 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:435 msgid "luci-app-tinyfilemanager is not installed, please install it first." msgstr "luci-app-tinyfilemanager 未安裝,請先安裝它。" @@ -4555,7 +4564,7 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1632 +#: htdocs/luci-static/resources/fchomo.js:1644 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo index 143672d84..613c6723a 100644 --- a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo +++ b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo @@ -319,6 +319,20 @@ const methods = { } }, + yamlfile2json: { + args: { type: 'type', filename: 'filename', command: 'command' }, + call: function(req) { + if (!(req.args?.type in RES_TYPE)) + return { content: null, error: 'illegal type' }; + + if ((!req.args?.filename) || match(req.args?.filename, /\.\.\//)) + return { content: null, error: 'illegal filename' }; + + const filepath = `${HM_DIR}/${req.args?.type}/${req.args?.filename}`; + return { result: json(trim(yqReadFile('-oj', req.args?.command || '.', filepath)) || '{}') }; + } + }, + dir_ls: { args: { type: 'type' }, call: function(req) { diff --git a/luci-app-fwlive/Makefile b/luci-app-fwlive/Makefile index c761cb0fb..5108a5e99 100644 --- a/luci-app-fwlive/Makefile +++ b/luci-app-fwlive/Makefile @@ -11,8 +11,8 @@ LUCI_DESCRIPTION:=Live firewall log table (nftables/fw4 and iptables LOG) with f LUCI_DEPENDS:=+luci-base +logd +jsonfilter LUCI_PKGARCH:=all -PKG_VERSION:=0.1.41 -PKG_RELEASE:=21 +PKG_VERSION:=0.1.42 +PKG_RELEASE:=22 # Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI). ifdef SOURCE_DATE_EPOCH diff --git a/luci-app-fwlive/README.md b/luci-app-fwlive/README.md index 87e603d57..2c5c2d79a 100644 --- a/luci-app-fwlive/README.md +++ b/luci-app-fwlive/README.md @@ -18,6 +18,7 @@ LuCI **Firewall Live View** — client-side JS view polling `ubus fwlive poll` ( | `htdocs/luci-static/resources/fwlive/table.js` | Table thead/rows DOM renderer (`renderThead`, `renderRows`) | | `htdocs/luci-static/resources/fwlive/buffer.js` | Ring-buffer apply/merge helpers (pause ingest + resume merge) | | `htdocs/luci-static/resources/fwlive/poll-coordinator.js` | Request coalescing, visibility, cadence, and disposal | +| `htdocs/luci-static/resources/fwlive/render-policy.js` | Pure weak-device display-cap and render-cost decisions | | `htdocs/luci-static/resources/fwlive/hostname.js` | Hostname cache LRU + failure TTL helpers | | `root/usr/share/luci/menu.d/*.json` | Menu entry (`admin/status/fwlive`) | | `root/usr/share/rpcd/acl.d/*.json` | ubus ACL (read + write for logging enable/disable) | diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/constants.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/constants.js index a1a8a9de4..9d90f0b23 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/constants.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/constants.js @@ -9,7 +9,7 @@ */ return baseclass.extend({ /* Keep in sync with openwrt-feed/luci-app-fwlive/Makefile PKG_VERSION. */ - APP_VERSION: '0.1.41', + APP_VERSION: '0.1.42', ROW_LIMIT_OPTIONS: [25, 50, 100, 250, 500, 1000, 2000], DEFAULT_ROW_LIMIT: 100, FETCH_MODE_OPTIONS: ['auto', 'manual'], diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/render-policy.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/render-policy.js new file mode 100644 index 000000000..758f796d0 --- /dev/null +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/render-policy.js @@ -0,0 +1,53 @@ +'use strict'; +/* SPDX-License-Identifier: Apache-2.0 */ +/* Copyright 2025-2026 Lucas Albers */ + +'require baseclass'; + +/* Pure render-policy decisions for the fwlive view. The module does not + * mutate state, schedule work, inspect the DOM, or know how rows render. */ + +/** + * @param {object} opts + * @param {number} opts.rowLimit - User-selected stored-row limit. + * @param {boolean} opts.weakDevice - Whether the weak-device cap is active. + * @param {number} opts.weakDeviceDisplayRowCap - Maximum visible rows when capped. + * @returns {number} Maximum rows to render. + */ +function displayRowCap(opts) { + opts = opts || {}; + return opts.weakDevice ? Math.min(opts.rowLimit, opts.weakDeviceDisplayRowCap) : opts.rowLimit; +} + +/** + * Calculate the token cost for the next render. + * + * @param {object} opts + * @param {number} opts.visibleRowCount - Number of candidate visible rows. + * @param {*} opts.visibleHeadId - First candidate row identity. + * @param {number} opts.lastRenderedRowCount - Count from the previous render. + * @param {*} opts.lastRenderedHeadId - First row identity from the previous render. + * @param {number} opts.lastBatchNewIdCount - Session-new IDs in the last batch. + * @returns {number} Token cost for the next render. + */ +function renderCost(opts) { + opts = opts || {}; + + const count = opts.visibleRowCount || 0; + const headId = count ? opts.visibleHeadId : ''; + const lastRenderedRowCount = opts.lastRenderedRowCount || 0; + const lastRenderedHeadId = opts.lastRenderedHeadId || ''; + + /* This cheap identity check intentionally does not compare full row content. */ + if (!count && !lastRenderedRowCount) return 0; + if (count === lastRenderedRowCount && headId === lastRenderedHeadId) return 0; + + /* Count changes must stay cheap so Limit/filter/trim updates remain paintable. */ + if (count !== lastRenderedRowCount) return 1; + return Math.max(1, opts.lastBatchNewIdCount || 1); +} + +return baseclass.extend({ + displayRowCap: displayRowCap, + renderCost: renderCost +}); diff --git a/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js b/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js index 30efec61e..48352c1c6 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js @@ -20,6 +20,7 @@ 'require fwlive.hostname as hostname'; 'require fwlive.proto as proto'; 'require fwlive.poll-coordinator as pollCoordinator'; +'require fwlive.render-policy as renderPolicy'; const callFwlivePoll = rpc.declare({ object: 'fwlive', @@ -985,9 +986,11 @@ return view.extend({ }, displayRowCap() { - return this.weakDevice - ? Math.min(this.rowLimit, constants.WEAK_DEVICE_DISPLAY_ROW_CAP) - : this.rowLimit; + return renderPolicy.displayRowCap({ + rowLimit: this.rowLimit, + weakDevice: this.weakDevice, + weakDeviceDisplayRowCap: constants.WEAK_DEVICE_DISPLAY_ROW_CAP + }); }, statusSuffix() { @@ -1343,18 +1346,13 @@ return view.extend({ const count = rows ? rows.length : 0; const headId = count ? rows[0].id : ''; - if (!count && !this.lastRenderedRowCount) return 0; - - if (count === this.lastRenderedRowCount && headId === this.lastRenderedHeadId) return 0; - - /* - * Visible row-count changes (Limit up/down, trim) must not be skipped by - * the flood throttle — otherwise status can show N/limit while the table - * still paints the previous size under ping -A. - */ - if (count !== this.lastRenderedRowCount) return 1; - - return Math.max(1, this.lastBatchNewIdCount || 1); + return renderPolicy.renderCost({ + visibleRowCount: count, + visibleHeadId: headId, + lastRenderedRowCount: this.lastRenderedRowCount, + lastRenderedHeadId: this.lastRenderedHeadId, + lastBatchNewIdCount: this.lastBatchNewIdCount + }); }, updateFloodBanner() { diff --git a/luci-app-quickstart/root/usr/share/luci/menu.d/luci-app-quickstart.json b/luci-app-quickstart/root/usr/share/luci/menu.d/luci-app-quickstart.json deleted file mode 100644 index d1667bb68..000000000 --- a/luci-app-quickstart/root/usr/share/luci/menu.d/luci-app-quickstart.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "admin/quickstart/*": { - "title": "QuickStart", - "order": 1, - "action": { - "type": "template", - "path": "quickstart/home" - } - } -} \ No newline at end of file diff --git a/luci-app-quickstart/root/usr/share/luci/menu.d/zz-luci-app-quickstart.json b/luci-app-quickstart/root/usr/share/luci/menu.d/zz-luci-app-quickstart.json new file mode 100644 index 000000000..f97d1f14c --- /dev/null +++ b/luci-app-quickstart/root/usr/share/luci/menu.d/zz-luci-app-quickstart.json @@ -0,0 +1,9 @@ +{ + "admin/dashboard": { + "depends": { + "uci": { + "disabled_by_quickstart": true + } + } + } +}