common.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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://mirror.ghproxy.com https://gh.ddlc.top https://ghfast.top 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=10 "$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. local version=$(wget -qO- --timeout=15 "$api_url" 2>/dev/null | sed -n 's/.*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p')
  40. if [ -n "$version" ]; then
  41. # 保存可用的代理供后续使用
  42. WORKING_PROXY="$proxy"
  43. echo "$version"
  44. return 0
  45. fi
  46. done
  47. echo ""
  48. return 1
  49. }
  50. # 获取架构对应的文件名后缀
  51. get_arch_suffix() {
  52. local arch="$(uname -m)"
  53. case "$arch" in
  54. 'x86_64')
  55. echo "linux-amd64"
  56. ;;
  57. 'aarch64')
  58. echo "linux-arm64"
  59. ;;
  60. *)
  61. echo ""
  62. ;;
  63. esac
  64. }
  65. # 下载指定版本(带多代理重试机制)
  66. # 参数: $1=版本号, $2=目标文件路径
  67. download_version() {
  68. local version=$1
  69. local target=$2
  70. local arch_suffix=$(get_arch_suffix)
  71. if [ -z "$arch_suffix" ]; then
  72. echo "不支持的架构: $(uname -m)"
  73. return 1
  74. fi
  75. local filename="mixapi-${version}-${arch_suffix}"
  76. local github_path="https://github.com/aiprodcoder/MIXAPI/releases/download/${version}/${filename}"
  77. # 如果之前已经找到可用代理,优先使用
  78. if [ -n "$WORKING_PROXY" ]; then
  79. local url="${WORKING_PROXY}/${github_path}"
  80. echo "下载地址: ${url}"
  81. wget -qO "$target" --timeout=60 "$url" 2>/dev/null
  82. if [ $? -eq 0 ] && [ -s "$target" ]; then
  83. chmod +x "$target"
  84. return 0
  85. fi
  86. fi
  87. # 遍历所有代理尝试下载
  88. for proxy in $GITHUB_PROXY_LIST; do
  89. local url="${proxy}/${github_path}"
  90. echo "尝试下载: ${url}"
  91. wget -qO "$target" --timeout=60 "$url" 2>/dev/null
  92. if [ $? -eq 0 ] && [ -s "$target" ]; then
  93. chmod +x "$target"
  94. WORKING_PROXY="$proxy"
  95. echo "下载成功 (代理: $proxy)"
  96. return 0
  97. fi
  98. echo "下载失败,尝试下一个代理..."
  99. rm -f "$target"
  100. done
  101. echo "所有代理均下载失败"
  102. return 1
  103. }
  104. # 获取当前版本
  105. get_current_version() {
  106. if [ -f "$VERSION_FILE" ]; then
  107. cat "$VERSION_FILE"
  108. else
  109. echo ""
  110. fi
  111. }
  112. # 保存版本号
  113. save_version() {
  114. echo "$1" > "$VERSION_FILE"
  115. }
  116. # 查找 mixapi 进程 PID
  117. find_mixapi_pid() {
  118. local pid=""
  119. pid=$(ps aux 2>/dev/null | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  120. if [ -z "$pid" ]; then
  121. # busybox ps 格式不同,尝试另一种方式
  122. pid=$(ps | grep "$MIXAPI_BIN" | grep -v grep | awk '{print $1}' | head -1)
  123. fi
  124. echo "$pid"
  125. }