2
0

ssr-switch 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. #获取服务器ip
  33. server2ip() {
  34. if [[ $1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
  35. echo $1
  36. else
  37. echo $(nslookup $1 | grep 'Address 1' | awk -F ': ' '{ print $2 }')
  38. fi
  39. }
  40. #判断代理是否正常
  41. check_proxy() {
  42. local result=0
  43. local try_count=$(uci_get_by_type global switch_try_count 3)
  44. for i in $(seq 1 $try_count); do
  45. /usr/bin/ssr-check www.google.com 80 $switch_time 1
  46. if [ "$?" == "0" ]; then
  47. # echo "$(date "+%Y-%m-%d %H:%M:%S") Check Google Proxy Success, count=$i" >> /tmp/ssrplus.log
  48. result=0
  49. break
  50. else
  51. # echo "$(date "+%Y-%m-%d %H:%M:%S") Check Google Proxy Fail, count=$i" >> /tmp/ssrplus.log
  52. /usr/bin/ssr-check www.baidu.com 80 $switch_time 1
  53. if [ "$?" == "0" ]; then
  54. result=1
  55. else
  56. result=2
  57. fi
  58. fi
  59. sleep 1
  60. done
  61. return $result
  62. }
  63. test_proxy() {
  64. local servername=$(uci_get_by_name $1 server)
  65. local serverport=$(uci_get_by_name $1 server_port)
  66. local serverip=$(server2ip $servername)
  67. ipset add ss_spec_wan_ac $serverip 2>/dev/null
  68. ret_ac=$?
  69. ret=$(tcpping -c 3 -p $serverport $servername | grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }' | awk -F "." '{ print $1 }')
  70. #echo "$(date "+%Y-%m-%d %H:%M:%S") test_proxy> name: $servername, ip: $serverip, ret_ac: $ret_ac, ret_tcpping: $ret" >> /tmp/ssrplus.log
  71. if [ -z "$ret" ] || [ "$ret" -gt "50" ]; then
  72. [ "$ret_ac" == "0" ] && ipset del ss_spec_wan_ac $serverip 2>/dev/null
  73. return 1
  74. fi
  75. /usr/bin/ssr-check $servername $serverport $switch_time
  76. local ret2=$?
  77. [ "$ret_ac" == "0" ] && ipset del ss_spec_wan_ac $serverip 2>/dev/null
  78. if [ "$ret2" == "0" ]; then
  79. return 0
  80. else
  81. return 1
  82. fi
  83. }
  84. search_proxy() {
  85. let server_count=server_count+1
  86. [ "$normal_flag" == "1" -a "$server_count" -le "$server_locate" ] && return 0
  87. [ "$(uci_get_by_name $1 switch_enable 0)" != "1" ] && return 1
  88. [ $ENABLE_SERVER != nil ] && return 0
  89. [ "$1" == "$CURRENT_SERVER" ] && return 0
  90. local servername=$(uci_get_by_name $1 server)
  91. local serverport=$(uci_get_by_name $1 server_port)
  92. local serverip=$(server2ip $servername)
  93. ipset add ss_spec_wan_ac $serverip 2>/dev/null
  94. ret=$?
  95. /usr/bin/ssr-check $servername $serverport $switch_time
  96. local ret2=$?
  97. if [ "$ret" == "0" ]; then
  98. ipset del ss_spec_wan_ac $serverip 2>/dev/null
  99. fi
  100. if [ "$ret2" == "0" ]; then
  101. server_locate=$server_count
  102. ENABLE_SERVER=$1
  103. return 0
  104. else
  105. return 1
  106. fi
  107. }
  108. #选择可用的代理
  109. select_proxy() {
  110. config_load $NAME
  111. ENABLE_SERVER=nil
  112. mkdir -p /var/run /var/etc
  113. server_count=0
  114. config_foreach search_proxy servers
  115. }
  116. #切换代理
  117. switch_proxy() {
  118. /etc/init.d/shadowsocksr restart $1
  119. return 0
  120. }
  121. start() {
  122. #不支持kcptun启用时的切换
  123. [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1
  124. while [ "1" == "1" ]; do #死循环
  125. sleep $cycle_time
  126. LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
  127. #判断当前代理是否为缺省服务器
  128. if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then
  129. #echo "not default proxy"
  130. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server is not default Main server, try to switch back." >>/tmp/ssrplus.log
  131. #检查缺省服务器是否正常
  132. if test_proxy $DEFAULT_SERVER; then
  133. #echo "switch to default proxy"
  134. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is avilable." >>/tmp/ssrplus.log
  135. #缺省服务器正常,切换回来
  136. CURRENT_SERVER=$DEFAULT_SERVER
  137. switch_proxy $CURRENT_SERVER
  138. echo "$(date "+%Y-%m-%d %H:%M:%S") switch to default "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  139. else
  140. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is NOT avilable.Continue using current server." >>/tmp/ssrplus.log
  141. fi
  142. fi
  143. #判断当前代理是否正常
  144. #echo "$(date "+%Y-%m-%d %H:%M:%S") Start checking if the current server is available." >>/tmp/ssrplus.log
  145. check_proxy
  146. current_ret=$?
  147. if [ "$current_ret" == "1" ]; then
  148. #当前代理错误,判断有无可用的服务器
  149. #echo "current error"
  150. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server error, try to switch another server." >>/tmp/ssrplus.log
  151. select_proxy
  152. if [ "$ENABLE_SERVER" != nil ]; then
  153. #有其他服务器可用,进行切换
  154. #echo $(uci_get_by_name $new_proxy server)
  155. echo "$(date "+%Y-%m-%d %H:%M:%S") Another server is avilable, now switching server." >>/tmp/ssrplus.log
  156. CURRENT_SERVER=$ENABLE_SERVER
  157. switch_proxy $CURRENT_SERVER
  158. normal_flag=1
  159. echo "$(date "+%Y-%m-%d %H:%M:%S") Switch to "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  160. else
  161. switch_proxy $CURRENT_SERVER
  162. normal_flag=1
  163. echo "$(date "+%Y-%m-%d %H:%M:%S") Try restart current server." >>/tmp/ssrplus.log
  164. fi
  165. else
  166. normal_flag=0
  167. # echo "$(date "+%Y-%m-%d %H:%M:%S") ShadowsocksR No Problem." >>/tmp/ssrplus.log
  168. fi
  169. done
  170. }