diff --git a/openmptcprouter/files/bin/omr-test-speed b/openmptcprouter/files/bin/omr-test-speed index e5ccadc34..11b4f6d14 100755 --- a/openmptcprouter/files/bin/omr-test-speed +++ b/openmptcprouter/files/bin/omr-test-speed @@ -1,6 +1,11 @@ #!/bin/sh -# (c) Yannick Chabanois (ycarus@zugaina.org) for OpenMPTCProuter # +# 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 test global or interface speed # FORCEVPS=false @@ -15,26 +20,174 @@ for i in $@; do :; done INTERFACE="$i" [ "$INTERFACE" = "forcevps" ] || [ "$INTERFACE" = "fasttest" ] && INTERFACE="" +IPV6=false +if [ "$(basename $0)" = "omr-test-speedv6" ]; then + IPV6=true +fi + [ -n "$INTERFACE" ] && [ ! -d "/sys/class/net/$INTERFACE" ] && { echo "You must use a real interface. You wan find them using 'ip a' for example (not $INTERFACE)" exit 0 } -[ "$FASTTEST" = true ] || echo "Select best test server..." HOSTLST="http://scaleway.testdebit.info/10G.iso http://bordeaux.testdebit.info/10G.iso http://aix-marseille.testdebit.info/10G.iso http://lyon.testdebit.info/10G.iso http://lille.testdebit.info/10G.iso http://paris.testdebit.info/10G.iso http://appliwave.testdebit.info/10G/10G.iso http://speedtest.frankfurt.linode.com/garbage.php?ckSize=10000 http://speedtest.tokyo2.linode.com/garbage.php?ckSize=10000 http://speedtest.singapore.linode.com/garbage.php?ckSize=10000 http://speedtest.newark.linode.com/garbage.php?ckSize=10000 http://speedtest.atlanta.linode.com/garbage.php?ckSize=10000 http://speedtest.dallas.linode.com/garbage.php?ckSize=10000 http://speedtest.fremont.linode.com/garbage.php?ckSize=10000 http://ipv4.bouygues.testdebit.info/10G.iso http://par.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://ams.download.datapacket.com/10000mb.bin http://fra.download.datapacket.com/10000mb.bin http://lon.download.datapacket.com/10000mb.bin http://mad.download.datapacket.com/10000mb.bin http://prg.download.datapacket.com/10000mb.bin http://sto.download.datapacket.com/10000mb.bin http://vie.download.datapacket.com/10000mb.bin http://war.download.datapacket.com/10000mb.bin http://atl.download.datapacket.com/10000mb.bin http://chi.download.datapacket.com/10000mb.bin http://lax.download.datapacket.com/10000mb.bin http://mia.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://speedtest.milkywan.fr/files/10G.iso" -bestping="9999" -for pinghost in $HOSTLST; do - domain=$(echo $pinghost | awk -F/ '{print $3}') - if [ -z "$INTERFACE" ] || [ "$FORCEVPS" = true ]; then - ping=$(ping -4 -c1 -w2 $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') +HOSTLST6="http://scaleway.testdebit.info/10G.iso http://bordeaux.testdebit.info/10G.iso http://aix-marseille.testdebit.info/10G.iso http://lyon.testdebit.info/10G.iso http://lille.testdebit.info/10G.iso http://paris.testdebit.info/10G.iso http://appliwave.testdebit.info/10G/10G.iso http://speedtest.frankfurt.linode.com/garbage.php?ckSize=10000 http://speedtest.tokyo2.linode.com/garbage.php?ckSize=10000 http://speedtest.singapore.linode.com/garbage.php?ckSize=10000 http://speedtest.newark.linode.com/garbage.php?ckSize=10000 http://speedtest.atlanta.linode.com/garbage.php?ckSize=10000 http://speedtest.dallas.linode.com/garbage.php?ckSize=10000 http://speedtest.fremont.linode.com/garbage.php?ckSize=10000 http://ipv6.bouygues.testdebit.info/10G.iso http://par.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://ams.download.datapacket.com/10000mb.bin http://fra.download.datapacket.com/10000mb.bin http://lon.download.datapacket.com/10000mb.bin http://mad.download.datapacket.com/10000mb.bin http://prg.download.datapacket.com/10000mb.bin http://sto.download.datapacket.com/10000mb.bin http://vie.download.datapacket.com/10000mb.bin http://war.download.datapacket.com/10000mb.bin http://atl.download.datapacket.com/10000mb.bin http://chi.download.datapacket.com/10000mb.bin http://lax.download.datapacket.com/10000mb.bin http://mia.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://speedtest.milkywan.fr/files/10G.iso" + +select_server() { + [ "$FASTTEST" = true ] || echo "Select best test server..." + bestping="9999" + if [ "$IPV6" = true ]; then + for pinghost in $HOSTLST6; do + domain=$(echo $pinghost | awk -F/ '{print $3}') + if [ -z "$INTERFACE" ] || [ "$FORCEVPS" = true ]; then + ping=$(ping -6 -c1 -w2 $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') + else + ping=$(ping -6 -c1 -w2 -I $INTERFACE -B $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') + fi + [ "$FASTTEST" = true ] || echo "host: $domain - ping: $ping" + if [ -n "$ping" ] && [ "$ping" -lt "$bestping" ]; then + bestping=$ping + HOST=$pinghost + fi + done else - ping=$(ping -4 -c1 -w2 -I $INTERFACE -B $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') + for pinghost in $HOSTLST; do + domain=$(echo $pinghost | awk -F/ '{print $3}') + if [ -z "$INTERFACE" ] || [ "$FORCEVPS" = true ]; then + ping=$(ping -4 -c1 -w2 $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') + else + ping=$(ping -4 -c1 -w2 -I $INTERFACE -B $domain | cut -d "/" -s -f5 | cut -d "." -f1 | tr -d '\n') + fi + [ "$FASTTEST" = true ] || echo "host: $domain - ping: $ping" + if [ -n "$ping" ] && [ "$ping" -lt "$bestping" ]; then + bestping=$ping + HOST=$pinghost + fi + done fi - [ "$FASTTEST" = true ] || echo "host: $domain - ping: $ping" - if [ -n "$ping" ] && [ "$ping" -lt "$bestping" ]; then - bestping=$ping - HOST=$pinghost +} + +get_speed_global() { + HOST=$1 + if [ "$IPV6" = true ]; then + curl -6 -o /dev/null $HOST || echo + else + curl -4 -o /dev/null $HOST || echo fi +} + +get_speed_global_fast() { + HOST=$1 + if [ "$IPV6" = true ]; then + avg_speed=$(curl -6 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' $HOST 2>/dev/null) + else + avg_speed=$(curl -4 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' $HOST 2>/dev/null) + fi + echo "$avg_speed" +} + +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 +} + +get_speed_interface() { + INTERFACE=$1 + HOST=$2 + bypass_host_enable $INTERFACE $HOST + if [ "$IPV6" = true ]; then + curl -6 -o /dev/null --interface $INTERFACE $HOST || echo + else + curl -4 -o /dev/null --interface $INTERFACE $HOST || echo + fi + bypass_host_disable $INTERFACE $HOST +} + +get_speed_interface_fast() { + INTERFACE=$1 + HOST=$2 + bypass_host_enable $INTERFACE $HOST + if [ "$IPV6" = true ]; then + avg_speed=$(curl -6 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' --interface $INTERFACE $HOST 2>/dev/null) + else + avg_speed=$(curl -4 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' --interface $INTERFACE $HOST 2>/dev/null) + fi + echo "$avg_speed" + bypass_host_disable $INTERFACE $HOST +} + +response="000" +try=0 +while [ "$response" = "000" ] && [ "$try" -le 3 ]; do + select_server + if [ "$IPV6" = true ]; then + response=$(curl -6 --write-out '%{http_code}' --silent --head --insecure -IL --connect-timeout 5 --output /dev/null $HOST) + HOSTLST6=$(echo $HOSTLST6 | tr ' ' '\n' | grep -v "$HOST" | xargs) + else + response=$(curl -4 --write-out '%{http_code}' --silent --head --insecure -IL --connect-timeout 5 --output /dev/null $HOST) + HOSTLST=$(echo $HOSTLST | tr ' ' '\n' | grep -v "$HOST" | xargs) + fi + try=$((try+1)) done [ -z "$HOST" ] && HOST="http://speedtest.milkywan.fr/files/10G.iso" @@ -43,40 +196,14 @@ done trap : HUP INT TERM if [ -z "$INTERFACE" ]; then if [ "$FASTTEST" = true ]; then - avg_speed=$(curl -4 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' $HOST 2>/dev/null) - echo "$avg_speed" + get_speed_global_fast $HOST else - curl -4 -o /dev/null $HOST || echo + get_speed_global $HOST fi else - [ -n "$(tc qdisc show dev $INTERFACE | grep ingress)" ] && /etc/init.d/sqm stop $INTERFACE - domain=$(echo $HOST | awk -F/ '{print $3}') - 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 if [ "$FASTTEST" = true ]; then - avg_speed=$(curl -4 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' --interface $INTERFACE $HOST 2>/dev/null) - echo "$avg_speed" + get_speed_interface_fast $INTERFACE $HOST else - curl -4 -o /dev/null --interface $INTERFACE $HOST || echo + get_speed_interface $INTERFACE $HOST fi - 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 - /etc/init.d/sqm start $INTERFACE fi diff --git a/openmptcprouter/files/bin/omr-test-speedv6 b/openmptcprouter/files/bin/omr-test-speedv6 deleted file mode 100755 index 792b23eca..000000000 --- a/openmptcprouter/files/bin/omr-test-speedv6 +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# (c) Yannick Chabanois (ycarus@zugaina.org) for OpenMPTCProuter -# -# - -FORCEVPS=false -FASTTEST=false -if [ "$1" = "forcevps" ]; then - FORCEVPS=true -fi -if [ "$1" = "fasttest" ]; then - FASTTEST=true -fi -for i in $@; do :; done -INTERFACE="$i" -[ "$INTERFACE" = "forcevps" ] || [ "$INTERFACE" = "fasttest" ] && INTERFACE="" - -[ -n "$INTERFACE" ] && [ ! -d "/sys/class/net/$INTERFACE" ] && { - echo "You must use a real interface. You wan find them using 'ip a' for example" - exit 0 -} - - -[ "$FASTTEST" = true ] || echo "Select best test server..." -HOSTLST="http://scaleway.testdebit.info/10G.iso http://bordeaux.testdebit.info/10G.iso http://aix-marseille.testdebit.info/10G.iso http://lyon.testdebit.info/10G.iso http://lille.testdebit.info/10G.iso http://paris.testdebit.info/10G.iso http://appliwave.testdebit.info/10G/10G.iso http://speedtest.frankfurt.linode.com/garbage.php?ckSize=10000 http://speedtest.tokyo2.linode.com/garbage.php?ckSize=10000 http://speedtest.singapore.linode.com/garbage.php?ckSize=10000 http://speedtest.newark.linode.com/garbage.php?ckSize=10000 http://speedtest.atlanta.linode.com/garbage.php?ckSize=10000 http://speedtest.dallas.linode.com/garbage.php?ckSize=10000 http://speedtest.fremont.linode.com/garbage.php?ckSize=10000 http://ipv6.bouygues.testdebit.info/10G.iso http://par.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://ams.download.datapacket.com/10000mb.bin http://fra.download.datapacket.com/10000mb.bin http://lon.download.datapacket.com/10000mb.bin http://mad.download.datapacket.com/10000mb.bin http://prg.download.datapacket.com/10000mb.bin http://sto.download.datapacket.com/10000mb.bin http://vie.download.datapacket.com/10000mb.bin http://war.download.datapacket.com/10000mb.bin http://atl.download.datapacket.com/10000mb.bin http://chi.download.datapacket.com/10000mb.bin http://lax.download.datapacket.com/10000mb.bin http://mia.download.datapacket.com/10000mb.bin http://nyc.download.datapacket.com/10000mb.bin http://speedtest.milkywan.fr/files/10G.iso" -bestping="9999" -for pinghost in $HOSTLST; do - domain=$(echo $pinghost | awk -F/ '{print $3}') - if [ -z "$INTERFACE" ] || [ "$FORCEVPS" = true ]; then - ping=$(ping -6 -c1 -w2 $domain | cut -d "/" -s -f5 | cut -d "." -f1) - else - ping=$(ping -6 -c1 -w2 -I $INTERFACE -B $domain | cut -d "/" -s -f5 | cut -d "." -f1) - fi - [ "$FASTTEST" = true ] || echo "host: $domain - ping: $ping" - if [ -n "$ping" ] && [ "$ping" -lt "$bestping" ]; then - bestping=$ping - HOST=$pinghost - fi -done - - -[ -z "$HOST" ] && HOST="http://speedtest.milkywan.fr/files/10G.iso" - -[ "$FASTTEST" = true ] || echo "Best server is $HOST, running test:" -trap : HUP INT TERM -if [ -z "$INTERFACE" ]; then - curl -6 $HOST >/dev/null || echo -else - /etc/init.d/sqm stop $INTERFACE - domain=$(echo $HOST | awk -F/ '{print $3}') - 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 - if [ "$FASTTEST" = true ]; then - avg_speed=$(curl -6 --max-time 10 -o /dev/null -qfsS -w '%{speed_download}' --interface $INTERFACE $HOST 2>/dev/null) - echo "$avg_speed" - else - curl -6 --interface $INTERFACE $HOST >/dev/null || echo - fi - 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 - /etc/init.d/sqm start $INTERFACE -fi diff --git a/openmptcprouter/files/bin/omr-test-speedv6 b/openmptcprouter/files/bin/omr-test-speedv6 new file mode 120000 index 000000000..6dc31bde2 --- /dev/null +++ b/openmptcprouter/files/bin/omr-test-speedv6 @@ -0,0 +1 @@ +omr-test-speed \ No newline at end of file