|
|
|
#!/bin/env bash
|
|
|
|
#
|
|
|
|
# lework
|
|
|
|
# Os repo mirror site speed test.
|
|
|
|
|
|
|
|
|
|
|
|
######################################################################################################
|
|
|
|
# environment configuration
|
|
|
|
######################################################################################################
|
|
|
|
|
|
|
|
# Colors
|
|
|
|
RED='\033[0;31m'
|
|
|
|
GREEN='\033[0;32m'
|
|
|
|
YELLOW='\033[0;33m'
|
|
|
|
BLUE='\033[0;36m'
|
|
|
|
PLAIN='\033[0m'
|
|
|
|
|
|
|
|
declare -A mirrors
|
|
|
|
mirrors=(
|
|
|
|
[edu_sjtu]="http://ftp.sjtu.edu.cn/"
|
|
|
|
[edu_ustc]="https://mirrors.ustc.edu.cn/"
|
|
|
|
[edu_lzu]="http://mirror.lzu.edu.cn/"
|
|
|
|
[edu_bjtu]="https://mirror.bjtu.edu.cn/"
|
|
|
|
[edu_bit]="http://mirror.bit.edu.cn/"
|
|
|
|
[edu_cqu]="http://mirrors.cqu.edu.cn/"
|
|
|
|
[edu_dlut]="http://mirror.dlut.edu.cn/"
|
|
|
|
[edu_zju]="http://mirrors.zju.edu.cn/"
|
|
|
|
[edu_tsinghua]="https://mirrors.tuna.tsinghua.edu.cn/"
|
|
|
|
[sohu]="http://mirrors.sohu.com/"
|
|
|
|
[huawei]="https://mirrors.huaweicloud.com/"
|
|
|
|
[netease]="http://mirrors.cn99.com/"
|
|
|
|
[tencent]="https://mirrors.cloud.tencent.com/"
|
|
|
|
[aliyun]="https://mirrors.aliyun.com/"
|
|
|
|
)
|
|
|
|
|
|
|
|
######################################################################################################
|
|
|
|
# function
|
|
|
|
######################################################################################################
|
|
|
|
|
|
|
|
function shutdown() {
|
|
|
|
tput cnorm # reset cursor
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function error() {
|
|
|
|
ps -ef | grep "$0" | awk '{print $2}' | xargs kill -9 '{}' >/dev/null 2>&1
|
|
|
|
}
|
|
|
|
|
|
|
|
trap shutdown EXIT
|
|
|
|
trap error ERR 2 3
|
|
|
|
|
|
|
|
function spinner() {
|
|
|
|
# make sure we use non-unicode character type locale
|
|
|
|
# (that way it works for any locale as long as the font supports the characters)
|
|
|
|
local LC_CTYPE=C
|
|
|
|
speed_test "$@" &
|
|
|
|
sleep 1
|
|
|
|
|
|
|
|
local pid=$(ps -ef | grep -E '[w]get.*-4O /dev/null -T300' | awk '{print $2}') # Process Id of the previous running command
|
|
|
|
|
|
|
|
local spin='-\|/'
|
|
|
|
local charwidth=1
|
|
|
|
|
|
|
|
local i=0
|
|
|
|
tput civis # cursor invisible
|
|
|
|
while kill -0 $pid 2>/dev/null; do
|
|
|
|
local i=$(((i + $charwidth) % ${#spin}))
|
|
|
|
printf "%s" "${spin:$i:$charwidth}"
|
|
|
|
|
|
|
|
echo -en "\033[1D"
|
|
|
|
sleep .1
|
|
|
|
done
|
|
|
|
tput cnorm
|
|
|
|
wait
|
|
|
|
}
|
|
|
|
|
|
|
|
speed_test() {
|
|
|
|
local output=$(LANG=C wget ${3:+"--header="}"$3" -4O /dev/null -T300 "$1" 2>&1)
|
|
|
|
local speed=$(printf '%s' "$output" | awk '/\/dev\/null/ {speed=$3 $4} END {gsub(/\(|\)/,"",speed); print speed}')
|
|
|
|
local ipaddress=$(printf '%s' "$output" | awk -F'|' '/Connecting to .*\|([^\|]+)\|/ {print $2}'| tail -1)
|
|
|
|
local time=$(printf '%s' "$output" | awk -F= '/100% / {print $2}')
|
|
|
|
local size=$(printf '%s' "$output" | awk '/Length:/ {s=$3} END {gsub(/\(|\)/,"",s); print s}')
|
|
|
|
printf "${YELLOW}%-14s${GREEN}%-20s${BLUE}%-14s${PLAIN}%-20s${RED}%-14s${PLAIN}\n" "$2" "${ipaddress}" "${size}" "${time}" "${speed}"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
######################################################################################################
|
|
|
|
# main
|
|
|
|
######################################################################################################
|
|
|
|
|
|
|
|
if [ ! -e '/usr/bin/wget' ]; then
|
|
|
|
echo "Error: wget command not found. You must be install wget command at first."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ ! -e '/usr/bin/curl' ]; then
|
|
|
|
echo "Error: curl command not found. You must be install curl command at first."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
clear
|
|
|
|
echo -e "\n\nOs repo mirror site speed test"
|
|
|
|
|
|
|
|
os=`cat /etc/*-release | grep '^ID=' | \
|
|
|
|
sed 's/^ID=["]*\([a-zA-Z]*\).*$/\1/' | \
|
|
|
|
tr '[:upper:]' '[:lower:]'`
|
|
|
|
|
|
|
|
os=${os:-centos}
|
|
|
|
case "$os" in
|
|
|
|
centos)
|
|
|
|
file="centos/filelist.gz"
|
|
|
|
;;
|
|
|
|
debian)
|
|
|
|
file="/debian/ls-lR.gz"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
file="centos/filelist.gz"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
echo -e "\n[Mirror Site]"
|
|
|
|
for mirror in ${!mirrors[*]}; do
|
|
|
|
printf "${PLAIN}%-14s${GREEN}%-20s${PLAIN}\n" ${mirror} ": ${mirrors[$mirror]}"
|
|
|
|
done
|
|
|
|
|
|
|
|
echo -e "\n[Test]"
|
|
|
|
echo -e "Test OS : ${YELLOW}${os}${PLAIN}"
|
|
|
|
echo -e "Download File : ${YELLOW}${file}${PLAIN}"
|
|
|
|
|
|
|
|
echo
|
|
|
|
printf "%-14s%-20s%-14s%-20s%-14s\n" "Site Name" "IPv4 address" "File Size" "Download Time" "Download Speed"
|
|
|
|
for mirror in ${!mirrors[*]}; do
|
|
|
|
spinner "${mirrors[$mirror]}${file}" ${mirror}
|
|
|
|
done
|
|
|
|
echo
|