diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua index fa6235479..e4a2fdc72 100644 --- a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua +++ b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua @@ -185,6 +185,8 @@ function interfaces_status() mArray.openmptcprouter["service_addr"] = uci:get("shadowsocks", "proxy", "server") or "0.0.0.0" mArray.openmptcprouter["local_addr"] = uci:get("network", "lan", "ipaddr") + -- shadowsocksaddr + mArray.openmptcprouter["ss_addr"] = sys.exec("curl -s -4 --socks5 127.0.0.1:1111 -m 2 http://ip.openmptcprouter.com") -- wanaddr mArray.openmptcprouter["wan_addr"] = sys.exec("wget -4 -qO- -T 1 http://ip.openmptcprouter.com") diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm index 451f02687..c078fdfe9 100644 --- a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm +++ b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm @@ -103,15 +103,18 @@ if (mArray.openmptcprouter.socks_service == false) { - statusMessage += 'Socks service is not running
'; + statusMessage += 'ShadowSocks is not running
'; } if (mArray.openmptcprouter.tun_service == false) { - statusMessage += 'TUN service is not running
'; + statusMessage += 'GloryTUN is not running
'; } if (mArray.openmptcprouter.wan_addr == "") { - statusMessage += 'No VPS IP address'; + statusMessage += 'No VPS IP address, No WAN IP address'; + } else if (mArray.openmptcprouter.ss_addr == "") + { + statusMessage += 'ShadowSocks not working'; } if(statusMessage !== "") diff --git a/omr-tracker/files/bin/omr-tracker-ss b/omr-tracker/files/bin/omr-tracker-ss new file mode 100755 index 000000000..9895c5c87 --- /dev/null +++ b/omr-tracker/files/bin/omr-tracker-ss @@ -0,0 +1,31 @@ +#!/bin/sh +# vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : + +name=$0 +basename="$(basename $0)" + +log() { + logger -p daemon.info -t "${basename}" "$@" +} + +timeout=$OMR_TRACKER_TIMEOUT +interval=$OMR_TRACKER_INTERVAL +retry=$OMR_TRACKER_TRIES +proxy=$OMR_TRACKER_PROXY + +last=0 + +while true; do + host=${OMR_TRACKER_HOSTS%% *} + if curl -s --socks5 "${proxy}" --max-time "${timeout}" --retry "${retry}" "$host" &>/dev/null ; then + [ ${last} = 0 ] && log "Shadowsocks is up" + /etc/init.d/shadowsocks-libev rules_up 2> /dev/null + last=1 + else + [ ${last} = 1 ] && log "Shadowsocks is down" + /etc/init.d/shadowsocks-libev rules_down 2> /dev/null + last=0 + fi + + sleep "${interval}" +done diff --git a/omr-tracker/files/etc/config/omr-tracker b/omr-tracker/files/etc/config/omr-tracker index 0f19b5b76..06102c2de 100644 --- a/omr-tracker/files/etc/config/omr-tracker +++ b/omr-tracker/files/etc/config/omr-tracker @@ -10,6 +10,14 @@ config defaults 'defaults' list hosts '80.67.169.40' option timeout '1' option tries '4' - option interval '2' + option interval '4' option type 'ping' option options '' + +config defaults 'shadowsocks' + option enabled '1' + list hosts 'google.com' + list hosts 'bing.com' + option timeout '1' + option tries '2' + option interval '10' \ No newline at end of file diff --git a/omr-tracker/files/etc/init.d/omr-tracker b/omr-tracker/files/etc/init.d/omr-tracker index 492c0a81a..f98a01a45 100755 --- a/omr-tracker/files/etc/init.d/omr-tracker +++ b/omr-tracker/files/etc/init.d/omr-tracker @@ -18,7 +18,7 @@ _validate_section() { 'timeout:uinteger' \ 'tries:uinteger' \ 'interval:uinteger' \ - 'type:string' \ + 'type:string:ping' \ 'enabled:bool:1' \ 'options:string' @@ -36,10 +36,7 @@ _launch_tracker() { loopback|lan*|if0*|tun*) return;; esac - local interface_type - config_get interface_type "$1" type - - local hosts timeout tries interval options type + local hosts timeout tries interval options type enabled _validate_section "defaults" "defaults" _validate_section "interface" "$1" @@ -50,7 +47,6 @@ _launch_tracker() { [ -z "$ifname" ] || [ -z "$multipath" ] || [ "$multipath" = "off" ] && [ "$1" != "glorytun" ] && return [ $enabled = 0 ] && return - [ -z "$type" ] && type="ping" procd_open_instance # shellcheck disable=SC2086 @@ -69,9 +65,70 @@ _launch_tracker() { procd_close_instance } +_initialize_shadowsocks_tracker() { + local redir_tcp server tracker_server + config_get redir_tcp ss_rules redir_tcp + config_get server $redir_tcp server + config_get tracker_server "tracker" server + [ "$server" = "$tracker_server" ] || { + [ -z "$tracker_server" ] && { + uci -q batch <<-EOF >/dev/null + set shadowsocks-libev.tracker=ss_local + set shadowsocks-libev.tracker.server=$server + set shadowsocks-libev.tracker.local_address="127.0.0.1" + set shadowsocks-libev.tracker.local_port=1111 + set shadowsocks-libev.tracker.mode=tcp_and_udp + set shadowsocks-libev.tracker.timeout=60 + set shadowsocks-libev.tracker.fast_open=1 + set shadowsocks-libev.tracker.reuse_port=1 + set shadowsocks-libev.tracker.mptcp=1 + set shadowsocks-libev.tracker.verbose=0 + commit shadowsocks-libev + EOF + } || { + uci -q set shadowsocks-libev.tracker.server=$server + } + /etc/init.d/shadowsocks-libev restart + } +} + +_launch_shadowsocks_tracker() { + local hosts timeout tries interval local_port enabled + + [ "$1" = "tracker" ] || return + + _validate_section "defaults" "shadowsocks" + + config_get local_port "$1" local_port + local disabled + config_get disabled "$1" disabled 0 + + [ $enabled = 0 ] && return + [ $disabled = 1 ] && return + + procd_open_instance + # shellcheck disable=SC2086 + procd_set_param command /bin/omr-tracker-ss "$1" + procd_append_param env "OMR_TRACKER_HOSTS=$hosts" + procd_append_param env "OMR_TRACKER_TIMEOUT=$timeout" + procd_append_param env "OMR_TRACKER_TRIES=$tries" + procd_append_param env "OMR_TRACKER_INTERVAL=$interval" + procd_append_param env "OMR_TRACKER_PROXY=127.0.0.1:$local_port" + procd_set_param limits nofile="51200 51200" + procd_set_param respawn 0 10 0 + procd_set_param stderr 1 + procd_close_instance +} + start_service() { + config_load shadowsocks-libev + _initialize_shadowsocks_tracker + config_load network config_foreach _launch_tracker interface + + config_load shadowsocks-libev + config_foreach _launch_shadowsocks_tracker ss_local } service_triggers() { diff --git a/shadowsocks-libev/files/shadowsocks-libev.init b/shadowsocks-libev/files/shadowsocks-libev.init index 318b982f5..adec4d584 100644 --- a/shadowsocks-libev/files/shadowsocks-libev.init +++ b/shadowsocks-libev/files/shadowsocks-libev.init @@ -1,12 +1,14 @@ #!/bin/sh /etc/rc.common # # Copyright (C) 2017 Yousong Zhou +# Copyright (C) 2018 Ycarus (Yannick Chabanois) # # This is free software, licensed under the GNU General Public License v3. # See /LICENSE for more information. # USE_PROCD=1 +EXTRA_COMMANDS="rules_up rules_down" START=99 ss_confdir=/var/etc/shadowsocks-libev @@ -169,9 +171,17 @@ ss_xxx() { fi } +ss_rules_restart() { + local cfg="$1" + local cfgtype="$2" + + eval "$("validate_${cfgtype}_section" "$cfg" ss_validate_mklocal)" + "validate_${cfgtype}_section" "$cfg" || return 1 + ss_rules_cb +} + ss_rules_cb() { local cfgserver server - if [ "$cfgtype" = ss_redir ]; then config_get cfgserver "$cfg" server config_get server "$cfgserver" server @@ -194,7 +204,6 @@ ss_rules() { local local_port_tcp local_port_udp local args local ss_redir_servers4 dst_ips_bypass4 dst_ips_forward4 src_ips_bypass4 src_ips_forward4 src_ips_checkdst4 - [ -x "$bin" ] || return 1 config_get cfgtype "$cfg" TYPE [ "$cfgtype" = ss_rules ] || return 1 @@ -307,6 +316,30 @@ stop_service() { rm -rf "$ss_confdir" } +_rules_status() { + [ -n "$(iptables -t nat -L | grep ss_rules_forward)" ] && return 1 + return 0 +} + +rules_up() { + _rules_status || return 0 + config_load shadowsocks-libev + for cfgtype in ss_redir; do + config_foreach ss_rules_restart "$cfgtype" "$cfgtype" + done + ss_rules + ss_rules6 +} + +rules_down() { + _rules_status && return 0 + local bin="$ss_bindir/ss-rules" + [ -x "$bin" ] && "$bin" -f + local bin6="$ss_bindir/ss-rules6" + [ -x "$bin6" ] && "$bin6" -f +} + + service_triggers() { procd_add_reload_interface_trigger wan* procd_add_reload_trigger shadowsocks-libev