#!/bin/sh /etc/rc.common # shellcheck disable=SC2039 # vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : # shellcheck disable=SC2034 { START=90 STOP=10 USE_PROCD=1 } _validate_section() { local tmp_hosts=$hosts tmp_timeout=$timeout tmp_tries=$tries local tmp_interval=$interval tmp_options=$options tmp_type=$type tmp_enabled=$enabled uci_validate_section omr-tracker "$1" "$2" \ 'hosts:list(host)' \ 'timeout:uinteger' \ 'tries:uinteger' \ 'interval:uinteger' \ 'type:string:ping' \ 'enabled:bool:1' \ 'options:string' [ -z "$hosts" ] && hosts=$tmp_hosts [ -z "$timeout" ] && timeout=$tmp_timeout [ -z "$tries" ] && tries=$tmp_tries [ -z "$interval" ] && interval=$tmp_interval [ -z "$options" ] && options=$tmp_options [ -z "$type" ] && type=$tmp_type [ -z "$enabled" ] && enabled=$tmp_enabled } _launch_tracker() { case "$1" in loopback|lan*|if0*|tun*) return;; esac local hosts timeout tries interval options type enabled _validate_section "defaults" "defaults" _validate_section "interface" "$1" local ifname ip4table config_get ifname "$1" ifname config_get multipath "$1" multipath config_get gateway "$1" gateway [ -z "$ifname" ] || [ -z "$multipath" ] || [ "$multipath" = "off" ] && [ "$1" != "glorytun" ] && return [ $enabled = 0 ] && return procd_open_instance # shellcheck disable=SC2086 procd_set_param command /bin/omr-tracker "$1" $options 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_TABLE=$ip4table" procd_append_param env "OMR_TRACKER_DEVICE=$ifname" procd_append_param env "OMR_TRACKER_DEVICE_GATEWAY=$gateway" procd_append_param env "OMR_TRACKER_TYPE=$type" procd_set_param limits nofile="51200 51200" procd_set_param respawn 0 10 0 procd_set_param stderr 1 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 "shadowsocks" "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() { procd_add_reload_trigger omr-tracker network } reload_service() { stop start }