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