From 7a269dbc768e63c0a8b8f2a6971508c28aee5c66 Mon Sep 17 00:00:00 2001 From: fscarmen <62703343+fscarmen@users.noreply.github.com> Date: Sat, 11 Jun 2022 23:55:53 +0800 Subject: [PATCH] Create ecs.sh --- ecs.sh | 1692 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1692 insertions(+) create mode 100644 ecs.sh diff --git a/ecs.sh b/ecs.sh new file mode 100644 index 0000000..fcb8f92 --- /dev/null +++ b/ecs.sh @@ -0,0 +1,1692 @@ +#!/usr/bin/env bash + +ver="2022.06.09" +changeLog="融合怪四代目(集合百家之长)(专为测评频道小鸡而生)" + +checkroot(){ + [[ $EUID -ne 0 ]] && echo -e "${RED}请使用 root 用户运行本脚本!${PLAIN}" && exit 1 +} + +checksystem() { + if [ -f /etc/redhat-release ]; then + release="centos" + elif cat /etc/issue | grep -Eqi "debian"; then + release="debian" + elif cat /etc/issue | grep -Eqi "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -Eqi "debian"; then + release="debian" + elif cat /proc/version | grep -Eqi "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + release="centos" + fi +} + +checkpython() { + if [ ! -e '/usr/bin/python' ]; then + echo "正在安装 Python" + if [ "${release}" == "centos" ]; then + yum update > /dev/null 2>&1 + yum -y install python > /dev/null 2>&1 + else + apt-get update > /dev/null 2>&1 + apt-get -y install python > /dev/null 2>&1 + fi + + fi +} + +checkcurl() { + if [ ! -e '/usr/bin/curl' ]; then + echo "正在安装 Curl" + if [ "${release}" == "centos" ]; then + yum update > /dev/null 2>&1 + yum -y install curl > /dev/null 2>&1 + else + apt-get update > /dev/null 2>&1 + apt-get -y install curl > /dev/null 2>&1 + fi + fi +} + +checkwget() { + if [ ! -e '/usr/bin/wget' ]; then + echo "正在安装 Wget" + if [ "${release}" == "centos" ]; then + yum update > /dev/null 2>&1 + yum -y install wget > /dev/null 2>&1 + else + apt-get update > /dev/null 2>&1 + apt-get -y install wget > /dev/null 2>&1 + fi + fi +} + +checkspeedtest() { + if [ ! -e './speedtest-cli/speedtest' ]; then + echo "正在安装 Speedtest-cli" + arch=$(uname -m) + if [ "${arch}" == "i686" ]; then + arch="i386" + fi + wget --no-check-certificate -qO speedtest.tgz https://cdn.jsdelivr.net/gh/oooldking/script@1.1.7/speedtest_cli/ookla-speedtest-1.0.0-${arch}-linux.tgz > /dev/null 2>&1 + # wget --no-check-certificate -qO speedtest.tgz https://bintray.com/ookla/download/download_file?file_path=ookla-speedtest-1.0.0-${arch}-linux.tgz > /dev/null 2>&1 + fi + mkdir -p speedtest-cli && tar zxvf speedtest.tgz -C ./speedtest-cli/ > /dev/null 2>&1 && chmod a+rx ./speedtest-cli/speedtest +} + + +red(){ echo -e "\033[31m\033[01m$1\033[0m"; } +green(){ echo -e "\033[32m\033[01m$1\033[0m"; } +test_area=("广州电信" "广州联通" "广州移动") +test_ip=("58.60.188.222" "210.21.196.6" "120.196.165.2") +TEMP_FILE='ip.test' + +SystemInfo_GetOSRelease() { + if [ -f "/etc/centos-release" ]; then # CentOS + Var_OSRelease="centos" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" + if [ "$(rpm -qa | grep -o el6 | sort -u)" = "el6" ]; then + Var_CentOSELRepoVersion="6" + local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $3}')" + elif [ "$(rpm -qa | grep -o el7 | sort -u)" = "el7" ]; then + Var_CentOSELRepoVersion="7" + local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $4}')" + elif [ "$(rpm -qa | grep -o el8 | sort -u)" = "el8" ]; then + Var_CentOSELRepoVersion="8" + local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $4}')" + else + local Var_CentOSELRepoVersion="unknown" + local Var_OSReleaseVersion="" + fi + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + elif [ -f "/etc/redhat-release" ]; then # RedHat + Var_OSRelease="rhel" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" + if [ "$(rpm -qa | grep -o el6 | sort -u)" = "el6" ]; then + Var_RedHatELRepoVersion="6" + local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $3}')" + elif [ "$(rpm -qa | grep -o el7 | sort -u)" = "el7" ]; then + Var_RedHatELRepoVersion="7" + local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $4}')" + elif [ "$(rpm -qa | grep -o el8 | sort -u)" = "el8" ]; then + Var_RedHatELRepoVersion="8" + local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $4}')" + else + local Var_RedHatELRepoVersion="unknown" + local Var_OSReleaseVersion="" + fi + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + elif [ -f "/etc/fedora-release" ]; then # Fedora + Var_OSRelease="fedora" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3}')" + local Var_OSReleaseVersion="$(cat /etc/fedora-release | awk '{print $3,$4,$5,$6,$7}')" + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + elif [ -f "/etc/lsb-release" ]; then # Ubuntu + Var_OSRelease="ubuntu" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/NAME/{print $3}' | head -n1)" + local Var_OSReleaseVersion="$(cat /etc/os-release | awk -F '[= "]' '/VERSION/{print $3,$4,$5,$6,$7}' | head -n1)" + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + Var_OSReleaseVersion_Short="$(cat /etc/lsb-release | awk -F '[= "]' '/DISTRIB_RELEASE/{print $2}')" + elif [ -f "/etc/debian_version" ]; then # Debian + Var_OSRelease="debian" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" + local Var_OSReleaseVersion="$(cat /etc/debian_version | awk '{print $1}')" + local Var_OSReleaseVersionShort="$(cat /etc/debian_version | awk '{printf "%d\n",$1}')" + if [ "${Var_OSReleaseVersionShort}" = "7" ]; then + Var_OSReleaseVersion_Short="7" + Var_OSReleaseVersion_Codename="wheezy" + local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Wheezy\"" + elif [ "${Var_OSReleaseVersionShort}" = "8" ]; then + Var_OSReleaseVersion_Short="8" + Var_OSReleaseVersion_Codename="jessie" + local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Jessie\"" + elif [ "${Var_OSReleaseVersionShort}" = "9" ]; then + Var_OSReleaseVersion_Short="9" + Var_OSReleaseVersion_Codename="stretch" + local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Stretch\"" + elif [ "${Var_OSReleaseVersionShort}" = "10" ]; then + Var_OSReleaseVersion_Short="10" + Var_OSReleaseVersion_Codename="buster" + local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Buster\"" + else + Var_OSReleaseVersion_Short="sid" + Var_OSReleaseVersion_Codename="sid" + local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Sid (Testing)\"" + fi + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + elif [ -f "/etc/alpine-release" ]; then # Alpine Linux + Var_OSRelease="alpinelinux" + local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/NAME/{print $3,$4}' | head -n1)" + local Var_OSReleaseVersion="$(cat /etc/alpine-release | awk '{print $1}')" + local Var_OSReleaseArch="$(arch)" + LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" + else + Var_OSRelease="unknown" # 未知系统分支 + LBench_Result_OSReleaseFullName="[Error: Unknown Linux Branch !]" + fi +} + +function Global_UnlockTest() { + echo "" + echo "============[ Multination ]============" + MediaUnlockTest_Dazn ${1} + MediaUnlockTest_HotStar ${1} + MediaUnlockTest_DisneyPlus ${1} + MediaUnlockTest_Netflix ${1} + MediaUnlockTest_YouTube_Premium ${1} + MediaUnlockTest_PrimeVideo_Region ${1} + MediaUnlockTest_TVBAnywhere ${1} + MediaUnlockTest_iQYI_Region ${1} + MediaUnlockTest_Viu.com ${1} + MediaUnlockTest_YouTube_CDN ${1} + MediaUnlockTest_NetflixCDN ${1} + MediaUnlockTest_Spotify ${1} + GameTest_Steam ${1} + echo "=======================================" +} + + +# =============== 检查 SysBench 组件 =============== +Check_SysBench() { + if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then + SystemInfo_GetOSRelease + SystemInfo_GetSystemBit + if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ]; then + echo -e "${Msg_Warning}Sysbench Module not found, installing ..." + yum -y install epel-release + yum -y install sysbench + elif [ "${Var_OSRelease}" = "ubuntu" ]; then + echo -e "${Msg_Warning}Sysbench Module not found, installing ..." + apt-get install -y sysbench + elif [ "${Var_OSRelease}" = "debian" ]; then + echo -e "${Msg_Warning}Sysbench Module not found, installing ..." + local mirrorbase="https://raindrop.ilemonrain.com/LemonBench" + local componentname="Sysbench" + local version="1.0.19-1" + local arch="debian" + local codename="${Var_OSReleaseVersion_Codename}" + local bit="${LBench_Result_SystemBit_Full}" + local filenamebase="sysbench" + local filename="${filenamebase}_${version}_${bit}.deb" + local downurl="${mirrorbase}/include/${componentname}/${version}/${arch}/${codename}/${filename}" + mkdir -p ${WorkDir}/download/ + pushd ${WorkDir}/download/ >/dev/null + wget -U "${UA_LemonBench}" -O ${filenamebase}_${version}_${bit}.deb ${downurl} + dpkg -i ./${filename} + apt-get install -f -y + popd + if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then + echo -e "${Msg_Warning}Sysbench Module Install Failed!" + fi + elif [ "${Var_OSRelease}" = "fedora" ]; then + echo -e "${Msg_Warning}Sysbench Module not found, installing ..." + dnf -y install sysbench + elif [ "${Var_OSRelease}" = "alpinelinux" ]; then + echo -e "${Msg_Warning}Sysbench Module not found, installing ..." + echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." + Var_Skip_SysBench="1" + fi + fi + # 垂死挣扎 (尝试编译安装) + if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then + echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..." + Check_Sysbench_InstantBuild >/dev/null 2>&1 + fi + # 最终检测 + if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then + echo -e "${Msg_Error}SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)" + # exit 1 + fi +} + +Check_Sysbench_InstantBuild() { + SystemInfo_GetOSRelease + SystemInfo_GetCPUInfo + if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ]; then + echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" + echo -e "${Msg_Info}Preparing compile enviorment ..." + yum install -y epel-release + yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel + echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" + echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." + mkdir -p /tmp/_LBench/src/ + wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip + echo -e "${Msg_Info}Compiling Sysbench Module ..." + cd /tmp/_LBench/src/ + unzip sysbench.zip && cd sysbench-1.0.17 + ./autogen.sh && ./configure --without-mysql && make -j8 && make install + echo -e "${Msg_Info}Cleaning up ..." + cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 + elif [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ]; then + echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" + echo -e "${Msg_Info}Preparing compile enviorment ..." + apt-get update + apt -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip + echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." + mkdir -p /tmp/_LBench/src/ + wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip + echo -e "${Msg_Info}Compiling Sysbench Module ..." + cd /tmp/_LBench/src/ + unzip sysbench.zip && cd sysbench-1.0.17 + ./autogen.sh && ./configure --without-mysql && make -j8 && make install + echo -e "${Msg_Info}Cleaning up ..." + cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 + elif [ "${Var_OSRelease}" = "fedora" ]; then + echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" + echo -e "${Msg_Info}Preparing compile enviorment ..." + dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel + echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." + mkdir -p /tmp/_LBench/src/ + wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip + echo -e "${Msg_Info}Compiling Sysbench Module ..." + cd /tmp/_LBench/src/ + unzip sysbench.zip && cd sysbench-1.0.17 + ./autogen.sh && ./configure --without-mysql && make -j8 && make install + echo -e "${Msg_Info}Cleaning up ..." + cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 + else + echo -e "${Msg_Error}Cannot compile on current enviorment! (Only Support CentOS/Debian/Ubuntu/Fedora) " + fi +} + +Function_CheckTracemode() { + if [ "${Flag_TracerouteModeisSet}" = "1" ]; then + if [ "${GlobalVar_TracerouteMode}" = "icmp" ]; then + echo -e "${Msg_Info}Traceroute/BestTrace Tracemode is set to: ${Font_SkyBlue}ICMP Mode${Font_Suffix}" + elif [ "${GlobalVar_TracerouteMode}" = "tcp" ]; then + echo -e "${Msg_Info}Traceroute/BestTrace Tracemode is set to: ${Font_SkyBlue}TCP Mode${Font_Suffix}" + fi + else + GlobalVar_TracerouteMode="tcp" + fi +} + +# =============== 测试启动与结束动作 =============== + +#Function_BenchFinish() { +# # 清理临时文件 +# LBench_Result_BenchFinishTime="$(date +"%Y-%m-%d %H:%M:%S")" +# LBench_Result_BenchFinishTimestamp="$(date +%s)" +# LBench_Result_TimeElapsedSec="$(echo "$LBench_Result_BenchFinishTimestamp $LBench_Result_BenchStartTimestamp" | awk '{print $1-$2}')" +# echo -e " ${Msg_Info}${Font_Yellow}Bench Finish Time:${Font_Suffix} ${Font_SkyBlue}${LBench_Result_BenchFinishTime}${Font_Suffix}" +# echo -e " ${Msg_Info}${Font_Yellow}Time Elapsed:${Font_Suffix} ${Font_SkyBlue}${LBench_Result_TimeElapsedSec} seconds${Font_Suffix}" +#} + + +# =============== SysBench - CPU性能 部分 =============== +Run_SysBench_CPU() { + # 调用方式: Run_SysBench_CPU "线程数" "测试时长(s)" "测试遍数" "说明" + # 变量初始化 + mkdir -p ${WorkDir}/SysBench/CPU/ >/dev/null 2>&1 + maxtestcount="$3" + local count="1" + local TestScore="0" + local TotalScore="0" + # 运行测试 + while [ $count -le $maxtestcount ]; do + echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t$count/$maxtestcount \c" + local TestResult="$(sysbench --test=cpu --num-threads=$1 --cpu-max-prime=10000 --max-requests=1000000 --max-time=$2 run 2>&1)" + local TestScore="$(echo ${TestResult} | grep -oE "events per second: [0-9]+" | grep -oE "[0-9]+")" + local TotalScore="$(echo "${TotalScore} ${TestScore}" | awk '{printf "%d",$1+$2}')" + let count=count+1 + local TestResult="" + local TestScore="0" + done + local ResultScore="$(echo "${TotalScore} ${maxtestcount}" | awk '{printf "%d",$1/$2}')" + if [ "$1" = "1" ]; then + echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t${Font_SkyBlue}${ResultScore}${Font_Suffix} ${Font_Yellow}Scores${Font_Suffix}" + echo -e " $4:\t\t\t${ResultScore} Scores" >>${WorkDir}/SysBench/CPU/result.txt + elif [ "$1" -ge "2" ]; then + echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t${Font_SkyBlue}${ResultScore}${Font_Suffix} ${Font_Yellow}Scores${Font_Suffix}" + echo -e " $4:\t\t${ResultScore} Scores" >>${WorkDir}/SysBench/CPU/result.txt + fi +} + +Function_SysBench_CPU_Fast() { + mkdir -p ${WorkDir}/SysBench/CPU/ >/dev/null 2>&1 + echo -e " ${Font_Yellow}-> CPU 测试中 (Fast Mode, 1-Pass @ 5sec)${Font_Suffix}\n" + echo -e " -> CPU 测试中 (Fast Mode, 1-Pass @ 5sec)\n" >>${WorkDir}/SysBench/CPU/result.txt + Run_SysBench_CPU "1" "5" "1" "1 线程测试(1核)得分" + if [ "${LBench_Result_CPUThreadNumber}" -ge "2" ]; then + Run_SysBench_CPU "${LBench_Result_CPUThreadNumber}" "5" "1" "${LBench_Result_CPUThreadNumber} 线程测试(多核)得分" + elif [ "${LBench_Result_CPUProcessorNumber}" -ge "2" ]; then + Run_SysBench_CPU "${LBench_Result_CPUProcessorNumber}" "5" "1" "${LBench_Result_CPUProcessorNumber} 线程测试(多核)得分" + fi + # 完成FLAG + LBench_Flag_FinishSysBenchCPUFast="1" +} + + +# =============== SystemInfo模块 部分 =============== +SystemInfo_GetHostname() { + LBench_Result_Hostname="$(hostname)" +} + + +SystemInfo_GetCPUInfo() { + mkdir -p ${WorkDir}/data >/dev/null 2>&1 + cat /proc/cpuinfo >${WorkDir}/data/cpuinfo + local ReadCPUInfo="cat ${WorkDir}/data/cpuinfo" + LBench_Result_CPUModelName="$($ReadCPUInfo | awk -F ': ' '/model name/{print $2}' | sort -u)" + local CPUFreqCount="$($ReadCPUInfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -run | wc -l)" + if [ "${CPUFreqCount}" -ge "2" ]; then + local CPUFreqArray="$(cat /proc/cpuinfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -run)" + local CPUFreq_Min="$(echo "$CPUFreqArray" | grep -oE '[0-9]+.[0-9]{3}' | awk 'BEGIN {min = 2147483647} {if ($1+0 < min+0) min=$1} END {print min}')" + local CPUFreq_Max="$(echo "$CPUFreqArray" | grep -oE '[0-9]+.[0-9]{3}' | awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} END {print max}')" + LBench_Result_CPUFreqMinGHz="$(echo $CPUFreq_Min | awk '{printf "%.2f\n",$1/1000}')" + LBench_Result_CPUFreqMaxGHz="$(echo $CPUFreq_Max | awk '{printf "%.2f\n",$1/1000}')" + Flag_DymanicCPUFreqDetected="1" + else + LBench_Result_CPUFreqMHz="$($ReadCPUInfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -u)" + LBench_Result_CPUFreqGHz="$(echo $LBench_Result_CPUFreqMHz | awk '{printf "%.2f\n",$1/1000}')" + Flag_DymanicCPUFreqDetected="0" + fi + LBench_Result_CPUCacheSize="$($ReadCPUInfo | awk -F ': ' '/cache size/{print $2}' | sort -u)" + LBench_Result_CPUPhysicalNumber="$($ReadCPUInfo | awk -F ': ' '/physical id/{print $2}' | sort -u | wc -l)" + LBench_Result_CPUCoreNumber="$($ReadCPUInfo | awk -F ': ' '/cpu cores/{print $2}' | sort -u)" + LBench_Result_CPUThreadNumber="$($ReadCPUInfo | awk -F ': ' '/cores/{print $2}' | wc -l)" + LBench_Result_CPUProcessorNumber="$($ReadCPUInfo | awk -F ': ' '/processor/{print $2}' | wc -l)" + LBench_Result_CPUSiblingsNumber="$($ReadCPUInfo | awk -F ': ' '/siblings/{print $2}' | sort -u)" + LBench_Result_CPUTotalCoreNumber="$($ReadCPUInfo | awk -F ': ' '/physical id/&&/0/{print $2}' | wc -l)" + + # 虚拟化能力检测 + SystemInfo_GetVirtType + if [ "${Var_VirtType}" = "dedicated" ] || [ "${Var_VirtType}" = "wsl" ]; then + LBench_Result_CPUIsPhysical="1" + local VirtCheck="$(cat /proc/cpuinfo | grep -oE 'vmx|svm' | uniq)" + if [ "${VirtCheck}" != "" ]; then + LBench_Result_CPUVirtualization="1" + local VirtualizationType="$(lscpu | awk /Virtualization:/'{print $2}')" + LBench_Result_CPUVirtualizationType="${VirtualizationType}" + else + LBench_Result_CPUVirtualization="0" + fi + elif [ "${Var_VirtType}" = "kvm" ] || [ "${Var_VirtType}" = "hyperv" ] || [ "${Var_VirtType}" = "microsoft" ] || [ "${Var_VirtType}" = "vmware" ]; then + LBench_Result_CPUIsPhysical="0" + local VirtCheck="$(cat /proc/cpuinfo | grep -oE 'vmx|svm' | uniq)" + if [ "${VirtCheck}" = "vmx" ] || [ "${VirtCheck}" = "svm" ]; then + LBench_Result_CPUVirtualization="2" + local VirtualizationType="$(lscpu | awk /Virtualization:/'{print $2}')" + LBench_Result_CPUVirtualizationType="${VirtualizationType}" + else + LBench_Result_CPUVirtualization="0" + fi + else + LBench_Result_CPUIsPhysical="0" + fi +} + +SystemInfo_GetCPUStat() { + local CPUStat_Result="$(top -bn1 | grep Cpu)" + # 原始数据 + LBench_Result_CPUStat_user="$(Function_ReadCPUStat "${CPUStat_Result}" "us")" + LBench_Result_CPUStat_system="$(Function_ReadCPUStat "${CPUStat_Result}" "sy")" + LBench_Result_CPUStat_anice="$(Function_ReadCPUStat "${CPUStat_Result}" "ni")" + LBench_Result_CPUStat_idle="$(Function_ReadCPUStat "${CPUStat_Result}" "id")" + LBench_Result_CPUStat_iowait="$(Function_ReadCPUStat "${CPUStat_Result}" "wa")" + LBench_Result_CPUStat_hardint="$(Function_ReadCPUStat "${CPUStat_Result}" "hi")" + LBench_Result_CPUStat_softint="$(Function_ReadCPUStat "${CPUStat_Result}" "si")" + LBench_Result_CPUStat_steal="$(Function_ReadCPUStat "${CPUStat_Result}" "st")" + # 加工后的数据 + LBench_Result_CPUStat_UsedAll="$(echo ${LBench_Result_CPUStat_user} ${LBench_Result_CPUStat_system} ${LBench_Result_CPUStat_nice} | awk '{printf "%.1f\n",$1+$2+$3}')" +} + +Function_ReadCPUStat() { + if [ "$1" == "" ]; then + echo -n "nil" + else + local result="$(echo $1 | grep -oE "[0-9]{1,2}.[0-9]{1} $2" | awk '{print $1}')" + echo $result + fi +} + +SystemInfo_GetKernelVersion() { + local version="$(uname -r)" + LBench_Result_KernelVersion="${version}" +} + +SystemInfo_GetNetworkCCMethod() { + local val_cc="$(sysctl -n net.ipv4.tcp_congestion_control)" + local val_qdisc="$(sysctl -n net.core.default_qdisc)" + LBench_Result_NetworkCCMethod="${val_cc} + ${val_qdisc}" +} + +SystemInfo_GetSystemBit() { + local sysarch="$(uname -m)" + if [ "${sysarch}" = "unknown" ] || [ "${sysarch}" = "" ]; then + local sysarch="$(arch)" + fi + if [ "${sysarch}" = "x86_64" ]; then + # X86平台 64位 + LBench_Result_SystemBit_Short="64" + LBench_Result_SystemBit_Full="amd64" + rm -rf dp + wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_amd64 && chmod +x dp + rm -rf nf + wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf + rm -rf tubecheck + wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_amd64 && chmod +x tubecheck + elif [ "${sysarch}" = "i386" ] || [ "${sysarch}" = "i686" ]; then + # X86平台 32位 + LBench_Result_SystemBit_Short="32" + LBench_Result_SystemBit_Full="i386" + rm -rf dp + wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_386 && chmod +x dp + rm -rf nf + wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf + rm -rf tubecheck + wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_386 && chmod +x tubecheck + elif [ "${sysarch}" = "armv7l" ] || [ "${sysarch}" = "armv8" ] || [ "${sysarch}" = "armv8l" ] || [ "${sysarch}" = "aarch64" ]; then + # ARM平台 暂且将32位/64位统一对待 + LBench_Result_SystemBit_Short="arm" + LBench_Result_SystemBit_Full="arm" + rm -rf dp + wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_arm && chmod +x dp + rm -rf nf + wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.1.0/nf_linux_arm64 && chmod +x nf + rm -rf tubecheck + wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_arm && chmod +x tubecheck + else + LBench_Result_SystemBit_Short="unknown" + LBench_Result_SystemBit_Full="unknown" + rm -rf dp + wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_amd64 && chmod +x dp + rm -rf nf + wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf + rm -rf tubecheck + wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_amd64 && chmod +x tubecheck + fi +} + + + +SystemInfo_GetVirtType() { + if [ -f "/usr/bin/systemd-detect-virt" ]; then + Var_VirtType="$(/usr/bin/systemd-detect-virt)" + # 虚拟机检测 + if [ "${Var_VirtType}" = "qemu" ]; then + LBench_Result_VirtType="QEMU" + elif [ "${Var_VirtType}" = "kvm" ]; then + LBench_Result_VirtType="KVM" + elif [ "${Var_VirtType}" = "zvm" ]; then + LBench_Result_VirtType="S390 Z/VM" + elif [ "${Var_VirtType}" = "vmware" ]; then + LBench_Result_VirtType="VMware" + elif [ "${Var_VirtType}" = "microsoft" ]; then + LBench_Result_VirtType="Microsoft Hyper-V" + elif [ "${Var_VirtType}" = "xen" ]; then + LBench_Result_VirtType="Xen Hypervisor" + elif [ "${Var_VirtType}" = "bochs" ]; then + LBench_Result_VirtType="BOCHS" + elif [ "${Var_VirtType}" = "uml" ]; then + LBench_Result_VirtType="User-mode Linux" + elif [ "${Var_VirtType}" = "parallels" ]; then + LBench_Result_VirtType="Parallels" + elif [ "${Var_VirtType}" = "bhyve" ]; then + LBench_Result_VirtType="FreeBSD Hypervisor" + # 容器虚拟化检测 + elif [ "${Var_VirtType}" = "openvz" ]; then + LBench_Result_VirtType="OpenVZ" + elif [ "${Var_VirtType}" = "lxc" ]; then + LBench_Result_VirtType="LXC" + elif [ "${Var_VirtType}" = "lxc-libvirt" ]; then + LBench_Result_VirtType="LXC (libvirt)" + elif [ "${Var_VirtType}" = "systemd-nspawn" ]; then + LBench_Result_VirtType="Systemd nspawn" + elif [ "${Var_VirtType}" = "docker" ]; then + LBench_Result_VirtType="Docker" + elif [ "${Var_VirtType}" = "rkt" ]; then + LBench_Result_VirtType="RKT" + # 特殊处理 + elif [ -c "/dev/lxss" ]; then # 处理WSL虚拟化 + Var_VirtType="wsl" + LBench_Result_VirtType="Windows Subsystem for Linux (WSL)" + # 未匹配到任何结果, 或者非虚拟机 + elif [ "${Var_VirtType}" = "none" ]; then + Var_VirtType="dedicated" + LBench_Result_VirtType="None" + local Var_BIOSVendor="$(dmidecode -s bios-vendor)" + if [ "${Var_BIOSVendor}" = "SeaBIOS" ]; then + Var_VirtType="Unknown" + LBench_Result_VirtType="Unknown with SeaBIOS BIOS" + else + Var_VirtType="dedicated" + LBench_Result_VirtType="Dedicated with ${Var_BIOSVendor} BIOS" + fi + fi + elif [ ! -f "/usr/sbin/virt-what" ]; then + Var_VirtType="Unknown" + LBench_Result_VirtType="[Error: virt-what not found !]" + elif [ -f "/.dockerenv" ]; then # 处理Docker虚拟化 + Var_VirtType="docker" + LBench_Result_VirtType="Docker" + elif [ -c "/dev/lxss" ]; then # 处理WSL虚拟化 + Var_VirtType="wsl" + LBench_Result_VirtType="Windows Subsystem for Linux (WSL)" + else # 正常判断流程 + Var_VirtType="$(virt-what | xargs)" + local Var_VirtTypeCount="$(echo $Var_VirtTypeCount | wc -l)" + if [ "${Var_VirtTypeCount}" -gt "1" ]; then # 处理嵌套虚拟化 + LBench_Result_VirtType="echo ${Var_VirtType}" + Var_VirtType="$(echo ${Var_VirtType} | head -n1)" # 使用检测到的第一种虚拟化继续做判断 + elif [ "${Var_VirtTypeCount}" -eq "1" ] && [ "${Var_VirtType}" != "" ]; then # 只有一种虚拟化 + LBench_Result_VirtType="${Var_VirtType}" + else + local Var_BIOSVendor="$(dmidecode -s bios-vendor)" + if [ "${Var_BIOSVendor}" = "SeaBIOS" ]; then + Var_VirtType="Unknown" + LBench_Result_VirtType="Unknown with SeaBIOS BIOS" + else + Var_VirtType="dedicated" + LBench_Result_VirtType="Dedicated with ${Var_BIOSVendor} BIOS" + fi + fi + fi +} + +Function_GenerateResult_SysBench_MemoryTest() { + sleep 0.1 + if [ -f "${WorkDir}/SysBench/Memory/result.txt" ]; then + cp -f ${WorkDir}/SysBench/Memory/result.txt ${WorkDir}/result/05-memorytest.result + fi +} + +# 生成结果文件 +Function_GenerateResult() { + # echo -e "${Msg_Info} Please wait, collecting results ..." + mkdir -p /tmp/ >/dev/null 2>&1 + mkdir -p ${WorkDir}/result >/dev/null 2>&1 + Function_GenerateResult_SysBench_CPUTest >/dev/null + Function_GenerateResult_DiskTest >/dev/null + Function_GenerateResult_SysBench_MemoryTest >/dev/null + # echo -e "${Msg_Info} Generating Report ..." + local finalresultfile="${WorkDir}/result/finalresult.txt" + sleep 0.2 + if [ -f "${WorkDir}/result/01-systeminfo.result" ]; then + cat ${WorkDir}/result/01-systeminfo.result >>${WorkDir}/result/finalresult.txt + fi + sleep 0.2 + if [ -f "${WorkDir}/result/04-cputest.result" ]; then + cat ${WorkDir}/result/04-cputest.result >>${WorkDir}/result/finalresult.txt + fi + sleep 0.2 + if [ -f "${WorkDir}/result/05-memorytest.result" ]; then + cat ${WorkDir}/result/05-memorytest.result >>${WorkDir}/result/finalresult.txt + fi + sleep 0.2 + if [ -f "${WorkDir}/result/06-disktest.result" ]; then + cat ${WorkDir}/result/06-disktest.result >>${WorkDir}/result/finalresult.txt + fi + sleep 0.2 + # echo -e "${Msg_Info} Saving local Report ..." + cp ${WorkDir}/result/finalresult.txt $HOME/LemonBench.Result.txt + sleep 0.1 + # echo -e "${Msg_Info} Generating Report URL ..." + cat ${WorkDir}/result/finalresult.txt | PasteBin_Upload +} + + +Function_GenerateResult_SysBench_CPUTest() { + sleep 0.1 + if [ -f "${WorkDir}/SysBench/CPU/result.txt" ]; then + cp -f ${WorkDir}/SysBench/CPU/result.txt ${WorkDir}/result/04-cputest.result + fi +} + +Function_GenerateResult_DiskTest() { + sleep 0.1 + if [ -f "${WorkDir}/DiskTest/result.txt" ]; then + cp -f ${WorkDir}/DiskTest/result.txt ${WorkDir}/result/06-disktest.result + fi +} + +Global_Exit_Action() { + rm -rf ${WorkDir}/ +} + +PasteBin_Upload() { + local uploadresult="$(curl -fsL -X POST \ + --url https://paste.ubuntu.com \ + --output /dev/null \ + --write-out "%{url_effective}\n" \ + --data-urlencode "content@${PASTEBIN_CONTENT:-/dev/stdin}" \ + --data "poster=${PASTEBIN_POSTER:-LemonBench}" \ + --data "expiration=${PASTEBIN_EXPIRATION:-}" \ + --data "syntax=${PASTEBIN_SYNTAX:-text}")" + if [ "$?" = "0" ]; then + # echo -e "${Msg_Success} Report Generate Success!Please save the follwing link:" + echo -e "${Msg_Info} 上述测试报告(需登陆查看): ${uploadresult}" + else + echo -e "${Msg_Warning} Report Generate Failure, But you can still read $HOME/LemonBench.Result.txt to get this result!" + fi + echo "----------------------------------------------------------------------" +} + + +Entrance_SysBench_CPU_Fast() { + Check_SysBench >/dev/null 2>&1 + SystemInfo_GetCPUInfo + Function_SysBench_CPU_Fast +# Function_BenchFinish +} + +#speed_test(){ +# speedLog="./speedtest.log" +# true > $speedLog +# speedtest-cli/speedtest -p no -s $1 --accept-license > $speedLog 2>&1 +# is_upload=$(cat $speedLog | grep 'Upload') +# if [[ ${is_upload} ]]; then +# local REDownload=$(cat $speedLog | awk -F ' ' '/Download/{print $3}') +# local reupload=$(cat $speedLog | awk -F ' ' '/Upload/{print $3}') +# local relatency=$(cat $speedLog | awk -F ' ' '/Latency/{print $2}') +# +# local nodeID=$1 +# local nodeLocation=$2 +# local nodeISP=$3 +# +# strnodeLocation="${nodeLocation}      " +# LANG=C +# #echo $LANG +# +# temp=$(echo "${REDownload}" | awk -F ' ' '{print $1}') +# if [[ $(awk -v num1=${temp} -v num2=0 'BEGIN{print(num1>num2)?"1":"0"}') -eq 1 ]]; then +# # printf "${RED}%-6s${YELLOW}%s%s${GREEN}%-24s${CYAN}%s%-10s${BLUE}%s%-10s${PURPLE}%-8s${PLAIN}\n" "${nodeID}" "${nodeISP}" "|" "${strnodeLocation:0:24}" "↑ " "${reupload}" "↓ " "${REDownload}" "${relatency}" | tee -a $log +# printf "\033[0;33m%-18s\033[0;32m%-18s\033[0;31m%-20s\033[0;36m%-12s\033[0m\n" "${strnodeLocation:0:20}" "${reupload}"Mbps "${REDownload}"Mbps "${relatency}"ms +# fi +# else +# local cerror="ERROR" +# fi +#} + +speed_test2() { + local nodeName="$2" + [ -z "$1" ] && ./speedtest-cli/speedtest --progress=no --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 || \ + ./speedtest-cli/speedtest --progress=no --server-id=$1 --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 + if [ $? -eq 0 ]; then + local dl_speed=$(awk '/Download/{print $3" "$4}' ./speedtest-cli/speedtest.log) + local up_speed=$(awk '/Upload/{print $3" "$4}' ./speedtest-cli/speedtest.log) + local latency=$(awk '/Latency/{print $2" "$3}' ./speedtest-cli/speedtest.log) + if [[ -n "${dl_speed}" && -n "${up_speed}" && -n "${latency}" ]]; then + echo -e "${nodeName}\t ${up_speed}\t ${dl_speed}\t ${latency}" + fi + fi +} + +function MediaUnlockTest_Dazn() { + echo -n -e " Dazn:\t\t\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} -sS --max-time 10 -X POST -H "Content-Type: application/json" -d '{"LandingPageKey":"generic","Languages":"zh-CN,zh,en","Platform":"web","PlatformAttributes":{},"Manufacturer":"","PromoCode":"","Version":"2"}' "https://startup.core.indazn.com/misl/v5/Startup" 2>&1) + + if [[ "$tmpresult" == "curl"* ]]; then + echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + isAllowed=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'isAllowed' | awk '{print $2}' | cut -f1 -d',') + local result=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep '"GeolocatedCountry":' | awk '{print $2}' | cut -f2 -d'"') + + if [[ "$isAllowed" == "true" ]]; then + local CountryCode=$(echo $result | tr [:lower:] [:upper:]) + echo -n -e "\r Dazn:\t\t\t\t\t${Font_Green}Yes (Region: ${CountryCode})${Font_Suffix}\n" + return + elif [[ "$isAllowed" == "false" ]]; then + echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + else + echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Unsupport${Font_Suffix}\n" + return + fi +} + +function MediaUnlockTest_Netflix() { + echo -n -e " Netflix:\t\t\t\t->\c" + local result1=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/81215567" 2>&1) + + if [[ "$result1" == "404" ]]; then + echo -n -e "\r Netflix:\t\t\t\t${Font_Yellow}Originals Only${Font_Suffix}\n" + return + elif [[ "$result1" == "403" ]]; then + echo -n -e "\r Netflix:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + elif [[ "$result1" == "200" ]]; then + local region=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -fs --max-time 10 --write-out %{redirect_url} --output /dev/null "https://www.netflix.com/title/80018499" | cut -d '/' -f4 | cut -d '-' -f1 | tr [:lower:] [:upper:]) + if [[ ! -n "$region" ]]; then + region="US" + fi + echo -n -e "\r Netflix:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" + return + elif [[ "$result1" == "000" ]]; then + echo -n -e "\r Netflix:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi +} + +function MediaUnlockTest_HotStar() { + echo -n -e " HotStar:\t\t\t\t->\c" + local result=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} ${ssll} -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://api.hotstar.com/o/v1/page/1557?offset=0&size=20&tao=0&tas=20") + if [ "$result" = "000" ]; then + echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + elif [ "$result" = "401" ]; then + local region=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} ${ssll} -sI "https://www.hotstar.com" | grep 'geo=' | sed 's/.*geo=//' | cut -f1 -d",") + local site_region=$(curl $useNIC $xForward -${1} ${ssll} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://www.hotstar.com" | sed 's@.*com/@@' | tr [:lower:] [:upper:]) + if [ -n "$region" ] && [ "$region" = "$site_region" ]; then + echo -n -e "\r HotStar:\t\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" + return + else + echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + fi + elif [ "$result" = "475" ]; then + echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + else + echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" + fi + +} + +function MediaUnlockTest_DisneyPlus() { + echo -n -e " Disney+:\t\t\t\t->\c" + local PreAssertion=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>&1) + if [[ "$PreAssertion" == "curl"* ]] && [[ "$1" == "6" ]]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}IPv6 Not Support${Font_Suffix}\n" + return + elif [[ "$PreAssertion" == "curl"* ]]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + local assertion=$(echo $PreAssertion | python -m json.tool 2>/dev/null | grep assertion | cut -f4 -d'"') + local PreDisneyCookie=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p') + local disneycookie=$(echo $PreDisneyCookie | sed "s/DISNEYASSERTION/${assertion}/g") + local TokenContent=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycookie") + local isBanned=$(echo $TokenContent | python -m json.tool 2>/dev/null | grep 'forbidden-location') + local is403=$(echo $TokenContent | grep '403 ERROR') + + if [ -n "$isBanned" ] || [ -n "$is403" ]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + fi + + local fakecontent=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p') + local refreshToken=$(echo $TokenContent | python -m json.tool 2>/dev/null | grep 'refresh_token' | awk '{print $2}' | cut -f2 -d'"') + local disneycontent=$(echo $fakecontent | sed "s/ILOVEDISNEY/${refreshToken}/g") + local tmpresult=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycontent" 2>&1) + local previewcheck=$(curl $useNIC $xForward -${1} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview) + local isUnabailable=$(echo $previewcheck | grep 'unavailable') + local region=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'countryCode' | cut -f4 -d'"') + local inSupportedLocation=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'inSupportedLocation' | awk '{print $2}' | cut -f1 -d',') + + if [[ "$region" == "JP" ]]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: JP)${Font_Suffix}\n" + return + elif [ -n "$region" ] && [[ "$inSupportedLocation" == "false" ]] && [ -z "$isUnabailable" ]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Yellow}Available For [Disney+ $region] Soon${Font_Suffix}\n" + return + elif [ -n "$region" ] && [ -n "$isUnavailable" ]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + elif [ -n "$region" ] && [[ "$inSupportedLocation" == "true" ]]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" + return + elif [ -z "$region" ]; then + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + else + echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" + return + fi + +} + +function MediaUnlockTest_NetflixCDN() { + echo -n -e " Netflix Preferred CDN:\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=1") + if [ -z "$tmpresult" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed${Font_Suffix}\n" + return + elif [ -n "$(echo $tmpresult | grep '>403<')" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (IP Banned By Netflix)${Font_Suffix}\n" + return + fi + + local CDNAddr=$(echo $tmpresult | sed 's/.*"url":"//' | cut -f3 -d"/") + if [[ "$1" == "6" ]]; then + nslookup -q=AAAA $CDNAddr >~/v6_addr.txt + ifAAAA=$(cat ~/v6_addr.txt | grep 'AAAA address' | awk '{print $NF}') + if [ -z "$ifAAAA" ]; then + CDNIP=$(cat ~/v6_addr.txt | grep Address | sed -n '$p' | awk '{print $NF}') + else + CDNIP=${ifAAAA} + fi + else + CDNIP=$(nslookup $CDNAddr | sed '/^\s*$/d' | awk 'END {print}' | awk '{print $2}') + fi + + if [ -z "$CDNIP" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (CDN IP Not Found)${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + fi + + local CDN_ISP=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -s --max-time 20 "https://api.ip.sb/geoip/$CDNIP" | python -m json.tool 2>/dev/null | grep 'isp' | cut -f4 -d'"') + local iata=$(echo $CDNAddr | cut -f3 -d"-" | sed 's/.\{3\}$//' | tr [:lower:] [:upper:]) + local isIataFound1=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | grep $iata) + local isIataFound2=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | grep $iata) + + if [ -n "$isIataFound1" ]; then + local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") + local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') + elif [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then + local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk '{print $1}' | sed -n "/${iata}/=") + local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk "NR==${lineNo}" | cut -f2 -d"," | sed -e 's/^[[:space:]]*//' | tr [:upper:] [:lower:] | sed 's/\b[a-z]/\U&/g') + fi + + if [ -n "$location" ] && [[ "$CDN_ISP" == "Netflix Streaming Services" ]]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Green}$location ${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + elif [ -n "$location" ] && [[ "$CDN_ISP" != "Netflix Streaming Services" ]]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Yellow}Associated with [$CDN_ISP] in [$location]${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + elif [ -n "$location" ] && [ -z "$CDN_ISP" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}No ISP Info Founded${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + fi +} + +function MediaUnlockTest_YouTube_Premium() { + echo -n -e " YouTube Premium:\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} --max-time 10 -sSL -H "Accept-Language: en" -b "YSC=BiCUU3-5Gdk; CONSENT=YES+cb.20220301-11-p0.en+FX+700; GPS=1; VISITOR_INFO1_LIVE=4VwPMkB7W5A; PREF=tz=Asia.Shanghai; _gcl_au=1.1.1809531354.1646633279" "https://www.youtube.com/premium" 2>&1) + + if [[ "$tmpresult" == "curl"* ]]; then + echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + local isCN=$(echo $tmpresult | grep 'www.google.cn') + if [ -n "$isCN" ]; then + echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}No${Font_Suffix} ${Font_Green} (Region: CN)${Font_Suffix} \n" + return + fi + local isNotAvailable=$(echo $tmpresult | grep 'Premium is not available in your country') + local region=$(echo $tmpresult | grep "countryCode" | sed 's/.*"countryCode"//' | cut -f2 -d'"') + local isAvailable=$(echo $tmpresult | grep 'manageSubscriptionButton') + + if [ -n "$isNotAvailable" ]; then + echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}No${Font_Suffix} \n" + return + elif [ -n "$isAvailable" ] && [ -n "$region" ]; then + echo -n -e "\r YouTube Premium:\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" + return + elif [ -z "$region" ] && [ -n "$isAvailable" ]; then + echo -n -e "\r YouTube Premium:\t\t\t${Font_Green}Yes${Font_Suffix}\n" + return + else + echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}Failed${Font_Suffix}\n" + fi + +} + +function MediaUnlockTest_PrimeVideo_Region() { + echo -n -e " Amazon Prime Video:\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} --user-agent "${UA_Browser}" -s --max-time 10 "https://www.primevideo.com") + + if [[ "$tmpresult" = "curl"* ]]; then + echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + local result=$(echo $tmpresult | grep '"currentTerritory":' | sed 's/.*currentTerritory//' | cut -f3 -d'"' | head -n 1) + if [ -n "$result" ]; then + echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Green}Yes (Region: $result)${Font_Suffix}\n" + return + else + echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Unsupported${Font_Suffix}\n" + return + fi + +} + +function MediaUnlockTest_TVBAnywhere() { + echo -n -e " TVBAnywhere+:\t\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android") + if [ -z "$tmpresult" ]; then + echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + local result=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'allow_in_this_country' | awk '{print $2}' | cut -f1 -d",") + if [[ "$result" == "true" ]]; then + echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" + return + elif [[ "$result" == "false" ]]; then + echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + else + echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" + fi + +} + +function MediaUnlockTest_iQYI_Region() { + echo -n -e " iQyi Oversea Region:\t\t\t->\c" + curl $useNIC $xForward -${1} ${ssll} -s -I --max-time 10 "https://www.iq.com/" >~/iqiyi + + if [ $? -eq 1 ]; then + echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + result=$(cat ~/iqiyi | grep 'mod=' | awk '{print $2}' | cut -f2 -d'=' | cut -f1 -d';') + rm ~/iqiyi >/dev/null 2>&1 + + if [ -n "$result" ]; then + if [[ "$result" == "ntw" ]]; then + result=TW + echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Green}${result}${Font_Suffix}\n" + return + else + result=$(echo $result | tr [:lower:] [:upper:]) + echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Green}${result}${Font_Suffix}\n" + return + fi + else + echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed${Font_Suffix}\n" + return + fi +} + +function MediaUnlockTest_Viu.com() { + echo -n -e " Viu.com:\t\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://www.viu.com/") + if [ "$tmpresult" = "000" ]; then + echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + fi + + result=$(echo $tmpresult | cut -f5 -d"/") + if [ -n "$result" ]; then + if [[ "$result" == "no-service" ]]; then + echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}No${Font_Suffix}\n" + return + else + result=$(echo $result | tr [:lower:] [:upper:]) + echo -n -e "\r Viu.com:\t\t\t\t${Font_Green}Yes (Region: ${result})${Font_Suffix}\n" + return + fi + + else + echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" + return + fi +} + +function MediaUnlockTest_YouTube_CDN() { + echo -n -e " YouTube CDN:\t\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -sS --max-time 10 "https://redirector.googlevideo.com/report_mapping" 2>&1) + + if [[ "$tmpresult" == "curl"* ]]; then + echo -n -e "\r YouTube Region:\t\t\t${Font_Red}Check Failed (Network Connection)${Font_Suffix}\n" + return + fi + + local iata=$(echo $tmpresult | grep router | cut -f2 -d'"' | cut -f2 -d"." | sed 's/.\{2\}$//' | tr [:lower:] [:upper:]) + local checkfailed=$(echo $tmpresult | grep "=>") + if [ -z "$iata" ] && [ -n "$checkfailed" ]; then + CDN_ISP=$(echo $checkfailed | awk '{print $3}' | cut -f1 -d"-" | tr [:lower:] [:upper:]) + echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Yellow}Associated with [$CDN_ISP]${Font_Suffix}\n" + return + elif [ -n "$iata" ]; then + local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") + local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') + echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Green}$location${Font_Suffix}\n" + return + else + echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Undetectable${Font_Suffix}\n" + return + fi + +} + +function MediaUnlockTest_NetflixCDN() { + echo -n -e " Netflix Preferred CDN:\t\t\t->\c" + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=1") + if [ -z "$tmpresult" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed${Font_Suffix}\n" + return + elif [ -n "$(echo $tmpresult | grep '>403<')" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (IP Banned By Netflix)${Font_Suffix}\n" + return + fi + + local CDNAddr=$(echo $tmpresult | sed 's/.*"url":"//' | cut -f3 -d"/") + if [[ "$1" == "6" ]]; then + nslookup -q=AAAA $CDNAddr >~/v6_addr.txt + ifAAAA=$(cat ~/v6_addr.txt | grep 'AAAA address' | awk '{print $NF}') + if [ -z "$ifAAAA" ]; then + CDNIP=$(cat ~/v6_addr.txt | grep Address | sed -n '$p' | awk '{print $NF}') + else + CDNIP=${ifAAAA} + fi + else + CDNIP=$(nslookup $CDNAddr | sed '/^\s*$/d' | awk 'END {print}' | awk '{print $2}') + fi + + if [ -z "$CDNIP" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (CDN IP Not Found)${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + fi + + local CDN_ISP=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -s --max-time 20 "https://api.ip.sb/geoip/$CDNIP" | python -m json.tool 2>/dev/null | grep 'isp' | cut -f4 -d'"') + local iata=$(echo $CDNAddr | cut -f3 -d"-" | sed 's/.\{3\}$//' | tr [:lower:] [:upper:]) + local isIataFound1=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | grep $iata) + local isIataFound2=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | grep $iata) + + if [ -n "$isIataFound1" ]; then + local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") + local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') + elif [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then + local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk '{print $1}' | sed -n "/${iata}/=") + local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk "NR==${lineNo}" | cut -f2 -d"," | sed -e 's/^[[:space:]]*//' | tr [:upper:] [:lower:] | sed 's/\b[a-z]/\U&/g') + fi + + if [ -n "$location" ] && [[ "$CDN_ISP" == "Netflix Streaming Services" ]]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Green}$location ${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + elif [ -n "$location" ] && [[ "$CDN_ISP" != "Netflix Streaming Services" ]]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Yellow}Associated with [$CDN_ISP] in [$location]${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + elif [ -n "$location" ] && [ -z "$CDN_ISP" ]; then + echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}No ISP Info Founded${Font_Suffix}\n" + rm -rf ~/v6_addr.txt + return + fi +} + +function MediaUnlockTest_Spotify() { + local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://spclient.wg.spotify.com/signup/public/v1/account" -d "birth_day=11&birth_month=11&birth_year=2000&collect_personal_info=undefined&creation_flow=&creation_point=https%3A%2F%2Fwww.spotify.com%2Fhk-en%2F&displayname=Gay%20Lord&gender=male&iagree=1&key=a1e486e2729f46d6bb368d6b2bcda326&platform=www&referrer=&send-email=0&thirdpartyemail=0&identifier_token=AgE6YTvEzkReHNfJpO114514" -H "Accept-Language: en") + local region=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep '"country":' | cut -f4 -d'"') + local isLaunched=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep is_country_launched | cut -f1 -d',' | awk '{print $2}') + local StatusCode=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep status | cut -f1 -d',' | awk '{print $2}') + echo -n -e " Spotify Registration:\t\t\t->\c" + + if [ "$tmpresult" = "000" ]; then + echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + return + elif [ "$StatusCode" = "320" ]; then + echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}No${Font_Suffix}\n" + return + elif [ "$StatusCode" = "311" ] && [ "$isLaunched" = "true" ]; then + echo -n -e "\r Spotify Registration:\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" + return + fi +} + +function GameTest_Steam() { + echo -n -e " Steam Currency:\t\t\t->\c" + local result=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} -fsSL --max-time 10 "https://store.steampowered.com/app/761830" 2>&1 | grep priceCurrency | cut -d '"' -f4) + + if [ ! -n "$result" ]; then + echo -n -e "\r Steam Currency:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" + else + echo -n -e "\r Steam Currency:\t\t\t${Font_Green}${result}${Font_Suffix}\n" + fi +} + +trap _exit INT QUIT TERM + +_red() { + printf '\033[0;31;31m%b\033[0m' "$1" +} + +_green() { + printf '\033[0;31;32m%b\033[0m' "$1" +} + +_yellow() { + printf '\033[0;31;33m%b\033[0m' "$1" +} + +_blue() { + printf '\033[0;31;36m%b\033[0m' "$1" +} + +_exists() { + local cmd="$1" + if eval type type > /dev/null 2>&1; then + eval type "$cmd" > /dev/null 2>&1 + elif command > /dev/null 2>&1; then + command -v "$cmd" > /dev/null 2>&1 + else + which "$cmd" > /dev/null 2>&1 + fi + local rt=$? + return ${rt} +} + +_exit() { + _red "\n检测到退出操作,脚本终止!\n" + # clean up + rm -fr speedtest.tgz speedtest-cli benchtest_* + exit 1 +} + +get_opsy() { + [ -f /etc/redhat-release ] && awk '{print $0}' /etc/redhat-release && return + [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return + [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} + +next() { + printf "%-70s\n" "-" | sed 's/\s/-/g' +} + +speed() { + speed_test2 '' 'speedtest' + speed_test2 '21541' '洛杉矶\t' + speed_test2 '13623' '新加坡\t' + speed_test2 '44988' '日本东京' + speed_test2 '16176' '中国香港' + speed_test2 '3633' '电信上海' '电信' +# speed_test '27594' '电信广东广州5G' '电信' + speed_test2 '5396' '电信江苏苏州5G' '电信' + speed_test2 '24447' '联通上海' '联通' + speed_test2 '26678' '联通广东广州5G' '联通' +# speed_test '4870' '联通湖南长沙' '联通' +# speed_test '15863' '移动广西南宁' '移动' + speed_test2 '16398' '移动贵州贵阳' '移动' + speed_test2 '27249' '移动江苏南京5G' '移动' +#https://raw.githubusercontent.com/zq/superspeed/master/superspeed.sh +} + +# =============== 磁盘测试 部分 =============== +Run_DiskTest_DD() { + # 调用方式: Run_DiskTest_DD "测试文件名" "块大小" "写入次数" "测试项目名称" + mkdir -p ${WorkDir}/DiskTest/ >/dev/null 2>&1 + SystemInfo_GetVirtType + mkdir -p /.tmp_LBench/DiskTest >/dev/null 2>&1 + mkdir -p ${WorkDir}/data >/dev/null 2>&1 + local Var_DiskTestResultFile="${WorkDir}/data/disktest_result" + # 将先测试读, 后测试写 + echo -n -e " $4\t\t->\c" + # 清理缓存, 避免影响测试结果 + sync + if [ "${Var_VirtType}" != "docker" ] && [ "${Var_VirtType}" != "openvz" ] && [ "${Var_VirtType}" != "lxc" ] && [ "${Var_VirtType}" != "wsl" ]; then + echo 3 >/proc/sys/vm/drop_caches + fi + # 避免磁盘压力过高, 启动测试前暂停1s + sleep 1 + # 正式写测试 + dd if=/dev/zero of=/.tmp_LBench/DiskTest/$1 bs=$2 count=$3 oflag=direct 2>${Var_DiskTestResultFile} + local DiskTest_WriteSpeed_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,4} kB\/s|[0-9]{1,4}.[0-9]{1,2} kB\/s|[0-9]{1,4} KB\/s|[0-9]{1,4}.[0-9]{1,2} KB\/s|[0-9]{1,4} MB\/s|[0-9]{1,4}.[0-9]{1,2} MB\/s|[0-9]{1,4} GB\/s|[0-9]{1,4}.[0-9]{1,2} GB\/s|[0-9]{1,4} TB\/s|[0-9]{1,4}.[0-9]{1,2} TB\/s|[0-9]{1,4} kB\/秒|[0-9]{1,4}.[0-9]{1,2} kB\/秒|[0-9]{1,4} KB\/秒|[0-9]{1,4}.[0-9]{1,2} KB\/秒|[0-9]{1,4} MB\/秒|[0-9]{1,4}.[0-9]{1,2} MB\/秒|[0-9]{1,4} GB\/秒|[0-9]{1,4}.[0-9]{1,2} GB\/秒|[0-9]{1,4} TB\/秒|[0-9]{1,4}.[0-9]{1,2} TB\/秒")" + DiskTest_WriteSpeed="$(echo "${DiskTest_WriteSpeed_ResultRAW}" | sed "s/秒/s/")" + local DiskTest_WriteTime_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} 秒|[0-9]{1,}.[0-9]{1,} 秒")" + DiskTest_WriteTime="$(echo ${DiskTest_WriteTime_ResultRAW} | awk '{print $1}')" + DiskTest_WriteIOPS="$(echo ${DiskTest_WriteTime} $3 | awk '{printf "%d\n",$2/$1}')" + DiskTest_WritePastTime="$(echo ${DiskTest_WriteTime} | awk '{printf "%.2f\n",$1}')" + if [ "${DiskTest_WriteIOPS}" -ge "10000" ]; then + DiskTest_WriteIOPS="$(echo ${DiskTest_WriteIOPS} 1000 | awk '{printf "%.2f\n",$2/$1}')" + echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS}K IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t->\c" + else + echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t->\c" + fi + # 清理结果文件, 准备下一次测试 + rm -f ${Var_DiskTestResultFile} + # 清理缓存, 避免影响测试结果 + sync + if [ "${Var_VirtType}" != "docker" ] && [ "${Var_VirtType}" != "wsl" ]; then + echo 3 >/proc/sys/vm/drop_caches + fi + sleep 0.5 + # 正式读测试 + dd if=/.tmp_LBench/DiskTest/$1 of=/dev/null bs=$2 count=$3 iflag=direct 2>${Var_DiskTestResultFile} + local DiskTest_ReadSpeed_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,4} kB\/s|[0-9]{1,4}.[0-9]{1,2} kB\/s|[0-9]{1,4} KB\/s|[0-9]{1,4}.[0-9]{1,2} KB\/s|[0-9]{1,4} MB\/s|[0-9]{1,4}.[0-9]{1,2} MB\/s|[0-9]{1,4} GB\/s|[0-9]{1,4}.[0-9]{1,2} GB\/s|[0-9]{1,4} TB\/s|[0-9]{1,4}.[0-9]{1,2} TB\/s|[0-9]{1,4} kB\/秒|[0-9]{1,4}.[0-9]{1,2} kB\/秒|[0-9]{1,4} KB\/秒|[0-9]{1,4}.[0-9]{1,2} KB\/秒|[0-9]{1,4} MB\/秒|[0-9]{1,4}.[0-9]{1,2} MB\/秒|[0-9]{1,4} GB\/秒|[0-9]{1,4}.[0-9]{1,2} GB\/秒|[0-9]{1,4} TB\/秒|[0-9]{1,4}.[0-9]{1,2} TB\/秒")" + DiskTest_ReadSpeed="$(echo "${DiskTest_ReadSpeed_ResultRAW}" | sed "s/s/s/")" + local DiskTest_ReadTime_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} 秒|[0-9]{1,}.[0-9]{1,} 秒")" + DiskTest_ReadTime="$(echo ${DiskTest_ReadTime_ResultRAW} | awk '{print $1}')" + DiskTest_ReadIOPS="$(echo ${DiskTest_ReadTime} $3 | awk '{printf "%d\n",$2/$1}')" + DiskTest_ReadPastTime="$(echo ${DiskTest_ReadTime} | awk '{printf "%.2f\n",$1}')" + rm -f ${Var_DiskTestResultFile} + # 输出结果 + echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t${Font_SkyBlue}${DiskTest_ReadSpeed} (${DiskTest_ReadIOPS} IOPS, ${DiskTest_ReadPastTime}s)${Font_Suffix}\n" + echo -e " $4\t\t${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime} s)\t\t${DiskTest_ReadSpeed} (${DiskTest_ReadIOPS} IOPS, ${DiskTest_ReadPastTime} s)" >>${WorkDir}/DiskTest/result.txt + rm -rf /.tmp_LBench/DiskTest/ +} + +Function_DiskTest_Fast() { + mkdir -p ${WorkDir}/DiskTest/ >/dev/null 2>&1 + echo -e " ${Font_Yellow}-> 磁盘IO测试中 (4K Block/1M Block, Direct Mode)${Font_Suffix}\n" + echo -e " -> 磁盘IO测试中 (4K Block/1M Block, Direct Mode)\n" >>${WorkDir}/DiskTest/result.txt + SystemInfo_GetVirtType + SystemInfo_GetOSRelease + if [ "${Var_VirtType}" = "docker" ] || [ "${Var_VirtType}" = "wsl" ]; then + echo -e " ${Msg_Warning}Due to virt architecture limit, the result may affect by the cache !\n" + fi + echo -e " ${Font_Yellow}测试操作\t\t写速度\t\t\t\t\t读速度${Font_Suffix}" + echo -e " Test Name\t\tWrite Speed\t\t\t\tRead Speed" >>${WorkDir}/DiskTest/result.txt + Run_DiskTest_DD "100MB.test" "4k" "25600" "100MB-4K Block" + Run_DiskTest_DD "1GB.test" "1M" "1000" "1GB-1M Block" + # 执行完成, 标记FLAG + LBench_Flag_FinishDiskTestFast="1" + sleep 1 +} + +# =============== SysBench - 内存性能 部分 =============== +Run_SysBench_Memory() { + # 调用方式: Run_SysBench_Memory "线程数" "测试时长(s)" "测试遍数" "测试模式(读/写)" "读写方式(顺序/随机)" "说明" + # 变量初始化 + mkdir -p ${WorkDir}/SysBench/Memory/ >/dev/null 2>&1 + maxtestcount="$3" + local count="1" + local TestScore="0.00" + local TestSpeed="0.00" + local TotalScore="0.00" + local TotalSpeed="0.00" + if [ "$1" -ge "2" ]; then + MultiThread_Flag="1" + else + MultiThread_Flag="0" + fi + # 运行测试 + while [ $count -le $maxtestcount ]; do + if [ "$1" -ge "2" ] && [ "$4" = "write" ]; then + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t$count/$maxtestcount \c" + else + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t$count/$maxtestcount \c" + fi + local TestResult="$(sysbench --test=memory --num-threads=$1 --memory-block-size=1M --memory-total-size=102400G --memory-oper=$4 --max-time=$2 --memory-access-mode=$5 run 2>&1)" + # 判断是MB还是MiB + echo "${TestResult}" | grep -oE "MiB" >/dev/null 2>&1 + if [ $? -eq 0 ]; then + local MiB_Flag="1" + else + local MiB_Flag="0" + fi + local TestScore="$(echo "${TestResult}" | grep -oE "[0-9]{1,}.[0-9]{1,2} ops\/sec|[0-9]{1,}.[0-9]{1,2} per second" | grep -oE "[0-9]{1,}.[0-9]{1,2}")" + local TestSpeed="$(echo "${TestResult}" | grep -oE "[0-9]{1,}.[0-9]{1,2} MB\/sec|[0-9]{1,}.[0-9]{1,2} MiB\/sec" | grep -oE "[0-9]{1,}.[0-9]{1,2}")" + local TotalScore="$(echo "${TotalScore} ${TestScore}" | awk '{printf "%.2f",$1+$2}')" + local TotalSpeed="$(echo "${TotalSpeed} ${TestSpeed}" | awk '{printf "%.2f",$1+$2}')" + let count=count+1 + local TestResult="" + local TestScore="0.00" + local TestSpeed="0.00" + done + ResultScore="$(echo "${TotalScore} ${maxtestcount} 1000" | awk '{printf "%.2f",$1/$2/$3}')" + if [ "${MiB_Flag}" = "1" ]; then + # MiB to MB + ResultSpeed="$(echo "${TotalSpeed} ${maxtestcount} 1048576 1000000" | awk '{printf "%.2f",$1/$2/$3*$4}')" + else + # 直接输出 + ResultSpeed="$(echo "${TotalSpeed} ${maxtestcount}" | awk '{printf "%.2f",$1/$2}')" + fi + # 1线程的测试结果写入临时变量,方便与后续的多线程变量做对比 + if [ "$1" = "1" ] && [ "$4" = "read" ]; then + LBench_Result_MemoryReadSpeedSingle="${ResultSpeed}" + elif [ "$1" = "1" ] &&[ "$4" = "write" ]; then + LBench_Result_MemoryWriteSpeedSingle="${ResultSpeed}" + fi + if [ "${MultiThread_Flag}" = "1" ]; then + # 如果是多线程测试,输出与1线程测试对比的倍率 + if [ "$1" -ge "2" ] && [ "$4" = "read" ]; then + LBench_Result_MemoryReadSpeedMulti="${ResultSpeed}" + local readmultiple="$(echo "${LBench_Result_MemoryReadSpeedMulti} ${LBench_Result_MemoryReadSpeedSingle}" | awk '{printf "%.2f", $1/$2}')" + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${LBench_Result_MemoryReadSpeedMulti}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix} (${readmultiple} x)" + elif [ "$1" -ge "2" ] && [ "$4" = "write" ]; then + LBench_Result_MemoryWriteSpeedMulti="${ResultSpeed}" + local writemultiple="$(echo "${LBench_Result_MemoryWriteSpeedMulti} ${LBench_Result_MemoryWriteSpeedSingle}" | awk '{printf "%.2f", $1/$2}')" + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${LBench_Result_MemoryWriteSpeedMulti}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix} (${writemultiple} x)" + fi + else + if [ "$4" = "read" ]; then + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${ResultSpeed}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix}" + elif [ "$4" = "write" ]; then + echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${ResultSpeed}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix}" + fi + fi + # Fix + if [ "$1" -ge "2" ] && [ "$4" = "write" ]; then + echo -e " $6:\t${ResultSpeed} MB/s" >>${WorkDir}/SysBench/Memory/result.txt + else + echo -e " $6:\t\t${ResultSpeed} MB/s" >>${WorkDir}/SysBench/Memory/result.txt + fi + sleep 1 +} + +Function_SysBench_Memory_Fast() { + mkdir -p ${WorkDir}/SysBench/Memory/ >/dev/null 2>&1 + echo -e " ${Font_Yellow}-> 内存测试 Test (Fast Mode, 1-Pass @ 5sec)${Font_Suffix}\n" + echo -e " -> 内存测试 (Fast Mode, 1-Pass @ 5sec)\n" >>${WorkDir}/SysBench/Memory/result.txt + Run_SysBench_Memory "1" "5" "1" "read" "seq" "单线程读测试" + Run_SysBench_Memory "1" "5" "1" "write" "seq" "单线程写测试" + # 完成FLAG + LBench_Flag_FinishSysBenchMemoryFast="1" + sleep 1 +} + +Entrance_SysBench_Memory_Fast() { + Function_SysBench_Memory_Fast +} + +Entrance_DiskTest_Fast() { + Function_DiskTest_Fast +# Function_BenchFinish +} + +calc_disk() { + local total_size=0 + local array=$@ + for size in ${array[@]} + do + [ "${size}" == "0" ] && size_t=0 || size_t=`echo ${size:0:${#size}-1}` + [ "`echo ${size:(-1)}`" == "K" ] && size=0 + [ "`echo ${size:(-1)}`" == "M" ] && size=$( awk 'BEGIN{printf "%.1f", '$size_t' / 1024}' ) + [ "`echo ${size:(-1)}`" == "T" ] && size=$( awk 'BEGIN{printf "%.1f", '$size_t' * 1024}' ) + [ "`echo ${size:(-1)}`" == "G" ] && size=${size_t} + total_size=$( awk 'BEGIN{printf "%.1f", '$total_size' + '$size'}' ) + done + echo ${total_size} +} + +check_virt(){ + _exists "dmesg" && virtualx="$(dmesg 2>/dev/null)" + if _exists "dmidecode"; then + sys_manu="$(dmidecode -s system-manufacturer 2>/dev/null)" + sys_product="$(dmidecode -s system-product-name 2>/dev/null)" + sys_ver="$(dmidecode -s system-version 2>/dev/null)" + else + sys_manu="" + sys_product="" + sys_ver="" + fi + if grep -qa docker /proc/1/cgroup; then + virt="Docker" + elif grep -qa lxc /proc/1/cgroup; then + virt="LXC" + elif grep -qa container=lxc /proc/1/environ; then + virt="LXC" + elif [[ -f /proc/user_beancounters ]]; then + virt="OpenVZ" + elif [[ "${virtualx}" == *kvm-clock* ]]; then + virt="KVM" + elif [[ "${cname}" == *KVM* ]]; then + virt="KVM" + elif [[ "${cname}" == *QEMU* ]]; then + virt="KVM" + elif [[ "${virtualx}" == *"VMware Virtual Platform"* ]]; then + virt="VMware" + elif [[ "${virtualx}" == *"Parallels Software International"* ]]; then + virt="Parallels" + elif [[ "${virtualx}" == *VirtualBox* ]]; then + virt="VirtualBox" + elif [[ -e /proc/xen ]]; then + if grep -q "control_d" "/proc/xen/capabilities" 2>/dev/null; then + virt="Xen-Dom0" + else + virt="Xen-DomU" + fi + elif [ -f "/sys/hypervisor/type" ] && grep -q "xen" "/sys/hypervisor/type"; then + virt="Xen" + elif [[ "${sys_manu}" == *"Microsoft Corporation"* ]]; then + if [[ "${sys_product}" == *"Virtual Machine"* ]]; then + if [[ "${sys_ver}" == *"7.0"* || "${sys_ver}" == *"Hyper-V" ]]; then + virt="Hyper-V" + else + virt="Microsoft Virtual Machine" + fi + fi + else + virt="Dedicated" + fi +} + +ipv4_info() { + local org="$(wget -q -T10 -O- ipinfo.io/org)" + local city="$(wget -q -T10 -O- ipinfo.io/city)" + local country="$(wget -q -T10 -O- ipinfo.io/country)" + local region="$(wget -q -T10 -O- ipinfo.io/region)" + if [[ -n "$org" ]]; then + echo " ASN组织 : $(_blue "$org")" + fi + if [[ -n "$city" && -n "$country" ]]; then + echo " 位置 : $(_blue "$city / $country")" + fi + if [[ -n "$region" ]]; then + echo " 地区 : $(_yellow "$region")" + fi + if [[ -z "$org" ]]; then + echo " 地区 : $(_red "无法获取ISP信息")" + fi +} + +install_speedtest() { + if [ ! -e "./speedtest-cli/speedtest" ]; then + sys_bit="" + local sysarch="$(uname -m)" + if [ "${sysarch}" = "unknown" ] || [ "${sysarch}" = "" ]; then + local sysarch="$(arch)" + fi + if [ "${sysarch}" = "x86_64" ]; then + sys_bit="x86_64" + fi + if [ "${sysarch}" = "i386" ] || [ "${sysarch}" = "i686" ]; then + sys_bit="i386" + fi + if [ "${sysarch}" = "armv8" ] || [ "${sysarch}" = "armv8l" ] || [ "${sysarch}" = "aarch64" ] || [ "${sysarch}" = "arm64" ]; then + sys_bit="aarch64" + fi + if [ "${sysarch}" = "armv7" ] || [ "${sysarch}" = "armv7l" ]; then + sys_bit="armhf" + fi + if [ "${sysarch}" = "armv6" ]; then + sys_bit="armel" + fi + [ -z "${sys_bit}" ] && _red "Error: Unsupported system architecture (${sysarch}).\n" && exit 1 + url1="https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" + url2="https://dl.lamp.sh/files/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" + wget --no-check-certificate -q -T10 -O speedtest.tgz ${url1} + if [ $? -ne 0 ]; then + wget --no-check-certificate -q -T10 -O speedtest.tgz ${url2} + [ $? -ne 0 ] && _red "Error: Failed to download speedtest-cli.\n" && exit 1 + fi + mkdir -p speedtest-cli && tar zxf speedtest.tgz -C ./speedtest-cli && chmod +x ./speedtest-cli/speedtest + rm -f speedtest.tgz + fi +} + +print_intro() { + echo "--------------------- A Bench Script By spiritlhl --------------------" + echo " 测评频道: https://t.me/vps_reviews " + echo "版本:$ver" + echo "更新日志:$changeLog" + echo "-------------------感谢teddysun和misakabench的开源--------------------" +} + +# Get System information +get_system_info() { + cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) + cores=$( awk -F: '/processor/ {core++} END {print core}' /proc/cpuinfo ) + freq=$( awk -F'[ :]' '/cpu MHz/ {print $4;exit}' /proc/cpuinfo ) + ccache=$( awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) + tram=$( LANG=C; free -m | awk '/Mem/ {print $2}' ) + uram=$( LANG=C; free -m | awk '/Mem/ {print $3}' ) + swap=$( LANG=C; free -m | awk '/Swap/ {print $2}' ) + uswap=$( LANG=C; free -m | awk '/Swap/ {print $3}' ) + up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days, %d hour %d min\n",a,b,c)}' /proc/uptime ) + if _exists "w"; then + load=$( LANG=C; w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) + elif _exists "uptime"; then + load=$( LANG=C; uptime | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) + fi + opsy=$( get_opsy ) + arch=$( uname -m ) + if _exists "getconf"; then + lbit=$( getconf LONG_BIT ) + else + echo ${arch} | grep -q "64" && lbit="64" || lbit="32" + fi + kern=$( uname -r ) + disk_size1=($( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|devtmpfs|by-uuid|chroot|Filesystem|udev|docker|snapd' | awk '{print $2}' )) + disk_size2=($( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|devtmpfs|by-uuid|chroot|Filesystem|udev|docker|snapd' | awk '{print $3}' )) + disk_total_size=$( calc_disk "${disk_size1[@]}" ) + disk_used_size=$( calc_disk "${disk_size2[@]}" ) + tcpctrl=$( sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}' ) +} +# Print System information +print_system_info() { + if [ -n "$cname" ]; then + echo " CPU 型号 : $(_blue "$cname")" + else + echo " CPU 型号 : $(_blue "无法检测到CPU型号")" + fi + echo " CPU 核心数 : $(_blue "$cores")" + if [ -n "$freq" ]; then + echo " CPU 频率 : $(_blue "$freq MHz")" + fi + if [ -n "$ccache" ]; then + echo " CPU 缓存 : $(_blue "$ccache")" + fi + echo " 硬盘空间 : $(_yellow "$disk_total_size GB") $(_blue "($disk_used_size GB 已用)")" + echo " 内存 : $(_yellow "$tram MB") $(_blue "($uram MB 已用)")" + echo " Swap : $(_blue "$swap MB ($uswap MB 已用)")" + echo " 系统在线时间 : $(_blue "$up")" + echo " 负载 : $(_blue "$load")" + echo " 系统 : $(_blue "$opsy")" + echo " 架构 : $(_blue "$arch ($lbit Bit)")" + echo " 内核 : $(_blue "$kern")" + echo " TCP加速方式 : $(_yellow "$tcpctrl")" + echo " 虚拟化架构 : $(_blue "$virt")" +} + + + +#print_io_test() { +# freespace=$( df -m . | awk 'NR==2 {print $4}' ) +# if [ -z "${freespace}" ]; then +# freespace=$( df -m . | awk 'NR==3 {print $3}' ) +# fi +# if [ ${freespace} -gt 1024 ]; then +# writemb=2048 +# io1=$( io_test ${writemb} ) +# echo " 磁盘I/O (第一次) : $(_yellow "$io1")" +# io2=$( io_test ${writemb} ) +# echo " 磁盘I/O (第二次) : $(_yellow "$io2")" +# io3=$( io_test ${writemb} ) +# echo " 磁盘I/O (第三次) : $(_yellow "$io3")" +# ioraw1=$( echo $io1 | awk 'NR==1 {print $1}' ) +# [ "`echo $io1 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw1=$( awk 'BEGIN{print '$ioraw1' * 1024}' ) +# ioraw2=$( echo $io2 | awk 'NR==1 {print $1}' ) +# [ "`echo $io2 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw2=$( awk 'BEGIN{print '$ioraw2' * 1024}' ) +# ioraw3=$( echo $io3 | awk 'NR==1 {print $1}' ) +# [ "`echo $io3 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw3=$( awk 'BEGIN{print '$ioraw3' * 1024}' ) +# ioall=$( awk 'BEGIN{print '$ioraw1' + '$ioraw2' + '$ioraw3'}' ) +# ioavg=$( awk 'BEGIN{printf "%.1f", '$ioall' / 3}' ) +# echo " 磁盘I/O (平均结果) : $(_yellow "$ioavg MB/s")" +# else +# echo " $(_red "Not enough space for I/O Speed test!")" +# fi +#} + +print_end_time() { + end_time=$(date +%s) + time=$(( ${end_time} - ${start_time} )) + if [ ${time} -gt 60 ]; then + min=$(expr $time / 60) + sec=$(expr $time % 60) + echo " 总共花费 : ${min} 分 ${sec} 秒" + else + echo " 总共花费 : ${time} 秒" + fi + date_time=$(date +%Y-%m-%d" "%H:%M:%S) + echo " 时间 : $date_time" +} + + +{ + [[ ! -e return.sh ]] && curl -qO https://raw.githubusercontent.com/spiritLHLS/ecs/main/return.sh + chmod +x return.sh >/dev/null 2>&1 + + for ((a=0;a<${#test_area[@]};a++)); do + green "依次测试电信,联通,移动经过的地区及线路,核心程序来由: ipip.net ,请知悉!" >> $TEMP_FILE + green "\n${test_area[a]} ${test_ip[a]}" >> $TEMP_FILE + ./return.sh ${test_ip[a]} >> $TEMP_FILE + done +}& + +checkroot +checkwget +checksystem +checkpython +checkcurl +checkspeedtest +SystemInfo_GetSystemBit +if [ "${release}" == "centos" ]; then + yum update > /dev/null 2>&1 + yum -y install python3.7 > /dev/null 2>&1 +else + apt-get update > /dev/null 2>&1 + apt-get -y install python3.7 > /dev/null 2>&1 +fi +export PYTHONIOENCODING=utf-8 +! _exists "wget" && _red "Error: wget command not found.\n" && exit 1 +! _exists "free" && _red "Error: free command not found.\n" && exit 1 +start_time=$(date +%s) +get_system_info +check_virt +clear +print_intro +print_system_info +ipv4_info +echo "-------------------CPU测试--感谢lemonbench开源------------------------" +Entrance_SysBench_CPU_Fast +echo "-------------------内存测试--感谢lemonbench开源-----------------------" +Entrance_SysBench_Memory_Fast +echo "----------------磁盘IO读写测试--感谢lemonbench开源--------------------" +#print_io_test +Entrance_DiskTest_Fast +next +Function_GenerateResult +Global_Exit_Action >/dev/null 2>&1 +install_speedtest && echo -e "测速点位置\t 上传速度\t 下载速度\t 延迟" +speed && rm -fr speedtest-cli +echo "--------------------流媒体解锁--感谢sjlleo开源-------------------------" +./tubecheck +echo "" +./nf +echo "" +./dp +echo "解锁油管,奈菲,迪士尼以上面为准,下面这三测的不准" +echo "---------------流媒体解锁--感谢RegionRestrictionCheck开源-------------" +echo " 以下为IPV4网络测试" +Global_UnlockTest 4 +echo " 以下为IPV6网络测试" +Global_UnlockTest 6 +echo "-----------------三网回程--感谢zhanghanyun/backtrace开源--------------" +curl https://raw.githubusercontent.com/zhanghanyun/backtrace/main/install.sh -sSf | sh +echo "--------------------回程路由--感谢fscarmen开源------------------------" +cat $TEMP_FILE +next +print_end_time +next +rm -rf return.sh +rm -rf speedtest.tgz* +rm -rf wget-log* +rm -rf ipip.py* +rm -rf dp +rm -rf nf +rm -rf tubecheck +rm -rf ecs.sh +rm -rf $TEMP_FILE