# vim: set ft=sh noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : SETROUTE=false set_route() { local multipath_config interface_gw interface_if INTERFACE=$1 PREVINTERFACE=$2 multipath_config=$(uci -q get "network.$INTERFACE.multipath" || echo "off") interface_if=$(uci -q get "network.$INTERFACE.ifname") multipath_current_config=$(multipath $interface_if | grep deactivated) if [ "$multipath_config" != "off" ] && [ "$SETROUTE" != true ] && [ "$INTERFACE" != "$PREVINTERFACE" ] && [ "$multipath_current_config" = "" ]; then #if [ "$multipath_config" != "off" ] && [ "$SETROUTE" != true ]; then #if [ "$multipath_config" != "off" ] && [ "$INTERFACE" != "$PREVINTERFACE" ] && [ "$SETROUTE" != true ]; then interface_gw=$(uci -q get "network.$INTERFACE.gateway") if [ -z $interface_gw ]; then $interface_gw=$(ubus call network.interface.$INTERFACE status | jsonfilter -e '@.route[0].nexthop' | tr -d "\n") fi if [ -z $interface_gw ]; then $interface_gw=$(ubus call network.interface.$INTERFACE status | jsonfilter -e '@.inactive.route[0].nexthop' | tr -d "\n") fi if [ "$interface_gw" != "" ]; then _log "Replace default route by $interface_gw dev $interface_if" ip route replace default scope global nexthop via $interface_gw dev $interface_if && SETROUTE=true fi fi } set_ss_route() { local server_ip config_get server_ip $1 server if [ "$server_ip" != "" ] && [ "$OMR_TRACKER_DEVICE_GATEWAY" != "" ] && [ "$(ip route show dev $OMR_TRACKER_DEVICE | grep $server_ip | grep $OMR_TRACKER_DEVICE_GATEWAY)" = "" ]; then _log "Set server route via $OMR_TRACKER_DEVICE" ip route replace $server_ip via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE fi } del_ss_route() { local server_ip config_get server_ip $1 server if [ "$server_ip" != "" ] && [ "$OMR_TRACKER_DEVICE_GATEWAY" != "" ] && [ "$(ip route show dev $OMR_TRACKER_DEVICE | grep $server_ip | grep $OMR_TRACKER_DEVICE_GATEWAY)" != "" ]; then _log "Remove server route via $OMR_TRACKER_DEVICE" ip route delete $server_ip via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE fi } sleep `expr $RANDOM % 10` # Get the current multipath status multipath_status="off" case "$(multipath "$OMR_TRACKER_DEVICE")" in *default*) multipath_status="on" ;; *backup*) multipath_status="backup" ;; *handover*) multipath_status="handover" ;; esac default_gw=$(ip route show default | grep -v metric | awk '/default/ {print $3}') #current_interface_gw=$(uci -q get "network.$OMR_TRACKER_INTERFACE.gateway") # An interface in error will never be used in MPTCP if [ "$OMR_TRACKER_STATUS" = "ERROR" ]; then #[ "$multipath_status" = "off" ] && exit 0 #_log "$OMR_TRACKER_DEVICE switched off" multipath "$OMR_TRACKER_DEVICE" off if [ "$default_gw" = "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]; then config_load network config_foreach set_route interface $OMR_TRACKER_INTERFACE fi config_load shadowsocks-libev config_foreach del_ss_route server exit 0 fi if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ]; then if [ "$default_gw" != "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]; then _log "Tunnel up : Replace default route by $current_interface_gw dev $OMR_TRACKER_DEVICE" ip route replace default scope global nexthop via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE fi exit 0 fi multipath_config=$(uci -q get "network.$OMR_TRACKER_INTERFACE.multipath" || echo "off") if [ "$multipath_config" = "master" ]; then if [ "$default_gw" != "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]; then if [ "$(ip route show default | grep -v metric | awk '/default/ {print $5}' | grep tun)" = "" ]; then _log "Master up : Replace default route by $current_interface_gw dev $OMR_TRACKER_DEVICE" ip route replace default scope global nexthop via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE else config_load shadowsocks-libev config_foreach set_ss_route server fi fi multipath_config="on" fi [ "$multipath_config" = "master" ] && [ "$multipath_status" = "on" ] && exit 0 [ "$multipath_status" = "$multipath_config" ] && exit 0 _log "Multipath $OMR_TRACKER_DEVICE switched to $multipath_config" multipath "$OMR_TRACKER_DEVICE" "$multipath_config"