download_utils.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/bin/bash
  2. # 信号处理
  3. trap 'rm -rf /tmp; exit 130' SIGINT SIGTSTP SIGTERM
  4. # 检查并安装软件包
  5. check_and_install() {
  6. local pkg=$1
  7. if ! command -v "$pkg" >/dev/null 2>&1; then
  8. if command -v apt-get >/dev/null 2>&1; then
  9. sudo apt-get update
  10. sudo apt-get install -y "$pkg"
  11. elif command -v yum >/dev/null 2>&1; then
  12. sudo yum install -y epel-release
  13. sudo yum install -y "$pkg"
  14. elif command -v dnf >/dev/null 2>&1; then
  15. sudo dnf install -y "$pkg"
  16. elif command -v pacman >/dev/null 2>&1; then
  17. sudo pacman -S "$pkg"
  18. elif command -v zypper >/dev/null 2>&1; then
  19. sudo zypper install -y "$pkg"
  20. elif [[ -f /etc/alpine-release ]]; then
  21. sudo apk add --no-cache "$pkg"
  22. else
  23. echo -e "\e[31m无法安装 $pkg,不支持的 Linux 发行版\e[0m"
  24. exit 1
  25. fi
  26. fi
  27. }
  28. # 获取 GitHub 仓库的最新标签
  29. get_tag() {
  30. local repo=$1
  31. local headers=("-H" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36") # 合法 User-Agent
  32. curl -fsSL "https://api.github.com/repos/$repo/releases/latest" | jq -r '.tag_name'
  33. }
  34. # 定义下载函数
  35. download_file() {
  36. local name=$1
  37. local version=$2
  38. local url=$3
  39. local tmp_file="/tmp/$name.tmp"
  40. local local_version=$(jq -r ".[\"$name\"]" <"$VERSION_FILE" 2>/dev/null || echo "0.0.0")
  41. echo -e "\e[1;47;34m$name 版本信息:【本地版本】$local_version | 【最新版本】$version\e[0m"
  42. if [ "$version" != "$local_version" ]; then
  43. echo -e "\e[37m正在更新 $name 到版本 $version\e[0m"
  44. # 下载文件
  45. if ! curl -I -L -m 10 "$url" >/dev/null 2>&1; then
  46. echo -e "\e[31mURL $url 不存在\e[0m"
  47. return 2
  48. fi
  49. if ! curl -L -m 60 -H "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" --retry 3 --retry-delay 5 -o "$tmp_file" "$url"; then
  50. echo -e "\e[31m下载 $name 失败\e[0m"
  51. rm -f "$tmp_file"
  52. return 1
  53. fi
  54. # 验证文件完整性
  55. local actual_size=$(du -b "$tmp_file" | awk '{print $1}')
  56. local min_size=$((1048576)) # 1MB minimum file size
  57. if [ "$actual_size" -lt "$min_size" ]; then
  58. echo -e "\e[31m[取消]下载的文件大小小于1MB,文件可能不完整\e[0m"
  59. rm -f "$tmp_file"
  60. return 1
  61. fi
  62. # 下载成功,重命名文件
  63. mv "$tmp_file" "$FILE_DIR/$name"
  64. echo -e "\e[32m成功更新 $name 到版本 $version\e[0m"
  65. return 0
  66. fi
  67. }
  68. # 处理文件下载
  69. process_files() {
  70. # 读取当前版本信息(如果存在)
  71. local current_versions
  72. if [ -f "$VERSION_FILE" ]; then
  73. current_versions=$(cat "$VERSION_FILE")
  74. else
  75. current_versions="{}"
  76. fi
  77. # 创建临时版本文件
  78. local tmp_version_file="/tmp/version.json.tmp"
  79. echo "$current_versions" > "$tmp_version_file"
  80. # 遍历所有文档
  81. for doc in "${!docs[@]}"; do
  82. if [[ $doc == *_name ]]; then
  83. local name=${docs[$doc]}
  84. local version=${docs[${doc/_name/_version}]}
  85. local url=${docs[${doc/_name/_url}]}
  86. # 下载文件并检查状态
  87. if download_file "$name" "$version" "$url"; then
  88. # 下载成功,更新临时版本文件
  89. jq -r --arg name "$name" --arg version "$version" '.[$name]=$version' \
  90. <"$tmp_version_file" > "$tmp_version_file.tmp"
  91. mv "$tmp_version_file.tmp" "$tmp_version_file"
  92. else
  93. # 下载失败,保留旧版本(如果存在)
  94. local old_version=$(jq -r ".[\"$name\"]" <"$tmp_version_file" 2>/dev/null)
  95. echo -e "\e[33m[跳过] $name 版本保持为 ${old_version:-未安装}\e[0m"
  96. fi
  97. fi
  98. done
  99. # 原子化替换原版本文件
  100. mv "$tmp_version_file" "$VERSION_FILE"
  101. echo -e "\e[32m版本文件已更新(仅包含成功下载的条目)\e[0m"
  102. }