common.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/bin/sh
  2. # 公共变量
  3. VERSION_FILE="/app/version.txt"
  4. MIXAPI_BIN="/app/mixapi"
  5. MIXAPI_NEW="/app/mixapi.new"
  6. UPDATE_SCRIPT="/app/check_update.sh"
  7. CRON_FILE="/var/spool/cron/crontabs/root"
  8. DEFAULT_VERSION="v2.5.1cl"
  9. # GitHub 代理列表(按优先级排序,支持通过环境变量 GITHUB_PROXY 覆盖)
  10. # 格式说明:
  11. # - 以 / 结尾的代理:直接拼接 GitHub URL(如 https://proxy.com/ + github.com/...)
  12. # - 不以 / 结尾的代理:需要加 / 再拼接(如 https://proxy.com + / + https://github.com/...)
  13. # - direct:直接访问 GitHub(不使用代理)
  14. # 已测试可用的代理:gh.llkk.cc (2024-12)
  15. GITHUB_PROXY_LIST="${GITHUB_PROXY:-https://gh.llkk.cc https://ghproxy.cn https://ghproxy.net direct}"
  16. # GitHub API 和下载基础 URL
  17. GITHUB_API_URL="https://api.github.com/repos/aiprodcoder/MIXAPI/releases/latest"
  18. GITHUB_DOWNLOAD_BASE="https://github.com/aiprodcoder/MIXAPI/releases/download"
  19. # 构建代理 URL
  20. # 参数: $1=代理, $2=目标URL
  21. build_proxy_url() {
  22. local proxy=$1
  23. local target_url=$2
  24. if [ "$proxy" = "direct" ]; then
  25. echo "$target_url"
  26. else
  27. # 检查代理是否以 / 结尾
  28. case "$proxy" in
  29. */)
  30. echo "${proxy}${target_url}"
  31. ;;
  32. *)
  33. echo "${proxy}/${target_url}"
  34. ;;
  35. esac
  36. fi
  37. }
  38. # 测试代理是否可用(快速检测,3秒超时)
  39. test_proxy() {
  40. local proxy=$1
  41. local test_url=$(build_proxy_url "$proxy" "$GITHUB_API_URL")
  42. echo "测试: $test_url" >&2
  43. local result=$(wget -qO- --timeout=3 --tries=1 "$test_url" 2>/dev/null)
  44. if echo "$result" | grep -q '"tag_name"'; then
  45. return 0
  46. fi
  47. return 1
  48. }
  49. # 获取最新版本号(带快速失败机制)
  50. get_latest_version() {
  51. local proxy
  52. for proxy in $GITHUB_PROXY_LIST; do
  53. local api_url=$(build_proxy_url "$proxy" "$GITHUB_API_URL")
  54. echo "尝试获取版本: $api_url" >&2
  55. local response=$(wget -qO- --timeout=5 --tries=1 "$api_url" 2>/dev/null)
  56. local version=$(echo "$response" | sed -n 's/.*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p')
  57. if [ -n "$version" ]; then
  58. # 保存可用的代理供后续使用
  59. WORKING_PROXY="$proxy"
  60. echo "获取版本成功: $version (代理: $proxy)" >&2
  61. echo "$version"
  62. return 0
  63. fi
  64. echo "代理失败: $proxy" >&2
  65. done
  66. echo ""
  67. return 1
  68. }
  69. # 获取架构对应的文件名后缀
  70. get_arch_suffix() {
  71. local arch="$(uname -m)"
  72. case "$arch" in
  73. 'x86_64')
  74. echo "linux-amd64"
  75. ;;
  76. 'aarch64')
  77. echo "linux-arm64"
  78. ;;
  79. *)
  80. echo ""
  81. ;;
  82. esac
  83. }
  84. # 下载指定版本(带多代理重试机制)
  85. # 参数: $1=版本号, $2=目标文件路径
  86. download_version() {
  87. local version=$1
  88. local target=$2
  89. local arch_suffix=$(get_arch_suffix)
  90. if [ -z "$arch_suffix" ]; then
  91. echo "不支持的架构: $(uname -m)"
  92. return 1
  93. fi
  94. local filename="mixapi-${version}-${arch_suffix}"
  95. local github_url="${GITHUB_DOWNLOAD_BASE}/${version}/${filename}"
  96. # 如果之前已经找到可用代理,优先使用
  97. if [ -n "$WORKING_PROXY" ]; then
  98. local url=$(build_proxy_url "$WORKING_PROXY" "$github_url")
  99. echo "下载地址: ${url}"
  100. wget -qO "$target" --timeout=60 --tries=2 "$url" 2>/dev/null
  101. if [ $? -eq 0 ] && [ -s "$target" ]; then
  102. chmod +x "$target"
  103. return 0
  104. fi
  105. echo "首选代理下载失败,尝试其他代理..."
  106. fi
  107. # 遍历所有代理尝试下载
  108. for proxy in $GITHUB_PROXY_LIST; do
  109. # 跳过已经失败的首选代理
  110. [ "$proxy" = "$WORKING_PROXY" ] && continue
  111. local url=$(build_proxy_url "$proxy" "$github_url")
  112. echo "尝试下载: ${url}"
  113. wget -qO "$target" --timeout=30 --tries=1 "$url" 2>/dev/null
  114. if [ $? -eq 0 ] && [ -s "$target" ]; then
  115. chmod +x "$target"
  116. WORKING_PROXY="$proxy"
  117. echo "下载成功 (代理: $proxy)"
  118. return 0
  119. fi
  120. echo "下载失败,尝试下一个代理..."
  121. rm -f "$target"
  122. done
  123. echo "所有代理均下载失败"
  124. return 1
  125. }
  126. # 获取当前版本
  127. get_current_version() {
  128. if [ -f "$VERSION_FILE" ]; then
  129. cat "$VERSION_FILE"
  130. else
  131. echo ""
  132. fi
  133. }
  134. # 保存版本号
  135. save_version() {
  136. echo "$1" > "$VERSION_FILE"
  137. }
  138. # 查找 mixapi 进程 PID
  139. find_mixapi_pid() {
  140. local pid=""
  141. pid=$(ps aux 2>/dev/null | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  142. if [ -z "$pid" ]; then
  143. # busybox ps 格式不同,尝试另一种方式
  144. pid=$(ps | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  145. fi
  146. echo "$pid"
  147. }