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