193 lines
5.9 KiB
Bash
193 lines
5.9 KiB
Bash
#!/bin/bash
|
||
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
|
||
export LC_ALL=C
|
||
|
||
export HR="+----------------------------------------------------"
|
||
export ARCH=$(uname -m)
|
||
|
||
# alinux Alibaba Cloud Linux
|
||
# hce Huawei Cloud EulerOS
|
||
# openEuler openEuler
|
||
export OS=$(source /etc/os-release && {
|
||
if [[ "$ID" == "ubuntu" ]]; then
|
||
echo "ubuntu"
|
||
elif [[ "$ID" == "debian" ]]; then
|
||
echo "debian"
|
||
elif [[ "$ID" == "rhel" ]] || [[ "$ID" == "almalinux" ]] || [[ "$ID" == "rocky" ]] || [[ "$ID" == "alinux" ]] || [[ "$ID" == "tencentos" ]] || [[ "$ID" == "opencloudos" ]]; then
|
||
echo "rhel"
|
||
elif [[ "$ID_LIKE" =~ "ubuntu" ]]; then
|
||
echo "ubuntu"
|
||
elif [[ "$ID_LIKE" =~ "debian" ]]; then
|
||
echo "debian"
|
||
elif [[ "$ID_LIKE" =~ "rhel" ]]; then
|
||
echo "rhel"
|
||
else
|
||
echo "unknown"
|
||
fi
|
||
})
|
||
export VERSION=$(source /etc/os-release && {
|
||
if [[ -n "$VERSION_ID" ]]; then
|
||
echo "$VERSION_ID" | cut -d'.' -f1
|
||
elif [[ -n "$VERSION" ]]; then
|
||
echo "$VERSION" | grep -oE '[0-9]+(\.[0-9]+)*' | head -1 | cut -d'.' -f1
|
||
else
|
||
echo "0"
|
||
fi
|
||
})
|
||
export CORES=$(nproc)
|
||
export MEM=$(LC_ALL=C free -m | grep Mem | awk '{print $2}')
|
||
export SWAP=$(LC_ALL=C free -m | grep Swap | awk '{print $2}')
|
||
|
||
export download_endpoint="https://dl.acepanel.net"
|
||
export setup_path="/opt/ace"
|
||
|
||
# 从配置文件中读取 setup_path
|
||
if [ -f /opt/ace/panel/storage/config.yml ]; then
|
||
download_endpoint="https://$(grep download_endpoint /opt/ace/panel/storage/config.yml | awk '{gsub(/["'\'']/, "", $2); print $2}')"
|
||
setup_path=$(grep root /opt/ace/panel/storage/config.yml | awk '{gsub(/["'\'']/, "", $2); print $2}')
|
||
fi
|
||
|
||
# 计算 j 值(通用)
|
||
calculate_j() {
|
||
total=$((MEM + SWAP))
|
||
j_value=$((total / 1024))
|
||
|
||
[ "$j_value" -eq 0 ] && j_value=1
|
||
[ "$j_value" -gt "$CORES" ] && j_value=$CORES
|
||
[ "$j_value" -gt 1 ] && j_value=$((j_value - 1)) # 大于1则减1
|
||
|
||
echo "$j_value"
|
||
}
|
||
|
||
# 计算 j 值(2倍内存)
|
||
calculate_j2() {
|
||
total=$((MEM + SWAP))
|
||
j_value=$((total / 2024))
|
||
|
||
[ "$j_value" -eq 0 ] && j_value=1
|
||
[ "$j_value" -gt "$CORES" ] && j_value=$CORES
|
||
[ "$j_value" -gt 1 ] && j_value=$((j_value - 1)) # 大于1则减1
|
||
|
||
echo "$j_value"
|
||
}
|
||
|
||
# 系统信息
|
||
sys_info() {
|
||
dir=$(pwd)
|
||
cd /tmp || cd /
|
||
|
||
if [ -f /etc/os-release ]; then
|
||
system_version=$(grep PRETTY_NAME /etc/os-release | awk -F '"' '{print $2}')
|
||
else
|
||
system_version="unknown"
|
||
fi
|
||
|
||
kernel_version=$(uname -a)
|
||
bitness=$(getconf LONG_BIT)-bit
|
||
cpu_name=$(lscpu | grep "^Model name:" | awk -F: '{print $2}' | sed 's/^[ \t]*//')
|
||
cpu_flags=$(lscpu | grep "^Flags:" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | sed 's/ /,/g')
|
||
|
||
if command -v gcc >/dev/null 2>&1; then
|
||
gcc_version=$(gcc -v 2>&1 | tail -n1 | awk '{print $3}')
|
||
else
|
||
gcc_version="no gcc"
|
||
fi
|
||
|
||
if command -v cmake >/dev/null 2>&1; then
|
||
cmake_version=$(cmake --version | head -n1 | awk '{print $3}')
|
||
else
|
||
cmake_version="no cmake"
|
||
fi
|
||
|
||
echo -e $HR
|
||
echo -e "| Kernel: $kernel_version"
|
||
echo -e "| CPU: $cpu_name | Arch: $ARCH | Core: $CORES"
|
||
echo -e "| OS: $system_version | Bit: $bitness | Mem: $MEM | Swap: $SWAP | gcc: $gcc_version | cmake: $cmake_version"
|
||
echo -e $HR
|
||
|
||
[ -d "$dir" ] && cd "$dir"
|
||
}
|
||
|
||
# 下载及校验
|
||
# 参数1:本地保存目录
|
||
# 参数2:服务器文件路径
|
||
# 参数3:本地保存文件名(可选,默认从 URL 中获取)
|
||
dl() {
|
||
local current="$(pwd)"
|
||
local save_dir="$1"
|
||
local url="${download_endpoint}$2"
|
||
local url_no_q="${url%%\?*}"
|
||
local filename="${3:-$(basename "$url_no_q")}"
|
||
|
||
[[ -z "$save_dir" || -z "$url" ]] && { error "dl function parameter error"; }
|
||
|
||
mkdir -p "$save_dir"
|
||
|
||
# 检测可用的下载工具
|
||
local downloader=""
|
||
if command -v aria2c >/dev/null 2>&1; then
|
||
downloader="aria2"
|
||
elif command -v wget >/dev/null 2>&1; then
|
||
downloader="wget"
|
||
elif command -v curl >/dev/null 2>&1; then
|
||
downloader="curl"
|
||
else
|
||
error "No download tool found. Please install aria2, wget or curl."
|
||
fi
|
||
|
||
case "$downloader" in
|
||
aria2)
|
||
local aria2_opts=(
|
||
-c
|
||
--file-allocation=falloc
|
||
--allow-overwrite=true
|
||
--auto-file-renaming=false
|
||
--console-log-level=notice
|
||
--summary-interval=2
|
||
--retry-wait=5
|
||
--max-tries=5
|
||
-x 16
|
||
-s 16
|
||
-k 1M
|
||
)
|
||
aria2c "${aria2_opts[@]}" \
|
||
-d "$save_dir" \
|
||
-o "$filename" \
|
||
"$url" || { error "Failed to download ${url}"; }
|
||
aria2c "${aria2_opts[@]}" \
|
||
-d "$save_dir" \
|
||
-o "${filename}.sha256" \
|
||
"${url}.sha256" || { error "Failed to download ${url}.sha256"; }
|
||
;;
|
||
wget)
|
||
wget -c -t 5 -T 30 -O "${save_dir}/${filename}" "$url" || { error "Failed to download ${url}"; }
|
||
wget -c -t 5 -T 30 -O "${save_dir}/${filename}.sha256" "${url}.sha256" || { error "Failed to download ${url}.sha256"; }
|
||
;;
|
||
curl)
|
||
curl -L -C - --retry 5 --retry-delay 5 -o "${save_dir}/${filename}" "$url" || { error "Failed to download ${url}"; }
|
||
curl -L -C - --retry 5 --retry-delay 5 -o "${save_dir}/${filename}.sha256" "${url}.sha256" || { error "Failed to download ${url}.sha256"; }
|
||
;;
|
||
esac
|
||
|
||
cd "$save_dir"
|
||
|
||
sha256sum --status -c "${filename}.sha256" || {
|
||
rm -f "${filename}" "${filename}.sha256"
|
||
cd "$current"
|
||
error "Failed to verify ${save_dir}/${filename}"
|
||
}
|
||
|
||
rm -f "${filename}.sha256"
|
||
cd "$current"
|
||
}
|
||
|
||
# 错误输出
|
||
error() {
|
||
echo -e $HR
|
||
echo -e "| Error: $1"
|
||
echo -e "| 可截图错误信息寻求帮助,或者联系面板官方支持。"
|
||
echo -e "| Take a screenshot of the error message for help, or contact the panel official support."
|
||
sys_info
|
||
exit 1
|
||
}
|