#!/bin/sh # vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : name=$0 basename="$(basename $0)" _log() { logger -p daemon.info -t "${basename}" "$@" } _ping_server() { local host=$1 ret=$(ping \ -w "$OMR_TRACKER_TIMEOUT" \ -c 1 \ -q \ "${host}" ) && echo "$ret" | grep -sq " 0% packet loss" && { server_ping=true } } _check_server() { local host=$1 local port=$2 local k=0 while [ "$server_ping" = false ] && [ "$k" -le "$retry" ]; do ret=$(curl \ --max-time "$OMR_TRACKER_TIMEOUT" \ -s \ -k \ "https://${host}:${port}/" ) [ -n "$ret" ] && server_ping=true k=$((k+1)) sleep "${intervaltries}" done } _check_server_intf() { local host=$1 local port=$2 local k=0 for intf in $(multipath | awk '/default/ {print $1}'); do while [ "$server_ping" = false ] && [ "$k" -le "$retry" ]; do ret=$(curl \ --max-time "$OMR_TRACKER_TIMEOUT" \ -s \ -k \ --interface $intf "https://${host}:${port}/" ) [ -n "$ret" ] && { server_ping=true return } k=$((k+1)) sleep "${intervaltries}" done done } _disable_current() { local serv=$1 config_set $serv current "0" } _disable_redir() { local redir=$1 config_get server $redir server if [ "$server" = "sss${count}" ]; then config_set $redir disabled "1" fi } _enable_redir() { local redir=$1 config_get server $redir server if [ "$server" = "sss${count}" ]; then config_set $redir disabled "0" fi } _check_master() { local name=$1 local count=0 local countips=0 local changes="0" config_get master $1 master config_get ip $1 ip config_get port $1 port "65500" config_get disabled $1 disabled [ "$master" = "1" ] && [ -n "$ip" ] && [ "$disabled" != "1" ] && { set_ip() { local ipd=$1 local ip="" ipresolve="$(resolveip -4 $ipd | head -n 1)" if [ -n "$ipresolve" ]; then ip="$ipresolve" else ip6resolve="$(resolveip -6 $ipd | head -n 1)" [ -n "$ip6resolve" ] && ip="$ip6resolve" fi [ -z "$ip" ] && return #_ping_server $ip #_check_server $ip $port _check_server_intf $ip $port if [ "$server_ping" = true ]; then if [ "$(uci -q get shadowsocks-libev.sss${count}.server | tr -d '\n')" != "$ip" ]; then logger -t "OMR-Tracker-Server" "Master server ${name} up ($ip), set it back" changes="1" #logger -t "OMR-Tracker-Server" "$(uci -q get shadowsocks-libev.sss${count}.server | tr -d '\n') - $ip" uci -q batch <<-EOF >/dev/null set shadowsocks-libev.sss${count}.server=$ip set shadowsocks-rust.sss${count}.server=$ip EOF if [ "$count" -eq "0" ]; then config_load openmptcprouter config_foreach _disable_current server uci -q batch <<-EOF >/dev/null set xray.omrout.s_vmess_address=$ip set xray.omrout.s_vless_address=$ip set xray.omrout.s_vless_reality_address=$ip set xray.omrout.s_trojan_address=$ip set xray.omrout.s_socks_address=$ip set xray.omrout.s_shadowsocks_address=$ip set v2ray.omrout.s_vmess_address=$ip set v2ray.omrout.s_vless_address=$ip set v2ray.omrout.s_trojan_address=$ip set v2ray.omrout.s_socks_address=$ip commit v2ray commit xray set glorytun.vpn.host=$ip commit glorytun glorytun-udp.vpn.host=$ip commit glorytun set dsvpn.vpn.host=$ip commit dsvpn set mlvpn.general.host=$ip commit mlvpn del openvpn.omr.remote add_list openvpn.omr.remote=$ip commit openvpn set openmptcprouter.${name}.current='1' commit openmptcprouter EOF /etc/init.d/openmptcprouter-vps get_openvpn_key $name >/dev/null 2>/dev/null /etc/init.d/v2ray restart >/dev/null 2>/dev/null /etc/init.d/xray restart >/dev/null 2>/dev/null /etc/init.d/glorytun restart >/dev/null 2>/dev/null /etc/init.d/glorytun-udp restart >/dev/null 2>/dev/null /etc/init.d/mlvpn restart >/dev/null 2>/dev/null /etc/init.d/openvpn restart >/dev/null 2>/dev/null /etc/init.d/dsvpn restart >/dev/null 2>/dev/null /etc/init.d/mptcpovervpn restart >/dev/null 2>/dev/null fi fi config_load shadowsocks-libev config_foreach _enable_redir ss_redir config_load shadowsocks-rust config_foreach _enable_redir ss_redir OMR_TRACKER_STATUS_MSG="Answer to ping and to API check" mail_alert="$(uci -q get omr-tracker.server.mail_alert)" #[ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" if [ "$(uci -q get omr-tracker.defaults.mail_up_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_up_message)" != "" ]; then mail_subject="$(uci -q get omr-tracker.defaults.mail_up_subject)" mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` mail_message="$(uci -q get omr-tracker.defaults.mail_up_message)" mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) else echo -e "Subject: $OMR_SYSNAME: Server ${name} (${ip}) is UP\n. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) fi } script_alert_down="$(uci -q get omr-tracker.proxy.script_alert_up)" [ -n "$script_alert_down" ] && eval $script_alert_up count=$((count+1)) else logger -t "OMR-Tracker-Server" "Master server ${name} down ($ip)" OMR_TRACKER_STATUS_MSG="No answer to ping and API check" uci -q batch <<-EOF >/dev/null set openmptcprouter.${name}.current='0' commit openmptcprouter EOF config_load shadowsocks-libev config_foreach _disable_redir ss_redir config_load shadowsocks-rust config_foreach _disable_redir ss_redir mail_alert="$(uci -q get omr-tracker.server.mail_alert)" #[ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" if [ "$(uci -q get omr-tracker.defaults.mail_down_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_down_message)" != "" ]; then mail_subject="$(uci -q get omr-tracker.defaults.mail_down_subject)" mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` mail_message="$(uci -q get omr-tracker.defaults.mail_down_message)" mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) else echo -e "Subject: $OMR_SYSNAME: Server ${name} (${ip}) is down\n. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) fi } script_alert_down="$(uci -q get omr-tracker.proxy.script_alert_down)" [ -n "$script_alert_down" ] && eval $script_alert_down fi countips=$((countips+1)) } config_load openmptcprouter config_list_foreach $1 ip set_ip #if [ "$server_ping" = true ] && [ "$countips" = "1" ]; then # uci -q batch <<-EOF >/dev/null # set shadowsocks-libev.sss${count}.server=$ip # EOF # config_foreach _enable_redir ss_redir #fi uci -q commit shadowsocks-libev uci -q commit shadowsocks-rust [ "$changes" = "1" ] && { /etc/init.d/shadowsocks-libev restart >/dev/null 2>/dev/null /etc/init.d/shadowsocks-rust restart >/dev/null 2>/dev/null } break } } _check_backup() { local name=$1 local count=0 local countips=0 local changes="0" config_get backup $1 backup config_get ip $1 ip config_get port $1 port config_get disabled $1 disabled [ "$backup" = "1" ] && [ -n "$ip" ] && [ "$disabled" != "1" ] && { set_ip() { local ip=$1 ipresolve="$(resolveip -4 $ip | head -n 1)" if [ -n "$ipresolve" ]; then ip="$ipresolve" else ip6resolve="$(resolveip -6 $ip | head -n 1)" [ -n "$ip6resolve" ] && ip="$ip6resolve" fi #_ping_server $ip #_check_server $ip $port _check_server_intf $ip $port #[ "$server_ping" = true ] && [ "$(uci -q get shadowsocks-libev.sss${count}.server | tr -d '\n')" = "$ip" ] && break if [ "$server_ping" = true ]; then if [ "$(uci -q get shadowsocks-libev.sss${count}.server | tr -d '\n')" != "$ip" ]; then logger -t "OMR-Tracker-Server" "Use backup server $1 ($ip)" changes="1" uci -q batch <<-EOF >/dev/null set shadowsocks-libev.sss${count}.server=$ip set shadowsocks-rust.sss${count}.server=$ip EOF if [ "$count" -eq "0" ]; then config_load openmptcprouter config_foreach _disable_current server uci -q batch <<-EOF >/dev/null set xray.omrout.s_vmess_address=$ip set xray.omrout.s_vless_address=$ip set xray.omrout.s_vless_reality_address=$ip set xray.omrout.s_trojan_address=$ip set xray.omrout.s_socks_address=$ip set xray.omrout.s_shadowsocks_address=$ip set v2ray.omrout.s_vmess_address=$ip set v2ray.omrout.s_vless_address=$ip set v2ray.omrout.s_trojan_address=$ip set v2ray.omrout.s_socks_address=$ip commit v2ray commit xray set glorytun.vpn.host=$ip commit glorytun glorytun-udp.vpn.host=$ip commit glorytun set dsvpn.vpn.host=$ip commit dsvpn set mlvpn.general.host=$ip commit mlvpn del openvpn.omr.remote add_list openvpn.omr.remote=$ip commit openvpn set openmptcprouter.${name}.current='1' commit openmptcprouter EOF /etc/init.d/openmptcprouter-vps get_openvpn_key $name >/dev/null 2>/dev/null /etc/init.d/v2ray restart >/dev/null 2>/dev/null /etc/init.d/xray restart >/dev/null 2>/dev/null /etc/init.d/glorytun restart >/dev/null 2>/dev/null /etc/init.d/glorytun-udp restart >/dev/null 2>/dev/null /etc/init.d/mlvpn restart >/dev/null 2>/dev/null /etc/init.d/openvpn restart >/dev/null 2>/dev/null /etc/init.d/dsvpn restart >/dev/null 2>/dev/null /etc/init.d/mptcpovervpn restart >/dev/null 2>/dev/null fi sleep $waittest fi config_load shadowsocks-libev config_foreach _enable_redir ss_redir config_load shadowsocks-rust config_foreach _enable_redir ss_redir OMR_TRACKER_STATUS_MSG="Answer to ping and to API check" mail_alert="$(uci -q get omr-tracker.server.mail_alert)" #[ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" if [ "$(uci -q get omr-tracker.defaults.mail_up_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_up_message)" != "" ]; then mail_subject="$(uci -q get omr-tracker.defaults.mail_up_subject)" mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` mail_message="$(uci -q get omr-tracker.defaults.mail_up_message)" mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) else echo -e "Subject: $OMR_SYSNAME: Server ${name} (${ip}) is UP\n. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) fi } script_alert_down="$(uci -q get omr-tracker.proxy.script_alert_up)" [ -n "$script_alert_down" ] && eval $script_alert_up count=$((count+1)) else uci -q batch <<-EOF >/dev/null set openmptcprouter.${name}.current='0' commit openmptcprouter EOF config_load shadowsocks-libev config_foreach _disable_redir ss_redir config_load shadowsocks-rust config_foreach _disable_redir ss_redir OMR_TRACKER_STATUS_MSG="No answer to ping and to API check" mail_alert="$(uci -q get omr-tracker.server.mail_alert)" #[ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" if [ "$(uci -q get omr-tracker.defaults.mail_down_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_down_message)" != "" ]; then mail_subject="$(uci -q get omr-tracker.defaults.mail_down_subject)" mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` mail_message="$(uci -q get omr-tracker.defaults.mail_down_message)" mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/Server ${name}/g" -e "s/%DEVICE%/${ip}/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) else echo -e "Subject: $OMR_SYSNAME: Server ${name} (${ip}) is down\n. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) fi } script_alert_down="$(uci -q get omr-tracker.proxy.script_alert_down)" [ -n "$script_alert_down" ] && eval $script_alert_down fi countips=$((countips+1)) } config_load openmptcprouter config_list_foreach $1 ip set_ip #if [ "$server_ping" = true ] && [ "$countips" = "1" ]; then # uci -q batch <<-EOF >/dev/null # set shadowsocks-libev.sss${count}.server=$ip # EOF # config_foreach _enable_redir ss_redir #fi uci -q commit shadowsocks-libev uci -q commit shadowsocks-rust [ "$changes" = "1" ] && { /etc/init.d/shadowsocks-libev restart >/dev/null 2>/dev/null /etc/init.d/shadowsocks-rust restart >/dev/null 2>/dev/null } [ "$server_ping" = true ] && break } } . /lib/functions.sh timeout=${OMR_TRACKER_TIMEOUT:-5} interval=${OMR_TRACKER_INTERVAL:-10} intervaltries=${OMR_TRACKER_INTERVAL_TRIES:-2} retry=${OMR_TRACKER_TRIES:-4} waittest=${OMR_TRACKER_WAIT_TEST:-0} while true; do server_ping=false config_load openmptcprouter config_foreach _check_master server [ "$server_ping" = false ] && { config_load openmptcprouter config_foreach _check_backup server } sleep "${interval}" done