diff --git a/luci-app-passwall/luasrc/controller/passwall.lua b/luci-app-passwall/luasrc/controller/passwall.lua index 5a9025c18..b57053b2d 100644 --- a/luci-app-passwall/luasrc/controller/passwall.lua +++ b/luci-app-passwall/luasrc/controller/passwall.lua @@ -63,6 +63,7 @@ function index() entry({"admin", "services", appname, "link_add_node"}, call("link_add_node")).leaf = true entry({"admin", "services", appname, "socks_autoswitch_add_node"}, call("socks_autoswitch_add_node")).leaf = true entry({"admin", "services", appname, "socks_autoswitch_remove_node"}, call("socks_autoswitch_remove_node")).leaf = true + entry({"admin", "services", appname, "gen_client_config"}, call("gen_client_config")).leaf = true entry({"admin", "services", appname, "get_now_use_node"}, call("get_now_use_node")).leaf = true entry({"admin", "services", appname, "get_redir_log"}, call("get_redir_log")).leaf = true entry({"admin", "services", appname, "get_socks_log"}, call("get_socks_log")).leaf = true @@ -171,6 +172,20 @@ function socks_autoswitch_remove_node() luci.http.redirect(api.url("socks_config", id)) end + +function gen_client_config() + local id = luci.http.formvalue("id") + local config_file = api.TMP_PATH .. "/config_" .. id + luci.sys.call(string.format("/usr/share/passwall/app.sh run_socks flag=config_%s node=%s bind=127.0.0.1 socks_port=1080 config_file=%s no_run=1", id, id, config_file)) + if nixio.fs.access(config_file) then + luci.http.prepare_content("application/json") + luci.http.write(luci.sys.exec("cat " .. config_file)) + luci.sys.call("rm -f " .. config_file) + else + luci.http.redirect(api.url("node_list")) + end +end + function get_now_use_node() local path = "/tmp/etc/passwall/acl/default" local e = {} diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index 61d620cad..ff2fc0859 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -81,6 +81,7 @@ function gen_outbound(flag, node, tag, proxy_table) end local proxy_tag = nil + local run_socks_instance = true if proxy_table ~= nil and type(proxy_table) == "table" then proxy_tag = proxy_table.tag or nil end @@ -92,18 +93,20 @@ function gen_outbound(flag, node, tag, proxy_table) if tag and node_id and tag ~= node_id then config_file = string.format("%s_%s_%s_%s.json", flag, tag, node_id, new_port) end - sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null', - appname, - string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s", - new_port, --flag - node_id, --node - "127.0.0.1", --bind - new_port, --socks port - config_file, --config file - (proxy_tag and relay_port) and tostring(relay_port) or "" --relay port + if run_socks_instance then + sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null', + appname, + string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s", + new_port, --flag + node_id, --node + "127.0.0.1", --bind + new_port, --socks port + config_file, --config file + (proxy_tag and relay_port) and tostring(relay_port) or "" --relay port + ) ) ) - ) + end node = { protocol = "socks", address = "127.0.0.1", @@ -883,6 +886,7 @@ function gen_config(var) local dns_socks_address = var["-dns_socks_address"] local dns_socks_port = var["-dns_socks_port"] local tags = var["-tags"] + local no_run = var["-no_run"] local dns_domain_rules = {} local dns = nil @@ -1174,7 +1178,7 @@ function gen_config(var) end end - local _outbound = gen_outbound(flag, _node, rule_name, { tag = use_proxy and preproxy_tag or nil }) + local _outbound = gen_outbound(flag, _node, rule_name, { tag = use_proxy and preproxy_tag or nil, run_socks_instance = not no_run }) if _outbound then _outbound.tag = _outbound.tag .. ":" .. _node.remarks rule_outboundTag, last_insert_outbound = set_outbound_detour(_node, _outbound, outbounds, rule_name) @@ -1807,7 +1811,7 @@ function gen_config(var) tag = "block" }) for index, value in ipairs(config.outbounds) do - if not value["_flag_proxy_tag"] and not value.detour and value["_id"] and value.server and value.server_port then + if not value["_flag_proxy_tag"] and not value.detour and value["_id"] and value.server and value.server_port and not no_run then sys.call(string.format("echo '%s' >> %s", value["_id"], api.TMP_PATH .. "/direct_node_list")) end for k, v in pairs(config.outbounds[index]) do @@ -1990,7 +1994,7 @@ if arg[1] then local func =_G[arg[1]] if func then print(func(api.get_function_args(arg))) - if next(geosite_all_tag) or next(geoip_all_tag) then + if (next(geosite_all_tag) or next(geoip_all_tag)) and not no_run then convert_geofile() end end diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index 888a6c4ff..bdb713edf 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -57,6 +57,7 @@ function gen_outbound(flag, node, tag, proxy_table) local proxy_tag = nil local fragment = nil local noise = nil + local run_socks_instance = true if proxy_table ~= nil and type(proxy_table) == "table" then proxy_tag = proxy_table.tag or nil fragment = proxy_table.fragment or nil @@ -74,17 +75,19 @@ function gen_outbound(flag, node, tag, proxy_table) if tag and node_id and tag ~= node_id then config_file = string.format("%s_%s_%s_%s.json", flag, tag, node_id, new_port) end - sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null', - appname, - string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s", - new_port, --flag - node_id, --node - "127.0.0.1", --bind - new_port, --socks port - config_file, --config file - (proxy_tag and relay_port) and tostring(relay_port) or "" --relay port - ) - )) + if run_socks_instance then + sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null', + appname, + string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s", + new_port, --flag + node_id, --node + "127.0.0.1", --bind + new_port, --socks port + config_file, --config file + (proxy_tag and relay_port) and tostring(relay_port) or "" --relay port + ) + )) + end node = {} node.protocol = "socks" node.transport = "tcp" @@ -580,6 +583,7 @@ function gen_config(var) local dns_socks_address = var["-dns_socks_address"] local dns_socks_port = var["-dns_socks_port"] local loglevel = var["-loglevel"] or "warning" + local no_run = var["-no_run"] local dns_domain_rules = {} local dns = nil @@ -931,7 +935,8 @@ function gen_config(var) }) end local proxy_table = { - tag = use_proxy and preproxy_tag or nil + tag = use_proxy and preproxy_tag or nil, + run_socks_instance = not no_run } if not proxy_table.tag then if xray_settings.fragment == "1" then @@ -1481,7 +1486,7 @@ function gen_config(var) end for index, value in ipairs(config.outbounds) do - if not value["_flag_proxy_tag"] and value["_id"] and value.server and value.server_port then + if not value["_flag_proxy_tag"] and value["_id"] and value.server and value.server_port and not no_run then sys.call(string.format("echo '%s' >> %s", value["_id"], api.TMP_PATH .. "/direct_node_list")) end for k, v in pairs(config.outbounds[index]) do diff --git a/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm b/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm index 4a0a1b3b9..f1788d558 100644 --- a/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm +++ b/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm @@ -1520,10 +1520,15 @@ local hysteria2_type = map:get("@global_subscribe[0]", "hysteria2_type") or "sin return false; } + function exportConfigFile(btn, sid) { + window.open('<%=api.url("gen_client_config")%>?id=' + sid, "_blank") + } + //]]> +
diff --git a/luci-app-passwall/po/zh-cn/passwall.po b/luci-app-passwall/po/zh-cn/passwall.po index 77a38caae..482b63dc2 100644 --- a/luci-app-passwall/po/zh-cn/passwall.po +++ b/luci-app-passwall/po/zh-cn/passwall.po @@ -535,6 +535,9 @@ msgstr "导出分享URL" msgid "Generate QRCode" msgstr "生成二维码" +msgid "Export Config File" +msgstr "导出配置文件" + msgid "Import Finished" msgstr "导入完成:" diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index d644f54a5..09d1a1ccb 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -415,7 +415,7 @@ run_ipt2socks() { run_singbox() { local flag type node tcp_redir_port tcp_proxy_way udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server direct_dns_dot_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port - local loglevel log_file config_file server_host server_port + local loglevel log_file config_file server_host server_port no_run local _extra_param="" eval_set_val $@ [ -z "$type" ] && { @@ -491,14 +491,15 @@ run_singbox() { esac [ -n "$remote_dns_client_ip" ] && _extra_param="${_extra_param} -remote_dns_client_ip ${remote_dns_client_ip}" [ "$remote_fakedns" = "1" ] && _extra_param="${_extra_param} -remote_dns_fake 1" + [ -n "$no_run" ] && _extra_param="${_extra_param} -no_run 1" lua $UTIL_SINGBOX gen_config ${_extra_param} > $config_file - ln_run "$(first_type $(config_t_get global_app singbox_file) sing-box)" "sing-box" $log_file run -c "$config_file" + [ -n "$no_run" ] || ln_run "$(first_type $(config_t_get global_app singbox_file) sing-box)" "sing-box" $log_file run -c "$config_file" } run_xray() { local flag type node tcp_redir_port tcp_proxy_way udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port - local loglevel log_file config_file server_host server_port + local loglevel log_file config_file server_host server_port no_run local _extra_param="" eval_set_val $@ [ -z "$type" ] && { @@ -559,8 +560,9 @@ run_xray() { _extra_param="${_extra_param} -remote_dns_doh_port ${_doh_port} -remote_dns_doh_url ${_doh_url} -remote_dns_doh_host ${_doh_host}" } _extra_param="${_extra_param} -loglevel $loglevel" + [ -n "$no_run" ] && _extra_param="${_extra_param} -no_run 1" lua $UTIL_XRAY gen_config ${_extra_param} > $config_file - ln_run "$(first_type $(config_t_get global_app ${type}_file) ${type})" ${type} $log_file run -c "$config_file" + [ -n "$no_run" ] || ln_run "$(first_type $(config_t_get global_app ${type}_file) ${type})" ${type} $log_file run -c "$config_file" } run_dns2socks() { @@ -601,7 +603,7 @@ run_chinadns_ng() { } run_socks() { - local flag node bind socks_port config_file http_port http_config_file relay_port log_file + local flag node bind socks_port config_file http_port http_config_file relay_port log_file no_run eval_set_val $@ [ -n "$config_file" ] && [ -z "$(echo ${config_file} | grep $TMP_PATH)" ] && config_file=$TMP_PATH/$config_file [ -n "$http_port" ] || http_port=0 @@ -614,20 +616,20 @@ run_socks() { local type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') local remarks=$(config_n_get $node remarks) local server_host=$(config_n_get $node address) - local port=$(config_n_get $node port) + local server_port=$(config_n_get $node port) [ -n "$relay_port" ] && { server_host="127.0.0.1" - port=$relay_port + server_port=$relay_port } local error_msg tmp - if [ -n "$server_host" ] && [ -n "$port" ]; then + if [ -n "$server_host" ] && [ -n "$server_port" ]; then check_host $server_host [ $? != 0 ] && { echolog " - Socks节点:[$remarks]${server_host} 是非法的服务器地址,无法启动!" return 1 } - tmp="${server_host}:${port}" + tmp="${server_host}:${server_port}" else error_msg="某种原因,此 Socks 服务的相关配置已失联,启动中止!" fi @@ -676,7 +678,8 @@ run_socks() { config_file=$(echo $config_file | sed "s/SOCKS/HTTP_SOCKS/g") local _args="http_address=$bind http_port=$http_port" } - [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$port" + [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$server_port" + [ -n "$no_run" ] && _args="${_args} -no_run 1" run_singbox flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args} ;; xray) @@ -685,24 +688,25 @@ run_socks() { config_file=$(echo $config_file | sed "s/SOCKS/HTTP_SOCKS/g") local _args="http_address=$bind http_port=$http_port" } - [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$port" + [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$server_port" + [ -n "$no_run" ] && _args="${_args} -no_run 1" run_xray flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args} ;; trojan*) - lua $UTIL_TROJAN gen_config -node $node -run_type client -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file - ln_run "$(first_type ${type})" "${type}" $log_file -c "$config_file" + lua $UTIL_TROJAN gen_config -node $node -run_type client -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $server_port > $config_file + [ -n "$no_run" ] || ln_run "$(first_type ${type})" "${type}" $log_file -c "$config_file" ;; naiveproxy) - lua $UTIL_NAIVE gen_config -node $node -run_type socks -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file - ln_run "$(first_type naive)" naive $log_file "$config_file" + lua $UTIL_NAIVE gen_config -node $node -run_type socks -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $server_port > $config_file + [ -n "$no_run" ] || ln_run "$(first_type naive)" naive $log_file "$config_file" ;; ssr) - lua $UTIL_SS gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file - ln_run "$(first_type ssr-local)" "ssr-local" $log_file -c "$config_file" -v -u + lua $UTIL_SS gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $server_port > $config_file + [ -n "$no_run" ] || ln_run "$(first_type ssr-local)" "ssr-local" $log_file -c "$config_file" -v -u ;; ss) - lua $UTIL_SS gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port -mode tcp_and_udp > $config_file - ln_run "$(first_type ss-local)" "ss-local" $log_file -c "$config_file" -v + lua $UTIL_SS gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $server_port -mode tcp_and_udp > $config_file + [ -n "$no_run" ] || ln_run "$(first_type ss-local)" "ss-local" $log_file -c "$config_file" -v ;; ss-rust) [ "$http_port" != "0" ] && { @@ -710,8 +714,8 @@ run_socks() { config_file=$(echo $config_file | sed "s/SOCKS/HTTP_SOCKS/g") local _extra_param="-local_http_address $bind -local_http_port $http_port" } - lua $UTIL_SS gen_config -node $node -local_socks_address $bind -local_socks_port $socks_port -server_host $server_host -server_port $port ${_extra_param} > $config_file - ln_run "$(first_type sslocal)" "sslocal" $log_file -c "$config_file" -v + lua $UTIL_SS gen_config -node $node -local_socks_address $bind -local_socks_port $socks_port -server_host $server_host -server_port $server_port ${_extra_param} > $config_file + [ -n "$no_run" ] || ln_run "$(first_type sslocal)" "sslocal" $log_file -c "$config_file" -v ;; hysteria2) [ "$http_port" != "0" ] && { @@ -719,12 +723,12 @@ run_socks() { config_file=$(echo $config_file | sed "s/SOCKS/HTTP_SOCKS/g") local _extra_param="-local_http_address $bind -local_http_port $http_port" } - lua $UTIL_HYSTERIA2 gen_config -node $node -local_socks_address $bind -local_socks_port $socks_port -server_host $server_host -server_port $port ${_extra_param} > $config_file - ln_run "$(first_type $(config_t_get global_app hysteria_file))" "hysteria" $log_file -c "$config_file" client + lua $UTIL_HYSTERIA2 gen_config -node $node -local_socks_address $bind -local_socks_port $socks_port -server_host $server_host -server_port $server_port ${_extra_param} > $config_file + [ -n "$no_run" ] || ln_run "$(first_type $(config_t_get global_app hysteria_file))" "hysteria" $log_file -c "$config_file" client ;; tuic) - lua $UTIL_TUIC gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file - ln_run "$(first_type tuic-client)" "tuic-client" $log_file -c "$config_file" + lua $UTIL_TUIC gen_config -node $node -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $server_port > $config_file + [ -n "$no_run" ] || ln_run "$(first_type tuic-client)" "tuic-client" $log_file -c "$config_file" ;; esac @@ -736,18 +740,18 @@ run_socks() { if [ -n "$bin" ]; then type="sing-box" lua $UTIL_SINGBOX gen_proto_config -local_http_address $bind -local_http_port $http_port -server_proto socks -server_address "127.0.0.1" -server_port $socks_port -server_username $_username -server_password $_password > $http_config_file - ln_run "$bin" ${type} /dev/null run -c "$http_config_file" + [ -n "$no_run" ] || ln_run "$bin" ${type} /dev/null run -c "$http_config_file" else bin=$(first_type $(config_t_get global_app xray_file) xray) [ -n "$bin" ] && type="xray" [ -z "$type" ] && return 1 lua $UTIL_XRAY gen_proto_config local_http_address $bind -local_http_port $http_port -server_proto socks -server_address "127.0.0.1" -server_port $socks_port -server_username $_username -server_password $_password > $http_config_file - ln_run "$bin" ${type} /dev/null run -c "$http_config_file" + [ -n "$no_run" ] || ln_run "$bin" ${type} /dev/null run -c "$http_config_file" fi } unset http_flag - [ "${server_host}" != "127.0.0.1" ] && [ "$type" != "sing-box" ] && [ "$type" != "xray" ] && echo "${node}" >> $TMP_PATH/direct_node_list + [ -z "$no_run" ] && [ "${server_host}" != "127.0.0.1" ] && [ "$type" != "sing-box" ] && [ "$type" != "xray" ] && echo "${node}" >> $TMP_PATH/direct_node_list } run_redir() {