#!/bin/sh # 公共变量 VERSION_FILE="/app/version.txt" MIXAPI_BIN="/app/mixapi" MIXAPI_NEW="/app/mixapi.new" UPDATE_SCRIPT="/app/check_update.sh" CRON_FILE="/var/spool/cron/crontabs/root" DEFAULT_VERSION="v2.5.1cl" # GitHub 代理列表(按优先级排序,支持通过环境变量 GITHUB_PROXY 覆盖) # 格式说明: # - 以 / 结尾的代理:直接拼接 GitHub URL(如 https://proxy.com/ + github.com/...) # - 不以 / 结尾的代理:需要加 / 再拼接(如 https://proxy.com + / + https://github.com/...) # - direct:直接访问 GitHub(不使用代理) # 已测试可用的代理:gh.llkk.cc (2024-12) GITHUB_PROXY_LIST="${GITHUB_PROXY:-https://gh.llkk.cc https://ghproxy.cn https://ghproxy.net direct}" # GitHub API 和下载基础 URL GITHUB_API_URL="https://api.github.com/repos/aiprodcoder/MIXAPI/releases/latest" GITHUB_DOWNLOAD_BASE="https://github.com/aiprodcoder/MIXAPI/releases/download" # 构建代理 URL # 参数: $1=代理, $2=目标URL build_proxy_url() { local proxy=$1 local target_url=$2 if [ "$proxy" = "direct" ]; then echo "$target_url" else # 检查代理是否以 / 结尾 case "$proxy" in */) echo "${proxy}${target_url}" ;; *) echo "${proxy}/${target_url}" ;; esac fi } # 测试代理是否可用(快速检测,3秒超时) test_proxy() { local proxy=$1 local test_url=$(build_proxy_url "$proxy" "$GITHUB_API_URL") echo "测试: $test_url" >&2 local result=$(wget -qO- --timeout=3 --tries=1 "$test_url" 2>/dev/null) if echo "$result" | grep -q '"tag_name"'; then return 0 fi return 1 } # 获取最新版本号(带快速失败机制) get_latest_version() { local proxy for proxy in $GITHUB_PROXY_LIST; do local api_url=$(build_proxy_url "$proxy" "$GITHUB_API_URL") echo "尝试获取版本: $api_url" >&2 local response=$(wget -qO- --timeout=5 --tries=1 "$api_url" 2>/dev/null) local version=$(echo "$response" | sed -n 's/.*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p') if [ -n "$version" ]; then # 保存可用的代理供后续使用 WORKING_PROXY="$proxy" echo "获取版本成功: $version (代理: $proxy)" >&2 echo "$version" return 0 fi echo "代理失败: $proxy" >&2 done echo "" return 1 } # 获取架构对应的文件名后缀 get_arch_suffix() { local arch="$(uname -m)" case "$arch" in 'x86_64') echo "linux-amd64" ;; 'aarch64') echo "linux-arm64" ;; *) echo "" ;; esac } # 下载指定版本(带多代理重试机制) # 参数: $1=版本号, $2=目标文件路径 download_version() { local version=$1 local target=$2 local arch_suffix=$(get_arch_suffix) if [ -z "$arch_suffix" ]; then echo "不支持的架构: $(uname -m)" return 1 fi local filename="mixapi-${version}-${arch_suffix}" local github_url="${GITHUB_DOWNLOAD_BASE}/${version}/${filename}" # 如果之前已经找到可用代理,优先使用 if [ -n "$WORKING_PROXY" ]; then local url=$(build_proxy_url "$WORKING_PROXY" "$github_url") echo "下载地址: ${url}" wget -qO "$target" --timeout=60 --tries=2 "$url" 2>/dev/null if [ $? -eq 0 ] && [ -s "$target" ]; then chmod +x "$target" return 0 fi echo "首选代理下载失败,尝试其他代理..." fi # 遍历所有代理尝试下载 for proxy in $GITHUB_PROXY_LIST; do # 跳过已经失败的首选代理 [ "$proxy" = "$WORKING_PROXY" ] && continue local url=$(build_proxy_url "$proxy" "$github_url") echo "尝试下载: ${url}" wget -qO "$target" --timeout=30 --tries=1 "$url" 2>/dev/null if [ $? -eq 0 ] && [ -s "$target" ]; then chmod +x "$target" WORKING_PROXY="$proxy" echo "下载成功 (代理: $proxy)" return 0 fi echo "下载失败,尝试下一个代理..." rm -f "$target" done echo "所有代理均下载失败" return 1 } # 获取当前版本 get_current_version() { if [ -f "$VERSION_FILE" ]; then cat "$VERSION_FILE" else echo "" fi } # 保存版本号 save_version() { echo "$1" > "$VERSION_FILE" } # 查找 mixapi 进程 PID find_mixapi_pid() { local pid="" pid=$(ps aux 2>/dev/null | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1) if [ -z "$pid" ]; then # busybox ps 格式不同,尝试另一种方式 pid=$(ps | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1) fi echo "$pid" }