#!/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 }