🍉 Sync 2026-10-05 00:22:14

This commit is contained in:
github-actions[bot] committed 2026-10-05 00:22:14 +08:00
1 parent 6d2e4f3868
commit 48e9eb5630
18 files changed
+3077 -3028

No files matched your search

@@ -238,10 +238,10 @@ const outbound_type = [
['shadowquic', _('ShadowQUIC') + ' - ' + _('UDP')],
['trusttunnel', _('TrustTunnel') + ' - ' + _('TCP/UDP')],
['zerotier', _('ZeroTier') + ' - ' + _('UDP') + ' - ' + _('L2')], // Endpoint
['wireguard', _('WireGuard') + ' - ' + _('UDP')], // Endpoint
['tailscale', _('Tailscale') + ' - ' + _('UDP')], // Endpoint
['masque', _('Masque') + ' - ' + _('UDP')], // Endpoint // https://blog.cloudflare.com/post-quantum-warp/
['easytier', _('EasyTier') + ' - ' + _('TCP/UDP')], // Endpoint
['wireguard', _('WireGuard') + ' - ' + _('UDP') + ' - ' + _('L3')], // Endpoint
['tailscale', _('Tailscale') + ' - ' + _('UDP') + ' - ' + _('L3')], // Endpoint
['masque', _('Masque') + ' - ' + _('UDP') + ' - ' + _('L3')], // Endpoint // https://blog.cloudflare.com/post-quantum-warp/
['easytier', _('EasyTier') + ' - ' + _('TCP/UDP') + ' - ' + _('L3')], // Endpoint
['ssh', _('SSH') + ' - ' + _('TCP')]
];
@@ -295,47 +295,79 @@ const routing_port_type = [
];
const rules_type = [
['DOMAIN'],
['DOMAIN-SUFFIX'],
['DOMAIN-KEYWORD'],
['DOMAIN-WILDCARD'],
['DOMAIN-REGEX'],
['GEOSITE'],
['IP-CIDR'],
['IP-CIDR6'],
['IP-SUFFIX'],
['IP-ASN'],
['GEOIP'],
['SRC-GEOIP'],
['SRC-IP-ASN'],
['SRC-IP-CIDR'],
['SRC-IP-SUFFIX'],
['DST-PORT'],
['SRC-PORT'],
//['IN-PORT'],
//['IN-TYPE'],
//['IN-USER'],
//['IN-NAME'],
['REMATCH-NAME'],
['PROCESS-PATH'],
['PROCESS-PATH-REGEX'],
['PROCESS-PATH-WILDCARD'],
['PROCESS-NAME'],
['PROCESS-NAME-REGEX'],
['PROCESS-NAME-WILDCARD'],
['UID'],
['NETWORK'],
['DSCP'],
['RULE-SET'],
['MATCH']
{
label: _('Domain'),
types: [
['DOMAIN'],
['DOMAIN-SUFFIX'],
['DOMAIN-KEYWORD'],
['DOMAIN-WILDCARD'],
['DOMAIN-REGEX'],
['GEOSITE']
]
},
{
label: _('Dst-IP'),
types: [
['IP-CIDR'],
['IP-CIDR6'],
['IP-SUFFIX'],
['IP-ASN'],
['GEOIP']
]
},
{
label: _('Src-IP'),
types: [
['SRC-GEOIP'],
['SRC-IP-ASN'],
['SRC-IP-CIDR'],
['SRC-IP-SUFFIX']
]
},
{
label: _('Port'),
types: [
['DST-PORT'],
['SRC-PORT']
]
},
{
label: _('Inbound'),
types: [
//['IN-PORT'],
//['IN-TYPE'],
//['IN-USER'],
//['IN-NAME'],
['REMATCH-NAME']
]
},
{
label: _('Process'),
types: [
['PROCESS-PATH'],
['PROCESS-PATH-REGEX'],
['PROCESS-PATH-WILDCARD'],
['PROCESS-NAME'],
['PROCESS-NAME-REGEX'],
['PROCESS-NAME-WILDCARD'],
['UID']
]
},
{
label: _('Network'),
types: [
['NETWORK'],
['DSCP']
]
},
{
label: _('Other'),
types: [
['RULE-SET'],
['MATCH']
]
}
];
const rules_type_allowparms = [
@@ -349,12 +381,15 @@ const rules_type_allowparms = [
'RULE-SET',
];
const rules_logical_type = [
['AND'],
['OR'],
['NOT'],
//['SUB-RULE'],
];
const rules_logical_type = {
label: _('Logical'),
types: [
['AND'],
['OR'],
['NOT'],
//['SUB-RULE']
]
};
const rules_logical_payload_count = {
'AND': { low: 2, high: undefined },
@@ -510,6 +545,16 @@ const CBIGridSection = form.GridSection.extend({
}
});
const CBIListValue = form.ListValue.extend({
renderWidget(/* ... */) {
let frameEl = form.ListValue.prototype.renderWidget.apply(this, arguments);
frameEl.querySelector('select').style["min-width"] = '10em';
return frameEl;
}
});
const CBIDynamicList = form.DynamicList.extend({ // @less_25_12
__name__: 'CBI.DynamicList',
@@ -533,6 +578,18 @@ const CBIDynamicList = form.DynamicList.extend({ // @less_25_12
}
});
const CBIStaticList = form.DynamicList.extend({
__name__: 'CBI.StaticList',
renderWidget(/* ... */) {
let El = (less_25_12 ? CBIDynamicList : form.DynamicList).prototype.renderWidget.apply(this, arguments); // @less_25_12
El.querySelector('.add-item ul > li[data-value="-"]')?.remove();
return El;
}
});
const CBIMultiValue = form.MultiValue.extend({ // @pr8758_merged
__name__: 'CBI.MultiValue',
@@ -550,11 +607,73 @@ const CBIMultiValue = form.MultiValue.extend({ // @pr8758_merged
}
});
const CBIStaticList = form.DynamicList.extend({
__name__: 'CBI.StaticList',
const CBIGroupListValue = CBIListValue.extend({
__name__: 'CBI.GroupListValue',
renderWidget(section_id, option_index, cfgvalue) {
const frameEl = CBIListValue.prototype.renderWidget.apply(this, arguments);
const select = frameEl.querySelector('select');
const options = Array.from(select.options);
Object.keys(this.grplist).forEach((label) => {
const groupEl = E('optgroup', {label: label}, []);
for (const option of options)
if (this.grplist[label].includes(option.value))
groupEl.appendChild(option);
select.appendChild(groupEl);
});
select.value = (cfgvalue != null) ? cfgvalue : this.default;
return frameEl;
},
value(key, val) {
this.keylist ??= [];
this.vallist ??= [];
this.grplist ??= {};
if (Array.isArray(key)) {
this.grplist[val] ??= [];
this.grplist[val].push(key[0]);
this.super('value', ...key);
} else
this.super('value', key, val);
}
});
const CBIGroupDynamicList = (less_25_12 ? CBIDynamicList : form.DynamicList).extend({ // @less_25_12
__name__: 'CBI.GroupDynamicList',
renderWidget(section_id, option_index, cfgvalue) {
const frameEl = (less_25_12 ? CBIDynamicList : form.DynamicList).prototype.renderWidget.apply(this, arguments); // @less_25_12
const select = frameEl.querySelector('ul');
const optLis = Array.from(select.querySelectorAll('li'));
Object.keys(this.grplist).forEach((label) => {
const groupLi = E('li', {
class: "group-title",
style: "font-weight: bold; pointer-events: none;"
}, [label]);
for (const optLi of optLis)
if (this.grplist[label].includes(optLi.getAttribute('data-value'))) {
optLi.classList.add('group-item');
optLi.style.paddingLeft = '20px';
}
const firstLi = select.querySelector(`li[data-value="${this.grplist[label][0]}"]`);
select.insertBefore(groupLi, firstLi);
});
return frameEl;
},
value: CBIGroupListValue.prototype.value
});
const CBIGroupStaticList = CBIGroupDynamicList.extend({
__name__: 'CBI.GroupStaticList',
renderWidget(/* ... */) {
let El = (less_25_12 ? CBIDynamicList : form.DynamicList).prototype.renderWidget.apply(this, arguments); // @less_25_12
let El = CBIGroupDynamicList.prototype.renderWidget.apply(this, arguments);
El.querySelector('.add-item ul > li[data-value="-"]')?.remove();
@@ -562,16 +681,6 @@ const CBIStaticList = form.DynamicList.extend({
}
});
const CBIListValue = form.ListValue.extend({
renderWidget(/* ... */) {
let frameEl = form.ListValue.prototype.renderWidget.apply(this, arguments);
frameEl.querySelector('select').style["min-width"] = '10em';
return frameEl;
}
});
const CBIRichValue = form.Value.extend({
__name__: 'CBI.RichValue',
@@ -1938,10 +2047,13 @@ return baseclass.extend({
/* Prototype */
GridSection: CBIGridSection,
DynamicList: CBIDynamicList,
MultiValue: CBIMultiValue,
StaticList: CBIStaticList,
ListValue: CBIListValue,
DynamicList: CBIDynamicList, // @less_25_12
StaticList: CBIStaticList,
MultiValue: CBIMultiValue,
GroupListValue: CBIGroupListValue,
GroupDynamicList: CBIGroupDynamicList,
GroupStaticList: CBIGroupStaticList,
RichValue: CBIRichValue,
RichMultiValue: CBIRichMultiValue,
TextValue: CBITextValue,
@@ -137,9 +137,9 @@ class RulesEntry {
Object.keys(content).forEach(key => this[key] = content[key]);
} catch {}
this.type ||= hm.rules_type[0][0];
this.type ||= hm.rules_type[0].types[0][0];
this.payload ||= [
{type: hm.rules_type[0][0], factor: '', /* deny: false */},
{type: hm.rules_type[0].types[0][0], factor: '', /* deny: false */},
//{type: 'DOMAIN-SUFFIX', factor: '.google.com', deny: true}
];
this.detour ||= hm.preset_outbound.full[0][0];
@@ -215,7 +215,7 @@ class RulesEntry {
toString(format) {
format ||= 'json';
let logical = hm.rules_logical_type.map(e => e[0] || e).includes(this.type);
let logical = hm.rules_logical_type.types.map(e => e[0] || e).includes(this.type);
let rule, factor, detour, params;
if (logical) {
@@ -380,7 +380,7 @@ const parseRulesYaml = hm.parseYaml.extend({
return null;
}
if (hm.rules_logical_type.map(e => e[0] || e).includes(tp)) {
if (hm.rules_logical_type.types.map(e => e[0] || e).includes(tp)) {
logical_payload = payload.match(/^\(\((.*)\)\)$/); // LOGIC_TYPE,((payload1),(payload2),(payload3)),DIRECT
if (logical_payload)
logical_payload = logical_payload[1].split('),(');
@@ -530,11 +530,11 @@ function renderPayload(s, total, uciconfig) {
for (let n=0; n<total; n++) {
prefix = `payload${n}_`;
o = s.option(form.ListValue, prefix + 'type', _('Type') + ` ${n+1}`);
o.default = hm.rules_type[0][0];
hm.rules_type.forEach((res) => {
o.value.apply(o, res);
})
o = s.option(hm.GroupListValue, prefix + 'type', _('Type') + ` ${n+1}`);
o.default = hm.rules_type[0].types[0][0];
for (const {label, types} of hm.rules_type) {
types.forEach((res) => o.value.call(o, res, label));
}
Object.keys(hm.rules_logical_payload_count).forEach((key) => {
if (n < hm.rules_logical_payload_count[key].low)
o.depends('type', key);
@@ -669,11 +669,10 @@ function renderPayload(s, total, uciconfig) {
Object.keys(extenbox).forEach((n) => {
prefix = `payload${n}_`;
o = s.option(hm.StaticList, prefix + 'type', _('Type') + ' ++');
o.default = hm.rules_type[0][0];
hm.rules_type.forEach((res) => {
o.value.apply(o, res);
})
o = s.option(hm.GroupStaticList, prefix + 'type', _('Type') + ' ++');
for (const {label, types} of hm.rules_type) {
types.forEach((res) => o.value.call(o, res, label));
}
extenbox[n].forEach((type) => {
o.depends('type', type);
})
@@ -695,7 +694,7 @@ function renderPayload(s, total, uciconfig) {
return true;
}
o = s.option(hm.less_25_12 ? hm.DynamicList : form.DynamicList, prefix + 'fused', _('Factor') + ' ++', // @less_25_12
o = s.option(hm.GroupDynamicList, prefix + 'fused', _('Factor') + ' ++',
_('Content will not be verified, Please make sure you enter it correctly.'));
extenbox[n].forEach((type) => {
o.depends(Object.fromEntries([['type', type], [prefix + 'type', /.+/]]));
@@ -703,13 +702,10 @@ function renderPayload(s, total, uciconfig) {
initDynamicPayload(o, n, 'factor', uciconfig);
o.load = L.bind(function(n, key, uciconfig, section_id) {
hm.loadLabel.call(this, [
['REMATCHNAME', _('-- REMATCH-NAME --')],
...hm.loadLabelValues(this.config, 'rematch-name'),
['NETWORK', _('-- NETWORK --')],
['udp', _('UDP')],
['tcp', _('TCP')],
['RULESET', _('-- RULE-SET --')],
...hm.loadLabelValues(this.config, 'ruleset')
...hm.loadLabelValues(this.config, 'rematch-name').map(e => [e, _('REMATCH-NAME')]),
[['udp', _('UDP')], _('NETWORK')],
[['tcp', _('TCP')], _('NETWORK')],
...hm.loadLabelValues(this.config, 'ruleset').map(e => [e, _('RULE-SET')])
], section_id);
return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => e[key] ?? '');
@@ -764,11 +760,11 @@ function renderRules(s, uciconfig) {
o.remove = form.AbstractValue.prototype.remove;
o.editable = true;
o = s.option(form.ListValue, 'type', _('Type'));
o.default = hm.rules_type[0][0];
[...hm.rules_type, ...hm.rules_logical_type].forEach((res) => {
o.value.apply(o, res);
})
o = s.option(hm.GroupListValue, 'type', _('Type'));
o.default = hm.rules_type[0].types[0][0];
for (const {label, types} of hm.rules_type.concat(hm.rules_logical_type)) {
types.forEach((res) => o.value.call(o, res, label));
}
o.load = function(section_id) {
return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).type;
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -16,7 +16,7 @@ function wGET(url, header, filepath) {
if (!url || type(url) !== 'string')
return null;
let ua = 'Wget/1.21 (FullCombo Shark!)';
let ua = 'Wget/1.24 (FullCombo Shark!)';
if (header) {
header = json(trim(header) || '{}');
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-netstat
PKG_VERSION:=1.1.5
PKG_RELEASE:=1
PKG_RELEASE:=2
PKG_MAINTAINER:=NoobLK <liyanagelsofficial@gmail.com>
PKG_LICENSE:=GPL-3.0
@@ -1,5 +1,5 @@
{
"admin/tools/netstat": {
"admin/status/netstat": {
"title": "Netstat",
"order": 20,
"action": {
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-open-box
PKG_VERSION:=0.1.280
PKG_RELEASE:=6
PKG_VERSION:=0.1.281
PKG_RELEASE:=7
PKG_MAINTAINER:=liandu2024
PKG_LICENSE:=GPL-3.0-or-later
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.10.4
PKG_RELEASE:=313
PKG_RELEASE:=314
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -79,14 +79,14 @@ local com = self.com
}
}
function onRequestError(btn, errorMessage) {
function onRequestError(btn, errorMessage, checking) {
setButtonDisabled(btn, false);
btn.value = retryText;
var app = btn.getAttribute('data-update-app');
var detailId = app === appname ? appname + '-check_btn' : '_' + app + '-check_btn';
var ckeckDetailElm = document.getElementById(detailId + '-detail');
if (app === appname) errorMessage = errorMessage ? updateFailedText : unknownErrorText;
if (app === appname && !checking) errorMessage = errorMessage ? updateFailedText : unknownErrorText;
if (errorMessage && ckeckDetailElm) {
ckeckDetailElm.textContent = errorMessage
}
@@ -117,7 +117,7 @@ local com = self.com
removePageNotice();
if (!json || json.code) {
appInfoList[app] = undefined;
onRequestError(btn, json && (json.error || updateFailedText));
onRequestError(btn, json && json.error, true);
} else {
appInfoList[app] = json;
if (json.has_update) {
@@ -6,14 +6,10 @@ manager="$3"
force="$4"
if [ "$manager" = apk ]; then
apk add --allow-untrusted "$dir/luci-app-${CONFIG}.apk" "$dir/luci-i18n-${CONFIG}-zh-cn.apk"
extra=""
[ "$force" = 1 ] && extra="--force-reinstall --force-overwrite"
apk add --allow-untrusted $extra "$dir/luci-app-${CONFIG}.apk" "$dir/luci-i18n-${CONFIG}-zh-cn.apk"
result=$?
if [ "$result" = 0 ] && [ "$force" = 1 ]; then
apk mkndx --allow-untrusted --pkgname-spec '${name}.apk' -o "$dir/Packages.adb" \
"$dir/luci-app-${CONFIG}.apk" "$dir/luci-i18n-${CONFIG}-zh-cn.apk" &&
apk --allow-untrusted --repository "$dir/Packages.adb" fix --reinstall "luci-app-${CONFIG}" "luci-i18n-${CONFIG}-zh-cn"
result=$?
fi
else
extra=""
[ "$force" = 1 ] && extra="--force-reinstall"
+1 -1
View File
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Status Pages
LUCI_DEPENDS:=+luci-base +luci-app-oui +luci-mod-dashboard +libiwinfo +rpcd-mod-iwinfo +rpcd-mod-rrdns +ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-socket
PKG_RELEASE:=26
PKG_RELEASE:=27
PKG_BUILD_DEPENDS:=iwinfo
PKG_LICENSE:=Apache-2.0
@@ -102,6 +102,7 @@ return baseclass.extend({
fields.splice(6, 0, _('Temperature'));
fields.splice(7, 0, cpuusage.tempinfo);
}
if (boardinfo.model != "Default string Default string") {
fields.splice(2, 0, _('Model'));
fields.splice(3, 0, boardinfo.model);
@@ -116,6 +117,19 @@ return baseclass.extend({
]));
}
if (uci.get('system', '@system[0]', 'links') !== '0') {
table.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td', 'colspan': 2, 'style': 'padding: 10px 12px;' }, [
E('div', { 'style': 'display: flex; justify-content: space-around; align-items: center; text-align: center;' }, [
E('a', { 'href': '[https://openwrt.ai/](https://openwrt.ai/)', 'target': '_blank' }, [ '固件下载与定制' ]),
E('a', { 'href': '[https://openwrt.ai/fadian/](https://openwrt.ai/fadian/)', 'target': '_blank', 'style': 'color: orangered;' }, [ '赞助' ]),
E('a', { 'href': '[https://github.com/kiddin9/Kwrt](https://github.com/kiddin9/Kwrt)', 'target': '_blank' }, [ '源码与反馈' ]),
E('a', { 'href': '[https://t.me/opkwrt](https://t.me/opkwrt)', 'target': '_blank' }, [ 'TG交流' ])
])
])
]));
}
return table;
}
});
+1 -1
View File
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Noobwrt Theme
LUCI_DEPENDS:=+wget +jsonfilter
PKG_VERSION:=1.1.7
PKG_RELEASE:=1
PKG_RELEASE:=2
CONFIG_LUCI_CSSTIDY:=1
@@ -961,3 +961,5 @@ input,
background-color: #707070;
color: #fff;
}
.main .main-right{background-color: transparent}
input[placeholder]::placeholder {color: #888888;opacity: 1}
+1 -1
View File
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=my-default-settings
PKG_VERSION:=2
PKG_RELEASE:=28
PKG_RELEASE:=29
include $(INCLUDE_DIR)/package.mk
@@ -1,14 +0,0 @@
<% if luci.sys.exec("echo -n `uci -q get base_config.@status[0].links`") ~= "0" then %>
<script>
var links = document.createElement('div');
links.innerHTML ='<table class="table"><tr class="tr"><td class="td left"><a href="https://openwrt.ai/" target="_blank">固件下载与定制</a></td><td class="td left" width="25%"><a href="https://openwrt.ai/fadian/" target="_blank" style="color:orangered">赞助</a></td><td class="td left" width="25%"><a href="https://github.com/kiddin9/Kwrt" target="_blank">源码与反馈</a></td><td class="td left" width="25%"><a href="https://t.me/opkwrt" target="_blank">TG交流</a></td></tr></table>';
setTimeout(function(){
var telegram = document.querySelectorAll(".cbi-section")[0];
telegram.appendChild(links);
}, 1500);
setTimeout(function(){
var telegram = document.querySelectorAll(".cbi-section")[0];
telegram.appendChild(links);
}, 2400);
</script>
<%end%>