update 2026-08-09 20:38:34

This commit is contained in:
action committed 2026-08-09 20:38:34 +08:00
1 parent b50cf2822f
commit 32070715c4
26 files changed
+271 -68

No files matched your search

+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dae
PKG_VERSION:=2026.08.08
PKG_VERSION:=2026.08.09
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=0e757f29d5c82deb1fcf687004a8b7b1fe7afb9d
PKG_SOURCE_VERSION:=5b380d5713b846f50052ecf7e23f98eee51bae2a
PKG_SOURCE_URL:=https://github.com/olicesx/dae.git
PKG_MIRROR_HASH:=skip
@@ -48,7 +48,7 @@
protocol: getOption("<%=self.config%>", "<%=self.section%>", name).value,
}, node_config_url);
} else {
window.location.href = node_config_url + "?select_proto=" + el.value;
window.location.href = node_config_url + "?select_proto=" + encodeURIComponent(el.value);
}
}
});
@@ -1255,11 +1255,11 @@ table td, .table .td {
this.section = cbi_id;
document.getElementById("set_node_div").style.display="block";
const node_name = document.getElementById("cbid.<%=appname%>." + cbi_id + ".remarks").value;
document.getElementById("set_node_name").innerHTML = node_name;
document.getElementById("set_node_name").textContent = node_name;
},
close() {
document.getElementById("set_node_div").style.display="none";
document.getElementById("set_node_name").innerHTML = "";
document.getElementById("set_node_name").textContent = "";
},
set(protocol) {
if (confirm('<%:Are you sure set to%> ' + protocol.toUpperCase() + ' <%:the server?%>') == true){
@@ -24,24 +24,16 @@ for k, e in ipairs(api.get_valid_nodes()) do
end
local dynamicList_write = function(self, section, value)
local t = {}
local t2 = {}
local new_t = {}
if type(value) == "table" then
local x
for _, x in ipairs(value) do
if x and #x > 0 then
if not t2[x] then
t2[x] = x
t[#t+1] = x
end
end
end
new_t = api.table_remove_duplicates(value)
else
t = { value }
new_t = { value }
end
t = table.concat(t, " ")
return DynamicList.write(self, section, t)
local new_val = table.concat(new_t, " ")
return DynamicList.write(self, section, new_val)
end
local doh_validate = function(self, value, t)
if value ~= "" then
local flag = 0
@@ -168,23 +168,14 @@ source.validate = function(self, value, t)
end
local dynamicList_write = function(self, section, value)
local t = {}
local t2 = {}
local new_t = {}
if type(value) == "table" then
local x
for _, x in ipairs(value) do
if x and #x > 0 then
if not t2[x] then
t2[x] = x
t[#t+1] = x
end
end
end
new_t = api.table_remove_duplicates(value)
else
t = { value }
new_t = { value }
end
t = table.concat(t, " ")
return DynamicList.write(self, section, t)
local new_val = table.concat(new_t, " ")
return DynamicList.write(self, section, new_val)
end
source.write = dynamicList_write
@@ -518,8 +518,30 @@ o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65"))
o.default = "0"
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
o = s:option(DynamicList, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites."))
o:value("TLS_AES_128_GCM_SHA256")
o:value("TLS_AES_256_GCM_SHA384")
o:value("TLS_CHACHA20_POLY1305_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA")
o:value("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA")
o:value("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA")
o:value("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
o:value("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384")
o:value("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
function o.custom_write(self, section, value)
local new_t
if type(value) == "table" then
new_t = api.table_remove_duplicates(value)
else
new_t = { value }
end
m:set(section, self.option:sub(1 + #option_prefix), new_t)
end
o = s:option(TextValue, _n("reality_mldsa65Verify"), "ML-DSA-65 " .. translate("Public key"))
o.default = ""
@@ -574,8 +574,30 @@ o.validate = function(self, value)
return value
end
o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
o = s:option(DynamicList, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites."))
o:value("TLS_AES_128_GCM_SHA256")
o:value("TLS_AES_256_GCM_SHA384")
o:value("TLS_CHACHA20_POLY1305_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA")
o:value("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA")
o:value("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA")
o:value("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
o:value("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384")
o:value("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
o:depends({ [_n("tls")] = true })
function o.custom_write(self, section, value)
local new_t
if type(value) == "table" then
new_t = api.table_remove_duplicates(value)
else
new_t = { value }
end
m:set(section, self.option:sub(1 + #option_prefix), new_t)
end
o = s:option(Flag, _n("ech"), translate("ECH"))
o.default = "0"
@@ -218,23 +218,14 @@ o:depends({ [_n("reality")] = true })
o = s:option(DynamicList, _n("reality_serverNames"), translate("serverNames"))
o:depends({ [_n("reality")] = true })
function o.write(self, section, value)
local t = {}
local t2 = {}
function o.custom_write(self, section, value)
local new_t = {}
if type(value) == "table" then
local x
for _, x in ipairs(value) do
if x and #x > 0 then
if not t2[x] then
t2[x] = x
t[#t+1] = x
end
end
end
new_t = api.table_remove_duplicates(value)
else
t = { value }
new_t = { value }
end
return DynamicList.write(self, section, t)
m:set(section, self.option:sub(1 + #option_prefix), new_t)
end
o = s:option(ListValue, _n("alpn"), translate("alpn"))
@@ -1863,3 +1863,19 @@ function get_network_devices()
table.sort(_devices, function(a, b) return a.sort < b.sort end)
return _devices
end
function table_remove_duplicates(t)
if not t or #t == 0 then return nil end
local t_lookup = {}
local new_t = {}
local x
for _, x in ipairs(t) do
if x and #x > 0 then
if not t_lookup[x] then
t_lookup[x] = x
new_t[#new_t+1] = x
end
end
end
return new_t
end
@@ -96,6 +96,21 @@ local function get_log_level(s)
return s
end
--[[
local cipherSuites = {
"TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"
}
local cipherSuites_lookup = {}
for i, v in ipairs(cipherSuites) do
cipherSuites_lookup[v] = true
end
]]--
function parseDNS(str)
local result_dns_server
-- [proto]://[ip]
@@ -261,7 +276,7 @@ function gen_outbound(flag, node, tag, proxy_table)
fragment = fragment,
record_fragment = record_fragment,
certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and split(node.tls_certificate_pem, "\n") or nil,
cipher_suites = node.cipherSuites or nil,
cipher_suites = (node.cipherSuites and #node.cipherSuites > 0) and node.cipherSuites or nil,
ech = (node.ech == "1") and (function()
local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech
local domain, dns = s:match("^([^+]+)%+(.+)$")
@@ -36,6 +36,21 @@ local function get_log_level(s)
return s
end
--[[
local cipherSuites = {
"TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"
}
local cipherSuites_lookup = {}
for i, v in ipairs(cipherSuites) do
cipherSuites_lookup[v] = true
end
]]--
function parseDNS(str)
local result_dns_server
-- [proto]://[ip]
@@ -195,7 +210,7 @@ function gen_outbound(flag, node, tag, proxy_table)
certificate = api.split(node.tls_certificate_pem, "\n"),
usage = "verify"
} or nil,
cipherSuites = node.cipherSuites or nil
cipherSuites = (node.cipherSuites and #node.cipherSuites > 0) and table.concat(node.cipherSuites, ":") or nil,
} or nil,
realitySettings = (node.stream_security == "reality") and {
serverName = node.tls_serverName,
@@ -48,7 +48,7 @@
protocol: getOption("<%=self.config%>", "<%=self.section%>", name).value,
}, node_config_url);
} else {
window.location.href = node_config_url + "?select_proto=" + el.value;
window.location.href = node_config_url + "?select_proto=" + encodeURIComponent(el.value);
}
}
});
@@ -1257,16 +1257,16 @@ table td, .table .td {
this.section = cbi_id;
document.getElementById("set_node_div").style.display="block";
const node_name = document.getElementById("cbid.<%=appname%>." + cbi_id + ".remarks").value;
document.getElementById("set_node_name").innerHTML = node_name;
document.getElementById("set_node_name").textContent = node_name;
},
close() {
document.getElementById("set_node_div").style.display="none";
document.getElementById("set_node_name").innerHTML = "";
document.getElementById("set_node_name").textContent = "";
},
set(type, config) {
if (confirm('<%:Are you sure set this node?%>') == true){
ajax.abortAll();
window.location.href = '<%=api.url("set_node")%>?type=' + type + '&config=' + config + '&section=' + section;
window.location.href = '<%=api.url("set_node")%>?type=' + type + '&config=' + config + '&section=' + this.section;
}
}
}
+2 -2
View File
@@ -2441,5 +2441,5 @@ msgstr "تنظیم نشده"
msgid "Cipher Suites"
msgstr "سوئیت‌های رمزدار"
msgid "Configures the list of supported cipher suites, separated by :"
msgstr "فهرست مجموعه‌های رمز پشتیبانی‌شده را که با موارد زیر از هم جدا شده‌اند، پیکربندی می‌کند:"
msgid "Configures the list of supported cipher suites."
msgstr "فهرست مجموعه‌های رمز پشتیبانی‌شده را پیکربندی می‌کند."
+2 -2
View File
@@ -2439,5 +2439,5 @@ msgstr "Не задано"
msgid "Cipher Suites"
msgstr "Наборы шифров"
msgid "Configures the list of supported cipher suites, separated by :"
msgstr "Задает список поддерживаемых наборов шифров, разделенных двоеточием (:)."
msgid "Configures the list of supported cipher suites."
msgstr "Задает список поддерживаемых наборов шифров."
+2 -2
View File
@@ -2427,5 +2427,5 @@ msgstr "未设置"
msgid "Cipher Suites"
msgstr "密码套件"
msgid "Configures the list of supported cipher suites, separated by :"
msgstr "配置支持的密码套件列表,以冒号 (:) 分隔。"
msgid "Configures the list of supported cipher suites."
msgstr "配置支持的密码套件列表。"
+2 -2
View File
@@ -2433,5 +2433,5 @@ msgstr "未設置"
msgid "Cipher Suites"
msgstr "密碼套件"
msgid "Configures the list of supported cipher suites, separated by :"
msgstr "配置支援的密碼套件列表,以冒號 (:) 分隔。"
msgid "Configures the list of supported cipher suites."
msgstr "配置支援的密碼套件列表。"
+22
View File
@@ -0,0 +1,22 @@
# Copyright (C) 2020 Gyj1109
# 适配 OpenWrt 25.12 修改版
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-syncthing
PKG_VERSION:=1.0
PKG_RELEASE:=3
LUCI_TITLE:=LuCI support for Syncthing
LUCI_PKGARCH:=all
# 适配 25.12:确保安装了 syncthing 后,LuCI 界面能正确拉起
LUCI_DEPENDS:=+syncthing
include $(TOPDIR)/feeds/luci/luci.mk
# 明确定义配置文件的归属,这对 25.12 的 apk 管理器非常重要
define Package/$(PKG_NAME)/conffiles
/etc/config/syncthing
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+2
View File
@@ -0,0 +1,2 @@
# luci-app-syncthing
在Potat0000源码基础上进行了汉化优化,官方openwrt23.05.3编译后可使用
@@ -0,0 +1,17 @@
module("luci.controller.syncthing", package.seeall)
function index()
if not nixio.fs.access("/etc/config/syncthing") then
return
end
entry({"admin", "services", "syncthing"}, cbi("syncthing"), _("文件同步"), 10).dependent = true
entry({"admin", "services", "syncthing", "status"}, call("act_status")).leaf = true
end
function act_status()
local e = {}
e.running = luci.sys.call("pgrep syncthing >/dev/null") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
@@ -0,0 +1,48 @@
require("nixio.fs")
m = Map("syncthing", translate("Syncthing同步工具"))
m:section(SimpleSection).template = "syncthing/syncthing_status"
s = m:section(TypedSection, "syncthing")
s.anonymous = true
o = s:option(Flag, "enabled", translate("启用"))
o.default = 0
o.rmempty = false
gui_address = s:option(Value, "gui_address", translate("GUI访问地址"))
gui_address.description = translate("使用0.0.0.0以监控所有访问。")
gui_address.default = "http://0.0.0.0:8384"
gui_address.placeholder = "http://0.0.0.0:8384"
gui_address.rmempty = false
home = s:option(Value, "home", translate("配置文件目录"))
home.description = translate("只有保存在/etc/syncthing中的配置会自动备份!")
home.default = "/etc/syncthing"
home.placeholder = "/etc/syncthing"
home.rmempty = false
user = s:option(ListValue, "user", translate("用户"))
user.description = translate("默认是syncthing,但这可能会导致权限被拒绝。Syncthing官方不建议以root身份运行。")
user:value("", translate("syncthing"))
for u in luci.util.execi("cat /etc/passwd | cut -d ':' -f1") do
user:value(u)
end
macprocs = s:option(Value, "macprocs", translate("线程限制"))
macprocs.description = translate("0表示匹配CPU数量(默认),>0表示显式指定并发数。")
macprocs.default = "0"
macprocs.placeholder = "0"
macprocs.datatype = "range(0,32)"
macprocs.rmempty = false
nice = s:option(Value, "nice", translate("优先级"))
nice.description = translate("显式指定优先级值。0是最高,19是最低。(暂时不允许设置负值)")
nice.default = "19"
nice.placeholder = "19"
nice.datatype = "range(0,19)"
nice.rmempty = false
return m
@@ -0,0 +1,27 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(1, '<%=url([[admin]], [[services]], [[syncthing]], [[status]])%>', null,
function (x, data) {
var tb = document.getElementById('syncthing_status');
if (data && tb) {
if (data.running) {
var links = '<em><b><font color="green">Syncthing <%:运行中%></font></b></em><input class="btn cbi-button mar-10" type="button" value="<%:打开Syncthing页面%>" onclick="openwebui();" />';
tb.innerHTML = links;
} else {
tb.innerHTML = '<em><b><font color="red">Syncthing <%:未运行%></font></b></em>';
}
}
}
);
function openwebui(){
var url = window.location.host+":<%=luci.sys.exec("uci -q get syncthing.syncthing.gui_address"):match(":[0-9]+"):gsub(":", "")%>";
window.open('http://'+url,'target','');
}
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="syncthing_status">
<em><%:正在收集数据...%></em>
</p>
</fieldset>
@@ -0,0 +1,12 @@
#!/bin/sh
touch /etc/config/syncthing
uci -q batch <<-EOF >/dev/null
delete ucitrack.@syncthing[-1]
add ucitrack syncthing
set ucitrack.@syncthing[-1].exec='/etc/init.d/syncthing stop && /etc/init.d/syncthing start'
commit ucitrack
EOF
# remove LuCI cache
rm -f /tmp/luci*
exit 0
@@ -0,0 +1,11 @@
{
"luci-app-syncthing": {
"description": "Grant UCI access for luci-app-syncthing",
"read": {
"uci": [ "syncthing" ]
},
"write": {
"uci": [ "syncthing" ]
}
}
}
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box
PKG_VERSION:=1.13.16
PKG_VERSION:=1.13.18
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=5d8201669387d0caded7a22c71682b3c025afef7bac8704cceabed52ea8bde5d
PKG_HASH:=e41ed9d7adecd7597c1d5cc91818366a9538d94b41c244225ac40ac948c643f5
PKG_LICENSE:=GPL-3.0-or-later
PKG_LICENSE_FILES:=LICENSE
+3 -3
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=v2rayA
PKG_VERSION:=2.4.9
PKG_VERSION:=2.4.10
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/v2rayA/v2rayA/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=3be8db2f84950a111e6aaacf4b67726e6552a2c7b6e8bf768a05584eb83cc8b7
PKG_HASH:=7257d6a167428e973e624865a3530d806c53217d315c3514339d5168fd43c1c6
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/service
PKG_LICENSE:=AGPL-3.0-only
@@ -60,7 +60,7 @@ define Download/v2raya-web
URL:=https://github.com/v2rayA/v2rayA/releases/download/v$(PKG_VERSION)/
URL_FILE:=web.tar.gz
FILE:=$(WEB_FILE)
HASH:=52940a0a47c38751c2199aac6f17eb4ef3e005ec9d9e0486d182bfe2bc7ca51b
HASH:=aaab3016709b649bd23fc628ee27780bf43b9a9d5bd18bb6061f1742abe588b9
endef
define Build/Prepare