From 0a9ce83a9c927704bb5e3d2fb0d4be5931daeea3 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sat, 5 Dec 2020 22:46:01 +0800 Subject: [PATCH] luci-app-passwall: sync with upstream source --- package/lienol/luci-app-passwall/Makefile | 6 ++- .../model/cbi/passwall/client/rule_list.lua | 5 +- .../root/usr/share/passwall/app.sh | 39 ++++++++++++++ .../root/usr/share/passwall/iptables.sh | 54 ++++++++----------- .../root/usr/share/passwall/subscribe.lua | 8 +-- .../root/usr/share/passwall/test.sh | 43 +++++++-------- 6 files changed, 89 insertions(+), 66 deletions(-) diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 6178e55c0a..aa2c3afb2b 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -134,8 +134,10 @@ define Package/$(PKG_NAME)/conffiles /etc/config/passwall_server /usr/share/passwall/rules/proxy_host /usr/share/passwall/rules/proxy_ip -/usr/share/passwall/rules/direct_host -/usr/share/passwall/rules/direct_ip +/usr/share/passwall/rules/proxy_host2 +/usr/share/passwall/rules/proxy_ip2 +/usr/share/passwall/rules/proxy_host3 +/usr/share/passwall/rules/proxy_ip3 endef define Package/$(PKG_NAME)/install diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua index bd5ad352d7..bf95912e54 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua @@ -2,7 +2,10 @@ local fs = require "nixio.fs" local appname = "passwall" m = Map(appname) - +m.apply_on_parse=true +function m.on_apply(self) +luci.sys.call("/etc/init.d/passwall reload > /dev/null 2>&1 &") +end -- [[ Rule List Settings ]]-- s = m:section(TypedSection, "global_rules") s.anonymous = true 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 9522313318..39d6ec6d8f 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 @@ -9,6 +9,7 @@ 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 RULES_PATH=/usr/share/${CONFIG}/rules @@ -48,6 +49,38 @@ config_t_get() { echo "${ret:=${3}}" } +set_lock(){ + exec 1000>"$LOCK_FILE" + flock -x 1000 +} + +trap 'rm -f "$LOCK_FILE"; exit $?' INT TERM EXIT + +unlock() { + failcount=1 + while [ "$failcount" -le 10 ]; do + if [ -f "$LOCK_FILE" ]; then + let "failcount++" + sleep 1s + [ "$failcount" -ge 10 ] && unset_lock + else + break + fi + done +} + +unset_lock(){ + flock -u 1000 + rm -rf "$LOCK_FILE" +} + +_exit() +{ + local rc=$1 + unset_lock + exit ${rc} +} + get_enabled_anonymous_secs() { uci -q show "${CONFIG}" | grep "${1}\[.*\.enabled='1'" | cut -d '.' -sf2 } @@ -1201,6 +1234,8 @@ boot() { } start() { + #加锁防止并发开启服务 + set_lock load_config start_socks start_haproxy @@ -1215,9 +1250,12 @@ start() { } start_crontab echolog "运行完成!\n" + unset_lock } stop() { + unlock + set_lock clean_log source $APP_PATH/iptables.sh stop kill_all v2ray-plugin obfs-local @@ -1231,6 +1269,7 @@ stop() { /etc/init.d/dnsmasq restart >/dev/null 2>&1 echolog "重启 dnsmasq 服务[$?]" echolog "清空并关闭相关程序和缓存完成。" + unset_lock } arg1=$1 diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh index 3ec658cf73..8f0401cacc 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh @@ -635,24 +635,32 @@ add_firewall_rule() { } del_firewall_rule() { - $ipt_n -D PREROUTING -p tcp -j PSW 2>/dev/null - $ipt_n -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null + ib_nat_exist=`$ipt_n -L PREROUTING | grep -c PSW` + if [ ! -z "$ib_nat_exist" ];then + until [ "$ib_nat_exist" = 0 ] + do + $ipt_n -D PREROUTING -p tcp -j PSW 2>/dev/null + $ipt_n -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null + + $ipt_m -D PREROUTING -j PSW 2>/dev/null + $ipt_m -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null + $ipt_m -D OUTPUT -p udp -j PSW_OUTPUT 2>/dev/null + + $ip6t_n -D PREROUTING -j PSW 2>/dev/null + $ip6t_n -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null + + $ip6t_m -D PREROUTING -j PSW 2>/dev/null + $ip6t_m -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null + + ib_nat_exist=`expr $ib_nat_exist - 1` + done + fi $ipt_n -F PSW 2>/dev/null && $ipt_n -X PSW 2>/dev/null $ipt_n -F PSW_OUTPUT 2>/dev/null && $ipt_n -X PSW_OUTPUT 2>/dev/null - - $ipt_m -D PREROUTING -j PSW 2>/dev/null - $ipt_m -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null - $ipt_m -D OUTPUT -p udp -j PSW_OUTPUT 2>/dev/null $ipt_m -F PSW 2>/dev/null && $ipt_m -X PSW 2>/dev/null $ipt_m -F PSW_OUTPUT 2>/dev/null && $ipt_m -X PSW_OUTPUT 2>/dev/null - - $ip6t_n -D PREROUTING -j PSW 2>/dev/null - $ip6t_n -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null $ip6t_n -F PSW 2>/dev/null && $ip6t_n -X PSW 2>/dev/null $ip6t_n -F PSW_OUTPUT 2>/dev/null && $ip6t_n -X PSW_OUTPUT 2>/dev/null - - $ip6t_m -D PREROUTING -j PSW 2>/dev/null - $ip6t_m -D OUTPUT -p tcp -j PSW_OUTPUT 2>/dev/null $ip6t_m -F PSW 2>/dev/null && $ip6t_m -X PSW 2>/dev/null $ip6t_m -F PSW_OUTPUT 2>/dev/null && $ip6t_m -X PSW_OUTPUT 2>/dev/null @@ -670,7 +678,7 @@ del_firewall_rule() { #ipset -F $IPSET_BLACKLIST2 >/dev/null 2>&1 && ipset -X $IPSET_BLACKLIST2 >/dev/null 2>&1 & #ipset -F $IPSET_BLACKLIST3 >/dev/null 2>&1 && ipset -X $IPSET_BLACKLIST3 >/dev/null 2>&1 & ipset -F $IPSET_WHITELIST >/dev/null 2>&1 && ipset -X $IPSET_WHITELIST >/dev/null 2>&1 & - #echolog "删除相关防火墙规则完成。" + echolog "删除相关防火墙规则完成。" } flush_ipset() { @@ -693,26 +701,8 @@ flush_include() { gen_include() { flush_include - extract_rules() { - local _ipt="iptables" - [ "$1" == "6" ] && _ipt="ip6tables" - - echo "*$2" - ${_ipt}-save -t $2 | grep PSW | \ - sed -e "s/^-A \(OUTPUT\|PREROUTING\)/-I \1 1/" - echo 'COMMIT' - } cat <<-EOF >>$FWI - iptables-save -c | grep -v "PSW" | iptables-restore -c - iptables-restore -n <<-EOT - $(extract_rules 4 nat) - $(extract_rules 4 mangle) - EOT - ip6tables-save -c | grep -v "PSW" | ip6tables-restore -c - ip6tables-restore -n <<-EOT - $(extract_rules 6 nat) - $(extract_rules 6 mangle) - EOT + /etc/init.d/passwall reload EOF return 0 } diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua index 8c8ecc069d..7c4ebe48c9 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -606,7 +606,6 @@ local function curl(url) end local function truncate_nodes() - local is_stop = 0 local function clear(type) local node_num = ucic2:get(application, "@global_other[0]", type .. "_node_num") or 1 for i = 1, node_num, 1 do @@ -614,7 +613,6 @@ local function truncate_nodes() if node then local is_sub_node = ucic2:get(application, node, "is_sub") or 0 if is_sub_node == "1" then - is_stop = 1 ucic2:set(application, '@global[0]', type .. "_node" .. i, "nil") end end @@ -628,7 +626,6 @@ local function truncate_nodes() if node then local is_sub_node = ucic2:get(application, node, "is_sub") or 0 if is_sub_node == "1" then - is_stop = 1 ucic2:set(application, t[".name"], "node", "nil") end end @@ -641,9 +638,6 @@ local function truncate_nodes() end) ucic2:commit(application) - if is_stop == 1 then - luci.sys.call("/etc/init.d/" .. application .. " restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早 - end log('在线订阅节点已全部删除') end @@ -808,7 +802,7 @@ local function update_node(manual) ]]-- ucic2:commit(application) - luci.sys.call("/etc/init.d/" .. application .. " restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早 + --luci.sys.call("/etc/init.d/" .. application .. " restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早 end end 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 35beb8d2b7..3f14223e20 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 @@ -136,32 +136,27 @@ test_auto_switch() { } start() { - ( - flock -xn 200 - [ "$?" != "0" ] && exit 0 - - ENABLED=$(config_t_get global enabled 0) - [ "$ENABLED" != 1 ] && return 1 - ENABLED=$(config_t_get auto_switch enable 0) - [ "$ENABLED" != 1 ] && return 1 + ENABLED=$(config_t_get global enabled 0) + [ "$ENABLED" != 1 ] && _return 1 + ENABLED=$(config_t_get auto_switch enable 0) + [ "$ENABLED" != 1 ] && _return 1 + delay=$(config_t_get auto_switch testing_time 1) + sleep ${delay}m + while [ "$ENABLED" -eq 1 ] + do + # TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) + # 暂时只能检测TCP1 + TCP_NODE_NUM=1 + for i in $(seq 1 $TCP_NODE_NUM); do + eval TCP_NODE$i=\"$(config_t_get auto_switch tcp_node$i nil)\" + eval tmp=\$TCP_NODE$i + [ -n "$tmp" -a "$tmp" != "nil" ] && { + test_auto_switch TCP tcp $i "$tmp" + } + done delay=$(config_t_get auto_switch testing_time 1) sleep ${delay}m - while [ "$ENABLED" -eq 1 ] - do - # TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) - # 暂时只能检测TCP1 - TCP_NODE_NUM=1 - for i in $(seq 1 $TCP_NODE_NUM); do - eval TCP_NODE$i=\"$(config_t_get auto_switch tcp_node$i nil)\" - eval tmp=\$TCP_NODE$i - [ -n "$tmp" -a "$tmp" != "nil" ] && { - test_auto_switch TCP tcp $i "$tmp" - } - done - delay=$(config_t_get auto_switch testing_time 1) - sleep ${delay}m - done - ) 200>"/var/lock/passwall_auto_switch.lock" + done } case $1 in