#!/bin/sh  /etc/rc.common
#
# Copyright (C) 2017 openwrt-ssr
# Copyright (C) 2017 yushi studio <ywb94@qq.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#

cycle_time=60
switch_time=3
normal_flag=0
server_locate=0
server_count=0
NAME=shadowsocksr
ENABLE_SERVER=nil
CONFIG_SWTICH_FILE=/var/etc/${NAME}_t.json


[ -n "$1" ] && cycle_time=$1
[ -n "$2" ] && switch_time=$2

uci_get_by_name() {
	local ret=$(uci get $NAME.$1.$2 2>/dev/null)
	echo ${ret:=$3}
}

uci_get_by_type() {
	local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null)
	echo ${ret:=$3}
}

DEFAULT_SERVER=$(uci_get_by_type global global_server)
CURRENT_SERVER=$DEFAULT_SERVER

#жϴǷ
check_proxy() {
/usr/bin/ssr-check www.google.com  80 $switch_time 1
if [ "$?" == "0" ]; then
 return 0
else
 /usr/bin/ssr-check www.baidu.com  80 $switch_time 1
 if [ "$?" == "0" ]; then
 #gooleͨbaiduͨ
 return 1
 else
 return 2
 fi
fi
return 0
}


test_proxy() {
local servername=$(uci_get_by_name $1 server)
local serverport=$(uci_get_by_name $1 server_port)
ret=$(ping -c 3 $servername  | grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }') 
[ -z "$ret"  ] && return 1
[ "$ret" -gt "50" ] && return 1
ipset add ss_spec_wan_ac $servername 2>/dev/null
ret=$?
/usr/bin/ssr-check $servername $serverport $switch_time 
local ret2=$?
if [ "$ret" = "0" ] ;then
ipset del ss_spec_wan_ac $servername 2>/dev/null
fi
if [ "$ret2" = "0" ] ;then
return 0
else
return 1
fi
}

search_proxy() {
let server_count=server_count+1
[ "$normal_flag" = "1" -a "$server_count" -le "$server_locate" ] && return 0
[ "$(uci_get_by_name $1 switch_enable)" != "1"  ]  && return 1
[ $ENABLE_SERVER != nil ] && return 0
[ "$1" = "$CURRENT_SERVER" ] && return 0
local servername=$(uci_get_by_name $1 server)
local serverport=$(uci_get_by_name $1 server_port)
ipset add ss_spec_wan_ac $servername 2>/dev/null
ret=$?
 /usr/bin/ssr-check $servername  $serverport $switch_time 
 local ret2=$?
if [ "$ret" = "0" ] ;then
ipset del ss_spec_wan_ac $servername 2>/dev/null
fi
if [ "$ret2" = "0" ] ;then
server_locate=$server_count
ENABLE_SERVER=$1
return 0
else
return 1
fi

}
#ѡõĴ
select_proxy() {

config_load $NAME
ENABLE_SERVER=nil
mkdir -p /var/run /var/etc
server_count=0
config_foreach search_proxy servers

}

#л
switch_proxy() {
/etc/init.d/shadowsocksr restart $1
return 0
}

start() {
#֧kcptunʱл
[ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1"  ]  && return 1

while [ "1" = "1" ]  #ѭ
do 
   sleep $cycle_time
   
   LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
    
   
   #жϵǰǷΪȱʡ
   if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ] ;then
   #echo "not default proxy"
   echo "$(date "+%Y-%m-%d %H:%M:%S") Current server is not default Main server, try to switch back." >> /tmp/ssrplus.log

     #ȱʡǷ
     if test_proxy $DEFAULT_SERVER  ;then
       #echo "switch to default proxy"
       echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is avilable." >> /tmp/ssrplus.log
       #ȱʡл
       CURRENT_SERVER=$DEFAULT_SERVER
       switch_proxy $CURRENT_SERVER 
       echo "switch to default ["$(uci_get_by_name $CURRENT_SERVER server)"] proxy!"  >> /tmp/ssrplus.log
       continue
     else
       echo "$(date "+%Y-%m-%d %H:%M:%S") Main server is NOT avilable.Continue using current server." >> /tmp/ssrplus.log
     fi
    fi

   #жϵǰǷ
   check_proxy  
   current_ret=$?
  
   if [ "$current_ret" = "1" ] ;then
     #ǰж޿õķ
     #echo "current error"
     echo "$(date "+%Y-%m-%d %H:%M:%S") Current server error, try to switch another server." >> /tmp/ssrplus.log
     
     select_proxy
     if [ "$ENABLE_SERVER" != nil ] ;then
      #ãл
      #echo $(uci_get_by_name $new_proxy server)
      echo "$(date "+%Y-%m-%d %H:%M:%S") Another server is avilable, now switching server." >> /tmp/ssrplus.log
      CURRENT_SERVER=$ENABLE_SERVER
      switch_proxy $CURRENT_SERVER
      normal_flag=1
      echo "$(date "+%Y-%m-%d %H:%M:%S") ShadowsocksR server switch OK" >> /tmp/ssrplus.log
     else
     normal_flag=0 
     fi
   else
    normal_flag=0 
    echo "$(date "+%Y-%m-%d %H:%M:%S") ShadowsocksR No Problem."  >> /tmp/ssrplus.log
   fi


done
}