ssr-switch 4.1 KB

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