update 2026-08-09 16:35:03

This commit is contained in:
action
2026-08-09 16:35:03 +08:00
parent ce12490610
commit b50cf2822f
28 changed files with 137 additions and 227 deletions
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=hysteria PKG_NAME:=hysteria
PKG_VERSION:=2.12.0 PKG_VERSION:=2.12.1
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?
PKG_HASH:=0c37f3ddc51a80e0c33425380d09c045045ce68b7fa6453e2ba27a986e65d9f5 PKG_HASH:=6bdd78678f25b27ac984fa6bf394cdbb586c0d02ba8057b5f598da690c61115c
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION)
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
@@ -495,22 +495,22 @@ end
function add_node() function add_node()
local redirect = http.formvalue("redirect") local redirect = http.formvalue("redirect")
local uuid = api.gen_short_uuid() local uid = api.gen_random_char()
uci:section(appname, "nodes", uuid) uci:section(appname, "nodes", uid)
local group = http.formvalue("group") local group = http.formvalue("group")
if group and group ~= "default" then if group and group ~= "default" then
uci:set(appname, uuid, "group", group) uci:set(appname, uid, "group", group)
end end
uci:set(appname, uuid, "type", "Socks") uci:set(appname, uid, "type", "Socks")
if redirect == "1" then if redirect == "1" then
api.uci_save(uci, appname) api.uci_save(uci, appname)
http.redirect(api.url("node_config", uuid)) http.redirect(api.url("node_config", uid))
else else
api.uci_save(uci, appname, true, true) api.uci_save(uci, appname, true, true)
http_write_json({result = uuid}) http_write_json({result = uid})
end end
end end
@@ -538,17 +538,17 @@ end
function copy_node() function copy_node()
local section = http.formvalue("section") local section = http.formvalue("section")
local uuid = api.gen_short_uuid() local uid = api.gen_random_char()
uci:section(appname, "nodes", uuid) uci:section(appname, "nodes", uid)
for k, v in pairs(uci:get_all(appname, section)) do for k, v in pairs(uci:get_all(appname, section)) do
if not k:match("^%.") and k ~= "group" then if not k:match("^%.") and k ~= "group" then
if k == "remarks" then v = (v or "") .. "(1)" end if k == "remarks" then v = (v or "") .. "(1)" end
uci:set(appname, uuid, k, v) uci:set(appname, uid, k, v)
end end
end end
uci:set(appname, uuid, "add_mode", 1) uci:set(appname, uid, "add_mode", 1)
api.uci_save(uci, appname) api.uci_save(uci, appname)
http.redirect(api.url("node_config", uuid)) http.redirect(api.url("node_config", uid))
end end
function clear_all_nodes() function clear_all_nodes()
@@ -1165,29 +1165,29 @@ function add_shunt_rule()
local add_name = http.formvalue("add_name") local add_name = http.formvalue("add_name")
local redirect = http.formvalue("redirect") local redirect = http.formvalue("redirect")
local uuid = add_name local uid = add_name
if add_name then if add_name then
local has = uci:get(appname, uuid) local has = uci:get(appname, uid)
if has then if has then
http_write_json_error({ message = "This ID already exists." }) http_write_json_error({ message = "This ID already exists." })
return return
end end
else else
uuid = api.gen_short_uuid() uid = api.gen_random_char()
end end
uci:section(appname, "shunt_rules", uuid) uci:section(appname, "shunt_rules", uid)
local group = http.formvalue("group") local group = http.formvalue("group")
if group and group ~= "default" then if group and group ~= "default" then
uci:set(appname, uuid, "group", group) uci:set(appname, uid, "group", group)
end end
if redirect == "1" then if redirect == "1" then
api.uci_save(uci, appname) api.uci_save(uci, appname)
http.redirect(api.url("shunt_rules", uuid)) http.redirect(api.url("shunt_rules", uid))
else else
api.uci_save(uci, appname) api.uci_save(uci, appname)
http_write_json_ok({uuid = uuid, redirect_url = api.url("shunt_rules", uuid)}) http_write_json_ok({uid = uid, redirect_url = api.url("shunt_rules", uid)})
end end
end end
@@ -23,10 +23,9 @@ s.anonymous = true
s.addremove = true s.addremove = true
s.extedit = api.url("acl_config", "%s") s.extedit = api.url("acl_config", "%s")
function s.create(e, t) function s.create(e, t)
local uuid = api.gen_short_uuid(5) local uid = "acl_" .. api.gen_random_char(5)
uuid = "acl_" .. uuid TypedSection.create(e, uid)
TypedSection.create(e, uuid) luci.http.redirect(e.extedit:format(uid))
luci.http.redirect(e.extedit:format(uuid))
end end
function s.remove(e, t) function s.remove(e, t)
sys.call("rm -rf /tmp/etc/passwall_tmp/dns_" .. t .. "*") sys.call("rm -rf /tmp/etc/passwall_tmp/dns_" .. t .. "*")
@@ -50,6 +49,15 @@ sys.net.mac_hints(function(e, t)
} }
end) end)
i = s:option(DummyValue, "interface", translate("Source Interface"))
i.cfgvalue = function(t, n)
local v = Value.cfgvalue(t, n) or ''
if v == "" then
return translate("All")
end
return v
end
o = s:option(DummyValue, "sources", translate("Source")) o = s:option(DummyValue, "sources", translate("Source"))
o.rawhtml = true o.rawhtml = true
o.cfgvalue = function(t, n) o.cfgvalue = function(t, n)
@@ -68,10 +76,13 @@ o.cfgvalue = function(t, n)
return e return e
end end
o = s:option(DummyValue, "interface", translate("Source Interface")) i = s:option(DummyValue, "mode", translate("Mode"))
o.cfgvalue = function(t, n) i.cfgvalue = function(t, n)
local v = Value.cfgvalue(t, n) or '-' local v = Value.cfgvalue(t, n) or '0'
return v if v == "1" then
return translate("Proxy")
end
return translate("No Proxy")
end end
--[[ --[[
@@ -84,19 +84,6 @@ o = s:option(Value, "remarks", translate("Remarks"))
o.default = cfgid o.default = cfgid
o.rmempty = false o.rmempty = false
---- Log
o = s:option(Flag, "log", translate("Log"))
o.default = 0
o.rmempty = false
o = s:option(ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
o.default = "warning"
o:value("debug")
o:value("info")
o:value("warning")
o:value("error")
o:depends("log", "1")
o = s:option(Value, "interface", translate("Source Interface")) o = s:option(Value, "interface", translate("Source Interface"))
o:value("", translate("All")) o:value("", translate("All"))
local iface = api.get_network_devices() local iface = api.get_network_devices()
@@ -196,12 +183,17 @@ sources.validate = function(self, value, t)
end end
sources.write = dynamicList_write sources.write = dynamicList_write
o = s:option(ListValue, "mode", translate("Mode"))
o:value("0", translate("No Proxy"))
o:value("1", translate("Proxy"))
---- TCP No Redir Ports ---- TCP No Redir Ports
local TCP_NO_REDIR_PORTS = m:get("@global_forwarding[0]", "tcp_no_redir_ports") local TCP_NO_REDIR_PORTS = m:get("@global_forwarding[0]", "tcp_no_redir_ports")
o = s:option(Value, "tcp_no_redir_ports", translate("TCP No Redir Ports")) o = s:option(Value, "tcp_no_redir_ports", translate("TCP No Redir Ports"))
o:value("", translate("Use global config") .. "(" .. TCP_NO_REDIR_PORTS .. ")") o:value("", translate("Use global config") .. "(" .. TCP_NO_REDIR_PORTS .. ")")
o:value("disable", translate("No patterns are used")) o:value("disable", translate("No patterns are used"))
o:value("1:65535", translate("All")) o:value("1:65535", translate("All"))
o:depends("mode", "1")
o.validate = port_validate o.validate = port_validate
---- UDP No Redir Ports ---- UDP No Redir Ports
@@ -213,11 +205,13 @@ o = s:option(Value, "udp_no_redir_ports", translate("UDP No Redir Ports"),
o:value("", translate("Use global config") .. "(" .. UDP_NO_REDIR_PORTS .. ")") o:value("", translate("Use global config") .. "(" .. UDP_NO_REDIR_PORTS .. ")")
o:value("disable", translate("No patterns are used")) o:value("disable", translate("No patterns are used"))
o:value("1:65535", translate("All")) o:value("1:65535", translate("All"))
o:depends("mode", "1")
o.validate = port_validate o.validate = port_validate
o = s:option(DummyValue, "_hide_node_option", "") o = s:option(DummyValue, "_hide_node_option", "")
o.template = "passwall/cbi/hidevalue" o.template = "passwall/cbi/hidevalue"
o.value = "1" o.value = "1"
o:depends("mode", "0")
o:depends({ tcp_no_redir_ports = "1:65535", udp_no_redir_ports = "1:65535" }) o:depends({ tcp_no_redir_ports = "1:65535", udp_no_redir_ports = "1:65535" })
if TCP_NO_REDIR_PORTS == "1:65535" and UDP_NO_REDIR_PORTS == "1:65535" then if TCP_NO_REDIR_PORTS == "1:65535" and UDP_NO_REDIR_PORTS == "1:65535" then
o:depends({ tcp_no_redir_ports = "", udp_no_redir_ports = "" }) o:depends({ tcp_no_redir_ports = "", udp_no_redir_ports = "" })
@@ -280,6 +274,20 @@ o.value = "1"
o:depends({ udp_node = "", ['!reverse'] = true }) o:depends({ udp_node = "", ['!reverse'] = true })
o:depends({ shunt_udp_node = "tcp" }) o:depends({ shunt_udp_node = "tcp" })
---- Log
o = s:option(Flag, "log", translate("Enable Node Log"))
o.default = 0
o.rmempty = false
o:depends({ _hide_node_option = false, use_global_config = false })
o = s:option(ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
o.default = "warn"
o:value("debug", "Debug")
o:value("info", "Info")
o:value("warn", "Warning")
o:value("error", "Error")
o:depends("log", "1")
---- TCP Proxy Drop Ports ---- TCP Proxy Drop Ports
local TCP_PROXY_DROP_PORTS = m:get("@global_forwarding[0]", "tcp_proxy_drop_ports") local TCP_PROXY_DROP_PORTS = m:get("@global_forwarding[0]", "tcp_proxy_drop_ports")
o = s:option(Value, "tcp_proxy_drop_ports", translate("TCP Proxy Drop Ports")) o = s:option(Value, "tcp_proxy_drop_ports", translate("TCP Proxy Drop Ports"))
@@ -650,11 +650,11 @@ o.default = "0"
o.rmempty = false o.rmempty = false
o = s:taboption("log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level")) o = s:taboption("log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
o.default = "warning" o.default = "warn"
o:value("debug") o:value("debug", "Debug")
o:value("info") o:value("info", "Info")
o:value("warning") o:value("warn", "Warning")
o:value("error") o:value("error", "Error")
o = s:taboption("log", Flag, "advanced_log_feature", translate("Advanced log feature"), translate("For professionals only.")) o = s:taboption("log", Flag, "advanced_log_feature", translate("Advanced log feature"), translate("For professionals only."))
o.default = "0" o.default = "0"
@@ -696,10 +696,9 @@ s2.anonymous = true
s2.addremove = true s2.addremove = true
s2.extedit = api.url("socks_config", "%s") s2.extedit = api.url("socks_config", "%s")
function s2.create(e, t) function s2.create(e, t)
local uuid = api.gen_short_uuid(5) local uid = "socks_" .. api.gen_random_char(5)
uuid = "socks_" .. uuid TypedSection.create(e, uid)
TypedSection.create(e, uuid) luci.http.redirect(e.extedit:format(uid))
luci.http.redirect(e.extedit:format(uuid))
end end
function s2.remove(e, t) function s2.remove(e, t)
local socks = "Socks_" .. t local socks = "Socks_" .. t
@@ -114,9 +114,8 @@ s.anonymous = true
s.addremove = true s.addremove = true
s.create = function(e, t) s.create = function(e, t)
local uuid = api.gen_short_uuid(5) local uid = "haproxy_" .. api.gen_random_char(5)
uuid = "haproxy_" .. uuid TypedSection.create(e, uid)
TypedSection.create(e, uuid)
end end
s.remove = function(self, section) s.remove = function(self, section)
@@ -138,12 +138,11 @@ s.template = "cbi/tblsection"
s.extedit = api.url("node_subscribe_config", "%s") s.extedit = api.url("node_subscribe_config", "%s")
function s.create(e, t) function s.create(e, t)
m.no_commit = true m.no_commit = true
local uuid = api.gen_short_uuid(5) local uid = "sub_" .. api.gen_random_char(5)
uuid = "sub_" .. uuid TypedSection.create(e, uid)
TypedSection.create(e, uuid) m:set(uid, "hysteria_up_mbps", "100")
m:set(uuid, "hysteria_up_mbps", "100") m:set(uid, "hysteria_down_mbps", "100")
m:set(uuid, "hysteria_down_mbps", "100") luci.http.redirect(e.extedit:format(uid))
luci.http.redirect(e.extedit:format(uuid))
end end
o = s:option(Value, "remark", translate("Remarks")) o = s:option(Value, "remark", translate("Remarks"))
@@ -222,9 +222,8 @@ if has_xray then
s_xray_noise.addremove = true s_xray_noise.addremove = true
s_xray_noise.create = function(e, t) s_xray_noise.create = function(e, t)
local uuid = api.gen_short_uuid(5) local uid = "xray_noise_" .. api.gen_random_char(5)
uuid = "xray_noise_" .. uuid TypedSection.create(e, uid)
TypedSection.create(e, uuid)
end end
s_xray_noise.remove = function(self, section) s_xray_noise.remove = function(self, section)
@@ -513,6 +513,9 @@ o.default = "chrome"
o:depends({ [_n("tls")] = true, [_n("utls")] = true }) o:depends({ [_n("tls")] = true, [_n("utls")] = true })
o:depends({ [_n("tls")] = true, [_n("reality")] = true }) 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:depends({ [_n("tls")] = true, [_n("reality")] = false })
o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65")) o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65"))
o.default = "0" o.default = "0"
o:depends({ [_n("tls")] = true, [_n("reality")] = true }) o:depends({ [_n("tls")] = true, [_n("reality")] = true })
@@ -536,6 +536,9 @@ o.validate = function(self, value)
return value return value
end 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:depends({ [_n("tls")] = true })
o = s:option(Flag, _n("ech"), translate("ECH")) o = s:option(Flag, _n("ech"), translate("ECH"))
o.default = "0" o.default = "0"
o:depends({ [_n("tls")] = true, [_n("flow")] = "", [_n("reality")] = false }) o:depends({ [_n("tls")] = true, [_n("flow")] = "", [_n("reality")] = false })
@@ -26,10 +26,9 @@ t.sortable = true
t.template = "cbi/tblsection" t.template = "cbi/tblsection"
t.extedit = api.url("server_user", "%s") t.extedit = api.url("server_user", "%s")
function t.create(e, t) function t.create(e, t)
local uuid = api.gen_uuid() local uid = api.gen_random_char()
t = uuid TypedSection.create(e, uid)
TypedSection.create(e, t) luci.http.redirect(e.extedit:format(uid))
luci.http.redirect(e.extedit:format(t))
end end
function t.remove(e, t) function t.remove(e, t)
e.map.proceed = true e.map.proceed = true
@@ -111,7 +111,7 @@ o:depends({ [_n("protocol")] = "socks" })
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password")) o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
for i = 1, 3 do for i = 1, 3 do
o:value(api.gen_uuid(1)) o:value(api.gen_uuid())
end end
o:depends({ [_n("protocol")] = "vmess" }) o:depends({ [_n("protocol")] = "vmess" })
o:depends({ [_n("protocol")] = "vless" }) o:depends({ [_n("protocol")] = "vless" })
@@ -235,7 +235,7 @@ o:depends({ [_n("protocol")] = "shadowsocks" })
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password")) o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
for i = 1, 3 do for i = 1, 3 do
o:value(api.gen_uuid(1)) o:value(api.gen_uuid())
end end
o:depends({ [_n("protocol")] = "vmess" }) o:depends({ [_n("protocol")] = "vmess" })
o:depends({ [_n("protocol")] = "vless" }) o:depends({ [_n("protocol")] = "vless" })
+2 -5
View File
@@ -642,15 +642,12 @@ function get_full_node_remarks(n)
return remarks return remarks
end end
function gen_uuid(format) function gen_uuid()
local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)") local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
if format == nil then
uuid = string.gsub(uuid, "-", "")
end
return uuid return uuid
end end
function gen_short_uuid(length) function gen_random_char(length)
if not length then length = 8 end if not length then length = 8 end
return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length) return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length)
end end
@@ -5,7 +5,6 @@ local sys = api.sys
local jsonc = api.jsonc local jsonc = api.jsonc
local appname = "passwall" local appname = "passwall"
local fs = api.fs local fs = api.fs
local split = api.split
local ech_domain = {} local ech_domain = {}
local local_version = api.get_app_version("sing-box"):match("[^v]+") local local_version = api.get_app_version("sing-box"):match("[^v]+")
@@ -88,6 +87,11 @@ local function convert_geofile()
convert(GEO_VAR.IP_PATH, "geoip", GEO_VAR.IP_TAGS) convert(GEO_VAR.IP_PATH, "geoip", GEO_VAR.IP_TAGS)
end end
local function get_log_level(s)
if s == "warning" then s = "warn" end
return s
end
function gen_outbound(flag, node, tag, proxy_table) function gen_outbound(flag, node, tag, proxy_table)
local result = nil local result = nil
if node then if node then
@@ -190,7 +194,7 @@ function gen_outbound(flag, node, tag, proxy_table)
if not GLOBAL.DNS_SERVER[dns_key] then if not GLOBAL.DNS_SERVER[dns_key] then
GLOBAL.DNS_SERVER[dns_key] = { GLOBAL.DNS_SERVER[dns_key] = {
server = { server = {
tag = "dns-node-" .. api.gen_short_uuid(), tag = "dns-node-" .. api.gen_random_char(),
type = dns_proto, type = dns_proto,
server = server_address, server = server_address,
server_port = server_port, server_port = server_port,
@@ -232,7 +236,8 @@ function gen_outbound(flag, node, tag, proxy_table)
--max_version = "1.3", --max_version = "1.3",
fragment = fragment, fragment = fragment,
record_fragment = record_fragment, record_fragment = record_fragment,
certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and split(node.tls_certificate_pem, "\n") or nil, certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and api.split(node.tls_certificate_pem, "\n") or nil,
cipher_suites = (node.cipherSuites and node.cipherSuites ~= "") and api.split(node.cipherSuites, ":") or nil,
ech = (node.ech == "1") and (function() ech = (node.ech == "1") and (function()
local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech
local domain, dns = s:match("^([^+]+)%+(.+)$") local domain, dns = s:match("^([^+]+)%+(.+)$")
@@ -1042,7 +1047,7 @@ function gen_config_server(node)
local config = { local config = {
log = { log = {
disabled = (not node or node.log == "0") and true or false, disabled = (not node or node.log == "0") and true or false,
level = node.loglevel or "info", level = get_log_level(node.loglevel) or "info",
timestamp = true, timestamp = true,
--output = logfile, --output = logfile,
}, },
@@ -2169,7 +2174,7 @@ function gen_config(var)
local config = { local config = {
log = { log = {
disabled = log == "0" and true or false, disabled = log == "0" and true or false,
level = loglevel, level = get_log_level(loglevel),
timestamp = true, timestamp = true,
output = logfile, output = logfile,
}, },
@@ -31,6 +31,11 @@ local function get_domain_excluded()
return hosts return hosts
end end
local function get_log_level(s)
if s == "warn" then s = "warning" end
return s
end
function gen_outbound(flag, node, tag, proxy_table) function gen_outbound(flag, node, tag, proxy_table)
local result = nil local result = nil
if node then if node then
@@ -165,7 +170,8 @@ function gen_outbound(flag, node, tag, proxy_table)
certificates = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and { certificates = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and {
certificate = api.split(node.tls_certificate_pem, "\n"), certificate = api.split(node.tls_certificate_pem, "\n"),
usage = "verify" usage = "verify"
} or nil } or nil,
cipherSuites = node.cipherSuites or nil
} or nil, } or nil,
realitySettings = (node.stream_security == "reality") and { realitySettings = (node.stream_security == "reality") and {
serverName = node.tls_serverName, serverName = node.tls_serverName,
@@ -453,7 +459,7 @@ function gen_outbound(flag, node, tag, proxy_table)
local dns_key = dns_proto .. "|" .. config_address .. "|" .. tostring(config_port) local dns_key = dns_proto .. "|" .. config_address .. "|" .. tostring(config_port)
if not GLOBAL.DNS_SERVER[dns_key] then if not GLOBAL.DNS_SERVER[dns_key] then
GLOBAL.DNS_SERVER[dns_key] = { GLOBAL.DNS_SERVER[dns_key] = {
tag = "dns-node-" .. api.gen_short_uuid(), tag = "dns-node-" .. api.gen_random_char(),
-- queryStrategy = node.domain_strategy or "UseIP", -- queryStrategy = node.domain_strategy or "UseIP",
address = config_address, address = config_address,
port = config_port, port = config_port,
@@ -635,7 +641,7 @@ function gen_config_server(node)
local config = { local config = {
log = { log = {
-- error = "/tmp/etc/passwall_server/log/" .. user[".name"] .. ".log", -- error = "/tmp/etc/passwall_server/log/" .. user[".name"] .. ".log",
loglevel = ("1" == node.log) and node.loglevel or "none" loglevel = ("1" == node.log) and get_log_level(node.loglevel) or "none"
}, },
-- 传入连接 -- 传入连接
inbounds = { inbounds = {
@@ -1966,7 +1972,7 @@ function gen_config(var)
end)(), end)(),
log = { log = {
-- error = string.format("/tmp/etc/%s/%s.log", appname, node[".name"]), -- error = string.format("/tmp/etc/%s/%s.log", appname, node[".name"]),
loglevel = loglevel loglevel = get_log_level(loglevel)
}, },
-- DNS -- DNS
dns = dns, dns = dns,
+12
View File
@@ -1631,6 +1631,9 @@ msgstr "日志"
msgid "Log" msgid "Log"
msgstr "日志" msgstr "日志"
msgid "Enable Node Log"
msgstr "启用节点日志"
msgid "%s Node Log" msgid "%s Node Log"
msgstr "%s 节点日志" msgstr "%s 节点日志"
@@ -2156,3 +2159,12 @@ msgstr "Gecko 包大小(最大)"
msgid "valid time (hh:mm)" msgid "valid time (hh:mm)"
msgstr "有效时间(hh:mm" msgstr "有效时间(hh:mm"
msgid "Not Set"
msgstr "未设置"
msgid "Cipher Suites"
msgstr "密码套件"
msgid "Configures the list of supported cipher suites, separated by :"
msgstr "配置支持的密码套件列表,以冒号 (:) 分隔。"
@@ -115,7 +115,6 @@ run_singbox() {
json_add_string "logfile" "${log_file}" json_add_string "logfile" "${log_file}"
fi fi
[ -z "$loglevel" ] && local loglevel=$(config_t_get global loglevel "warn") [ -z "$loglevel" ] && local loglevel=$(config_t_get global loglevel "warn")
[ "$loglevel" = "warning" ] && loglevel="warn"
json_add_string "loglevel" "$loglevel" json_add_string "loglevel" "$loglevel"
[ -n "$flag" ] && json_add_string "flag" "$flag" [ -n "$flag" ] && json_add_string "flag" "$flag"
@@ -1527,7 +1526,7 @@ acl_app() {
eval $(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-) eval $(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)
log=${log:-0} log=${log:-0}
loglevel=${loglevel:-warning} loglevel=${loglevel:-warn}
if [ -n "${sources}" ]; then if [ -n "${sources}" ]; then
for s in $sources; do for s in $sources; do
@@ -203,6 +203,7 @@ load_acl() {
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)" eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
mode=${mode:-0}
tcp_no_redir_ports=${tcp_no_redir_ports:-default} tcp_no_redir_ports=${tcp_no_redir_ports:-default}
udp_no_redir_ports=${udp_no_redir_ports:-default} udp_no_redir_ports=${udp_no_redir_ports:-default}
use_global_config=${use_global_config:-0} use_global_config=${use_global_config:-0}
@@ -217,6 +218,10 @@ load_acl() {
chn_list=${chn_list:-direct} chn_list=${chn_list:-direct}
tcp_proxy_mode=${tcp_proxy_mode:-proxy} tcp_proxy_mode=${tcp_proxy_mode:-proxy}
udp_proxy_mode=${udp_proxy_mode:-proxy} udp_proxy_mode=${udp_proxy_mode:-proxy}
[ "$mode" = "0" ] && {
tcp_no_redir_ports="1:65535"
udp_no_redir_ports="1:65535"
}
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS [ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS [ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS [ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
@@ -263,6 +263,7 @@ load_acl() {
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)" eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
mode=${mode:-0}
tcp_no_redir_ports=${tcp_no_redir_ports:-default} tcp_no_redir_ports=${tcp_no_redir_ports:-default}
udp_no_redir_ports=${udp_no_redir_ports:-default} udp_no_redir_ports=${udp_no_redir_ports:-default}
use_global_config=${use_global_config:-0} use_global_config=${use_global_config:-0}
@@ -277,6 +278,10 @@ load_acl() {
chn_list=${chn_list:-direct} chn_list=${chn_list:-direct}
tcp_proxy_mode=${tcp_proxy_mode:-proxy} tcp_proxy_mode=${tcp_proxy_mode:-proxy}
udp_proxy_mode=${udp_proxy_mode:-proxy} udp_proxy_mode=${udp_proxy_mode:-proxy}
[ "$mode" = "0" ] && {
tcp_no_redir_ports="1:65535"
udp_no_redir_ports="1:65535"
}
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS [ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS [ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS [ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
@@ -180,9 +180,9 @@ do
local flag = "Socks节点列表[" .. i .. "]备用节点的列表" local flag = "Socks节点列表[" .. i .. "]备用节点的列表"
local currentNodes = {} local currentNodes = {}
local newNodes = {} local newNodes = {}
for k, asb_node in ipairs(t.autoswitch_backup_node) do for k, asb_node_id in ipairs(t.autoswitch_backup_node) do
if asb_node then if asb_node_id then
local currentNode = uci:get_all(appname, asb_node) or {} local currentNode = uci:get_all(appname, asb_node_id) or {}
if currentNode[".type"] == "nodes" then if currentNode[".type"] == "nodes" then
currentNodes[#currentNodes + 1] = { currentNodes[#currentNodes + 1] = {
log = true, log = true,
@@ -1931,7 +1931,7 @@ local function update_node(manual)
chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type
end end
for _, vv in ipairs(list) do for _, vv in ipairs(list) do
local cfgid = uci:section(appname, "nodes", api.gen_short_uuid()) local cfgid = uci:section(appname, "nodes", api.gen_random_char())
for kkk, vvv in pairs(vv) do for kkk, vvv in pairs(vv) do
if type(vvv) == "table" and next(vvv) ~= nil then if type(vvv) == "table" and next(vvv) ~= nil then
uci:set_list(appname, cfgid, kkk, vvv) uci:set_list(appname, cfgid, kkk, vvv)
-22
View File
@@ -1,22 +0,0 @@
# 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
@@ -1,2 +0,0 @@
# luci-app-syncthing
在Potat0000源码基础上进行了汉化优化,官方openwrt23.05.3编译后可使用
@@ -1,17 +0,0 @@
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
@@ -1,48 +0,0 @@
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
@@ -1,27 +0,0 @@
<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>
@@ -1,12 +0,0 @@
#!/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
@@ -1,11 +0,0 @@
{
"luci-app-syncthing": {
"description": "Grant UCI access for luci-app-syncthing",
"read": {
"uci": [ "syncthing" ]
},
"write": {
"uci": [ "syncthing" ]
}
}
}