#!/bin/sh # # Copyright (C) 2018-2024 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # This script check speed using Speedtest servers INTERFACE="$1" bypass_host_enable() { INTERFACE=$1 HOST=$2 [ -n "$(tc qdisc show dev $INTERFACE | grep ingress)" ] && /etc/init.d/sqm stop $INTERFACE domain=$(echo $HOST | awk -F/ '{print $3}') if [ "$IPV6" = true ]; then hostip=$(dig +nocmd +noall +answer AAAA $domain | grep -v CNAME | awk '{print $5}' | tr '\n' ' ') if [ -n "$(ipset list 2>/dev/null | grep ss_rules6)" ]; then for ip in $hostip; do ipset add ss_rules6_dst_bypass_all $ip done fi if [ -n "$(nft list set inet fw4 omr_dst_bypass_all_6 2>/dev/null)" ]; then for ip in $hostip; do nft add element inet fw4 omr_dst_bypass_all_6 { $ip } >/dev/null 2>&1 done fi else hostip=$(dig +nocmd +noall +answer A $domain | grep -v CNAME | awk '{print $5}' | tr '\n' ' ') if [ -n "$(ipset list 2>/dev/null | grep ss_rules)" ]; then for ip in $hostip; do ipset add ss_rules_dst_bypass_all $ip done fi if [ -n "$(nft list set inet fw4 omr_dst_bypass_all_4 2>/dev/null)" ]; then for ip in $hostip; do nft add element inet fw4 omr_dst_bypass_all_4 { $ip } >/dev/null 2>&1 done fi fi } bypass_host_disable() { INTERFACE=$1 HOST=$2 domain=$(echo $HOST | awk -F/ '{print $3}') if [ "$IPV6" = true ]; then hostip=$(dig +nocmd +noall +answer AAAA $domain | grep -v CNAME | awk '{print $5}' | tr '\n' ' ') if [ -n "$(ipset list 2>/dev/null | grep ss_rules6)" ]; then for ip in $hostip; do ipset del ss_rules6_dst_bypass_all $ip done fi if [ -n "$(nft list set inet fw4 omr_dst_bypass_all_6 2>/dev/null)" ]; then for ip in $hostip; do nft delete element inet fw4 omr_dst_bypass_all_6 { $ip } >/dev/null 2>&1 done fi else hostip=$(dig +nocmd +noall +answer A $domain | grep -v CNAME | awk '{print $5}' | tr '\n' ' ') if [ -n "$(ipset list 2>/dev/null | grep ss_rules)" ]; then for ip in $hostip; do ipset del ss_rules_dst_bypass_all $ip done fi if [ -n "$(nft list set inet fw4 omr_dst_bypass_all_4 2>/dev/null)" ]; then for ip in $hostip; do nft delete element inet fw4 omr_dst_bypass_all_4 { $ip } >/dev/null 2>&1 done fi fi /etc/init.d/sqm start $INTERFACE } if [ -f /usr/bin/v2ray ]; then upload_file="/usr/bin/v2ray" elif [ -f /usr/bin/xray ]; then upload_file="/usr/bin/xray" elif [ -f /boot/vmlinuz ]; then upload_file="/boot/vmlinuz" elif [ -f /bin/bash ]; then upload_file="/bin/bash" else upload_file="/bin/busybox" fi echo "Download server list..." wget -q -O /tmp/speedtest.lst https://www.speedtest.net/api/js/servers bestuploadurl="" besthost="" bestpinghost="" sponsor="" bestping="999" echo "Select best server..." while read line; do host=$(echo $line | jsonfilter -e '@.host') pinghost=$(echo $host | awk -F: '{print $1}') url=$(echo $line | jsonfilter -e '@.url') ping=$(ping -c1 -w1 $pinghost | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') echo -n "." if [ -n "$ping" ] && [ "$ping" -lt "$bestping" ]; then bestping=$ping besturl=$url besthost=$host bestpinghost=$pinghost sponsor=$(echo $line | jsonfilter -q -e '@.sponsor') fi done < <(cat /tmp/speedtest.lst | jsonfilter -e '@[*]') echo echo "Done: url: $besturl - host: $besthost - ping: $bestping - sponsor: $sponsor" echo "Download test:" if [ -z "$INTERFACE" ]; then curl -4 $besthost/speedtest/random7000x7000.jpg >/dev/null || echo else bypass_host_enable $INTERFACE $bestpinghost echo "Download:" curl -4 --interface $INTERFACE $besthost/speedtest/random7000x7000.jpg >/dev/null || echo echo "Upload:" curl -4 --interface $INTERFACE -F "file=@$upload_file" $besturl >/dev/null || echo bypass_host_disable $INTERFACE $bestpinghost fi