-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbench.sh
executable file
·183 lines (172 loc) · 6.28 KB
/
bench.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/usr/bin/env bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE="\033[0;35m"
CYAN='\033[0;36m'
SUFFIX='\033[0m'
check_system() {
if [ -f /etc/redhat-release ]; then
PACKAGE_TYPE="RPM"
elif grep -qi 'alpine' /etc/issue; then
PACKAGE_TYPE="APK"
elif grep -qi 'debian\|ubuntu' /etc/issue; then
PACKAGE_TYPE="DEB"
elif grep -qi 'centos\|red hat\|redhat' /etc/issue; then
PACKAGE_TYPE="RPM"
elif grep -qi 'alpine' /proc/version; then
PACKAGE_TYPE="APK"
elif grep -qi 'debian\|ubuntu' /proc/version; then
PACKAGE_TYPE="DEB"
elif grep -qi 'centos\|red hat\|redhat' /proc/version; then
PACKAGE_TYPE="RPM"
else
echo -e "${RED}Warning: Unknown package management${SUFFIX}"
fi
}
curl_setup() {
if type curl > /dev/null 2>&1; then return; fi
echo -n "Installing curl..."
if [ $EUID -ne 0 ]; then
echo -e "\n${RED}Error: You must be root user${SUFFIX}"
exit 1
fi
if [ "${PACKAGE_TYPE}" == "RPM" ]; then
yum update > /dev/null 2>&1 && yum -y install curl > /dev/null 2>&1
elif [ "${PACKAGE_TYPE}" == "DEB" ]; then
apt update > /dev/null 2>&1 && apt -y install curl > /dev/null 2>&1
elif [ "${PACKAGE_TYPE}" == "APK" ]; then
apk update > /dev/null 2>&1 && apk add curl > /dev/null 2>&1
else
echo -e "\n${RED}Error: Unknown package management${SUFFIX}"
echo -e "Please install ${YELLOW}curl${SUFFIX} manual"
exit 1
fi
if type curl > /dev/null 2>&1; then
echo -e "${GREEN}OK${SUFFIX}"
else
echo -e "${RED}ERROR${SUFFIX}"
exit 1
fi
}
speedtest_setup() {
[[ -e './st-temp/speedtest' ]] && return
echo -n "Getting speedtest-cli..."
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54"
html=$(curl -sL "https://www.speedtest.net/apps/cli" --user-agent "${user_agent}")
version=$(echo "$html" | grep -oP 'ookla-speedtest-.*?-' | head -n 1 | cut -b 17- | rev | cut -c 2- | rev)
url="https://install.speedtest.net/app/cli/ookla-speedtest-${version}-linux-$(uname -m).tgz"
mkdir -p ./st-temp/ && cd ./st-temp || exit 1
curl "${url}" -o ./speedtest.tgz > /dev/null 2>&1
tar xf ./speedtest.tgz speedtest && rm -f ./speedtest.tgz
cd ../
if [ -e './st-temp/speedtest' ]; then
echo -e "${GREEN}OK${SUFFIX}"
else
echo -e "${RED}ERROR${SUFFIX}"
exit 1
fi
}
server_list() {
echo -n "Getting server list..."
rm -f ./st-temp/*.list
curl -sL "https://st.343.re/cn/DX.list" > ./st-temp/DX.list
curl -sL "https://st.343.re/cn/LT.list" > ./st-temp/LT.list
curl -sL "https://st.343.re/cn/YD.list" > ./st-temp/YD.list
curl -sL "https://st.343.re/cn/CN.list" > ./st-temp/CN.list
[[ ! -e './st-temp/DX.list' ]] && echo -e "${RED}ERROR${SUFFIX}" && clear_env && exit 2
[[ ! -e './st-temp/LT.list' ]] && echo -e "${RED}ERROR${SUFFIX}" && clear_env && exit 2
[[ ! -e './st-temp/YD.list' ]] && echo -e "${RED}ERROR${SUFFIX}" && clear_env && exit 2
[[ ! -e './st-temp/CN.list' ]] && echo -e "${RED}ERROR${SUFFIX}" && clear_env && exit 2
echo -e "${GREEN}OK${SUFFIX}"
}
load_servers() {
local dat
while read -r line
do
dat=(${line//,/ })
id_arr[${#id_arr[@]}+1]=${dat[0]}
addr_arr[${#addr_arr[@]}+1]=${dat[1]}
isp_arr[${#isp_arr[@]}+1]=${dat[2]}
done <<< "$(cat "$1")"
server_num=${#id_arr[@]}
}
select_isp() {
echo -e "${GREEN}1.${SUFFIX} 全部节点"
echo -e "${GREEN}2.${SUFFIX} 电信节点"
echo -e "${GREEN}3.${SUFFIX} 联通节点"
echo -e "${GREEN}4.${SUFFIX} 移动节点"
echo -e "${GREEN}0.${SUFFIX} 取消测速\c"
while :; do echo
read -rp "请选择: " selection
if [[ ! $selection =~ ^[0-4]$ ]]; then
echo -e "${RED}输入无效${SUFFIX}\c"
else
break
fi
done
[[ ${selection} == 0 ]] && clear_env && exit 1
[[ ${selection} == 1 ]] && load_servers './st-temp/CN.list'
[[ ${selection} == 2 ]] && load_servers './st-temp/DX.list'
[[ ${selection} == 3 ]] && load_servers './st-temp/LT.list'
[[ ${selection} == 4 ]] && load_servers './st-temp/YD.list'
}
speedtest() {
speed_log="./st-temp/speedtest.log"
LANG=C
echo -e "\r\c"
touch $speed_log
node_loc="$2 "
./st-temp/speedtest -p no -s "$1" --accept-license > $speed_log 2>&1
if [ "$3" == "教育网" ]; then
printf "${RED}%-6s${YELLOW}%s%s${GREEN}%-21s${SUFFIX}" "$1" "$3" "|" "${node_loc:0:21}"
else
printf "${RED}%-6s${YELLOW}%s%s${GREEN}%-24s${SUFFIX}" "$1" "$3" "|" "${node_loc:0:24}"
fi
if grep 'Upload' "$speed_log" > /dev/null 2>&1; then
latency=$(awk -F " " '/Latency/{print $2}' "$speed_log")
download=$(awk -F " " '/Download/{print $3}' "$speed_log")
upload=$(awk -F " " '/Upload/{print $3}' "$speed_log")
temp=$(echo "${download}" | awk -F ' ' '{print $1}')
if [[ $(awk -v num1="${temp}" -v num2=0 'BEGIN{print(num1>num2)?"1":"0"}') -eq 1 ]]; then
printf "${CYAN}%s%-10s${BLUE}%s%-10s${PURPLE}%-8s${SUFFIX}\n" "↑ " "${upload}" "↓ " "${download}" "${latency}"
fi
else
printf "${RED}%s${SUFFIX}\n" "ERROR"
fi
}
start_test() {
echo -e "\033[?25l\c"
echo "——————————————————————————————————————————————————————————"
curl "ip.343.re/info"
echo "——————————————————————————————————————————————————————————"
echo "ID 测速服务器信息 上传/Mbps 下载/Mbps 延迟/ms"
start=$(date +%s)
for ((i=1; i<=server_num; i++)) do
echo -e "正在测试 ${YELLOW}${isp_arr[i]}|${SUFFIX}${GREEN}${addr_arr[i]}${SUFFIX} ...\c"
speedtest "${id_arr[i]}" "${addr_arr[i]}" "${isp_arr[i]}"
done
end=$(date +%s)
echo "——————————————————————————————————————————————————————————"
time=$((end - start))
if [[ $time -gt 60 ]]; then
min=$(expr $time / 60)
sec=$(expr $time % 60)
echo -e "测试完成, 共耗时${CYAN} ${min} 分 ${sec} 秒${SUFFIX}"
else
echo -e "测试完成, 共耗时${CYAN} ${time} 秒${SUFFIX}"
fi
echo -e "\033[?25h"
}
clear_env() {
rm -rf ./st-temp
}
check_system
curl_setup
speedtest_setup
server_list
select_isp
clear
start_test
clear_env