From 4136a9b4883cb131b302c4b0bc6978ceccfc976d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 26 Sep 2026 02:25:56 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=84=20Sync=202026-09-26=2002:25:56?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- luci-app-daede/Makefile | 2 +- .../luci-static/resources/view/daede/log.js | 3 +- .../resources/view/daede/updates.js | 18 +- luci-app-daede/po/zh-cn/daede.po | 3 + luci-app-fwlive/Makefile | 2 +- .../luci-static/resources/fwlive/chips.js | 27 +- .../luci-static/resources/fwlive/links.js | 6 +- .../luci-static/resources/fwlive/log.js | 28 +- .../luci-static/resources/fwlive/logging.js | 19 +- .../luci-static/resources/fwlive/table.js | 31 +- .../resources/view/status/fwlive.js | 13 +- luci-app-fwlive/po/de/luci-app-fwlive.po | 933 +++++++------- luci-app-fwlive/po/ru/luci-app-fwlive.po | 1039 +++++++++------- .../po/templates/luci-app-fwlive.pot | 157 ++- luci-app-fwlive/po/zh_Hans/luci-app-fwlive.po | 1106 +++++++++-------- .../usr/libexec/fwlive-is-firewall-event.awk | 20 +- luci-app-passwall/Makefile | 2 +- .../cbi/passwall/client/type/1_sing-box.lua | 10 +- luci-app-passwall/luasrc/passwall/api.lua | 19 + .../luasrc/passwall/util_sing-box.lua | 10 +- .../luasrc/passwall/util_xray.lua | 9 +- .../view/passwall/node_config/header.htm | 2 +- .../root/usr/share/passwall/iptables.sh | 8 +- .../root/usr/share/passwall/nftables.sh | 8 +- luci-app-ssr-plus/Makefile | 2 +- .../luasrc/controller/shadowsocksr.lua | 551 +++----- .../view/shadowsocksr/clash_main_panel.htm | 259 +--- .../luasrc/view/shadowsocksr/component.htm | 267 +--- luci-app-ssr-plus/po/templates/ssr-plus.pot | 308 ++--- luci-app-ssr-plus/po/zh_Hans/ssr-plus.po | 308 ++--- .../root/etc/init.d/shadowsocksr | 42 +- .../root/etc/uci-defaults/luci-ssr-plus | 12 - .../share/shadowsocksr/shadowsocksr.config | 3 - .../share/shadowsocksr/ui/zashboard/.nojekyll | 0 .../usr/share/shadowsocksr/ui/zashboard/CNAME | 1 - .../ui/zashboard/THIRD_PARTY_NOTICES.md | 30 - .../ui/zashboard/apple-touch-icon.png | Bin 1458 -> 0 bytes .../assets/EarthGlobeCard-DQPfbIzt.css | 1 - .../assets/EarthGlobeCard-DhFkBz8U.js | 2 - .../NotoColorEmoji-flagsonly-CWWDk9km.ttf | Bin 913564 -> 0 bytes .../TwemojiMozilla-flags-B12sb_Bp.woff2 | Bin 78308 -> 0 bytes .../zashboard/assets/background-DTLDDGUj.jpg | Bin 223691 -> 0 bytes .../connection-geoip-database-NH8WGZdk.js | 1 - .../zashboard/assets/earth-day-O5DYyPrv.webp | Bin 173438 -> 0 bytes .../assets/earth-night-DiMNTAKM.webp | Bin 83470 -> 0 bytes .../assets/earth-renderer-Dh_x8rMR.js | 538 -------- .../assets/earth-surface-DQPefyI6.webp | Bin 400480 -> 0 bytes .../zashboard/assets/geoip.worker-CYCCgy29.js | 1 - .../ui/zashboard/assets/index-DC9m9n9t.js | 165 --- .../ui/zashboard/assets/index-aEk9Ew7B.css | 1 - .../zashboard/assets/metacubex-BlQkOUXT.jpg | Bin 14267 -> 0 bytes .../ui/zashboard/assets/palette-DPyxzM37.js | 1 - .../ui/zashboard/favicon-dark.svg | 8 - .../shadowsocksr/ui/zashboard/favicon.ico | Bin 15086 -> 0 bytes .../shadowsocksr/ui/zashboard/favicon.svg | 8 - .../share/shadowsocksr/ui/zashboard/icon.svg | 8 - .../shadowsocksr/ui/zashboard/index.html | 54 - .../ui/zashboard/manifest.webmanifest | 1 - .../shadowsocksr/ui/zashboard/pwa-192x192.png | Bin 4041 -> 0 bytes .../shadowsocksr/ui/zashboard/pwa-512x512.png | Bin 11527 -> 0 bytes .../ui/zashboard/pwa-maskable-192x192.png | Bin 1521 -> 0 bytes .../ui/zashboard/pwa-maskable-512x512.png | Bin 6479 -> 0 bytes .../shadowsocksr/ui/zashboard/registerSW.js | 1 - .../usr/share/shadowsocksr/ui/zashboard/sw.js | 1 - .../ui/zashboard/workbox-9c191d2f.js | 1 - .../share/shadowsocksr/update_dashboard.sh | 375 ------ .../luci-static/resources/tools/views.js | 31 +- luci-base/po/zh_Hans/base.po | 6 + luci-base/po/zh_Hant/base.po | 6 + .../view/dashboard/include/30_wifi.js | 45 +- luci-mod-status/Makefile | 2 +- .../resources/view/status/dmesg.js | 6 +- wwand/Makefile | 4 +- 73 files changed, 2401 insertions(+), 4124 deletions(-) delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/.nojekyll delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/CNAME delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/THIRD_PARTY_NOTICES.md delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/apple-touch-icon.png delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/EarthGlobeCard-DQPfbIzt.css delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/EarthGlobeCard-DhFkBz8U.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/NotoColorEmoji-flagsonly-CWWDk9km.ttf delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/TwemojiMozilla-flags-B12sb_Bp.woff2 delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/background-DTLDDGUj.jpg delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/connection-geoip-database-NH8WGZdk.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/earth-day-O5DYyPrv.webp delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/earth-night-DiMNTAKM.webp delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/earth-renderer-Dh_x8rMR.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/earth-surface-DQPefyI6.webp delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/geoip.worker-CYCCgy29.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/index-DC9m9n9t.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/index-aEk9Ew7B.css delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/metacubex-BlQkOUXT.jpg delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/assets/palette-DPyxzM37.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/favicon-dark.svg delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/favicon.ico delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/favicon.svg delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/icon.svg delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/index.html delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/manifest.webmanifest delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/pwa-192x192.png delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/pwa-512x512.png delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/pwa-maskable-192x192.png delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/pwa-maskable-512x512.png delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/registerSW.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/sw.js delete mode 100644 luci-app-ssr-plus/root/usr/share/shadowsocksr/ui/zashboard/workbox-9c191d2f.js delete mode 100755 luci-app-ssr-plus/root/usr/share/shadowsocksr/update_dashboard.sh diff --git a/luci-app-daede/Makefile b/luci-app-daede/Makefile index 80e693d4b..f6c18c31b 100644 --- a/luci-app-daede/Makefile +++ b/luci-app-daede/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-daede PKG_VERSION:=1.15 -PKG_RELEASE:=45 +PKG_RELEASE:=46 PKG_MAINTAINER:=kenzok8 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/luci-app-daede/htdocs/luci-static/resources/view/daede/log.js b/luci-app-daede/htdocs/luci-static/resources/view/daede/log.js index c39cd0b46..46c6c835b 100644 --- a/luci-app-daede/htdocs/luci-static/resources/view/daede/log.js +++ b/luci-app-daede/htdocs/luci-static/resources/view/daede/log.js @@ -295,7 +295,7 @@ return view.extend({ function applyFilter() { const f = state.filter; pane.querySelectorAll('.dd-line').forEach(function(el) { - if (matchesFilter(el.textContent, f)) + if (matchesFilter(el._rawLine, f)) el.classList.remove('dd-hidden'); else el.classList.add('dd-hidden'); @@ -309,6 +309,7 @@ return view.extend({ const ln = lines[i]; if (!ln) continue; const el = buildLine(ln); + el._rawLine = ln; if (!matchesFilter(ln, state.filter)) el.classList.add('dd-hidden'); frag.appendChild(el); diff --git a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js index 20992cad9..4ece1ae5b 100644 --- a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js +++ b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js @@ -446,17 +446,19 @@ return view.extend({ healthBody.appendChild(mkRow('✓', 'dd-up-ok', _('Hot reload'), _('/etc/init.d/dae hot_reload is available'))); } - if (ctx.backend.useNetns && ns && ns.exists) { + if (ctx.backend.useNetns && ns && ns.exists && running[ctx.name]) { + healthBody.appendChild(mkRow('✓', 'dd-up-ok', _('netns daens'), HEALTH_PATHS.netns + ' · ' + _('in use by daed'))); + } else if (ctx.backend.useNetns && ns && ns.exists) { const btn = E('button', { 'class': 'dd-up-btn' }, _('Clean')); btn.addEventListener('click', function() { - const daedRunning = !!(running && running[ctx.name]); - const msg = daedRunning - ? _('%s is running. Deleting the daens netns now will break its networking until you restart it. Continue?').format(ctx.name) - : _('Delete the daens netns?'); - if (!confirm(msg)) - return; btn.disabled = true; - fs.exec('/sbin/ip', ['netns', 'del', 'daens']).finally(function() { btn.disabled = false; }); + backend.detectRunning().then(function(now) { + const msg = now[ctx.name] + ? _('%s is running. Deleting the daens netns now will break its networking until you restart it. Continue?').format(ctx.name) + : _('Delete the daens netns?'); + if (confirm(msg)) + return fs.exec('/sbin/ip', ['netns', 'del', 'daens']); + }).finally(function() { btn.disabled = false; }); }); healthBody.appendChild(mkRow('⚠', 'dd-up-warn', _('netns daens'), HEALTH_PATHS.netns + ' · ' + _('exists, may block daed start'), btn)); } else if (ctx.backend.useNetns) { diff --git a/luci-app-daede/po/zh-cn/daede.po b/luci-app-daede/po/zh-cn/daede.po index b4ec479c0..7d33bedaa 100644 --- a/luci-app-daede/po/zh-cn/daede.po +++ b/luci-app-daede/po/zh-cn/daede.po @@ -372,6 +372,9 @@ msgstr "dae 热重载可用" msgid "netns daens removed." msgstr "netns daens 已清理。" +msgid "in use by daed" +msgstr "daed 运行中,正在使用" + msgid "exists, may block daed start" msgstr "已存在,可能阻碍 daed 启动" diff --git a/luci-app-fwlive/Makefile b/luci-app-fwlive/Makefile index 1310aaabb..dc096c61b 100644 --- a/luci-app-fwlive/Makefile +++ b/luci-app-fwlive/Makefile @@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter LUCI_PKGARCH:=all PKG_VERSION:=0.1.45 -PKG_RELEASE:=37 +PKG_RELEASE:=38 # 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/htdocs/luci-static/resources/fwlive/chips.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js index a48574b93..5bf346fb9 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js @@ -17,26 +17,9 @@ */ function chipFieldLabel(spec) { - switch (spec.key) { - case 'q': - return _('Search'); - case 'action': - return _('Action'); - case 'interface': - return _('Interface'); - case 'proto': - return _('Proto'); - case 'src': - return _('Source'); - case 'dst': - return _('Destination'); - case 'sport': - return _('Source port'); - case 'dport': - return _('Destination port'); - default: - return spec.label || spec.key; - } + const mapped = log.filterFieldLabel(spec.key); + if (mapped !== spec.key) return mapped; + return spec.label || spec.key; } function chipValueNodes(spec, val) { @@ -58,9 +41,7 @@ function chipValueNodes(spec, val) { if (key === 'q' || key === 'src' || key === 'dst') return [ label + ': ', - E('strong', { 'class': 'fwlive-chip-not' }, [_('not')]), - ' ', - _('contains'), + E('strong', { 'class': 'fwlive-chip-not' }, [_('does not contain')]), ' ', valueNode ]; diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js index 84fe61157..c0133191e 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js @@ -60,7 +60,7 @@ function filterLink(field, value, label, onFilterClick) { { 'href': '#', 'class': 'fwlive-filter-link', - 'title': _('Filter by %s').format(field), + 'title': _('Filter by %s').format(log.filterFieldLabel(field)), 'click': function (ev) { onFilterClick(field, value, ev); } @@ -88,7 +88,7 @@ function addrFilterLink(field, ip, showHostnames, hostnameCache, onFilterClick) : hostnameCache.get(ip); } const display = name || ip; - const title = name ? ip : _('Filter by %s').format(field); + const title = name ? ip : _('Filter by %s').format(log.filterFieldLabel(field)); return E( 'a', @@ -153,7 +153,7 @@ function ifaceLink(value, onFilterClick) { { 'href': '#', 'class': 'fwlive-filter-link fwlive-iface-badge', - 'title': _('Filter by interface'), + 'title': _('Filter by %s').format(log.filterFieldLabel('interface')), 'click': function (ev) { onFilterClick('interface', value, ev); } diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js index 715981085..94f68e10d 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js @@ -26,6 +26,8 @@ const CLASSIFY_SPEC = { 'PREC', 'DF' ], + /* Classify trim (not JS String#trim): ASCII space/tab/LF/CR + NBSP (U+00A0). */ + trimWhitespace: [' ', '\t', '\n', '\r', '\u00a0'], nonFirewallPrefixes: [ 'dnsmasq', 'procd', @@ -64,6 +66,15 @@ function wordPattern(words) { return new RegExp('(^|[^A-Za-z0-9_])(' + alt + ')([^A-Za-z0-9_]|$)', 'i'); } +function classifyTrim(s) { + const ws = CLASSIFY_SPEC.trimWhitespace; + let start = 0; + let end = s.length; + while (start < end && ws.indexOf(s.charAt(start)) >= 0) start++; + while (end > start && ws.indexOf(s.charAt(end - 1)) >= 0) end--; + return s.slice(start, end); +} + /* ---- spec-derived classification regexes (mirror core/fwlive-log.js) ---- */ const DENY_CLASS_WORDS = CLASSIFY_SPEC.actionWords.slice(3); const NON_FIREWALL_PREFIX = new RegExp( @@ -335,10 +346,25 @@ return baseclass.extend({ return m; }, + + filterFieldLabel: function (field) { + const labels = { + 'q': _('Search'), + 'action': _('Action'), + 'interface': _('Interface'), + 'proto': _('Proto'), + 'src': _('Source'), + 'dst': _('Destination'), + 'sport': _('Source port'), + 'dport': _('Destination port') + }; + + return labels[field] || field; + }, /* @fwlive-codegen:luci-preserve-end */ isFirewallEvent: function (entry) { - const msg = this.normalizeNetfilterMessage((entry && entry.msg) || '').trim(); + const msg = classifyTrim(this.normalizeNetfilterMessage((entry && entry.msg) || '')); if (!msg) return false; if (this.NON_FIREWALL_PREFIX.test(msg)) return false; diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js index 864e2d5ac..961ec40b2 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js @@ -17,7 +17,7 @@ * * renderManualTestNodes(host, state, callbacks) → void * host -