diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 090904a836..e168dec050 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.5 -PKG_RELEASE:=17 -PKG_DATA:=20200220 +PKG_RELEASE:=19 +PKG_DATE:=20200222 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 0dfb1aa122..31b7664530 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -199,10 +199,8 @@ function ping_node() if luci.sys.exec("echo -n `uci -q get %s.@global_other[0].use_tcping`" % appname) == "1" and luci.sys.exec("echo -n $(command -v tcping)") ~= "" then - local interface = luci.sys.exec( - "echo -n $(route | grep default | awk '{print $NF}')") e.ping = luci.sys.exec(string.format( - "echo -n $(tcping -c 1 -i 1 -p %s %s 2>&1 | grep 'SYN/ACK' | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}')", + "echo -n $(tcping -q -c 1 -i 1 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}')", port, address)) else e.ping = luci.sys.exec( @@ -239,72 +237,37 @@ function check_port() local retstring = "
" -- retstring = retstring .. "暂时不支持UDP检测
" - if luci.sys.exec("echo -n `uci -q get %s.@global_other[0].use_tcping`" % - appname) == "1" and - luci.sys.exec("echo -n `command -v tcping`") ~= "" then - retstring = retstring .. - "使用tcping检测端口延迟
" - local interface = luci.sys.exec( - "echo -n $(route | grep default | awk '{print $NF}')") - uci:foreach("passwall", "nodes", function(s) - local ret = "" - local tcp_socket - if (s.use_kcp and s.use_kcp == "1" and s.kcp_port) or - (s.v2ray_transport and s.v2ray_transport == "mkcp" and s.port) then - else - local type = s.type - if type and type ~= "V2ray_balancing" and s.address and s.port and - s.remarks then - node_name = "[%s] [%s:%s]" % {s.remarks, s.address, s.port} - result = luci.sys.exec( - string.format( - "echo -n $(tcping -c 1 -i 1 -I %s -p %s %s 2>&1 | grep 'SYN/ACK' | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}')", - interface, s.port, s.address)) - if result and result ~= "" then - retstring = retstring .. "" .. - node_name .. " " .. result .. - "ms.
" - else - retstring = retstring .. "" .. - node_name .. " Timeout.
" - end - ret = "" + retstring = retstring .. + "检测端口可用性
" + uci:foreach("passwall", "nodes", function(s) + local ret = "" + local tcp_socket + if (s.use_kcp and s.use_kcp == "1" and s.kcp_port) or + (s.v2ray_transport and s.v2ray_transport == "mkcp" and s.port) then + else + local type = s.type + if type and type ~= "V2ray_balancing" and s.address and s.port and + s.remarks then + node_name = "%s:[%s] %s:%s" % + {s.type, s.remarks, s.address, s.port} + tcp_socket = nixio.socket("inet", "stream") + tcp_socket:setopt("socket", "rcvtimeo", 3) + tcp_socket:setopt("socket", "sndtimeo", 3) + ret = tcp_socket:connect(s.address, s.port) + if tostring(ret) == "true" then + retstring = + retstring .. "" .. node_name .. + " OK.
" + else + retstring = + retstring .. "" .. node_name .. + " Error.
" end + ret = "" end - end) - else - retstring = retstring .. - "使用socket检测端口是否打开
" - uci:foreach("passwall", "nodes", function(s) - local ret = "" - local tcp_socket - local udp_socket - if (s.use_kcp and s.use_kcp == "1" and s.kcp_port) or - (s.v2ray_transport and s.v2ray_transport == "mkcp" and s.port) then - else - local type = s.type - if type and type ~= "V2ray_balancing" and s.address and s.port and - s.remarks then - node_name = "%s:[%s] %s:%s" % - {s.type, s.remarks, s.address, s.port} - tcp_socket = nixio.socket("inet", "stream") - tcp_socket:setopt("socket", "rcvtimeo", 3) - tcp_socket:setopt("socket", "sndtimeo", 3) - ret = tcp_socket:connect(s.address, s.port) - if tostring(ret) == "true" then - retstring = retstring .. "" .. - node_name .. " OK.
" - else - retstring = retstring .. "" .. - node_name .. " Error.
" - end - ret = "" - end - end - if tcp_socket then tcp_socket:close() end - if udp_socket then udp_socket:close() end - end) - end + end + if tcp_socket then tcp_socket:close() end + end) luci.http.prepare_content("application/json") luci.http.write_json({ret = retstring}) end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan_client_config_file.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan_client_config.lua similarity index 100% rename from package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan_client_config_file.lua rename to package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan_client_config.lua diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray_client_config_file.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray_client_config.lua similarity index 100% rename from package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray_client_config_file.lua rename to package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray_client_config.lua 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 5d999cf037..c62f4fdafe 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 @@ -7,16 +7,7 @@ CONFIG=passwall CONFIG_PATH=/var/etc/$CONFIG RUN_BIN_PATH=$CONFIG_PATH/bin -RUN_PID_PATH=$CONFIG_PATH/pid RUN_ID_PATH=$CONFIG_PATH/id -RUN_IP_PATH=$CONFIG_PATH/ip -RUN_PORT_PATH=$CONFIG_PATH/port -HAPROXY_FILE=$CONFIG_PATH/haproxy.cfg -REDSOCKS_CONFIG_TCP_FILE=$CONFIG_PATH/redsocks_TCP.conf -REDSOCKS_CONFIG_UDP_FILE=$CONFIG_PATH/redsocks_UDP.conf -CONFIG_TCP_FILE=$CONFIG_PATH/TCP.json -CONFIG_UDP_FILE=$CONFIG_PATH/UDP.json -CONFIG_SOCKS5_FILE=$CONFIG_PATH/SOCKS5.json LOCK_FILE=/var/lock/$CONFIG.lock LOG_FILE=/var/log/$CONFIG.log RULE_PATH=/etc/config/${CONFIG}_rule @@ -24,17 +15,14 @@ APP_PATH=/usr/share/$CONFIG TMP_DNSMASQ_PATH=/var/etc/dnsmasq-passwall.d DNSMASQ_PATH=/etc/dnsmasq.d RESOLVFILE=/tmp/resolv.conf.d/resolv.conf.auto -lanip=$(uci -q get network.lan.ipaddr) DNS_PORT=7913 -API_GEN_V2RAY=/usr/lib/lua/luci/model/cbi/passwall/api/gen_v2ray_client_config_file.lua -API_GEN_TROJAN=/usr/lib/lua/luci/model/cbi/passwall/api/gen_trojan_client_config_file.lua - -get_date() { - echo "$(date "+%Y-%m-%d %H:%M:%S")" -} +LUA_API_PATH=/usr/lib/lua/luci/model/cbi/$CONFIG/api +API_GEN_V2RAY=$LUA_API_PATH/gen_v2ray_client_config.lua +API_GEN_TROJAN=$LUA_API_PATH/gen_trojan_client_config.lua echolog() { - echo -e "$(get_date): $1" >>$LOG_FILE + local d="$(date "+%Y-%m-%d %H:%M:%S")" + echo -e "$d: $1" >>$LOG_FILE } find_bin() { @@ -60,12 +48,10 @@ config_t_get() { } get_host_ip() { - local network_type host isip - network_type=$1 - host=$2 - isip="" - ip=$host - if [ "$network_type" == "ipv6" ]; then + local host=$2 + local isip="" + local ip=$host + if [ "$1" == "ipv6" ]; then isip=$(echo $host | grep -E "([[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){0,7}::[a-f0-9]{0,4}(:[a-f0-9]{1,4}){0,7}])") if [ -n "$isip" ]; then isip=$(echo $host | cut -d '[' -f2 | cut -d ']' -f1) @@ -75,17 +61,12 @@ get_host_ip() { else isip=$(echo $host | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}") fi - if [ -z "$isip" ]; then - vpsrip="" - if [ "$use_ipv6" == "1" ]; then - vpsrip=$(resolveip -6 -t 3 $host | awk 'NR==1{print}') - [ -z "$vpsrip" ] && vpsrip=$(dig @208.67.222.222 $host AAAA 2>/dev/null | grep 'IN' | awk -F ' ' '{print $5}' | grep -E "([a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){0,7}::[a-f0-9]{0,4}(:[a-f0-9]{1,4}){0,7})" | head -n1) - else - vpsrip=$(resolveip -4 -t 3 $host | awk 'NR==1{print}') - [ -z "$vpsrip" ] && vpsrip=$(dig @208.67.222.222 $host 2>/dev/null | grep 'IN' | awk -F ' ' '{print $5}' | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | head -n1) - fi + [ -z "$isip" ] && { + local t=4 + [ "$1" == "ipv6" ] && t=6 + local vpsrip=$(resolveip -$t -t 3 $host | awk 'NR==1{print}') ip=$vpsrip - fi + } echo $ip } @@ -152,6 +133,22 @@ set_subscribe_proxy() { } } +ln_start_bin() { + local file=$1 + local bin=$2 + local cmd=$3 + if [ -n "${RUN_BIN_PATH}/$bin" -a -f "${RUN_BIN_PATH}/$bin" ];then + ${RUN_BIN_PATH}/$bin $cmd >/dev/null 2>&1 & + else + if [ -n "$file" -a -f "$file" ];then + ln -s $file ${RUN_BIN_PATH}/$bin + ${RUN_BIN_PATH}/$bin $cmd >/dev/null 2>&1 & + else + echolog "找不到$bin主程序,无法启动!" + fi + fi +} + ENABLED=$(config_t_get global enabled 0) TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) @@ -172,22 +169,9 @@ done [ "$UDP_NODE1" == "tcp" ] && UDP_NODE1=$TCP_NODE1 [ "$SOCKS5_NODE1" == "tcp" ] && SOCKS5_NODE1=$TCP_NODE1 -TCP_NODE1_IP="" -UDP_NODE1_IP="" -SOCKS5_NODE1_IP="" -TCP_NODE1_IPV6="" -UDP_NODE1_IPV6="" -SOCKS5_NODE1_IPV6="" -TCP_NODE1_PORT="" -UDP_NODE1_PORT="" -SOCKS5_NODE1_PORT="" -TCP_NODE1_TYPE="" -UDP_NODE1_TYPE="" -SOCKS5_NODE1_TYPE="" +# Dynamic variables (Used to record) +# TCP_NODE1_IP="" UDP_NODE1_IP="" SOCKS5_NODE1_IP="" TCP_NODE1_PORT="" UDP_NODE1_PORT="" SOCKS5_NODE1_PORT="" TCP_NODE1_TYPE="" UDP_NODE1_TYPE="" SOCKS5_NODE1_TYPE="" -BROOK_SOCKS5_CMD="" -BROOK_TCP_CMD="" -BROOK_UDP_CMD="" TCP_REDIR_PORTS=$(config_t_get global_forwarding tcp_redir_ports '80,443') UDP_REDIR_PORTS=$(config_t_get global_forwarding udp_redir_ports '1:65535') TCP_NO_REDIR_PORTS=$(config_t_get global_forwarding tcp_no_redir_ports 'disable') @@ -242,37 +226,7 @@ load_config() { 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 $CONFIG_PATH $RUN_BIN_PATH $RUN_PID_PATH $RUN_ID_PATH $RUN_IP_PATH $RUN_PORT_PATH - - #配置环境 - ss_redir_bin=$(find_bin ss-redir) - [ -n "$ss_redir_bin" -a -f "$ss_redir_bin" ] && ln -s $ss_redir_bin ${RUN_BIN_PATH}/ss-redir && ss_redir_bin=${RUN_BIN_PATH}/ss-redir - ss_local_bin=$(find_bin ss-local) - [ -n "$ss_local_bin" -a -f "$ss_local_bin" ] && ln -s $ss_local_bin ${RUN_BIN_PATH}/ss-local && ss_local_bin=${RUN_BIN_PATH}/ss-local - ssr_redir_bin=$(find_bin ssr-redir) - [ -n "$ssr_redir_bin" -a -f "$ssr_redir_bin" ] && ln -s $ssr_redir_bin ${RUN_BIN_PATH}/ssr-redir && ssr_redir_bin=${RUN_BIN_PATH}/ssr-redir - ssr_local_bin=$(find_bin ssr-local) - [ -n "$ssr_local_bin" -a -f "$ssr_local_bin" ] && ln -s $ssr_local_bin ${RUN_BIN_PATH}/ssr-local && ssr_local_bin=${RUN_BIN_PATH}/ssr-local - trojan_bin=$(find_bin trojan) - [ -n "$trojan_bin" -a -f "$trojan_bin" ] && ln -s $trojan_bin ${RUN_BIN_PATH}/trojan && trojan_bin=${RUN_BIN_PATH}/trojan - v2ray_path=$(config_t_get global_app v2ray_file $(find_bin v2ray)) - [ -n "$v2ray_path" -a -f "${v2ray_path}/v2ray" ]&& ln -s ${v2ray_path}/v2ray ${RUN_BIN_PATH}/v2ray && v2ray_bin=${RUN_BIN_PATH}/v2ray - brook_bin=$(config_t_get global_app brook_file $(find_bin brook)) - [ -n "$brook_bin" -a -f "$brook_bin" ] && ln -s $brook_bin ${RUN_BIN_PATH}/brook && brook_bin=${RUN_BIN_PATH}/brook - kcptun_bin=$(config_t_get global_app kcptun_client_file $(find_bin kcptun-client)) - [ -n "$kcptun_bin" -a -f "$kcptun_bin" ] && ln -s $kcptun_bin ${RUN_BIN_PATH}/kcptun-client && kcptun_bin=${RUN_BIN_PATH}/kcptun-client - redsocks2_bin=$(find_bin redsocks2) - [ -n "$redsocks2_bin" -a -f "$redsocks2_bin" ] && ln -s $redsocks2_bin ${RUN_BIN_PATH}/redsocks2 && redsocks2_bin=${RUN_BIN_PATH}/redsocks2 - ipt2socks_bin=$(find_bin ipt2socks) - [ -n "$ipt2socks_bin" -a -f "$ipt2socks_bin" ] && ln -s $ipt2socks_bin ${RUN_BIN_PATH}/ipt2socks && ipt2socks_bin=${RUN_BIN_PATH}/ipt2socks - dns2socks_bin=$(find_bin dns2socks) - [ -n "$dns2socks_bin" -a -f "$dns2socks_bin" ] && ln -s $dns2socks_bin ${RUN_BIN_PATH}/dns2socks && dns2socks_bin=${RUN_BIN_PATH}/dns2socks - pdnsd_bin=$(find_bin pdnsd) - [ -n "$pdnsd_bin" -a -f "$pdnsd_bin" ] && ln -s $pdnsd_bin ${RUN_BIN_PATH}/pdnsd && pdnsd_bin=${RUN_BIN_PATH}/pdnsd - chinadns_ng_bin=$(find_bin chinadns-ng) - [ -n "$chinadns_ng_bin" -a -f "$chinadns_ng_bin" ] && ln -s $chinadns_ng_bin ${RUN_BIN_PATH}/chinadns-ng && chinadns_ng_bin=${RUN_BIN_PATH}/chinadns-ng - haproxy_bin=$(find_bin haproxy) - [ -n "$haproxy_bin" -a -f "$haproxy_bin" ] && ln -s $haproxy_bin ${RUN_BIN_PATH}/haproxy && haproxy_bin=${RUN_BIN_PATH}/haproxy + mkdir -p /var/etc $CONFIG_PATH $RUN_BIN_PATH $RUN_ID_PATH config_load $CONFIG return 0 @@ -347,11 +301,7 @@ gen_start_config() { echolog "Socks5节点不能使用Socks5代理节点!" elif [ "$type" == "v2ray" ]; then lua $API_GEN_V2RAY $node nil nil $local_port >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" elif [ "$type" == "v2ray_balancing" ]; then local balancing_node=$(config_n_get $node v2ray_balancing_node) balancing_node_address="" @@ -368,37 +318,26 @@ gen_start_config() { balancing_node_address="$temp" done lua $API_GEN_V2RAY $node nil nil $local_port >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" elif [ "$type" == "trojan" ]; then lua $API_GEN_TROJAN $node client "0.0.0.0" $local_port >$config_file - [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & + ln_start_bin $(find_bin trojan) trojan "-c $config_file" elif [ "$type" == "brook" ]; then - BROOK_SOCKS5_CMD="client -l 0.0.0.0:$local_port -i 0.0.0.0 -s $server_ip:$port -p $(config_n_get $node password)" - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_SOCKS5_CMD &>/dev/null & - else - echolog "找不到Brook客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app brook_file $(find_bin brook)) brook "client -l 0.0.0.0:$local_port -i 0.0.0.0 -s $server_ip:$port -p $(config_n_get $node password)" elif [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port 0 $node $config_file - [ -f "$ssr_local_bin" ] && $ssr_local_bin -c $config_file -b 0.0.0.0 -u >/dev/null 2>&1 & + ln_start_bin $(find_bin ssr-local) ssr-local "-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 - [ -n "$ss_local_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $node ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { - local opts=$(config_n_get $node ss_plugin_opts) - plugin_params="--plugin $plugin --plugin-opts $opts" - } - fi - $ss_local_bin -c $config_file -b 0.0.0.0 -u $plugin_params >/dev/null 2>&1 & - } + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { + local opts=$(config_n_get $node ss_plugin_opts) + 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" fi fi @@ -416,20 +355,14 @@ gen_start_config() { local server_username=$(config_n_get $node username) local server_password=$(config_n_get $node password) eval port=\$UDP_REDIR_PORT$5 - [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R >/dev/null & + ln_start_bin $(find_bin ipt2socks) ipt2socks "-U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R" - #[ -f "$redsocks2_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port $node_address $node_port $server_username $server_password - # $redsocks2_bin -c $redsocks_config_file >/dev/null & - #} + # local redsocks_config_file=$CONFIG_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" ]; then lua $API_GEN_V2RAY $node udp $local_port nil >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" elif [ "$type" == "v2ray_balancing" ]; then local balancing_node=$(config_n_get $node v2ray_balancing_node) balancing_node_address="" @@ -446,57 +379,40 @@ gen_start_config() { balancing_node_address="$temp" done lua $API_GEN_V2RAY $node udp $local_port nil >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-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 - [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & + ln_start_bin $(find_bin trojan) trojan "-c $config_file" local node_address=$(config_n_get $node address) local node_port=$(config_n_get $node port) local server_username=$(config_n_get $node username) local server_password=$(config_n_get $node password) eval port=\$UDP_REDIR_PORT$5 - [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -U -l $port -b 0.0.0.0 -s 127.0.0.1 -p $socks5_port -R >/dev/null & + ln_start_bin $(find_bin ipt2socks) ipt2socks "-U -l $port -b 0.0.0.0 -s 127.0.0.1 -p $socks5_port -R" - #[ -f "$redsocks2_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/redsocks_UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port "127.0.0.1" $socks5_port - # $redsocks2_bin -c $redsocks_config_file >/dev/null & - #} + # local redsocks_config_file=$CONFIG_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 - BROOK_UDP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_UDP_CMD &>/dev/null & - else - echolog "找不到Brook客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app brook_file $(find_bin brook)) brook "tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" elif [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port 0 $node $config_file - if [ -f "$ssr_redir_bin" ]; then - $ssr_redir_bin -c $config_file -f $RUN_PID_PATH/udp_ssr_1_$5 -U >/dev/null 2>&1 & - else - echolog "找不到ssr客户端主程序,无法启用!" - fi + ln_start_bin $(find_bin ssr-redir) ssr-redir "-c $config_file -U" elif [ "$type" == "ss" ]; then gen_ss_ssr_config_file ss $local_port 0 $node $config_file - [ -f "$ss_redir_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $node ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { - local opts=$(config_n_get $node ss_plugin_opts) - plugin_params="--plugin $plugin --plugin-opts $opts" - } - fi - $ss_redir_bin -c $config_file -f $RUN_PID_PATH/udp_ss_1_$5 -U $plugin_params >/dev/null 2>&1 & - } + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { + local opts=$(config_n_get $node ss_plugin_opts) + plugin_params="--plugin $plugin --plugin-opts $opts" + } + fi + ln_start_bin $(find_bin ss-redir) ss-redir "-c $config_file -U $plugin_params" fi fi @@ -514,20 +430,14 @@ gen_start_config() { local server_username=$(config_n_get $node username) local server_password=$(config_n_get $node password) eval port=\$TCP_REDIR_PORT$5 - [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -l $port -b 0.0.0.0 -s $node_address -p $socks5_port -R >/dev/null & + ln_start_bin $(find_bin ipt2socks) ipt2socks "-l $port -b 0.0.0.0 -s $node_address -p $socks5_port -R" - #[ -f "$redsocks2_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/TCP_$i.conf - # gen_redsocks_config $redsocks_config_file tcp $port $node_address $socks5_port $server_username $server_password - # $redsocks2_bin -c $redsocks_config_file >/dev/null & - #} + # local redsocks_config_file=$CONFIG_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" ]; then lua $API_GEN_V2RAY $node tcp $local_port nil >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" elif [ "$type" == "v2ray_balancing" ]; then local balancing_node=$(config_n_get $node v2ray_balancing_node) balancing_node_address="" @@ -544,14 +454,10 @@ gen_start_config() { balancing_node_address="$temp" done lua $API_GEN_V2RAY $node tcp $local_port nil >$config_file - if [ -f "$v2ray_bin" ]; then - $v2ray_bin -config=$config_file >/dev/null & - else - echolog "找不到V2ray客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray "-config=$config_file" elif [ "$type" == "trojan" ]; then lua $API_GEN_TROJAN $node nat "0.0.0.0" $local_port >$config_file - [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & + ln_start_bin $(find_bin trojan) trojan "-c $config_file" else local kcptun_use=$(config_n_get $node use_kcp 0) if [ "$kcptun_use" == "1" ]; then @@ -559,15 +465,11 @@ gen_start_config() { local kcptun_port=$(config_n_get $node kcp_port) local kcptun_config="$(config_n_get $node kcp_opts)" local lbenabled=$(config_t_get global_haproxy balancing_enable 0) - if [ ! -f "$kcptun_bin" ]; then - echolog "【未安装Kcptun主程序,请到自动更新下载Kcptun】,跳过~" - force_stop - fi if [ -z "$kcptun_port" -o -z "$kcptun_config" ]; then echolog "【未配置Kcptun参数】,跳过~" force_stop fi - if [ -n "$kcptun_port" -a -n "$kcptun_config" -a "$lbenabled" == "0" -a -f "$kcptun_bin" ]; then + if [ -n "$kcptun_port" -a -n "$kcptun_config" -a "$lbenabled" == "0" ]; then local run_kcptun_ip=$server_ip if [ -n "$kcptun_server_host" ]; then kcptun_use_ipv6=$(config_n_get $node kcp_use_ipv6) @@ -579,42 +481,33 @@ gen_start_config() { echolog "Kcptun节点IP地址:$kcptun_server_ip" fi KCPTUN_REDIR_PORT=$(get_not_exists_port_after $KCPTUN_REDIR_PORT udp) - $kcptun_bin --log $CONFIG_PATH/kcptun_${5}.log -l 0.0.0.0:$KCPTUN_REDIR_PORT -r $run_kcptun_ip:$kcptun_port $kcptun_config >/dev/null 2>&1 & + ln_start_bin $(config_t_get global_app kcptun_client_file $(find_bin kcptun-client)) kcptun-client "--log $CONFIG_PATH/kcptun_${5}.log -l 0.0.0.0:$KCPTUN_REDIR_PORT -r $run_kcptun_ip:$kcptun_port $kcptun_config" fi fi if [ "$type" == "ssr" ]; then gen_ss_ssr_config_file ssr $local_port $kcptun_use $node $config_file - [ -f "$ssr_redir_bin" ] && { - for k in $(seq 1 $process); do - $ssr_redir_bin -c $config_file -f $RUN_PID_PATH/tcp_ssr_${k}_${5} >/dev/null 2>&1 & - done - } + for k in $(seq 1 $process); do + ln_start_bin $(find_bin ssr-redir) ssr-redir "-c $config_file" + done elif [ "$type" == "ss" ]; then gen_ss_ssr_config_file ss $local_port $kcptun_use $node $config_file - [ -f "$ss_redir_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $node ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { - local opts=$(config_n_get $node ss_plugin_opts) - plugin_params="--plugin $plugin --plugin-opts $opts" - } - fi - for k in $(seq 1 $process); do - $ss_redir_bin -c $config_file -f $RUN_PID_PATH/tcp_ss_${k}_${5} $plugin_params >/dev/null 2>&1 & - done - } + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" -o "$plugin" == "obfs-local" ] && { + local opts=$(config_n_get $node ss_plugin_opts) + plugin_params="--plugin $plugin --plugin-opts $opts" + } + fi + for k in $(seq 1 $process); do + ln_start_bin $(find_bin ss-redir) ss-redir "-c $config_file $plugin_params" + done elif [ "$type" == "brook" ]; then [ "$kcptun_use" == "1" ] && { server_ip=127.0.0.1 port=$KCPTUN_REDIR_PORT } - BROOK_TCP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_TCP_CMD &>/dev/null & - else - echolog "找不到Brook客户端主程序,无法启用!" - fi + ln_start_bin $(config_t_get global_app brook_file $(find_bin brook)) brook "tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" fi fi fi @@ -632,9 +525,7 @@ start_redir() { local port=$(echo $(get_not_exists_port_after $current_port $3)) eval ${1}_${2}$i=$port gen_start_config $node $port $1 $config_file $i - echo $port > $RUN_PORT_PATH/${1}_${i} - eval ip=\$${1}_NODE${i}_IP - echo $ip > $RUN_IP_PATH/${1}_${i} + #eval ip=\$${1}_NODE${i}_IP echo $node > $RUN_ID_PATH/${1}_${i} } done @@ -642,10 +533,10 @@ start_redir() { clean_log() { logsnum=$(cat $LOG_FILE 2>/dev/null | wc -l) - if [ "$logsnum" -gt 300 ]; then - rm -f $LOG_FILE >/dev/null 2>&1 & + [ "$logsnum" -gt 300 ] && { + echo "" > $LOG_FILE echolog "日志文件过长,清空处理!" - fi + } } start_crontab() { @@ -663,15 +554,15 @@ start_crontab() { time_restart=$(config_t_get global_delay time_restart) [ -z "$time_off" -o "$time_off" != "nil" ] && { echo "0 $time_off * * * /etc/init.d/$CONFIG stop" >>/etc/crontabs/root - echolog "设置自动关闭在每天 $time_off 点。" + echolog "配置定时任务:每天 $time_off 点关闭服务。" } [ -z "$time_on" -o "$time_on" != "nil" ] && { echo "0 $time_on * * * /etc/init.d/$CONFIG start" >>/etc/crontabs/root - echolog "设置自动开启在每天 $time_on 点。" + echolog "配置定时任务:每天 $time_on 点开启服务。" } [ -z "$time_restart" -o "$time_restart" != "nil" ] && { echo "0 $time_restart * * * /etc/init.d/$CONFIG restart" >>/etc/crontabs/root - echolog "设置自动重启在每天 $time_restart 点。" + echolog "配置定时任务:每天 $time_restart 点重启服务。" } fi @@ -680,7 +571,7 @@ start_crontab() { testing_time=$(config_t_get auto_switch testing_time) [ -n "$testing_time" ] && { echo "*/$testing_time * * * * nohup $APP_PATH/test.sh > /dev/null 2>&1" >>/etc/crontabs/root - echolog "设置每$testing_time分钟执行检测脚本。" + echolog "配置定时任务:每$testing_time分钟执行自动切换检测脚本。" } } @@ -691,29 +582,17 @@ start_crontab() { weekupdatesubscribe=$(config_t_get global_subscribe week_update_subscribe) dayupdatesubscribe=$(config_t_get global_subscribe time_update_subscribe) if [ "$autoupdate" = "1" ]; then - local t - if [ "$weekupdate" = "7" ]; then - t="0 $dayupdate * * *" - else - t="0 $dayupdate * * $weekupdate" - fi + local t="0 $dayupdate * * $weekupdate" + [ "$weekupdate" = "7" ] && t="0 $dayupdate * * *" echo "$t $APP_PATH/rule_update.sh" >>/etc/crontabs/root echolog "配置定时任务:自动更新规则。" - else - sed -i '/rule_update.sh/d' /etc/crontabs/root >/dev/null 2>&1 & fi if [ "$autoupdatesubscribe" = "1" ]; then - local t - if [ "$weekupdatesubscribe" = "7" ]; then - t="0 $dayupdatesubscribe * * *" - else - t="0 $dayupdatesubscribe * * $weekupdate" - fi + local t="0 $dayupdatesubscribe * * $weekupdate" + [ "$weekupdatesubscribe" = "7" ] && t="0 $dayupdatesubscribe * * *" echo "$t lua $APP_PATH/subscribe.lua start log > /dev/null 2>&1 &" >>/etc/crontabs/root echolog "配置定时任务:自动更新节点订阅。" - else - sed -i '/subscribe.lua/d' /etc/crontabs/root >/dev/null 2>&1 & fi /etc/init.d/cron restart @@ -737,66 +616,56 @@ start_dns() { ;; dns2socks) if [ -n "$SOCKS5_NODE1" -a "$SOCKS5_NODE1" != "nil" ]; then - [ -f "$dns2socks_bin" ] && { - DNS2SOCKS_FORWARD=$(config_t_get global dns2socks_forward 8.8.4.4) - nohup $dns2socks_bin 127.0.0.1:$SOCKS5_PROXY_PORT1 $DNS2SOCKS_FORWARD 127.0.0.1:$DNS_PORT >/dev/null 2>&1 & - echolog "DNS:dns2socks..." - } + DNS2SOCKS_FORWARD=$(config_t_get global dns2socks_forward 8.8.4.4) + ln_start_bin $(find_bin dns2socks) dns2socks "127.0.0.1:$SOCKS5_PROXY_PORT1 $DNS2SOCKS_FORWARD 127.0.0.1:$DNS_PORT" + echolog "DNS:dns2socks..." else echolog "DNS:dns2socks模式需要使用Socks5代理节点,请开启!" force_stop fi ;; pdnsd) - [ -f "$pdnsd_bin" ] && { - use_tcp_node_resolve_dns=1 - gen_pdnsd_config $DNS_PORT 10240 - DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g') - nohup $pdnsd_bin --daemon -c $pdnsd_dir/pdnsd.conf -d >/dev/null 2>&1 & - echolog "DNS:pdnsd..." - } + use_tcp_node_resolve_dns=1 + gen_pdnsd_config $DNS_PORT 10240 + DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g') + ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d" + echolog "DNS:pdnsd..." ;; chinadns-ng) - [ -f "$chinadns_ng_bin" ] && { - other_port=$(expr $DNS_PORT + 1) - cat $RULE_PATH/gfwlist.conf | sort | uniq | sed -e '/127.0.0.1/d' | sed 's/ipset=\/.//g' | sed 's/\/gfwlist//g' > $CONFIG_PATH/gfwlist.txt - [ -f "$CONFIG_PATH/gfwlist.txt" ] && local gfwlist_param="-g $CONFIG_PATH/gfwlist.txt" - [ -f "$RULE_PATH/chnlist" ] && local chnlist_param="-m $RULE_PATH/chnlist" - - up_trust_chinadns_ng_dns=$(config_t_get global up_trust_chinadns_ng_dns "pdnsd") - if [ "$up_trust_chinadns_ng_dns" == "pdnsd" ]; then - if [ -z "$TCP_NODE1" -o "$TCP_NODE1" == "nil" ]; then - echolog "DNS:ChinaDNS-NG + pdnsd 模式需要启用TCP节点!" - force_stop - else - use_tcp_node_resolve_dns=1 - gen_pdnsd_config $other_port 0 - [ -f "$pdnsd_bin" ] && { - DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g') - nohup $pdnsd_bin --daemon -c $pdnsd_dir/pdnsd.conf -d >/dev/null 2>&1 & - nohup $chinadns_ng_bin -l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param >/dev/null 2>&1 & - echolog "DNS:ChinaDNS-NG + pdnsd($DNS_FORWARD),国内DNS:$UP_CHINA_DNS" - } - fi - elif [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then - if [ -n "$SOCKS5_NODE1" -a "$SOCKS5_NODE1" != "nil" ]; then - [ -f "$dns2socks_bin" ] && { - DNS2SOCKS_FORWARD=$(config_t_get global dns2socks_forward 8.8.4.4) - nohup $dns2socks_bin 127.0.0.1:$SOCKS5_PROXY_PORT1 $DNS2SOCKS_FORWARD 127.0.0.1:$other_port >/dev/null 2>&1 & - nohup $chinadns_ng_bin -l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param >/dev/null 2>&1 & - echolog "DNS:ChinaDNS-NG + dns2socks($DNS2SOCKS_FORWARD),国内DNS:$UP_CHINA_DNS" - } - else - echolog "DNS:dns2socks模式需要使用Socks5代理节点,请开启!" - force_stop - fi + other_port=$(expr $DNS_PORT + 1) + cat $RULE_PATH/gfwlist.conf | sort | uniq | sed -e '/127.0.0.1/d' | sed 's/ipset=\/.//g' | sed 's/\/gfwlist//g' > $CONFIG_PATH/gfwlist.txt + [ -f "$CONFIG_PATH/gfwlist.txt" ] && local gfwlist_param="-g $CONFIG_PATH/gfwlist.txt" + [ -f "$RULE_PATH/chnlist" ] && local chnlist_param="-m $RULE_PATH/chnlist" + + up_trust_chinadns_ng_dns=$(config_t_get global up_trust_chinadns_ng_dns "pdnsd") + if [ "$up_trust_chinadns_ng_dns" == "pdnsd" ]; then + if [ -z "$TCP_NODE1" -o "$TCP_NODE1" == "nil" ]; then + echolog "DNS:ChinaDNS-NG + pdnsd 模式需要启用TCP节点!" + force_stop else - use_udp_node_resolve_dns=1 - DNS_FORWARD=$(echo $up_trust_chinadns_ng_dns | sed 's/,/ /g') - nohup $chinadns_ng_bin -l $DNS_PORT -c $UP_CHINA_DNS -t $up_trust_chinadns_ng_dns $gfwlist_param $chnlist_param >/dev/null 2>&1 & - echolog "DNS:ChinaDNS-NG,国内DNS:$UP_CHINA_DNS,可信DNS:$up_trust_chinadns_ng_dns,如果不能使用,请确保UDP节点已打开并且支持UDP转发。" + use_tcp_node_resolve_dns=1 + gen_pdnsd_config $other_port 0 + DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g') + ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d" + ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param" + echolog "DNS:ChinaDNS-NG + pdnsd($DNS_FORWARD),国内DNS:$UP_CHINA_DNS" fi - } + elif [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then + if [ -n "$SOCKS5_NODE1" -a "$SOCKS5_NODE1" != "nil" ]; then + DNS2SOCKS_FORWARD=$(config_t_get global dns2socks_forward 8.8.4.4) + ln_start_bin $(find_bin dns2socks) dns2socks "127.0.0.1:$SOCKS5_PROXY_PORT1 $DNS2SOCKS_FORWARD 127.0.0.1:$other_port" + ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param" + echolog "DNS:ChinaDNS-NG + dns2socks($DNS2SOCKS_FORWARD),国内DNS:$UP_CHINA_DNS" + else + echolog "DNS:dns2socks模式需要使用Socks5代理节点,请开启!" + force_stop + fi + else + use_udp_node_resolve_dns=1 + DNS_FORWARD=$(echo $up_trust_chinadns_ng_dns | sed 's/,/ /g') + ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t $up_trust_chinadns_ng_dns $gfwlist_param $chnlist_param" + echolog "DNS:ChinaDNS-NG,国内DNS:$UP_CHINA_DNS,可信DNS:$up_trust_chinadns_ng_dns,如果不能使用,请确保UDP节点已打开并且支持UDP转发。" + fi ;; esac } @@ -832,9 +701,7 @@ add_dnsmasq() { EOF } - cat <<-EOF >> /var/dnsmasq.d/dnsmasq-$CONFIG.conf - conf-dir=$TMP_DNSMASQ_PATH - EOF + echo "conf-dir=$TMP_DNSMASQ_PATH" >> /var/dnsmasq.d/dnsmasq-$CONFIG.conf cp -rf /var/dnsmasq.d/dnsmasq-$CONFIG.conf $DNSMASQ_PATH/dnsmasq-$CONFIG.conf echolog "dnsmasq:生成配置文件。" } @@ -913,7 +780,6 @@ gen_pdnsd_config() { global { perm_cache = $2; cache_dir = "$pdnsd_dir"; - pid_file = "$RUN_PID_PATH/pdnsd.pid"; run_as = "root"; server_ip = 127.0.0.1; server_port = $1; @@ -980,21 +846,24 @@ stop_dnsmasq() { rm -rf /var/dnsmasq.d/dnsmasq-$CONFIG.conf rm -rf $DNSMASQ_PATH/dnsmasq-$CONFIG.conf rm -rf $TMP_DNSMASQ_PATH - /etc/init.d/dnsmasq restart >/dev/null 2>&1 & + /etc/init.d/dnsmasq reload >/dev/null 2>&1 & } start_haproxy() { enabled=$(config_t_get global_haproxy balancing_enable 0) [ "$enabled" = "1" ] && { + haproxy_bin=$(find_bin haproxy) [ -f "$haproxy_bin" ] && { + local HAPROXY_PATH=$CONFIG_PATH/haproxy + mkdir -p $HAPROXY_PATH + local HAPROXY_FILE=$HAPROXY_PATH/config.cfg bport=$(config_t_get global_haproxy haproxy_port) cat <<-EOF >$HAPROXY_FILE global log 127.0.0.1 local2 chroot /usr/bin - pidfile $RUN_PID_PATH/haproxy.pid maxconn 60000 - stats socket $RUN_PID_PATH/haproxy.sock + stats socket $HAPROXY_PATH/haproxy.sock user root daemon @@ -1023,9 +892,6 @@ start_haproxy() { for i in $(seq 0 50); do bips=$(config_t_get balancing lbss '' $i) bports=$(config_t_get balancing lbort '' $i) - bweight=$(config_t_get balancing lbweight '' $i) - exports=$(config_t_get balancing export '' $i) - bbackup=$(config_t_get balancing backup '' $i) if [ -z "$bips" ] || [ -z "$bports" ]; then break fi @@ -1033,6 +899,10 @@ start_haproxy() { local bport=$(echo $bips | awk -F ":" '{print $2}') [ "$bports" != "default" ] && bport=$bports [ -z "$bport" ] && break + + bweight=$(config_t_get balancing lbweight '' $i) + exports=$(config_t_get balancing export '' $i) + bbackup=$(config_t_get balancing backup '' $i) if [ "$bbackup" = "1" ]; then bbackup=" backup" echolog "负载均衡:添加故障转移备节点:$bip" @@ -1060,7 +930,6 @@ start_haproxy() { sleep 1m else route add -host ${bip} dev ${exports} - echolog "添加SS出口路由表:$exports" echo "$bip" >>/tmp/balancing_ip break fi @@ -1071,19 +940,19 @@ start_haproxy() { console_port=$(config_t_get global_haproxy console_port) console_user=$(config_t_get global_haproxy console_user) console_password=$(config_t_get global_haproxy console_password) + local auth="" + [ -n "$console_user" -a -n "console_password" ] && auth="stats auth $console_user:$console_password" cat <<-EOF >> $HAPROXY_FILE listen status bind 0.0.0.0:$console_port mode http stats refresh 30s - stats uri / - stats auth $console_user:$console_password - #stats hide-version + stats uri / stats admin if TRUE + $auth EOF - nohup $haproxy_bin -f $HAPROXY_FILE >/dev/null 2>&1 & - [ "$?" == 0 ] && echolog "负载均衡:运行成功!" || echolog "负载均衡:运行失败!" + ln_start_bin $haproxy_bin haproxy "-f $HAPROXY_FILE" } } } @@ -1122,7 +991,7 @@ start() { add_dnsmasq source $APP_PATH/iptables.sh start start_crontab - /etc/init.d/dnsmasq restart >/dev/null 2>&1 & + /etc/init.d/dnsmasq reload >/dev/null 2>&1 & echolog "运行完成!\n" rm -f "$LOCK_FILE" return 0 @@ -1147,7 +1016,6 @@ stop() { stop_dnsmasq stop_crontab echolog "关闭相关程序,清理相关文件和缓存完成。" - sleep 1s } case $1 in 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 97f254aa90..48fbc29323 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 @@ -16,88 +16,91 @@ config_t_get() { echo ${ret:=$3} } -TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) -for i in $(seq 1 $TCP_NODE_NUM); do - eval TCP_NODE$i=$(config_t_get global tcp_node$i nil) -done +ENABLED=$(config_t_get global enabled 0) +[ "$ENABLED" == "1" ] && { + TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) + for i in $(seq 1 $TCP_NODE_NUM); do + eval TCP_NODE$i=$(config_t_get global tcp_node$i nil) + done -UDP_NODE_NUM=$(config_t_get global_other udp_node_num 1) -for i in $(seq 1 $UDP_NODE_NUM); do - eval UDP_NODE$i=$(config_t_get global udp_node$i nil) -done + UDP_NODE_NUM=$(config_t_get global_other udp_node_num 1) + for i in $(seq 1 $UDP_NODE_NUM); do + eval UDP_NODE$i=$(config_t_get global udp_node$i nil) + done -SOCKS5_NODE_NUM=$(config_t_get global_other socks5_node_num 1) -for i in $(seq 1 $SOCKS5_NODE_NUM); do - eval SOCKS5_NODE$i=$(config_t_get global socks5_node$i nil) -done + SOCKS5_NODE_NUM=$(config_t_get global_other socks5_node_num 1) + for i in $(seq 1 $SOCKS5_NODE_NUM); do + eval SOCKS5_NODE$i=$(config_t_get global socks5_node$i nil) + done -dns_mode=$(config_t_get global dns_mode) -use_haproxy=$(config_t_get global_haproxy balancing_enable 0) + dns_mode=$(config_t_get global dns_mode) + use_haproxy=$(config_t_get global_haproxy balancing_enable 0) -#tcp -for i in $(seq 1 $TCP_NODE_NUM); do - eval tmp_node=\$TCP_NODE$i - if [ "$tmp_node" != "nil" ]; then - #kcptun - use_kcp=$(config_n_get $tmp_node use_kcp 0) - if [ $use_kcp -gt 0 ]; then - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep kcptun-client | grep kcptun_${i} | wc -l) + #tcp + for i in $(seq 1 $TCP_NODE_NUM); do + eval tmp_node=\$TCP_NODE$i + if [ "$tmp_node" != "nil" ]; then + #kcptun + use_kcp=$(config_n_get $tmp_node use_kcp 0) + if [ $use_kcp -gt 0 ]; then + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep kcptun-client | grep kcptun_${i} | wc -l) + if [ $icount = 0 ]; then + /etc/init.d/passwall restart + exit 0 + fi + fi + [ -f "/var/etc/passwall/port/TCP_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/TCP_$i`) + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "TCP_${i}|brook tproxy -l 0.0.0.0:${listen_port}|ipt2socks -T -l ${listen_port}" | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 fi fi - [ -f "/var/etc/passwall/port/TCP_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/TCP_$i`) - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "TCP_${i}|brook tproxy -l 0.0.0.0:${listen_port}|ipt2socks -T -l ${listen_port}" | wc -l) + done + + + #udp + for i in $(seq 1 $UDP_NODE_NUM); do + eval tmp_node=\$UDP_NODE$i + if [ "$tmp_node" != "nil" ]; then + [ "$tmp_node" == "default" ] && tmp_node=$TCP_NODE1 + [ -f "/var/etc/passwall/port/UDP_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/UDP_$i`) + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "UDP_${i}|brook tproxy -l 0.0.0.0:${listen_port}|ipt2socks -U -l ${listen_port}" | wc -l) + if [ $icount = 0 ]; then + /etc/init.d/passwall restart + exit 0 + fi + fi + done + + #socks5 + for i in $(seq 1 $SOCKS5_NODE_NUM); do + eval tmp_node=\$SOCKS5_NODE$i + if [ "$tmp_node" != "nil" ]; then + [ -f "/var/etc/passwall/port/SOCKS5_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/SOCKS5_$i`) + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "SOCKS5_${i}|brook client -l 0.0.0.0:${listen_port}" | wc -l) + if [ $icount = 0 ]; then + /etc/init.d/passwall restart + exit 0 + fi + fi + done + + #dns + if [ "$dns_mode" != "nonuse" ]; then + icount=$(netstat -apn | grep 7913 | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 fi fi -done - -#udp -for i in $(seq 1 $UDP_NODE_NUM); do - eval tmp_node=\$UDP_NODE$i - if [ "$tmp_node" != "nil" ]; then - [ "$tmp_node" == "default" ] && tmp_node=$TCP_NODE1 - [ -f "/var/etc/passwall/port/UDP_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/UDP_$i`) - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "UDP_${i}|brook tproxy -l 0.0.0.0:${listen_port}|ipt2socks -U -l ${listen_port}" | wc -l) + #haproxy + if [ $use_haproxy -gt 0 ]; then + icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep haproxy | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 fi fi -done - -#socks5 -for i in $(seq 1 $SOCKS5_NODE_NUM); do - eval tmp_node=\$SOCKS5_NODE$i - if [ "$tmp_node" != "nil" ]; then - [ -f "/var/etc/passwall/port/SOCKS5_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/SOCKS5_$i`) - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep -i -E "SOCKS5_${i}|brook client -l 0.0.0.0:${listen_port}" | wc -l) - if [ $icount = 0 ]; then - /etc/init.d/passwall restart - exit 0 - fi - fi -done - -#dns -if [ "$dns_mode" != "nonuse" ]; then - icount=$(netstat -apn | grep 7913 | wc -l) - if [ $icount = 0 ]; then - /etc/init.d/passwall restart - exit 0 - fi -fi - -#haproxy -if [ $use_haproxy -gt 0 ]; then - icount=$(ps -w | grep -v grep | grep $RUN_BIN_PATH | grep haproxy | wc -l) - if [ $icount = 0 ]; then - /etc/init.d/passwall restart - exit 0 - fi -fi +} \ No newline at end of file