common.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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="v1.2"
  9. # 国内使用 GitHub 代理加速
  10. # 支持通过环境变量 GITHUB_PROXY 覆盖默认代理
  11. # 备用代理列表(按优先级排序)
  12. GITHUB_PROXY_LIST="${GITHUB_PROXY:-https://ghfast.top https://gh.ddlc.top https://mirror.ghproxy.com https://github.moeyy.xyz}"
  13. # 测试代理是否可用(快速检测)
  14. test_proxy() {
  15. local proxy=$1
  16. local test_url="${proxy}/https://api.github.com/repos/aiprodcoder/MIXAPI/releases/latest"
  17. wget -qO- --timeout=5 --tries=1 "$test_url" >/dev/null 2>&1
  18. return $?
  19. }
  20. # 获取可用的代理
  21. get_working_proxy() {
  22. for proxy in $GITHUB_PROXY_LIST; do
  23. echo "测试代理: $proxy" >&2
  24. if test_proxy "$proxy"; then
  25. echo "代理可用: $proxy" >&2
  26. echo "$proxy"
  27. return 0
  28. fi
  29. echo "代理不可用: $proxy" >&2
  30. done
  31. echo ""
  32. return 1
  33. }
  34. # 获取最新版本号(带重试机制,快速超时)
  35. get_latest_version() {
  36. local proxy
  37. for proxy in $GITHUB_PROXY_LIST; do
  38. local api_url="${proxy}/https://api.github.com/repos/aiprodcoder/MIXAPI/releases/latest"
  39. echo "尝试获取版本: $api_url" >&2
  40. local version=$(wget -qO- --timeout=8 --tries=1 "$api_url" 2>/dev/null | sed -n 's/.*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p')
  41. if [ -n "$version" ]; then
  42. # 保存可用的代理供后续使用
  43. WORKING_PROXY="$proxy"
  44. echo "获取版本成功: $version (代理: $proxy)" >&2
  45. echo "$version"
  46. return 0
  47. fi
  48. echo "代理失败: $proxy" >&2
  49. done
  50. echo ""
  51. return 1
  52. }
  53. # 获取架构对应的文件名后缀
  54. get_arch_suffix() {
  55. local arch="$(uname -m)"
  56. case "$arch" in
  57. 'x86_64')
  58. echo "linux-amd64"
  59. ;;
  60. 'aarch64')
  61. echo "linux-arm64"
  62. ;;
  63. *)
  64. echo ""
  65. ;;
  66. esac
  67. }
  68. # 下载指定版本(带多代理重试机制)
  69. # 参数: $1=版本号, $2=目标文件路径
  70. download_version() {
  71. local version=$1
  72. local target=$2
  73. local arch_suffix=$(get_arch_suffix)
  74. if [ -z "$arch_suffix" ]; then
  75. echo "不支持的架构: $(uname -m)"
  76. return 1
  77. fi
  78. local filename="mixapi-${version}-${arch_suffix}"
  79. local github_path="https://github.com/aiprodcoder/MIXAPI/releases/download/${version}/${filename}"
  80. # 如果之前已经找到可用代理,优先使用
  81. if [ -n "$WORKING_PROXY" ]; then
  82. local url="${WORKING_PROXY}/${github_path}"
  83. echo "下载地址: ${url}"
  84. wget -qO "$target" --timeout=30 --tries=2 "$url" 2>/dev/null
  85. if [ $? -eq 0 ] && [ -s "$target" ]; then
  86. chmod +x "$target"
  87. return 0
  88. fi
  89. echo "首选代理下载失败,尝试其他代理..."
  90. fi
  91. # 遍历所有代理尝试下载
  92. for proxy in $GITHUB_PROXY_LIST; do
  93. # 跳过已经失败的首选代理
  94. [ "$proxy" = "$WORKING_PROXY" ] && continue
  95. local url="${proxy}/${github_path}"
  96. echo "尝试下载: ${url}"
  97. wget -qO "$target" --timeout=30 --tries=1 "$url" 2>/dev/null
  98. if [ $? -eq 0 ] && [ -s "$target" ]; then
  99. chmod +x "$target"
  100. WORKING_PROXY="$proxy"
  101. echo "下载成功 (代理: $proxy)"
  102. return 0
  103. fi
  104. echo "下载失败,尝试下一个代理..."
  105. rm -f "$target"
  106. done
  107. echo "所有代理均下载失败"
  108. return 1
  109. }
  110. # 获取当前版本
  111. get_current_version() {
  112. if [ -f "$VERSION_FILE" ]; then
  113. cat "$VERSION_FILE"
  114. else
  115. echo ""
  116. fi
  117. }
  118. # 保存版本号
  119. save_version() {
  120. echo "$1" > "$VERSION_FILE"
  121. }
  122. # 查找 mixapi 进程 PID
  123. find_mixapi_pid() {
  124. local pid=""
  125. pid=$(ps aux 2>/dev/null | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  126. if [ -z "$pid" ]; then
  127. # busybox ps 格式不同,尝试另一种方式
  128. pid=$(ps | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  129. fi
  130. echo "$pid"
  131. }