🔥 Sync 2026-09-24 17:48:02

This commit is contained in:
github-actions[bot] committed 2026-09-24 17:48:02 +08:00
1 parent 97fd8c867c
commit aac134b37b
20 files changed
+153 -58

No files matched your search

+4 -4
View File
@@ -10,12 +10,12 @@ AGENTFLOW_ARCH_x86_64:=amd64
AGENTFLOW_ARCH_aarch64:=arm64 AGENTFLOW_ARCH_aarch64:=arm64
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH)) AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
AGENTFLOW_HASH_x86_64:=3bdd9b3af7a95c78d6fb6589117931e2be3f2800056fc7836aa95abe48d0a33d AGENTFLOW_HASH_x86_64:=266ceb4bc47d8ef0d2d731594a612266573bb93c4e23e9e329acf00c3bac4087
AGENTFLOW_HASH_aarch64:=8962a1ec6f57ee394ddfdf61abd72191f5378644c5ab1ce85040b132b757cc43 AGENTFLOW_HASH_aarch64:=7790a94a0a04e57d196165ef96177475125c1b24fe24321f6927a55b2c62211f
PKG_NAME:=agentflow PKG_NAME:=agentflow
PKG_VERSION:=0.3.4 PKG_VERSION:=0.3.5
PKG_RELEASE:=14 PKG_RELEASE:=15
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH) AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH)) AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=kai-agent PKG_NAME:=kai-agent
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22 PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_SOURCE:=kai-agent-bundle-$(PKG_VERSION).tar.gz PKG_SOURCE:=kai-agent-bundle-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip PKG_HASH:=skip
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_kai:=$(ARCH) PKG_ARCH_kai:=$(ARCH)
PKG_NAME:=kai PKG_NAME:=kai
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22 PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=6 PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip PKG_HASH:=skip
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_kai_session:=$(ARCH) PKG_ARCH_kai_session:=$(ARCH)
PKG_NAME:=kai_session PKG_NAME:=kai_session
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22 PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=6 PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip PKG_HASH:=skip
+3 -3
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=linkease-app-entry PKG_NAME:=linkease-app-entry
# This lightweight runtime is released independently from the full desktop. # This lightweight runtime is released independently from the full desktop.
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22 PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=1 PKG_RELEASE:=2
ARCH_HEXCODE:= ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)
@@ -22,7 +22,7 @@ LINKEASE_RUNTIME_ARCH:=arm64
PKG_HASH:=skip PKG_HASH:=skip
endif endif
PKG_SOURCE_VERSION:=d3d23965623e4182de554dde64418bb9a20c9078 PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz PKG_SOURCE:=linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-app-entry-runtime-v$(PKG_VERSION)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-app-entry-runtime-v$(PKG_VERSION)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH) PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH)
+2 -2
View File
@@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease-common-bin PKG_NAME:=linkease-common-bin
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5 PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=34 PKG_RELEASE:=35
ARCH_HEXCODE:= ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)
@@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c ARCH_HEXCODE=1b0c
endif endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9 PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz PKG_SOURCE:=linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE) PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE)
+2 -2
View File
@@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease PKG_NAME:=linkease
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5 PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=37 PKG_RELEASE:=38
ARCH_HEXCODE:= ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)
@@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c ARCH_HEXCODE=1b0c
endif endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9 PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz PKG_SOURCE:=linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE) PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE)
+2 -2
View File
@@ -11,7 +11,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkeasefull PKG_NAME:=linkeasefull
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=3.0.22 PKG_SOURCE_DATE:=3.0.22
PKG_RELEASE:=36 PKG_RELEASE:=37
ARCH_HEXCODE:= ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)
@@ -24,7 +24,7 @@ LINKEASE_RUNTIME_ARCH:=arm64
PKG_HASH:=skip PKG_HASH:=skip
endif endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9 PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz PKG_SOURCE:=linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkeasefull-runtime-v$(PKG_SOURCE_DATE)/ PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkeasefull-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH) PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH)
+1 -1
View File
@@ -11,7 +11,7 @@ LUCI_DEPENDS:=+luci-base +luci-lib-jsonc +curl +bandix
PKG_MAINTAINER:=timsaya PKG_MAINTAINER:=timsaya
PKG_VERSION:=0.12.11 PKG_VERSION:=0.12.11
PKG_RELEASE:=10 PKG_RELEASE:=11
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk
@@ -133,6 +133,20 @@ function formatSize(bytes) {
} }
// 格式化设备名称 // 格式化设备名称
// IPv6 地址按 RFC 3986 用方括号包起来,一是避免 '2600:...:8000::' + ':' + '80' 拼出
// ':::80' 这种分不清边界的写法,二是选中复制出来就是 [addr]:port,可以直接粘去用。
// 地址和端口是行内元素,复制时不会被拆成两行;端口自身 nowrap,不会被折断
function flowEndpointCell(addr, port) {
var text = addr || '-';
if (text.indexOf(':') >= 0) {
text = '[' + text + ']';
}
return E('td', { 'class': 'flows-addr-cell' }, [
E('span', { 'class': 'flows-addr' }, text),
E('span', { 'class': 'flows-port' }, port ? ':' + port : '')
]);
}
function formatDeviceName(device) { function formatDeviceName(device) {
if (device.host && device.host !== '') { if (device.host && device.host !== '') {
return device.host; return device.host;
@@ -719,26 +733,52 @@ return view.extend({
.flows-modal-content .flows-table th:nth-child(1), .flows-modal-content .flows-table th:nth-child(1),
.flows-modal-content .flows-table td:nth-child(1) { width: 5%; } .flows-modal-content .flows-table td:nth-child(1) { width: 5%; }
.flows-modal-content .flows-table th:nth-child(2), .flows-modal-content .flows-table th:nth-child(2),
.flows-modal-content .flows-table td:nth-child(2) { width: 8%; } .flows-modal-content .flows-table td:nth-child(2) { width: 10%; }
.flows-modal-content .flows-table th:nth-child(3), .flows-modal-content .flows-table th:nth-child(3),
.flows-modal-content .flows-table td:nth-child(3) { width: 14%; } .flows-modal-content .flows-table td:nth-child(3) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(4), .flows-modal-content .flows-table th:nth-child(4),
.flows-modal-content .flows-table td:nth-child(4) { width: 14%; } .flows-modal-content .flows-table td:nth-child(4) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(5), .flows-modal-content .flows-table th:nth-child(5),
.flows-modal-content .flows-table td:nth-child(5) { width: 10%; } .flows-modal-content .flows-table td:nth-child(5) { width: 9%; }
.flows-modal-content .flows-table th:nth-child(6), .flows-modal-content .flows-table th:nth-child(6),
.flows-modal-content .flows-table td:nth-child(6) { width: 14%; } .flows-modal-content .flows-table td:nth-child(6) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(7), .flows-modal-content .flows-table th:nth-child(7),
.flows-modal-content .flows-table td:nth-child(7) { width: 14%; } .flows-modal-content .flows-table td:nth-child(7) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(8), .flows-modal-content .flows-table th:nth-child(8),
.flows-modal-content .flows-table td:nth-child(8) { width: 10%; } .flows-modal-content .flows-table td:nth-child(8) { width: 9%; }
.flows-modal-content .flows-table th:nth-child(9), .flows-modal-content .flows-table th:nth-child(9),
.flows-modal-content .flows-table td:nth-child(9) { width: 11%; } .flows-modal-content .flows-table td:nth-child(9) { width: 8%; }
/* IPv6 没有 NAT,回复方向恒为源方向的镜像,隐藏后地址列能放下整条 IPv6 地址 */
.flows-modal-content .flows-table.hide-repl th:nth-child(6),
.flows-modal-content .flows-table.hide-repl td:nth-child(6),
.flows-modal-content .flows-table.hide-repl th:nth-child(7),
.flows-modal-content .flows-table.hide-repl td:nth-child(7) { display: none; }
.flows-modal-content .flows-table.hide-repl th:nth-child(1),
.flows-modal-content .flows-table.hide-repl td:nth-child(1) { width: 4%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(2),
.flows-modal-content .flows-table.hide-repl td:nth-child(2) { width: 10%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(3),
.flows-modal-content .flows-table.hide-repl td:nth-child(3) { width: 31%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(4),
.flows-modal-content .flows-table.hide-repl td:nth-child(4) { width: 31%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(5),
.flows-modal-content .flows-table.hide-repl td:nth-child(5) { width: 9.5%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(8),
.flows-modal-content .flows-table.hide-repl td:nth-child(8) { width: 9.5%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(9),
.flows-modal-content .flows-table.hide-repl td:nth-child(9) { width: 5%; }
/* 紧凑模式下再降一档字号,最长的 IPv6 地址才能完整落在一行里 */
.flows-modal-content .flows-table.hide-repl .flows-addr-cell {
font-size: 11px;
}
.flows-modal-content .flows-table th, .flows-modal-content .flows-table th,
.flows-modal-content .flows-table td { .flows-modal-content .flows-table td {
padding: 8px 12px; padding: 8px 12px;
text-align: left; text-align: left;
vertical-align: top;
border-bottom: 1px solid rgba(0,0,0,0.08); border-bottom: 1px solid rgba(0,0,0,0.08);
} }
@@ -749,7 +789,32 @@ return view.extend({
.flows-modal-content .flows-addr-cell { .flows-modal-content .flows-addr-cell {
word-break: break-all; word-break: break-all;
font-size: 0.8rem; font-size: 12px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
line-height: 1.35;
}
.flows-modal-content .flows-addr-cell .flows-port {
opacity: 0.6;
white-space: nowrap;
}
/* ESTABLISHED 是单个长单词,宽度不够时必须允许断开,否则会压到相邻列上 */
.flows-modal-content .flows-table td.flows-state-cell {
overflow-wrap: anywhere;
word-break: break-word;
}
.flows-modal-content .flows-repl-toggle {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.85rem;
cursor: pointer;
}
.flows-modal-content .flows-repl-toggle input {
margin: 0;
} }
.flows-modal-content .flows-protocol-tcp { .flows-modal-content .flows-protocol-tcp {
@@ -1091,25 +1156,25 @@ return view.extend({
var pageInfo = E('span', { 'style': 'font-size: 0.85rem; opacity: 0.85; margin: 0 14px;' }, ''); var pageInfo = E('span', { 'style': 'font-size: 0.85rem; opacity: 0.85; margin: 0 14px;' }, '');
var prevPageBtn = E('button', { 'class': 'cbi-button cbi-button-action', 'style': 'margin-right: 8px;' }, _('Previous')); var prevPageBtn = E('button', { 'class': 'cbi-button cbi-button-action', 'style': 'margin-right: 8px;' }, _('Previous'));
var nextPageBtn = E('button', { 'class': 'cbi-button cbi-button-action' }, _('Next')); var nextPageBtn = E('button', { 'class': 'cbi-button cbi-button-action' }, _('Next'));
var replToggle = E('input', { 'type': 'checkbox', 'id': 'flows-show-repl', 'checked': 'checked' });
var tableBody = E('tbody', { 'class': 'flows-table-body' }); var tableBody = E('tbody', { 'class': 'flows-table-body' });
var tableWrap = E('div', { 'class': 'flows-table-wrap' }, [ var flowsTable = E('table', { 'class': 'flows-table' }, [
E('table', { 'class': 'flows-table' }, [ E('thead', {}, [
E('thead', {}, [ E('tr', {}, [
E('tr', {}, [ E('th', {}, _('Protocol')),
E('th', {}, _('Protocol')), E('th', {}, _('State')),
E('th', {}, _('State')), E('th', {}, _('Orig Src')),
E('th', {}, _('Orig Src')), E('th', {}, _('Orig Dst')),
E('th', {}, _('Orig Dst')), E('th', {}, _('Send')),
E('th', {}, _('Send')), E('th', {}, _('Repl Src')),
E('th', {}, _('Repl Src')), E('th', {}, _('Repl Dst')),
E('th', {}, _('Repl Dst')), E('th', {}, _('Reply')),
E('th', {}, _('Reply')), E('th', {}, _('Flags'))
E('th', {}, _('Flags')) ])
]) ]),
]), tableBody
tableBody
])
]); ]);
var tableWrap = E('div', { 'class': 'flows-table-wrap' }, [flowsTable]);
function updatePaginationUi() { function updatePaginationUi() {
if (pageInfo) { if (pageInfo) {
@@ -1186,22 +1251,18 @@ return view.extend({
else if (f.state.indexOf('TIME_WAIT') >= 0) stateCls = 'flows-state-wait'; else if (f.state.indexOf('TIME_WAIT') >= 0) stateCls = 'flows-state-wait';
else if (f.state.indexOf('CLOSE') >= 0) stateCls = 'flows-state-close'; else if (f.state.indexOf('CLOSE') >= 0) stateCls = 'flows-state-close';
} }
var origSrc = f.orig ? (f.orig.src || '-') + ':' + (f.orig.sport || '-') : '-';
var origDst = f.orig ? (f.orig.dst || '-') + ':' + (f.orig.dport || '-') : '-';
var replSrc = f.repl ? (f.repl.src || '-') + ':' + (f.repl.sport || '-') : '-';
var replDst = f.repl ? (f.repl.dst || '-') + ':' + (f.repl.dport || '-') : '-';
var sendStr = (f.orig_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.orig_bytes || 0); var sendStr = (f.orig_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.orig_bytes || 0);
var replyStr = (f.repl_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.repl_bytes || 0); var replyStr = (f.repl_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.repl_bytes || 0);
var flagsStr = (f.flags && f.flags.length) ? f.flags.join(' ') : '-'; var flagsStr = (f.flags && f.flags.length) ? f.flags.join(' ') : '-';
var protoCls = (f.protocol || '').toLowerCase() === 'tcp' ? 'flows-protocol-tcp' : 'flows-protocol-udp'; var protoCls = (f.protocol || '').toLowerCase() === 'tcp' ? 'flows-protocol-tcp' : 'flows-protocol-udp';
tableBody.appendChild(E('tr', {}, [ tableBody.appendChild(E('tr', {}, [
E('td', { 'class': protoCls }, (f.protocol || '-').toUpperCase()), E('td', { 'class': protoCls }, (f.protocol || '-').toUpperCase()),
E('td', { 'class': stateCls }, f.state || '-'), E('td', { 'class': 'flows-state-cell ' + stateCls }, f.state || '-'),
E('td', { 'class': 'flows-addr-cell' }, origSrc), flowEndpointCell(f.orig && f.orig.src, f.orig && f.orig.sport),
E('td', { 'class': 'flows-addr-cell' }, origDst), flowEndpointCell(f.orig && f.orig.dst, f.orig && f.orig.dport),
E('td', {}, sendStr), E('td', {}, sendStr),
E('td', { 'class': 'flows-addr-cell' }, replSrc), flowEndpointCell(f.repl && f.repl.src, f.repl && f.repl.sport),
E('td', { 'class': 'flows-addr-cell' }, replDst), flowEndpointCell(f.repl && f.repl.dst, f.repl && f.repl.dport),
E('td', {}, replyStr), E('td', {}, replyStr),
E('td', { 'style': 'font-size: 0.8rem;' }, flagsStr) E('td', { 'style': 'font-size: 0.8rem;' }, flagsStr)
])); ]));
@@ -1253,6 +1314,10 @@ return view.extend({
protocolSelect, protocolSelect,
E('label', {}, _('State') + ':'), E('label', {}, _('State') + ':'),
stateSelect, stateSelect,
E('label', { 'class': 'flows-repl-toggle', 'for': 'flows-show-repl' }, [
replToggle,
E('span', {}, _('Show reply direction'))
]),
E('button', { 'class': 'cbi-button cbi-button-apply', 'click': loadFlows }, _('Refresh')) E('button', { 'class': 'cbi-button cbi-button-apply', 'click': loadFlows }, _('Refresh'))
]), ]),
tableWrap, tableWrap,
@@ -1271,6 +1336,16 @@ return view.extend({
if (stateSelect && stateSelect.addEventListener) { if (stateSelect && stateSelect.addEventListener) {
stateSelect.addEventListener('change', onFilterChange); stateSelect.addEventListener('change', onFilterChange);
} }
if (replToggle && replToggle.addEventListener) {
replToggle.addEventListener('change', function () {
// 关掉回复方向后,两个地址列各占 27%,整条 IPv6 地址能放进一行
if (replToggle.checked) {
flowsTable.classList.remove('hide-repl');
} else {
flowsTable.classList.add('hide-repl');
}
});
}
var overlay = document.getElementById('flows-modal-overlay'); var overlay = document.getElementById('flows-modal-overlay');
if (!overlay) { if (!overlay) {
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "No se pudieron cargar las cuotas de tráfico"
msgid "Unavailable" msgid "Unavailable"
msgstr "No disponible" msgstr "No disponible"
msgid "Show reply direction"
msgstr "Mostrar la dirección de respuesta"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Impossible de charger les quotas de trafic"
msgid "Unavailable" msgid "Unavailable"
msgstr "Indisponible" msgstr "Indisponible"
msgid "Show reply direction"
msgstr "Afficher la direction de réponse"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "トラフィッククォータを読み込めませんでした"
msgid "Unavailable" msgid "Unavailable"
msgstr "利用不可" msgstr "利用不可"
msgid "Show reply direction"
msgstr "応答方向を表示"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Nie udało się wczytać limitów transferu"
msgid "Unavailable" msgid "Unavailable"
msgstr "Niedostępne" msgstr "Niedostępne"
msgid "Show reply direction"
msgstr "Pokaż kierunek odpowiedzi"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Не удалось загрузить квоты трафика"
msgid "Unavailable" msgid "Unavailable"
msgstr "Недоступно" msgstr "Недоступно"
msgid "Show reply direction"
msgstr "Показывать обратное направление"
+3
View File
@@ -1375,3 +1375,6 @@ msgstr "每分钟配额"
msgid "Minute" msgid "Minute"
msgstr "每分钟" msgstr "每分钟"
msgid "Show reply direction"
msgstr "显示回复方向"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "載入流量配額失敗"
msgid "Unavailable" msgid "Unavailable"
msgstr "無法使用" msgstr "無法使用"
msgid "Show reply direction"
msgstr "顯示回覆方向"
+1 -1
View File
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Argon Theme LUCI_TITLE:=Argon Theme
LUCI_DEPENDS:=+USE_APK:wget-any +!USE_APK:wget +jsonfilter LUCI_DEPENDS:=+USE_APK:wget-any +!USE_APK:wget +jsonfilter
PKG_VERSION:=2.4.7 PKG_VERSION:=2.4.7
PKG_RELEASE:=18 PKG_RELEASE:=19
CONFIG_LUCI_CSSTIDY:= CONFIG_LUCI_CSSTIDY:=
@@ -137,7 +137,6 @@
{% else %} {% else %}
<!-- Image Background Start --> <!-- Image Background Start -->
{% online_wallpaper = cfg.get_first('argon', 'global', 'online_wallpaper') ?? 'default' %} {% online_wallpaper = cfg.get_first('argon', 'global', 'online_wallpaper') ?? 'default' %}
<div class="main-bg" id="main-bg"><img src="{{ entityencode(bgArry.bgUrl, true) }}" data-fallback="{{ media }}/img/bg1.jpg" onerror="this.onerror=null;this.src=this.dataset.fallback" alt=""></div>
<div class="main-bg" id="main-bg">{% if (online_wallpaper != 'default'): %}<img src="{{ entityencode(bgArry.bgUrl, true) }}" data-fallback="{{ media }}/img/bg1.jpg" onerror="this.onerror=null;this.src=this.dataset.fallback" alt="">{% endif %}</div> <div class="main-bg" id="main-bg">{% if (online_wallpaper != 'default'): %}<img src="{{ entityencode(bgArry.bgUrl, true) }}" data-fallback="{{ media }}/img/bg1.jpg" onerror="this.onerror=null;this.src=this.dataset.fallback" alt="">{% endif %}</div>
<!-- Image Background End --> <!-- Image Background End -->
{% endif %} {% endif %}
+1 -1
View File
@@ -12,7 +12,7 @@ define KernelPackage/oaf
SUBMENU:=Netfilter Extensions SUBMENU:=Netfilter Extensions
TITLE:=OAF netfilter module TITLE:=OAF netfilter module
FILES:=$(PKG_BUILD_DIR)/oaf.ko FILES:=$(PKG_BUILD_DIR)/oaf.ko
DEPENDS:=+kmod-ipt-conntrack DEPENDS:=+kmod-nf-conntrack +kmod-nf-reject
KCONFIG:= KCONFIG:=
endef endef