From f8594e6833ce316e604d146107b2795607c91103 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Thu, 5 Mar 2020 19:05:00 +0800 Subject: [PATCH] luci-app-passwall: sync with upstream source --- package/lienol/luci-app-passwall/Makefile | 4 +- .../luasrc/controller/passwall.lua | 25 ++- .../model/cbi/passwall/api/passwall.lua | 108 ++++++++++++ .../luasrc/model/cbi/passwall/global.lua | 31 ++-- .../luasrc/model/cbi/passwall/rule.lua | 1 + .../view/passwall/rule/passwall_version.htm | 156 ++++++++++++++++++ .../root/etc/config/passwall | 8 +- .../root/usr/share/passwall/app.sh | 148 ++++++----------- .../root/usr/share/passwall/config.default | 12 +- .../root/usr/share/passwall/monitor.sh | 6 +- .../root/usr/share/passwall/test.sh | 15 +- 11 files changed, 369 insertions(+), 145 deletions(-) create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/passwall.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/rule/passwall_version.htm diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 7af1e14459..7c0dd21e42 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.6 -PKG_RELEASE:=11 -PKG_DATE:=20200304 +PKG_RELEASE:=13 +PKG_DATE:=20200305 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index b6421638ae..9c72f647b1 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -2,6 +2,7 @@ module("luci.controller.passwall", package.seeall) local appname = "passwall" local http = require "luci.http" +local passwall = require "luci.model.cbi.passwall.api.passwall" local kcptun = require "luci.model.cbi.passwall.api.kcptun" local brook = require "luci.model.cbi.passwall.api.brook" local v2ray = require "luci.model.cbi.passwall.api.v2ray" @@ -59,6 +60,10 @@ function index() true entry({"admin", "vpn", "passwall", "update_rules"}, call("update_rules")).leaf = true + entry({"admin", "vpn", "passwall", "luci_check"}, call("luci_check")).leaf = + true + entry({"admin", "vpn", "passwall", "luci_update"}, call("luci_update")).leaf = + true entry({"admin", "vpn", "passwall", "kcptun_check"}, call("kcptun_check")).leaf = true entry({"admin", "vpn", "passwall", "kcptun_update"}, call("kcptun_update")).leaf = @@ -127,8 +132,8 @@ function status() appname, i)) == 0 e["tcp_node%s_status" % i] = luci.sys.call( string.format( - "ps -w | grep -v grep | grep '%s/bin/' | grep -i -E 'TCP_%s|brook_tcp_%s|ipt2socks_tcp_%s' >/dev/null", - appname, i, i, i)) == 0 + "ps -w | grep -v grep | grep -v kcptun | grep '%s/bin/' | grep -i -E 'TCP_%s' >/dev/null", + appname, i)) == 0 end local udp_node_num = luci.sys.exec( @@ -137,8 +142,8 @@ function status() for i = 1, udp_node_num, 1 do e["udp_node%s_status" % i] = luci.sys.call( string.format( - "ps -w | grep -v grep | grep '%s/bin/' | grep -i -E 'UDP_%s|brook_udp_%s|ipt2socks_udp_%s' >/dev/null", - appname, i, i, i)) == 0 + "ps -w | grep -v grep | grep '%s/bin/' | grep -i -E 'UDP_%s' >/dev/null", + appname, i)) == 0 end local socks5_node_num = luci.sys.exec( @@ -151,7 +156,7 @@ function status() appname, i)) == 0 e["socks5_node%s_status" % i] = luci.sys.call( string.format( - "ps -w | grep -v grep | grep '%s/bin/' | grep -i -E 'SOCKS5_%s|brook_socks_%s' >/dev/null", + "ps -w | grep -v grep | grep -v kcptun | grep '%s/bin/' | grep -i -E 'SOCKS_%s|SOCKS5_%s' >/dev/null", appname, i, i)) == 0 end luci.http.prepare_content("application/json") @@ -268,6 +273,16 @@ function update_rules() "' > /dev/null 2>&1 &") end +function luci_check() + local json = passwall.to_check("") + http_write_json(json) +end + +function luci_update() + local json = passwall.update_luci(http.formvalue("url"), http.formvalue("save")) + http_write_json(json) +end + function kcptun_check() local json = kcptun.to_check("") http_write_json(json) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/passwall.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/passwall.lua new file mode 100644 index 0000000000..641b36c7d8 --- /dev/null +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/passwall.lua @@ -0,0 +1,108 @@ +module("luci.model.cbi.passwall.api.passwall", package.seeall) +local fs = require "nixio.fs" +local sys = require "luci.sys" +local util = require "luci.util" +local i18n = require "luci.i18n" +local api = require "luci.model.cbi.passwall.api.api" + +local luci_api = + "https://api.github.com/repos/lienol/openwrt-package/releases/latest" + +function get_luci_version() + local ipkg = require "luci.model.ipkg" + local package_name = "luci-app-passwall" + local package_info = ipkg.info(package_name) or {} + if next(package_info) ~= nil then + return package_info[package_name]["Version"] + end + return "" +end + +function to_check() + local json = api.get_api_json(luci_api) + + if json.tag_name == nil then + return { + code = 1, + error = i18n.translate("Get remote version info failed.") + } + end + + local remote_version = json.tag_name:match("[^v]+") + + local needs_update = api.compare_versions(get_luci_version(client_file), + "<", remote_version) + local html_url, download_url + + if needs_update then + html_url = json.html_url + for _, v in ipairs(json.assets) do + local n = v.name + if n then + if n:match("luci%-app%-passwall") then + download_url = v.browser_download_url + end + end + end + end + + if needs_update and not download_url then + return { + code = 1, + now_version = get_luci_version(), + version = remote_version, + html_url = html_url, + error = i18n.translate( + "New version found, but failed to get new version download url.") + } + end + + return { + code = 0, + update = needs_update, + now_version = get_luci_version(), + version = remote_version, + url = {html = html_url, download = download_url} + } +end + +function update_luci(url, save) + if not url or url == "" then + return {code = 1, error = i18n.translate("Download url is required.")} + end + + sys.call("/bin/rm -f /tmp/luci_passwall.*.ipk") + + local tmp_file = + util.trim(util.exec("mktemp -u -t luci_passwall.XXXXXX")) .. ".ipk" + + local result = api.exec(api.wget, + {"-O", tmp_file, url, api._unpack(api.wget_args)}, + nil, api.command_timeout) == 0 + + if not result then + api.exec("/bin/rm", {"-f", tmp_file}) + return { + code = 1, + error = i18n.translatef("File download failed or timed out: %s", url) + } + end + + local opkg_args = {"--force-downgrade", "--force-reinstall"} + + if save ~= "true" then opkg_args[#opkg_args + 1] = "--force-maintainer" end + + result = + api.exec("/bin/opkg", {"install", tmp_file, api._unpack(opkg_args)}) == + 0 + + if not result then + api.exec("/bin/rm", {"-f", tmp_file}) + return {code = 1, error = i18n.translate("Package update failed.")} + end + + api.exec("/bin/rm", {"-f", tmp_file}) + api.exec("/bin/rm", {"-rf", "/tmp/luci-indexcache", "/tmp/luci-modulecache"}) + + return {code = 0} +end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua index 262c7333fe..d5d0cedf90 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua @@ -107,23 +107,20 @@ for i = 1, socks5_node_num, 1 do for _, key in pairs(key_table) do o:value(key, n[key]) end end -if api.uci_get_type("global_other", "wangejibadns", "0") == "1" then - o = - s:option(Value, "up_china_dns", translate("China DNS Server") .. "(UDP)") - -- o.description = translate("If you want to work with other DNS acceleration services, use the default.
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.") - o.default = "default" - o:value("default", translate("default")) - o:value("dnsbyisp", translate("dnsbyisp")) - o:value("223.5.5.5", "223.5.5.5 (" .. translate("Ali") .. "DNS)") - o:value("223.6.6.6", "223.6.6.6 (" .. translate("Ali") .. "DNS)") - o:value("114.114.114.114", "114.114.114.114 (114DNS)") - o:value("114.114.115.115", "114.114.115.115 (114DNS)") - o:value("119.29.29.29", "119.29.29.29 (DNSPOD DNS)") - o:value("182.254.116.116", "182.254.116.116 (DNSPOD DNS)") - o:value("1.2.4.8", "1.2.4.8 (CNNIC DNS)") - o:value("210.2.4.8", "210.2.4.8 (CNNIC DNS)") - o:value("180.76.76.76", "180.76.76.76 (" .. translate("Baidu") .. "DNS)") -end +o = s:option(Value, "up_china_dns", translate("China DNS Server") .. "(UDP)") +-- o.description = translate("If you want to work with other DNS acceleration services, use the default.
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.") +o.default = "default" +o:value("default", translate("default")) +o:value("dnsbyisp", translate("dnsbyisp")) +o:value("223.5.5.5", "223.5.5.5 (" .. translate("Ali") .. "DNS)") +o:value("223.6.6.6", "223.6.6.6 (" .. translate("Ali") .. "DNS)") +o:value("114.114.114.114", "114.114.114.114 (114DNS)") +o:value("114.114.115.115", "114.114.115.115 (114DNS)") +o:value("119.29.29.29", "119.29.29.29 (DNSPOD DNS)") +o:value("182.254.116.116", "182.254.116.116 (DNSPOD DNS)") +o:value("1.2.4.8", "1.2.4.8 (CNNIC DNS)") +o:value("210.2.4.8", "210.2.4.8 (CNNIC DNS)") +o:value("180.76.76.76", "180.76.76.76 (" .. translate("Baidu") .. "DNS)") ---- DNS Forward Mode o = s:option(ListValue, "dns_mode", translate("DNS Mode")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua index a72cefb89b..c0cfe54aa9 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua @@ -106,6 +106,7 @@ s = m:section(TypedSection, "global_app", translate("App Update"), translate("Please confirm that your firmware supports FPU.") .. "") s.anonymous = true +s:append(Template("passwall/rule/passwall_version")) s:append(Template("passwall/rule/v2ray_version")) s:append(Template("passwall/rule/kcptun_version")) s:append(Template("passwall/rule/brook_version")) diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/rule/passwall_version.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/rule/passwall_version.htm new file mode 100644 index 0000000000..0e2209130f --- /dev/null +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/rule/passwall_version.htm @@ -0,0 +1,156 @@ +<% +local api = require "luci.model.cbi.passwall.api.api" +local dsp = require "luci.dispatcher" + +function get_luci_version() + local ipkg = require "luci.model.ipkg" + local package_name = "luci-app-passwall" + local package_info = ipkg.info(package_name) or {} + if next(package_info) ~= nil then + return package_info[package_name]["Version"] + end + return "" +end + +local passwall_version = get_luci_version() +-%> + + + +
+ +
+
+ 【 <%=passwall_version%>】 + + +
+
+
\ No newline at end of file diff --git a/package/lienol/luci-app-passwall/root/etc/config/passwall b/package/lienol/luci-app-passwall/root/etc/config/passwall index 86566e7f25..1e3cff01eb 100644 --- a/package/lienol/luci-app-passwall/root/etc/config/passwall +++ b/package/lienol/luci-app-passwall/root/etc/config/passwall @@ -43,6 +43,12 @@ config global_other config global_rules option auto_update '0' + option chnlist_update '1' + option chnroute_update '1' + option gfwlist_update '1' + option gfwlist_version '2020-02-27' + option chnroute_version '2020-02-27' + option chnlist_version '2020-02-27' config global_app option v2ray_file '/usr/bin/v2ray/' @@ -54,5 +60,5 @@ config global_subscribe option auto_update_subscribe '0' config auto_switch - option testing_time '3' + option testing_time '1' option enable '0' diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh index 9f55d1a83c..ff01c90b7f 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh @@ -8,6 +8,7 @@ CONFIG=passwall TMP_PATH=/var/etc/$CONFIG TMP_BIN_PATH=$TMP_PATH/bin TMP_ID_PATH=$TMP_PATH/id +TMP_PORT_PATH=$TMP_PATH/port LOCK_FILE=/var/lock/$CONFIG.lock LOG_FILE=/var/log/$CONFIG.log APP_PATH=/usr/share/$CONFIG @@ -151,6 +152,16 @@ for i in $(seq 1 $SOCKS5_NODE_NUM); do eval SOCKS5_NODE$i=$(config_t_get global socks5_node$i nil) done +TCP_REDIR_PORT1=$(config_t_get global_forwarding tcp_redir_port 1041) +TCP_REDIR_PORT2=$(expr $TCP_REDIR_PORT1 + 1) +TCP_REDIR_PORT3=$(expr $TCP_REDIR_PORT2 + 1) +UDP_REDIR_PORT1=$(config_t_get global_forwarding udp_redir_port 1051) +UDP_REDIR_PORT2=$(expr $UDP_REDIR_PORT1 + 1) +UDP_REDIR_PORT3=$(expr $UDP_REDIR_PORT2 + 1) +SOCKS5_PROXY_PORT1=$(config_t_get global_forwarding socks5_proxy_port 1081) +SOCKS5_PROXY_PORT2=$(expr $SOCKS5_PROXY_PORT1 + 1) +SOCKS5_PROXY_PORT3=$(expr $SOCKS5_PROXY_PORT2 + 1) + [ "$UDP_NODE1" == "tcp" ] && UDP_NODE1=$TCP_NODE1 [ "$SOCKS5_NODE1" == "tcp" ] && SOCKS5_NODE1=$TCP_NODE1 @@ -184,8 +195,6 @@ load_config() { LOCALHOST_PROXY_MODE=$(config_t_get global localhost_proxy_mode default) [ "$LOCALHOST_PROXY_MODE" == "default" ] && LOCALHOST_PROXY_MODE=$PROXY_MODE UP_CHINA_DNS=$(config_t_get global up_china_dns dnsbyisp) - wangejibadns=$(config_t_get global_other wangejibadns 0) - [ "$wangejibadns" == "0" ] && UP_CHINA_DNS="default" [ "$UP_CHINA_DNS" == "default" ] && IS_DEFAULT_CHINA_DNS=1 [ ! -f "$RESOLVFILE" -o ! -s "$RESOLVFILE" ] && RESOLVFILE=/tmp/resolv.conf.auto if [ "$UP_CHINA_DNS" == "dnsbyisp" -o "$UP_CHINA_DNS" == "default" ]; then @@ -206,17 +215,8 @@ load_config() { UP_CHINA_DNS="223.5.5.5" fi fi - TCP_REDIR_PORT1=$(config_t_get global_forwarding tcp_redir_port 1041) - TCP_REDIR_PORT2=$(expr $TCP_REDIR_PORT1 + 1) - TCP_REDIR_PORT3=$(expr $TCP_REDIR_PORT2 + 1) - UDP_REDIR_PORT1=$(config_t_get global_forwarding udp_redir_port 1051) - UDP_REDIR_PORT2=$(expr $UDP_REDIR_PORT1 + 1) - UDP_REDIR_PORT3=$(expr $UDP_REDIR_PORT2 + 1) - SOCKS5_PROXY_PORT1=$(config_t_get global_forwarding socks5_proxy_port 1081) - SOCKS5_PROXY_PORT2=$(expr $SOCKS5_PROXY_PORT1 + 1) - SOCKS5_PROXY_PORT3=$(expr $SOCKS5_PROXY_PORT2 + 1) PROXY_IPV6=$(config_t_get global_forwarding proxy_ipv6 0) - mkdir -p /var/etc $TMP_PATH $TMP_BIN_PATH $TMP_ID_PATH + mkdir -p /var/etc $TMP_PATH $TMP_BIN_PATH $TMP_ID_PATH $TMP_PORT_PATH return 0 } @@ -270,7 +270,7 @@ gen_start_config() { port=$(config_n_get $node port) [ -n "$server_host" -a -n "$port" ] && { # 判断节点服务器地址是否URL并去掉~ - server_host=$(echo $server_host | sed 's/^\(http:\/\/\|https:\/\/\)//g' | awk -F '/' '{print $1}') + server_host=$(echo $server_host | sed 's/^\(https:\/\/\|http:\/\/\)//g' | awk -F '/' '{print $1}') # 判断节点服务器地址是否包含汉字~ local tmp=$(echo -n $server_host | awk '{print gensub(/[!-~]/,"","g",$0)}') [ -n "$tmp" ] && { @@ -286,10 +286,10 @@ gen_start_config() { echolog "Socks5节点不能使用Socks5代理节点!" elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" -o "$type" == "v2ray_shunt" ]; then lua $API_GEN_V2RAY $node nil nil $local_port >$config_file - ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_socks_$5 "-config=$config_file" elif [ "$type" == "trojan" ]; then lua $API_GEN_TROJAN $node client "0.0.0.0" $local_port >$config_file - ln_start_bin $(find_bin trojan) trojan "-c $config_file" + ln_start_bin $(find_bin trojan) trojan_socks_$5 "-c $config_file" elif [ "$type" == "brook" ]; then local protocol=$(config_n_get $node brook_protocol client) local brook_tls=$(config_n_get $node brook_tls 0) @@ -299,7 +299,7 @@ gen_start_config() { ln_start_bin $(config_t_get global_app brook_file $(find_bin brook)) brook_socks_$5 "$protocol -l 0.0.0.0:$local_port -i 0.0.0.0 -s $server_host:$port -p $(config_n_get $node password)" elif [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port 0 $node $config_file - ln_start_bin $(find_bin ssr-local) ssr-local "-c $config_file -b 0.0.0.0 -u" + ln_start_bin $(find_bin ssr-local) ssr-local_socks_$5 "-c $config_file -b 0.0.0.0 -u" elif [ "$type" == "ss" ]; then gen_ss_ssr_config_file ss $local_port 0 $node $config_file local plugin_params="" @@ -310,7 +310,7 @@ gen_start_config() { plugin_params="--plugin $plugin --plugin-opts $opts" } fi - ln_start_bin $(find_bin ss-local) ss-local "-c $config_file -b 0.0.0.0 -u $plugin_params" + ln_start_bin $(find_bin ss-local) ss-local_socks_$5 "-c $config_file -b 0.0.0.0 -u $plugin_params" fi fi @@ -324,19 +324,15 @@ gen_start_config() { local server_password=$(config_n_get $node password) eval port=\$UDP_REDIR_PORT$5 ln_start_bin $(find_bin ipt2socks) ipt2socks_udp_$5 "-U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R" - - # local redsocks_config_file=$TMP_PATH/UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port $node_address $node_port $server_username $server_password - # ln_start_bin $(find_bin redsocks2) redsocks2 "-c $redsocks_config_file" elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" -o "$type" == "v2ray_shunt" ]; then lua $API_GEN_V2RAY $node udp $local_port nil >$config_file - ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_udp_$5 "-config=$config_file" elif [ "$type" == "trojan" ]; then SOCKS5_PROXY_PORT4=$(expr $SOCKS5_PROXY_PORT3 + 1) local_port=$(get_not_exists_port_after $SOCKS5_PROXY_PORT4 tcp) socks5_port=$local_port lua $API_GEN_TROJAN $node client "127.0.0.1" $socks5_port >$config_file - ln_start_bin $(find_bin trojan) trojan "-c $config_file" + ln_start_bin $(find_bin trojan) trojan_udp_$5 "-c $config_file" local node_address=$(config_n_get $node address) local node_port=$(config_n_get $node port) @@ -344,10 +340,6 @@ gen_start_config() { local server_password=$(config_n_get $node password) eval port=\$UDP_REDIR_PORT$5 ln_start_bin $(find_bin ipt2socks) ipt2socks_udp_$5 "-U -l $port -b 0.0.0.0 -s 127.0.0.1 -p $socks5_port -R" - - # local redsocks_config_file=$TMP_PATH/redsocks_UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port "127.0.0.1" $socks5_port - # ln_start_bin $(find_bin redsocks2) redsocks2 "-c $redsocks_config_file" elif [ "$type" == "brook" ]; then local protocol=$(config_n_get $node brook_protocol client) if [ "$protocol" == "wsclient" ]; then @@ -357,7 +349,7 @@ gen_start_config() { fi elif [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port 0 $node $config_file - ln_start_bin $(find_bin ssr-redir) ssr-redir "-c $config_file -U" + ln_start_bin $(find_bin ssr-redir) ssr-redir_udp_$5 "-c $config_file -U" elif [ "$type" == "ss" ]; then gen_ss_ssr_config_file ss $local_port 0 $node $config_file local plugin_params="" @@ -368,7 +360,7 @@ gen_start_config() { plugin_params="--plugin $plugin --plugin-opts $opts" } fi - ln_start_bin $(find_bin ss-redir) ss-redir "-c $config_file -U $plugin_params" + ln_start_bin $(find_bin ss-redir) ss-redir_udp_$5 "-c $config_file -U $plugin_params" fi fi @@ -382,17 +374,13 @@ gen_start_config() { local server_password=$(config_n_get $node password) eval port=\$TCP_REDIR_PORT$5 ln_start_bin $(find_bin ipt2socks) ipt2socks_tcp_$5 "-T -l $port -b 0.0.0.0 -s $node_address -p $node_port -R" - - # local redsocks_config_file=$TMP_PATH/TCP_$i.conf - # gen_redsocks_config $redsocks_config_file tcp $port $node_address $socks5_port $server_username $server_password - # ln_start_bin $(find_bin redsocks2) redsocks2 "-c $redsocks_config_file" elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" -o "$type" == "v2ray_shunt" ]; then lua $API_GEN_V2RAY $node tcp $local_port nil >$config_file - ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_tcp_$5 "-config=$config_file" elif [ "$type" == "trojan" ]; then lua $API_GEN_TROJAN $node nat "0.0.0.0" $local_port >$config_file for k in $(seq 1 $process); do - ln_start_bin $(find_bin trojan) trojan "-c $config_file" + ln_start_bin $(find_bin trojan) trojan_tcp_$5 "-c $config_file" done else local kcptun_use=$(config_n_get $node use_kcp 0) @@ -414,7 +402,7 @@ gen_start_config() { if [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port $kcptun_use $node $config_file for k in $(seq 1 $process); do - ln_start_bin $(find_bin ssr-redir) ssr-redir "-c $config_file" + ln_start_bin $(find_bin ssr-redir) ssr-redir_tcp_$5 "-c $config_file" done elif [ "$type" == "ss" ]; then gen_ss_ssr_config_file ss $local_port $kcptun_use $node $config_file @@ -427,7 +415,7 @@ gen_start_config() { } fi for k in $(seq 1 $process); do - ln_start_bin $(find_bin ss-redir) ss-redir "-c $config_file $plugin_params" + ln_start_bin $(find_bin ss-redir) ss-redir_tcp_$5 "-c $config_file $plugin_params" done elif [ "$type" == "brook" ]; then local server_ip=$server_host @@ -453,6 +441,23 @@ gen_start_config() { return 0 } +node_switch() { + local i=$4 + local node=$5 + [ -n "$1" -a -n "$2" -a "$2" != "nil" -a -n "$3" -a -n "$4" -a -n "$5" ] && { + ps -w | grep -E "$TMP_PATH" | grep -i "${1}_${i}" | grep -v "grep" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & + local config_file=$TMP_PATH/${1}_${i}.json + eval current_port=\$${1}_${2}_PORT$i + local port=$(cat $TMP_PORT_PATH/${1}_${i}) + gen_start_config $node $port $1 $config_file $i + echo $node > $TMP_ID_PATH/${1}_${i} + local node_net=$(echo $1 | tr 'A-Z' 'a-z') + uci set $CONFIG.@global[0].${node_net}_node${i}=$node + uci commit $CONFIG + /etc/init.d/dnsmasq restart >/dev/null 2>&1 & + } +} + start_redir() { eval num=\$${1}_NODE_NUM for i in $(seq 1 $num); do @@ -466,6 +471,7 @@ start_redir() { gen_start_config $node $port $1 $config_file $i #eval ip=\$${1}_NODE${i}_IP echo $node > $TMP_ID_PATH/${1}_${i} + echo $port > $TMP_PORT_PATH/${1}_${i} } done } @@ -667,71 +673,6 @@ add_dnsmasq() { echolog "dnsmasq:生成配置文件。" } -gen_redsocks_config() { - protocol=$2 - local_port=$3 - proxy_server=$4 - proxy_port=$5 - proxy_username=$6 - [ -n "$proxy_username" ] && proxy_username="login = $proxy_username;" - proxy_password=$7 - [ -n "$proxy_password" ] && proxy_password="password = $proxy_password;" - [ -n "$1" ] && { - cat >$1 <<-EOF - base { - log_debug = off; - log_info = off; - log = "file:/dev/null"; - daemon = on; - redirector = iptables; - } - - EOF - if [ "$protocol" == "tcp" ]; then - cat >>$1 <<-EOF - redsocks { - local_ip = 0.0.0.0; - local_port = $local_port; - type = socks5; - autoproxy = 0; - ip = $proxy_server; - port = $proxy_port; - $proxy_username - $proxy_password - } - - autoproxy { - no_quick_check_seconds = 300; - quick_connect_timeout = 2; - } - - ipcache { - cache_size = 4; - stale_time = 7200; - autosave_interval = 3600; - port_check = 0; - } - - EOF - elif [ "$protocol" == "udp" ]; then - cat >>$1 <<-EOF - redudp { - local_ip = 0.0.0.0; - local_port = $local_port; - type = socks5; - ip = $proxy_server; - port = $proxy_port; - $proxy_username - $proxy_password - udp_timeout = 60; - udp_timeout_stream = 360; - } - - EOF - fi - } -} - gen_pdnsd_config() { pdnsd_dir=$TMP_PATH/pdnsd mkdir -p $pdnsd_dir @@ -1008,6 +949,9 @@ stop() { } case $1 in +node_switch) + node_switch $2 $3 $4 $5 $6 + ;; stop) [ -n "$2" -a "$2" == "force" ] && force_stop stop diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/config.default b/package/lienol/luci-app-passwall/root/usr/share/passwall/config.default index 83dd6a229b..e10e8ce332 100644 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/config.default +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/config.default @@ -43,12 +43,12 @@ config global_other config global_rules option auto_update '0' - option gfwlist_update '1' - option chnroute_update '1' option chnlist_update '1' - option gfwlist_version '2019-12-10' - option chnroute_version '2019-12-05' - option chnlist_version '2020-01-06' + option chnroute_update '1' + option gfwlist_update '1' + option gfwlist_version '2020-02-27' + option chnroute_version '2020-02-27' + option chnlist_version '2020-02-27' config global_app option v2ray_file '/usr/bin/v2ray/' @@ -60,5 +60,5 @@ config global_subscribe option auto_update_subscribe '0' config auto_switch - option testing_time '3' + option testing_time '1' option enable '0' diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh index fb8f433cf5..80f3f40249 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh @@ -48,7 +48,7 @@ ENABLED=$(config_t_get global enabled 0) exit 0 fi fi - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "TCP_${i}|brook_tcp_${i}|ipt2socks_tcp_${i}" | wc -l) + icount=$(ps -w | grep -v grep | grep -v kcptun | grep $RUN_BIN_PATH | grep -i -E "TCP_${i}" | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 @@ -62,7 +62,7 @@ ENABLED=$(config_t_get global enabled 0) eval tmp_node=\$UDP_NODE$i if [ "$tmp_node" != "nil" ]; then [ "$tmp_node" == "default" ] && tmp_node=$TCP_NODE1 - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "UDP_${i}|brook_udp_${i}|ipt2socks_udp_${i}" | wc -l) + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "UDP_${i}" | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 @@ -74,7 +74,7 @@ ENABLED=$(config_t_get global enabled 0) for i in $(seq 1 $SOCKS5_NODE_NUM); do eval tmp_node=\$SOCKS5_NODE$i if [ "$tmp_node" != "nil" ]; then - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "SOCKS5_${i}|brook_socks_${i}" | wc -l) + icount=$(ps -w | grep -v grep | grep -v kcptun | grep $RUN_BIN_PATH | grep -i -E "SOCKS_${i}|SOCKS5_${i}" | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh index 7fcaa14312..70dd963c8b 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh @@ -46,8 +46,8 @@ test_proxy() { test_auto_switch() { local type=$1 - local index=$2 - local b_tcp_nodes=$3 + local index=$4 + local b_tcp_nodes=$5 local now_node if [ -f "/var/etc/$CONFIG/id/${type}_${index}" ]; then now_node=$(cat /var/etc/$CONFIG/id/${type}_${index}) @@ -61,7 +61,7 @@ test_auto_switch() { return 1 elif [ "$status" == 1 ]; then echolog "自动切换检测:${type}_${index}节点异常,开始切换节点!" - new_node= + local new_node in_backup_nodes=$(echo $b_tcp_nodes | grep $now_node) # 判断当前节点是否存在于备用节点列表里 if [ -z "$in_backup_nodes" ]; then @@ -77,14 +77,11 @@ test_auto_switch() { new_node=$next_node fi fi - rm -f $LOCK_FILE - uci set $CONFIG.@global[0].tcp_node${index}=$new_node - uci commit $CONFIG - /etc/init.d/$CONFIG restart > /dev/null & + /usr/share/passwall/app.sh node_switch $type $2 $3 $index $new_node echolog "自动切换检测:${type}_${index}节点切换完毕!" return 0 elif [ "$status" == 0 ]; then - echolog "自动切换检测:${type}_${index}节点正常。" + #echolog "自动切换检测:${type}_${index}节点正常。" return 0 fi } @@ -106,7 +103,7 @@ start() { eval TCP_NODE$i=\"$(config_t_get auto_switch tcp_node$i nil)\" eval tmp=\$TCP_NODE$i [ -n "$tmp" ] && { - test_auto_switch TCP $i $tmp + test_auto_switch TCP REDIR tcp $i "$tmp" } done