ssr-switch 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #!/bin/sh /etc/rc.common
  2. #
  3. # Copyright (C) 2017 openwrt-ssr
  4. # Copyright (C) 2017 yushi studio <[email protected]>
  5. #
  6. # This is free software, licensed under the GNU General Public License v3.
  7. # See /LICENSE for more information.
  8. #
  9. LOCK_FILE="/var/lock/ssr-switch.lock"
  10. [ -f "$LOCK_FILE" ] && exit 2
  11. touch "$LOCK_FILE"
  12. cycle_time=60
  13. switch_time=3
  14. normal_flag=0
  15. server_locate=0
  16. server_count=0
  17. NAME=shadowsocksr
  18. ENABLE_SERVER=nil
  19. CONFIG_SWTICH_FILE=/var/etc/${NAME}_t.json
  20. [ -n "$1" ] && cycle_time=$1
  21. [ -n "$2" ] && switch_time=$2
  22. uci_get_by_name() {
  23. local ret=$(uci get $NAME.$1.$2 2>/dev/null)
  24. echo ${ret:=$3}
  25. }
  26. uci_get_by_type() {
  27. local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null)
  28. echo ${ret:=$3}
  29. }
  30. DEFAULT_SERVER=$(uci_get_by_type global global_server)
  31. CURRENT_SERVER=$DEFAULT_SERVER
  32. #判断代理是否正常
  33. check_proxy() {
  34. local result=0
  35. local try_count=$(uci_get_by_type global switch_try_count 3)
  36. for i in $(seq 1 $try_count); do
  37. /usr/bin/ssr-check www.google.com 80 $switch_time 1
  38. if [ "$?" == "0" ]; then
  39. # echo "$(date "+%Y-%m-%d %H:%M:%S") Check Google Proxy Success, count=$i" >> /tmp/ssrplus.log
  40. result=0
  41. break
  42. else
  43. # echo "$(date "+%Y-%m-%d %H:%M:%S") Check Google Proxy Fail, count=$i" >> /tmp/ssrplus.log
  44. /usr/bin/ssr-check www.baidu.com 80 $switch_time 1
  45. if [ "$?" == "0" ]; then
  46. result=1
  47. else
  48. result=2
  49. fi
  50. fi
  51. sleep 1
  52. done
  53. return $result
  54. }
  55. test_proxy() {
  56. local servername=$(uci_get_by_name $1 server)
  57. local serverport=$(uci_get_by_name $1 server_port)
  58. ret=$(tcpping -c 3 -p $serverport $servername | grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }' | awk -F "." '{ print $1 }')
  59. [ -z "$ret" ] && return 1
  60. [ "$ret" -gt "50" ] && return 1
  61. ipset add ss_spec_wan_ac $servername 2>/dev/null
  62. ret=$?
  63. /usr/bin/ssr-check $servername $serverport $switch_time
  64. local ret2=$?
  65. if [ "$ret" == "0" ]; then
  66. ipset del ss_spec_wan_ac $servername 2>/dev/null
  67. fi
  68. if [ "$ret2" == "0" ]; then
  69. return 0
  70. else
  71. return 1
  72. fi
  73. }
  74. search_proxy() {
  75. let server_count=server_count+1
  76. [ "$normal_flag" == "1" -a "$server_count" -le "$server_locate" ] && return 0
  77. [ "$(uci_get_by_name $1 switch_enable 0)" != "1" ] && return 1
  78. [ $ENABLE_SERVER != nil ] && return 0
  79. [ "$1" == "$CURRENT_SERVER" ] && return 0
  80. local servername=$(uci_get_by_name $1 server)
  81. local serverport=$(uci_get_by_name $1 server_port)
  82. ipset add ss_spec_wan_ac $servername 2>/dev/null
  83. ret=$?
  84. /usr/bin/ssr-check $servername $serverport $switch_time
  85. local ret2=$?
  86. if [ "$ret" == "0" ]; then
  87. ipset del ss_spec_wan_ac $servername 2>/dev/null
  88. fi
  89. if [ "$ret2" == "0" ]; then
  90. server_locate=$server_count
  91. ENABLE_SERVER=$1
  92. return 0
  93. else
  94. return 1
  95. fi
  96. }
  97. #选择可用的代理
  98. select_proxy() {
  99. config_load $NAME
  100. ENABLE_SERVER=nil
  101. mkdir -p /var/run /var/etc
  102. server_count=0
  103. config_foreach search_proxy servers
  104. }
  105. #切换代理
  106. switch_proxy() {
  107. /etc/init.d/shadowsocksr restart $1
  108. return 0
  109. }
  110. start() {
  111. #不支持kcptun启用时的切换
  112. [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1
  113. while [ "1" == "1" ]; do #死循环
  114. sleep $cycle_time
  115. LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
  116. #判断当前代理是否为缺省服务器
  117. if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then
  118. #echo "not default proxy"
  119. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server is not default Main server, try to switch back." >>/tmp/ssrplus.log
  120. #检查缺省服务器是否正常
  121. if test_proxy $DEFAULT_SERVER; then
  122. #echo "switch to default proxy"
  123. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is avilable." >>/tmp/ssrplus.log
  124. #缺省服务器正常,切换回来
  125. CURRENT_SERVER=$DEFAULT_SERVER
  126. switch_proxy $CURRENT_SERVER
  127. echo "$(date "+%Y-%m-%d %H:%M:%S") switch to default "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  128. else
  129. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is NOT avilable.Continue using current server." >>/tmp/ssrplus.log
  130. fi
  131. fi
  132. #判断当前代理是否正常
  133. #echo "$(date "+%Y-%m-%d %H:%M:%S") Start checking if the current server is available." >>/tmp/ssrplus.log
  134. check_proxy
  135. current_ret=$?
  136. if [ "$current_ret" == "1" ]; then
  137. #当前代理错误,判断有无可用的服务器
  138. #echo "current error"
  139. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server error, try to switch another server." >>/tmp/ssrplus.log
  140. select_proxy
  141. if [ "$ENABLE_SERVER" != nil ]; then
  142. #有其他服务器可用,进行切换
  143. #echo $(uci_get_by_name $new_proxy server)
  144. echo "$(date "+%Y-%m-%d %H:%M:%S") Another server is avilable, now switching server." >>/tmp/ssrplus.log
  145. CURRENT_SERVER=$ENABLE_SERVER
  146. switch_proxy $CURRENT_SERVER
  147. normal_flag=1
  148. echo "$(date "+%Y-%m-%d %H:%M:%S") Switch to "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  149. else
  150. switch_proxy $CURRENT_SERVER
  151. normal_flag=1
  152. echo "$(date "+%Y-%m-%d %H:%M:%S") Try restart current server." >>/tmp/ssrplus.log
  153. fi
  154. else
  155. normal_flag=0
  156. # echo "$(date "+%Y-%m-%d %H:%M:%S") ShadowsocksR No Problem." >>/tmp/ssrplus.log
  157. fi
  158. done
  159. }