ssr-switch 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. ipset add whitelist $servername 2>/dev/null
  59. tcping -q -c 3 -i 1 -t 2 -p $serverport $servername
  60. if [ "$?" -gt "0" ]; then
  61. ipset del whitelist $servername 2>/dev/null
  62. return 1
  63. fi
  64. /usr/bin/ssr-check $servername $serverport $switch_time
  65. local ret=$?
  66. ipset del whitelist $servername 2>/dev/null
  67. if [ "$ret" == "0" ]; then
  68. return 0
  69. else
  70. return 1
  71. fi
  72. }
  73. search_proxy() {
  74. let server_count=server_count+1
  75. [ "$normal_flag" == "1" -a "$server_count" -le "$server_locate" ] && return 0
  76. [ "$(uci_get_by_name $1 switch_enable 0)" != "1" ] && return 1
  77. [ $ENABLE_SERVER != nil ] && return 0
  78. [ "$1" == "$CURRENT_SERVER" ] && return 0
  79. local servername=$(uci_get_by_name $1 server)
  80. local serverport=$(uci_get_by_name $1 server_port)
  81. ipset add whitelist $servername 2>/dev/null
  82. /usr/bin/ssr-check $servername $serverport $switch_time
  83. local ret=$?
  84. ipset del whitelist $servername 2>/dev/null
  85. if [ "$ret" == "0" ]; then
  86. server_locate=$server_count
  87. ENABLE_SERVER=$1
  88. return 0
  89. else
  90. return 1
  91. fi
  92. }
  93. #选择可用的代理
  94. select_proxy() {
  95. config_load $NAME
  96. ENABLE_SERVER=nil
  97. mkdir -p /var/run /var/etc
  98. server_count=0
  99. config_foreach search_proxy servers
  100. }
  101. #切换代理
  102. switch_proxy() {
  103. /etc/init.d/shadowsocksr restart $1
  104. return 0
  105. }
  106. start() {
  107. #不支持kcptun启用时的切换
  108. [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1
  109. while [ "1" == "1" ]; do #死循环
  110. sleep $cycle_time
  111. LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
  112. #判断当前代理是否为缺省服务器
  113. if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then
  114. #echo "not default proxy"
  115. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server is not default Main server, try to switch back." >>/tmp/ssrplus.log
  116. #检查缺省服务器是否正常
  117. if test_proxy $DEFAULT_SERVER; then
  118. #echo "switch to default proxy"
  119. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is avilable." >>/tmp/ssrplus.log
  120. #缺省服务器正常,切换回来
  121. CURRENT_SERVER=$DEFAULT_SERVER
  122. switch_proxy $CURRENT_SERVER
  123. echo "$(date "+%Y-%m-%d %H:%M:%S") switch to default "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  124. else
  125. echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is NOT avilable.Continue using current server." >>/tmp/ssrplus.log
  126. fi
  127. fi
  128. #判断当前代理是否正常
  129. #echo "$(date "+%Y-%m-%d %H:%M:%S") Start checking if the current server is available." >>/tmp/ssrplus.log
  130. check_proxy
  131. current_ret=$?
  132. if [ "$current_ret" == "1" ]; then
  133. #当前代理错误,判断有无可用的服务器
  134. #echo "current error"
  135. echo "$(date "+%Y-%m-%d %H:%M:%S") Current server error, try to switch another server." >>/tmp/ssrplus.log
  136. select_proxy
  137. if [ "$ENABLE_SERVER" != nil ]; then
  138. #有其他服务器可用,进行切换
  139. #echo $(uci_get_by_name $new_proxy server)
  140. echo "$(date "+%Y-%m-%d %H:%M:%S") Another server is avilable, now switching server." >>/tmp/ssrplus.log
  141. CURRENT_SERVER=$ENABLE_SERVER
  142. switch_proxy $CURRENT_SERVER
  143. normal_flag=1
  144. echo "$(date "+%Y-%m-%d %H:%M:%S") Switch to "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" >>/tmp/ssrplus.log
  145. else
  146. switch_proxy $CURRENT_SERVER
  147. normal_flag=1
  148. echo "$(date "+%Y-%m-%d %H:%M:%S") Try restart current server." >>/tmp/ssrplus.log
  149. fi
  150. else
  151. normal_flag=0
  152. # echo "$(date "+%Y-%m-%d %H:%M:%S") ShadowsocksR No Problem." >>/tmp/ssrplus.log
  153. fi
  154. done
  155. }