update 2026-08-14 20:53:13

This commit is contained in:
action committed 2026-08-14 20:53:13 +08:00
1 parent bbea37a7c8
commit 58e04d6ceb
1972 files changed
+1523368 -299

No files matched your search

@@ -3,7 +3,6 @@
local api = require ("luci.passwall2.api")
local appname = api.appname
local fs = api.fs
local jsonc = api.jsonc
local uci = api.uci
local sys = api.sys
@@ -21,11 +20,11 @@ local haproxy_conf = var["-conf"]
local haproxy_dns = "127.0.0.1"
local cpu_thread = sys.exec('echo -n $(cat /proc/cpuinfo | grep "processor" | wc -l)') or "1"
local health_check_type = uci:get(api.c_config, "@global_haproxy[0]", "health_check_type") or "tcp"
local health_check_inter = uci:get(api.c_config, "@global_haproxy[0]", "health_check_inter") or "20"
local balancingStrategy = uci:get(api.c_config, "@global_haproxy[0]", "balancingStrategy") or "roundrobin"
local console_port = uci:get(api.c_config, "@global_haproxy[0]", "console_port")
local bind_local = uci:get(api.c_config, "@global_haproxy[0]", "bind_local") or "0"
local health_check_type = api.uci_get_c("@global_haproxy[0]", "health_check_type") or "tcp"
local health_check_inter = api.uci_get_c("@global_haproxy[0]", "health_check_inter") or "20"
local balancingStrategy = api.uci_get_c("@global_haproxy[0]", "balancingStrategy") or "roundrobin"
local console_port = api.uci_get_c("@global_haproxy[0]", "console_port")
local bind_local = api.uci_get_c("@global_haproxy[0]", "bind_local") or "0"
local bind_address = "0.0.0.0"
if bind_local == "1" then bind_address = "127.0.0.1" end
@@ -92,14 +91,14 @@ f_out:write(haproxy_config)
local listens = {}
uci:foreach(api.c_config, "haproxy_config", function(t)
api.uci_foreach_c("haproxy_config", function(t)
if t.enabled == "1" then
local server_remark
local server_address
local server_port
local lbss = t.lbss
local listen_port = tonumber(t.haproxy_port) or 0
local server_node = uci:get_all(api.c_config, lbss)
local server_node = api.uci_get_c(lbss)
local hop = (health_check_type == "script_logic") and (server_node.hysteria_hop or server_node.hysteria2_hop) or nil
hop = hop and hop:gsub(":", "-") or nil
if server_node and server_node.address and (server_node.port or hop) then
@@ -212,8 +211,8 @@ listen %s
end
-- Console config
local console_user = uci:get(api.c_config, "@global_haproxy[0]", "console_user")
local console_password = uci:get(api.c_config, "@global_haproxy[0]", "console_password")
local console_user = api.uci_get_c("@global_haproxy[0]", "console_user")
local console_password = api.uci_get_c("@global_haproxy[0]", "console_password")
local str = [[
listen console
bind 0.0.0.0:%s
@@ -229,7 +228,7 @@ f_out:close()
-- Built-in health check URL
if health_check_type == "script_logic" then
local probeUrl = uci:get(api.c_config, "@global_haproxy[0]", "health_probe_url") or "https://www.google.com/generate_204"
local probeUrl = api.uci_get_c("@global_haproxy[0]", "health_probe_url") or "https://www.google.com/generate_204"
local f_url = io.open(haproxy_path .. "/Probe_URL", "w")
f_url:write(probeUrl)
f_url:close()
@@ -1,6 +1,5 @@
local api = require "luci.passwall2.api"
local appname = "passwall2"
local uci = api.uci
local c_config = api.c_config
local sys = api.sys
local jsonc = api.jsonc
local fs = api.fs
@@ -23,38 +22,38 @@ local function tinsert(table_name, val)
end
local function backup_servers()
local DNSMASQ_DNS = uci:get("dhcp", "@dnsmasq[0]", "server")
local DNSMASQ_DNS = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if DNSMASQ_DNS and #DNSMASQ_DNS > 0 then
uci:set(api.c_config, "@global[0]", "dnsmasq_servers", DNSMASQ_DNS)
api.uci_save(uci, appname, true)
api.uci_set_c("@global[0]", "dnsmasq_servers", DNSMASQ_DNS)
api.uci_save_c(true)
end
end
local function restore_servers()
local dns_table = {}
local DNSMASQ_DNS = uci:get("dhcp", "@dnsmasq[0]", "server")
local DNSMASQ_DNS = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if DNSMASQ_DNS and #DNSMASQ_DNS > 0 then
for k, v in ipairs(DNSMASQ_DNS) do
tinsert(dns_table, v)
end
end
local OLD_SERVER = uci:get(api.c_config, "@global[0]", "dnsmasq_servers")
local OLD_SERVER = api.uci_get_c("@global[0]", "dnsmasq_servers")
if OLD_SERVER and #OLD_SERVER > 0 then
for k, v in ipairs(OLD_SERVER) do
tinsert(dns_table, v)
end
uci:delete(api.c_config, "@global[0]", "dnsmasq_servers")
api.uci_save(uci, appname, true)
api.uci_del_c("@global[0]", "dnsmasq_servers")
api.uci_save_c(true)
end
if dns_table and #dns_table > 0 then
uci:set_list("dhcp", "@dnsmasq[0]", "server", dns_table)
api.uci_save(uci, "dhcp", true)
api.uci_set("dhcp", "@dnsmasq[0]", "server", dns_table)
api.uci_save(nil, "dhcp", true)
end
end
function stretch()
local dnsmasq_server = uci:get("dhcp", "@dnsmasq[0]", "server")
local dnsmasq_noresolv = uci:get("dhcp", "@dnsmasq[0]", "noresolv")
local dnsmasq_server = api.uci_get("dhcp", "@dnsmasq[0]", "server")
local dnsmasq_noresolv = api.uci_get("dhcp", "@dnsmasq[0]", "noresolv")
local _flag
if dnsmasq_server and #dnsmasq_server > 0 then
for k, v in ipairs(dnsmasq_server) do
@@ -64,7 +63,7 @@ function stretch()
end
end
if not _flag and dnsmasq_noresolv == "1" then
uci:delete("dhcp", "@dnsmasq[0]", "noresolv")
api.uci_del("dhcp", "@dnsmasq[0]", "noresolv")
local RESOLVFILE = "/tmp/resolv.conf.d/resolv.conf.auto"
local file = io.open(RESOLVFILE, "r")
if not file then
@@ -76,8 +75,8 @@ function stretch()
RESOLVFILE = "/tmp/resolv.conf.auto"
end
end
uci:set("dhcp", "@dnsmasq[0]", "resolvfile", RESOLVFILE)
api.uci_save(uci, "dhcp", true)
api.uci_set("dhcp", "@dnsmasq[0]", "resolvfile", RESOLVFILE)
api.uci_save(nil, "dhcp", true)
end
end
@@ -96,15 +95,15 @@ function logic_restart(var)
backup_servers()
--sys.call("sed -i '/list server/d' /etc/config/dhcp >/dev/null 2>&1")
local dns_table = {}
local dnsmasq_server = uci:get("dhcp", "@dnsmasq[0]", "server")
local dnsmasq_server = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if dnsmasq_server and #dnsmasq_server > 0 then
for k, v in ipairs(dnsmasq_server) do
if v:find("/") then
tinsert(dns_table, v)
end
end
uci:set_list("dhcp", "@dnsmasq[0]", "server", dns_table)
api.uci_save(uci, "dhcp", true)
api.uci_set("dhcp", "@dnsmasq[0]", "server", dns_table)
api.uci_save(nil, "dhcp", true)
end
sys.call("/etc/init.d/dnsmasq restart >/dev/null 2>&1")
restore_servers()
@@ -243,7 +242,7 @@ function add_rule(var)
end
local cache_text = ""
local nodes_address_md5 = sys.exec("echo -n $(uci show passwall2 | grep '\\.address') | md5sum")
local nodes_address_md5 = sys.exec("echo -n $(uci show %s | grep '\\.address') | md5sum" % c_config)
local new_text = TMP_DNSMASQ_PATH .. DNSMASQ_CONF_FILE .. DEFAULT_DNS .. LOCAL_DNS .. TUN_DNS .. nodes_address_md5 .. NFTFLAG
if fs.access(CACHE_TEXT_FILE) then
for line in io.lines(CACHE_TEXT_FILE) do
@@ -268,7 +267,7 @@ function add_rule(var)
-- Always use domestic DNS to resolve node domain names
if true then
fwd_dns = LOCAL_DNS
uci:foreach(api.c_config, "nodes", function(t)
api.uci_foreach_c("nodes", function(t)
local function process_address(address)
address = (address or ""):lower()
if address == "engage.cloudflareclient.com" then return end
@@ -326,7 +325,7 @@ function add_rule(var)
["return"] = "1"
})
--dhcp.leases to hostsMore actions
local hosts = "/tmp/etc/" .. appname .. "_tmp/dhcp-hosts"
local hosts = api.CACHE_PATH .. "/dhcp-hosts"
sys.call("touch " .. hosts)
tinsert(conf_lines, "addn-hosts=" .. hosts)
else
@@ -1,12 +1,11 @@
#!/usr/bin/lua
local api = require "luci.passwall2.api"
local name = api.appname
local c_config = api.c_config
local appname = api.appname
local fs = api.fs
local log = api.log
local sys = api.sys
local uci = api.uci
local uci, uci_get, uci_set, uci_del, uci_foreach, uci_save = api.uci, api.uci_get_c, api.uci_set_c, api.uci_del_c, api.uci_foreach_c, api.uci_save_c
local arg1 = arg[1]
local arg2 = arg[2]
@@ -16,9 +15,9 @@ local reboot = 0
local geoip_update = "0"
local geosite_update = "0"
local geoip_url = uci:get(c_config, "@global_rules[0]", "geoip_url") or "https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat"
local geosite_url = uci:get(c_config, "@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
local asset_location = uci:get(c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
local geoip_url = uci_get("@global_rules[0]", "geoip_url") or "https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat"
local geosite_url = uci_get("@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
local asset_location = uci_get("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
asset_location = asset_location:match("/$") and asset_location or (asset_location .. "/")
local backup_path = "/tmp/bak_v2ray/"
@@ -177,16 +176,16 @@ if arg2 then
end
end)
else
geoip_update = uci:get(c_config, "@global_rules[0]", "geoip_update") or "1"
geosite_update = uci:get(c_config, "@global_rules[0]", "geosite_update") or "1"
geoip_update = uci_get("@global_rules[0]", "geoip_update") or "1"
geosite_update = uci_get("@global_rules[0]", "geosite_update") or "1"
end
if geoip_update == "0" and geosite_update == "0" then
os.exit(0)
end
local function check_instance(action)
local rule_lock = "/var/lock/" .. name .. "_rule_update.lock"
local sub_lock = "/var/lock/" .. name .. "_subscribe.lock"
local rule_lock = "/var/lock/" .. appname .. "_rule_update.lock"
local sub_lock = "/var/lock/" .. appname .. "_subscribe.lock"
if action == "start" then
math.randomseed(os.time() + math.floor(os.clock() * 1000))
@@ -233,20 +232,20 @@ if geosite_update == "1" then
remove_tmp_geofile("geosite")
end
uci:set(c_config, "@global_rules[0]", "geoip_update", geoip_update)
uci:set(c_config, "@global_rules[0]", "geosite_update", geosite_update)
api.uci_save(uci, c_config, true)
uci_set("@global_rules[0]", "geoip_update", geoip_update)
uci_set("@global_rules[0]", "geosite_update", geosite_update)
uci_save(true)
if reboot == 1 then
if arg3 == "cron" then
if not fs.access("/var/lock/" .. name .. ".lock") then
sys.call("touch /tmp/lock/" .. name .. "_cron.lock")
if not fs.access("/var/lock/" .. appname .. ".lock") then
sys.call("touch /tmp/lock/" .. appname .. "_cron.lock")
end
end
log(1, api.i18n.translate("Restart the service and apply the new rules."))
uci:set(c_config, "@global[0]", "flush_set", "1")
api.uci_save(uci, c_config, true, true)
uci_set("@global[0]", "flush_set", "1")
uci_save(true, true)
end
log(0, api.i18n.translate("The rules have been updated..."))
@@ -7,23 +7,22 @@ require 'luci.util'
require 'luci.jsonc'
require 'luci.sys'
local api = require "luci.passwall2.api"
local appname = api.appname
local c_config = api.c_config
local datatypes = require "luci.cbi.datatypes"
local datatypes = api.datatypes
local split = api.split
local base64Decode = api.base64Decode
local jsonParse, jsonStringify = api.jsonc.parse, api.jsonc.stringify
local UrlEncode, UrlDecode = api.UrlEncode, api.UrlDecode
local fs = api.fs
local log = api.log
local i18n = api.i18n
local uci, uci_get, uci_set, uci_del, uci_foreach, uci_save = api.uci, api.uci_get_c, api.uci_set_c, api.uci_del_c, api.uci_foreach_c, api.uci_save_c
-- these global functions are accessed all the time by the event handler
-- so caching them is worth the effort
local tinsert = table.insert
local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub
local split = api.split
local jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify
local base64Decode = api.base64Decode
local UrlEncode = api.UrlEncode
local UrlDecode = api.UrlDecode
local uci = api.uci
local fs = api.fs
local log = api.log
local i18n = api.i18n
local lyaml = require "lyaml"
local has_ss_rust = api.is_finded("sslocal")
@@ -32,9 +31,9 @@ local has_singbox = api.finded_com("sing-box")
local has_xray = api.finded_com("xray")
local has_hysteria2 = api.finded_com("hysteria")
local DEFAULT_ALLOWINSECURE = true
local DEFAULT_FILTER_KEYWORD_MODE = uci:get(c_config, "@global_subscribe[0]", "filter_keyword_mode") or "0"
local DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci:get(c_config, "@global_subscribe[0]", "filter_discard_list") or {}
local DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci:get(c_config, "@global_subscribe[0]", "filter_keep_list") or {}
local DEFAULT_FILTER_KEYWORD_MODE = uci_get("@global_subscribe[0]", "filter_keyword_mode") or "0"
local DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci_get("@global_subscribe[0]", "filter_discard_list") or {}
local DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci_get("@global_subscribe[0]", "filter_keep_list") or {}
-- Nodes should be retrieved using the core type (if not set on the node subscription page, the default type will be used automatically).
local DEFAULT_SS_TYPE = api.get_core("ss_type", {{has_ss_rust,"shadowsocks-rust"},{has_singbox,"sing-box"},{has_xray,"xray"}})
local DEFAULT_TROJAN_TYPE = api.get_core("trojan_type", {{has_singbox,"sing-box"},{has_xray,"xray"}})
@@ -131,13 +130,13 @@ do
local szType = "@global[0]"
local option = "node"
local node_id = uci:get(c_config, szType, option)
local node_id = uci_get(szType, option)
CONFIG[#CONFIG + 1] = {
log = true,
remarks = i18n.translatef("Node"),
currentNode = node_id and uci:get_all(c_config, node_id) or nil,
currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
uci:set(c_config, szType, option, server)
uci_set(szType, option, server)
o.newNodeId = server
end
}
@@ -146,7 +145,7 @@ do
if true then
local i = 0
local option = "node"
uci:foreach(c_config, "socks", function(t)
uci_foreach("socks", function(t)
i = i + 1
local id = t[".name"]
local node_id = t[option]
@@ -154,14 +153,14 @@ do
log = true,
id = id,
remarks = i18n.translatef("Socks node list [%s]", i),
currentNode = node_id and uci:get_all(c_config, node_id) or nil,
currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
if not server or server == "" then
if #nodes_table > 0 then
server = nodes_table[1][".name"]
end
end
uci:set(c_config, t[".name"], option, server)
uci_set(t[".name"], option, server)
o.newNodeId = server
end
}
@@ -171,7 +170,7 @@ do
local newNodes = {}
for k, asb_node_id in ipairs(t.autoswitch_backup_node) do
if asb_node_id then
local currentNode = uci:get_all(c_config, asb_node_id) or {}
local currentNode = uci_get(asb_node_id) or {}
if currentNode[".type"] == "nodes" then
currentNodes[#currentNodes + 1] = {
log = true,
@@ -193,7 +192,7 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
uci:set_list(c_config, id, "autoswitch_backup_node", newNodes or {})
uci_set(id, "autoswitch_backup_node", newNodes or {})
end
end
}
@@ -209,25 +208,25 @@ do
local ip, port = str:match("^([%d%.]+):(%d+)$")
return ip and datatypes.ipaddr(ip) and tonumber(port) and tonumber(port) <= 65535
end
uci:foreach(c_config, "haproxy_config", function(t)
uci_foreach("haproxy_config", function(t)
i = i + 1
local node_id = t[option]
CONFIG[#CONFIG + 1] = {
log = true,
id = t[".name"],
remarks = i18n.translatef("HAProxy node list [%s]", i),
currentNode = node_id and uci:get_all(c_config, node_id) or nil,
currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
-- Modify the LBS value only if it is not in IP:Port format.
if not is_ip_port(t[option]) then
uci:set(c_config, t[".name"], option, server)
uci_set(t[".name"], option, server)
o.newNodeId = server
end
end,
delete = function(o)
-- Deletion is only performed if the current LBS value is not in IP:port format.
if not is_ip_port(t[option]) then
uci:delete(c_config, t[".name"])
uci_del(t[".name"])
end
end
}
@@ -236,7 +235,7 @@ do
if true then
local i = 0
uci:foreach(c_config, "acl_rule", function(t)
uci_foreach("acl_rule", function(t)
i = i + 1
local option = "node"
local node_id = t[option]
@@ -244,20 +243,20 @@ do
log = true,
id = t[".name"],
remarks = i18n.translatef("ACL list [%s]", i),
currentNode = node_id and uci:get_all(c_config, node_id) or nil,
currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
uci:set(c_config, t[".name"], option, server)
uci_set(t[".name"], option, server)
o.newNodeId = server
end
}
end)
end
uci:foreach(c_config, "nodes", function(node)
uci_foreach("nodes", function(node)
local node_id = node[".name"]
if node.protocol and node.protocol == '_shunt' then
local rules = {}
uci:foreach(c_config, "shunt_rules", function(e)
uci_foreach("shunt_rules", function(e)
if e[".name"] and e.remarks then
table.insert(rules, e)
table.insert(rules, {
@@ -278,7 +277,7 @@ do
for k, e in pairs(rules) do
local _node_id = node[e[".name"]] or nil
if _node_id then
local section = uci:get_all(c_config, _node_id) or {}
local section = uci_get(_node_id) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = false,
@@ -286,7 +285,7 @@ do
remarks = i18n.translatef("Shunt [%s] node", e.remarks),
set = function(o, server)
if not server then server = "" end
uci:set(c_config, node_id, e[".name"], server)
uci_set(node_id, e[".name"], server)
o.newNodeId = server
end
}
@@ -303,7 +302,7 @@ do
log = true,
node = b_node_id,
currentNode = (function()
local section = uci:get_all(c_config, b_node_id) or {}
local section = uci_get(b_node_id) or {}
if section[".type"] == "socks" then
return { Socks = b_node_id }
end
@@ -325,15 +324,15 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
uci:set_list(c_config, node_id, "balancing_node", newNodes or {})
uci_set(node_id, "balancing_node", newNodes or {})
end
end
}
-- Backup Node
local currentNode = uci:get_all(c_config, node_id) or nil
local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.fallback_node then
local section = uci:get_all(c_config, currentNode.fallback_node) or {}
local section = uci_get(currentNode.fallback_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
@@ -341,11 +340,11 @@ do
remarks = i18n.translatef("Xray Load Balancing node [%s] backup node", node_id),
currentNode = section,
set = function(o, server)
uci:set(c_config, node_id, "fallback_node", server)
uci_set(node_id, "fallback_node", server)
o.newNodeId = server
end,
delete = function(o)
uci:delete(c_config, node_id, "fallback_node")
uci_del(node_id, "fallback_node")
end
}
end
@@ -360,7 +359,7 @@ do
log = true,
node = u_node_id,
currentNode = (function()
local section = uci:get_all(c_config, u_node_id) or {}
local section = uci_get(u_node_id) or {}
if section[".type"] == "socks" then
return { Socks = u_node_id }
end
@@ -382,47 +381,47 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
uci:set_list(c_config, node_id, "urltest_node", newNodes or {})
uci_set(node_id, "urltest_node", newNodes or {})
end
end
}
else
-- Preproxy Node
local currentNode = uci:get_all(c_config, node_id) or nil
local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.preproxy_node then
local section = uci:get_all(c_config, currentNode.preproxy_node) or {}
local section = uci_get(currentNode.preproxy_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
id = node_id,
remarks = i18n.translatef("Node [%s] preproxy node", node_id),
currentNode = uci:get_all(c_config, currentNode.preproxy_node) or nil,
currentNode = uci_get(currentNode.preproxy_node) or nil,
set = function(o, server)
uci:set(c_config, node_id, "preproxy_node", server)
uci_set(node_id, "preproxy_node", server)
o.newNodeId = server
end,
delete = function(o)
uci:delete(c_config, node_id, "preproxy_node")
uci_del(node_id, "preproxy_node")
end
}
end
end
-- Landing node
local currentNode = uci:get_all(c_config, node_id) or nil
local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.to_node then
local section = uci:get_all(c_config, currentNode.to_node) or {}
local section = uci_get(currentNode.to_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
id = node_id,
remarks = i18n.translatef("Node [%s] landing node", node_id),
currentNode = uci:get_all(c_config, currentNode.to_node) or nil,
currentNode = uci_get(currentNode.to_node) or nil,
set = function(o, server)
uci:set(c_config, node_id, "to_node", server)
uci_set(node_id, "to_node", server)
o.newNodeId = server
end,
delete = function(o)
uci:delete(c_config, node_id, "to_node")
uci_del(node_id, "to_node")
end
}
end
@@ -2002,7 +2001,7 @@ local function curl(url, file, ua, mode, hwid)
end
function get_headers()
local cache_file = "/tmp/etc/" .. appname .. "_tmp/sub_curl_headers"
local cache_file = CACHE_PATH .. "/sub_curl_headers"
if fs.access(cache_file) then
return luci.sys.exec("cat " .. cache_file)
end
@@ -2084,19 +2083,19 @@ local function truncate_nodes(group)
end
end
end
uci:foreach(c_config, "nodes", function(node)
uci_foreach("nodes", function(node)
if node.add_mode == "2" then
if (not group) or (group:lower() == (node.group or ""):lower()) then
uci:delete(c_config, node['.name'])
uci_del(node['.name'])
end
end
end)
uci:foreach(c_config, "subscribe_list", function(o)
uci_foreach("subscribe_list", function(o)
if (not group) or (group:lower() == (o.remark or ""):lower()) then
uci:delete(c_config, o['.name'], "md5")
uci_del(o['.name'], "md5")
end
end)
api.uci_save(uci, c_config, true)
uci_save(true)
end
local function select_node(nodes, config, parentConfig)
@@ -2239,10 +2238,10 @@ local function update_node(manual)
end
if manual == 0 and next(group) then
uci:foreach(c_config, "nodes", function(node)
uci_foreach("nodes", function(node)
-- Do not delete nodes if no new nodes are found or nodes were manually imported...
if node.add_mode == "2" and (node.group and group[node.group:lower()] == true) then
uci:delete(c_config, node['.name'])
uci_del(node['.name'])
end
end)
end
@@ -2255,9 +2254,9 @@ local function update_node(manual)
-- Subscription Group Chain Agent
local function valid_chain_node(node)
if not node then return "" end
local cp = uci:get(c_config, node, "chain_proxy") or ""
local am = uci:get(c_config, node, "add_mode") or "0"
chain_node_type = (cp == "" and am ~= "2") and (uci:get(c_config, node, "type") or "") or ""
local cp = uci_get(node, "chain_proxy") or ""
local am = uci_get(node, "add_mode") or "0"
chain_node_type = (cp == "" and am ~= "2") and (uci_get(node, "type") or "") or ""
if chain_node_type ~= "Xray" and chain_node_type ~= "sing-box" then
chain_node_type = ""
return ""
@@ -2278,39 +2277,39 @@ local function update_node(manual)
local cfgid = uci:section(c_config, "nodes", api.gen_random_char())
for kkk, vvv in pairs(vv) do
if type(vvv) == "table" and next(vvv) ~= nil then
uci:set_list(c_config, cfgid, kkk, vvv)
uci_set(cfgid, kkk, vvv)
else
if kkk ~= "group" or vvv ~= "default" then
uci:set(c_config, cfgid, kkk, vvv)
uci_set(cfgid, kkk, vvv)
end
-- Sing-Box Node Domain resolver
if kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then
if domain_resolver then
uci:set(c_config, cfgid, "domain_resolver", domain_resolver)
uci_set(cfgid, "domain_resolver", domain_resolver)
if domain_resolver_dns then
uci:set(c_config, cfgid, "domain_resolver_dns", domain_resolver_dns)
uci_set(cfgid, "domain_resolver_dns", domain_resolver_dns)
elseif domain_resolver_dns_https then
uci:set(c_config, cfgid, "domain_resolver_dns_https", domain_resolver_dns_https)
uci_set(cfgid, "domain_resolver_dns_https", domain_resolver_dns_https)
end
end
if domain_strategy then
if vvv == "sing-box" then
domain_strategy = (domain_strategy == "UseIPv4" and "ipv4_only") or (domain_strategy == "UseIPv6" and "ipv6_only") or domain_strategy
end
uci:set(c_config, cfgid, "domain_strategy", domain_strategy)
uci_set(cfgid, "domain_strategy", domain_strategy)
end
end
-- Subscription Group Chain Agent
if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then
if preproxy_node_group ~="" then
uci:set(c_config, cfgid, "chain_proxy", "1")
uci:set(c_config, cfgid, "preproxy_node", preproxy_node_group)
uci_set(cfgid, "chain_proxy", "1")
uci_set(cfgid, "preproxy_node", preproxy_node_group)
elseif to_node_group ~= "" then
uci:set(c_config, cfgid, "chain_proxy", "2")
uci:set(c_config, cfgid, "to_node", to_node_group)
uci_set(cfgid, "chain_proxy", "2")
uci_set(cfgid, "to_node", to_node_group)
elseif outbound_iface_group ~= "" then
uci:set(c_config, cfgid, "chain_proxy", "3")
uci:set(c_config, cfgid, "outbound_iface", outbound_iface_group)
uci_set(cfgid, "chain_proxy", "3")
uci_set(cfgid, "outbound_iface", outbound_iface_group)
end
end
end
@@ -2321,16 +2320,16 @@ local function update_node(manual)
for cfgid, info in pairs(subscribe_info) do
for key, value in pairs(info) do
if value ~= "" then
uci:set(c_config, cfgid, key, value)
uci_set(cfgid, key, value)
else
uci:delete(c_config, cfgid, key)
uci_del(cfgid, key)
end
end
end
if next(CONFIG) then
local nodes = {}
uci:foreach(c_config, "nodes", function(node)
uci_foreach("nodes", function(node)
nodes[#nodes + 1] = node
end)
@@ -2352,16 +2351,16 @@ local function update_node(manual)
end
end
api.uci_save(uci, c_config, true)
uci_save(true)
if arg[3] == "cron" then
if not fs.access("/var/lock/" .. appname .. ".lock") then
luci.sys.call("touch /tmp/lock/" .. appname .. "_cron.lock")
if not fs.access(api.LOCK_PREFIX .. ".lock") then
luci.sys.call("touch %s_cron.lock" % api.LOCK_PREFIX)
end
end
if manual ~= 1 then
luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &")
luci.sys.call("/etc/init.d/passwall2 restart > /dev/null 2>&1 &")
end
end
@@ -2485,10 +2484,10 @@ local execute = function()
local fail_list = {}
if arg[2] ~= "all" then
string.gsub(arg[2], '[^' .. "," .. ']+', function(w)
subscribe_list[#subscribe_list + 1] = uci:get_all(c_config, w) or {}
subscribe_list[#subscribe_list + 1] = uci_get(w) or {}
end)
else
uci:foreach(c_config, "subscribe_list", function(o)
uci_foreach("subscribe_list", function(o)
subscribe_list[#subscribe_list + 1] = o
end)
end
@@ -2531,7 +2530,7 @@ local execute = function()
log(1, i18n.translatef("Subscription: [%s] No changes, no update required.", remark))
else
parse_link(raw_data, "2", remark, value)
uci:set(c_config, cfgid, "md5", new_md5)
uci_set(cfgid, "md5", new_md5)
end
else
fail_list[#fail_list + 1] = value
@@ -2554,8 +2553,8 @@ local execute = function()
end
local function check_instance(action)
local sub_lock = "/var/lock/" .. appname .. "_subscribe.lock"
local rule_lock = "/var/lock/" .. appname .. "_rule_update.lock"
local sub_lock = api.LOCK_PREFIX .. "_subscribe.lock"
local rule_lock = api.LOCK_PREFIX .. "_rule_update.lock"
if action == "start" then
math.randomseed(os.time() + math.floor(os.clock() * 1000))