diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/1_sing-box.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/1_sing-box.lua index cbab6003..5e94c90a 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/1_sing-box.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/1_sing-box.lua @@ -383,6 +383,10 @@ if singbox_tags:find("with_quic") then o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" } o:depends({ hysteria2_realms = "1" }) + o = s:option(Flag, "hysteria2_realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) + o.default = "0" + o:depends({ hysteria2_realms = "1" }) + o = s:option(Value, "hysteria2_auth_password", translate("Auth Password")) o.password = true o:depends({ protocol = "hysteria2"}) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/2_xray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/2_xray.lua index 1697d1de..6ff9f508 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/2_xray.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/2_xray.lua @@ -357,6 +357,10 @@ o = s:option(DynamicList, "hysteria2_realm_stun", translate("Realm STUN")) o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" } o:depends({ hysteria2_realms = "1" }) +o = s:option(Flag, "hysteria2_realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) +o.default = "0" +o:depends({ hysteria2_realms = "1" }) + o = s:option(Value, "hysteria2_auth_password", translate("Auth Password")) o.password = true o:depends({ protocol = "hysteria2"}) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/5_hysteria2.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/5_hysteria2.lua index 481fc1f2..d9b4d600 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/5_hysteria2.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/5_hysteria2.lua @@ -61,6 +61,11 @@ o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio o.rewrite_option = _n(o.option) o:depends({ realms = "1" }) +o = s:option(Flag, "realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) +o.default = "0" +o.rewrite_option = _n(o.option) +o:depends({ realms = "1" }) + o = s:option(Value, "auth_password", translate("Auth Password")) o.password = true o.rewrite_option = _n(o.option) @@ -124,6 +129,20 @@ o = s:option(Flag, "disable_mtu_discovery", translate("Disable MTU detection")) o.default = "0" o.rewrite_option = _n(o.option) + +o = s:option(Flag, "ech", translate("ECH")) +o.default = "0" +o:depends({ realms = false }) + +o = s:option(TextValue, "ech_config", translate("ECH Config")) +o.default = "" +o.rows = 5 +o.wrap = "soft" +o:depends({ ech = "1" }) +o.validate = function(self, value) + return api.trim(value:gsub("[\r\n]", "")) +end + o = s:option(Flag, "lazy_start", translate("Lazy Start")) o.default = "0" o.rewrite_option = _n(o.option) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua index 129bbfd9..b2f33565 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua @@ -183,6 +183,10 @@ if singbox_tags:find("with_quic") then o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" } o:depends({ hysteria2_realms = "1" }) + o = s:option(Flag, "hysteria2_realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) + o.default = "0" + o:depends({ hysteria2_realms = "1" }) + o = s:option(ListValue, "hysteria2_obfs_type", translate("Obfs Type")) o:value("", translate("Disable")) o:value("salamander") diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua index 182018ef..11ec4fab 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua @@ -149,6 +149,10 @@ o = s:option(DynamicList, "hysteria2_realm_stun", translate("Realm STUN")) o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" } o:depends({ hysteria2_realms = "1" }) +o = s:option(Flag, "hysteria2_realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) +o.default = "0" +o:depends({ hysteria2_realms = "1" }) + o = s:option(ListValue, "hysteria2_obfs_type", translate("Obfs Type")) o:value("", translate("Disable")) o:value("salamander") diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua index bbc97737..9a037ff7 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua @@ -73,6 +73,11 @@ o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio o.rewrite_option = _n(o.option) o:depends({ realms = "1" }) +o = s:option(Flag, "realm_upnp", translate("Enable") .. " UPnP/NAT-PMP", translate("Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success.")) +o.default = "0" +o.rewrite_option = _n(o.option) +o:depends({ realms = "1" }) + o = s:option(ListValue, "obfs_type", translate("Obfs Type")) o:value("", translate("Disable")) o:value("salamander") @@ -147,6 +152,19 @@ o.validate = function(self, value, t) end o:depends({ custom = false }) +o = s:option(FileUpload, "ech_keyFile", translate("ECH key absolute path"), translate("as:") .. "/etc/ssl/ech.pem") +o.validate = function(self, value, t) + if value and value ~= "" then + if not fs.access(value) then + return nil, translate("Can't find this file!") + else + return value + end + end + return nil +end +o:depends({ custom = false }) + o = s:option(Flag, "firewall_allow", translate("Firewall Allow")) o.default = "0" o:depends({ custom = false }) diff --git a/luci-app-passwall/luasrc/passwall/util_hysteria2.lua b/luci-app-passwall/luasrc/passwall/util_hysteria2.lua index cfe30588..60350d06 100644 --- a/luci-app-passwall/luasrc/passwall/util_hysteria2.lua +++ b/luci-app-passwall/luasrc/passwall/util_hysteria2.lua @@ -48,8 +48,10 @@ function gen_config_server(node) ignoreClientBandwidth = (node.hysteria2_ignoreClientBandwidth == "1") and true or false, disableUDP = (node.hysteria2_udp == "0") and true or false, realm = (node.hysteria2_realms and node.hysteria2_realm_stun) and { - stunServers = node.hysteria2_realm_stun - } or nil + stunServers = node.hysteria2_realm_stun, + portMapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil + } or nil, + ech = (node.ech_keyFile and node.ech_keyFile ~= "") and { keyPath = node.ech_keyFile } or nil } if config.obfs and config.obfs.gecko then @@ -101,7 +103,8 @@ function gen_config(var) return server end)(), realm = (node.hysteria2_realms and node.hysteria2_realm_stun) and { - stunServers = node.hysteria2_realm_stun + stunServers = node.hysteria2_realm_stun, + portMapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil } or nil, transport = { type = "udp", @@ -138,6 +141,7 @@ function gen_config(var) sni = node.tls_serverName, insecure = (node.tls_allowInsecure == "1") and true or false, pinSHA256 = (node.tls_pinSHA256) and node.tls_pinSHA256 or nil, + ech = (node.ech == "1") and node.ech_config or nil }, quic = { initStreamReceiveWindow = (node.hysteria2_recv_window) and tonumber(node.hysteria2_recv_window) or nil, diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index c8780b26..419cfce5 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -596,6 +596,7 @@ function gen_outbound(flag, node, tag, proxy_table) realm.scheme = nil realm.address = nil realm.port = nil + realm.port_mapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil return realm end return nil @@ -951,6 +952,7 @@ function gen_config_server(node) realm.address = nil realm.port = nil realm.stun_domain_resolver = "direct" + realm.port_mapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil return realm end return nil diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index 6a0c4bbb..cae6532e 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -308,7 +308,8 @@ function gen_outbound(flag, node, tag, proxy_table) type = "realm", settings = { url = url, - stunServers = stun + stunServers = stun, + portMapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil } } udp[#udp+1] = r @@ -782,7 +783,8 @@ function gen_config_server(node) type = "realm", settings = { url = url, - stunServers = stun + stunServers = stun, + portMapping = (node.hysteria2_realm_upnp == "1") and { enabled = true } or nil } } udp[#udp+1] = r diff --git a/luci-app-passwall/luasrc/view/passwall/node_config/link_share_man.htm b/luci-app-passwall/luasrc/view/passwall/node_config/link_share_man.htm index 1e6c7116..03c9f4e0 100644 --- a/luci-app-passwall/luasrc/view/passwall/node_config/link_share_man.htm +++ b/luci-app-passwall/luasrc/view/passwall/node_config/link_share_man.htm @@ -594,6 +594,7 @@ local current_node = map:get(section) params += opt.query("pinSHA256", dom_prefix + "tls_pinSHA256"); params += opt.query("pcs", dom_prefix + "tls_pinSHA256"); params += opt.query("vcn", dom_prefix + "tls_CertByName"); + params += opt.query("ech", dom_prefix + "ech_config"); var v_password = null; @@ -628,7 +629,7 @@ local current_node = map:get(section) params = params.replace(/^&/, ""); url = _address + ":" + - v_port.value + "?" + + (v_port.value || "443") + "?" + params + "#" + encodeURI(v_alias.value); if (v_password) { @@ -1664,6 +1665,8 @@ local current_node = map:get(section) ); opt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || queryParam.pinSHA256 || ''); opt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || ''); + opt.set(dom_prefix + 'ech', !!queryParam.ech); + opt.set(dom_prefix + 'ech_config', queryParam.ech || ''); if (m.hash) { opt.set('remarks', decodeURIComponent(m.hash.substr(1))); } diff --git a/luci-app-passwall/po/zh-cn/passwall.po b/luci-app-passwall/po/zh-cn/passwall.po index 8c72fa80..c3ce77c6 100644 --- a/luci-app-passwall/po/zh-cn/passwall.po +++ b/luci-app-passwall/po/zh-cn/passwall.po @@ -1604,6 +1604,9 @@ msgstr "公钥文件绝对路径" msgid "Private key absolute path" msgstr "私钥文件绝对路径" +msgid "ECH key absolute path" +msgstr "ECH 密钥绝对路径" + msgid "Can't find this file!" msgstr "找不到这个文件!" @@ -2160,6 +2163,9 @@ msgstr "Gecko 包大小(最小)" msgid "Gecko Packet Size (max)" msgstr "Gecko 包大小(最大)" +msgid "Enable UPnP/NAT-PMP port mapping on your gateway to improve hole punching success." +msgstr "在网关上启用 UPnP/NAT-PMP 端口映射以提升打洞成功率。" + msgid "valid time (hh:mm)" msgstr "有效时间(hh:mm)" diff --git a/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/luci-app-passwall/root/usr/share/passwall/subscribe.lua index 0d9cb090..fbe3924e 100755 --- a/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -1467,6 +1467,10 @@ local function processData(szType, content, add_mode, group, sub_cfg) result.hysteria2_up_mbps = params.upmbps or (sub_cfg and sub_hy_up_mbps or nil) result.hysteria2_down_mbps = params.downmbps or (sub_cfg and sub_hy_down_mbps or nil) result.hysteria2_hop = params.mport + if params.ech and params.ech ~= "" then + result.ech = "1" + result.ech_config = params.ech + end if params["obfs-password"] or params["obfs_password"] then result.hysteria2_obfs_type = params.obfs or "salamander" result.hysteria2_obfs_password = params["obfs-password"] or params["obfs_password"] diff --git a/luci-app-syncthing/Makefile b/luci-app-syncthing/Makefile new file mode 100644 index 00000000..2219fcb2 --- /dev/null +++ b/luci-app-syncthing/Makefile @@ -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))) diff --git a/luci-app-syncthing/README.md b/luci-app-syncthing/README.md new file mode 100644 index 00000000..b07298c1 --- /dev/null +++ b/luci-app-syncthing/README.md @@ -0,0 +1,2 @@ +# luci-app-syncthing +在Potat0000源码基础上进行了汉化优化,官方openwrt23.05.3编译后可使用 diff --git a/luci-app-syncthing/luasrc/controller/syncthing.lua b/luci-app-syncthing/luasrc/controller/syncthing.lua new file mode 100644 index 00000000..ee2ca7ef --- /dev/null +++ b/luci-app-syncthing/luasrc/controller/syncthing.lua @@ -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 diff --git a/luci-app-syncthing/luasrc/model/cbi/syncthing.lua b/luci-app-syncthing/luasrc/model/cbi/syncthing.lua new file mode 100644 index 00000000..324ea054 --- /dev/null +++ b/luci-app-syncthing/luasrc/model/cbi/syncthing.lua @@ -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 diff --git a/luci-app-syncthing/luasrc/view/syncthing/syncthing_status.htm b/luci-app-syncthing/luasrc/view/syncthing/syncthing_status.htm new file mode 100644 index 00000000..566cc020 --- /dev/null +++ b/luci-app-syncthing/luasrc/view/syncthing/syncthing_status.htm @@ -0,0 +1,27 @@ + + +
+

+ <%:正在收集数据...%> +

+
diff --git a/luci-app-syncthing/root/etc/uci-defaults/luci-syncthing b/luci-app-syncthing/root/etc/uci-defaults/luci-syncthing new file mode 100644 index 00000000..3adb7997 --- /dev/null +++ b/luci-app-syncthing/root/etc/uci-defaults/luci-syncthing @@ -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 diff --git a/luci-app-syncthing/root/usr/share/rpcd/acl.d/luci-app-syncthing.json b/luci-app-syncthing/root/usr/share/rpcd/acl.d/luci-app-syncthing.json new file mode 100644 index 00000000..9fc9cc54 --- /dev/null +++ b/luci-app-syncthing/root/usr/share/rpcd/acl.d/luci-app-syncthing.json @@ -0,0 +1,11 @@ +{ + "luci-app-syncthing": { + "description": "Grant UCI access for luci-app-syncthing", + "read": { + "uci": [ "syncthing" ] + }, + "write": { + "uci": [ "syncthing" ] + } + } +} diff --git a/v2ray-geodata/Makefile b/v2ray-geodata/Makefile index 10a48199..c3378b7b 100644 --- a/v2ray-geodata/Makefile +++ b/v2ray-geodata/Makefile @@ -21,13 +21,13 @@ define Download/geoip HASH:=c67bd077eb102cec74fab759b73d17f99275f56af10a87c14d9fd983508f5ce1 endef -GEOSITE_VER:=20260826065759 +GEOSITE_VER:=20260827152101 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=2c2d0b45924d73c9ae65c5a41b81a2c2e28edef06ede619954dbe1df613d5a5c + HASH:=ba1adf51d4d724abbc157c53234a02bda00c94cdb8211709682e51a6855520b7 endef GEOSITE_IRAN_VER:=202608240025