download_tests.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/bin/bash
  2. # gvisor系统调用测试套件下载和校验脚本
  3. # 用于DragonOS项目
  4. set -e
  5. SCRIPT_DIR=$(dirname "$(realpath "$0")")
  6. TESTS_DIR="$SCRIPT_DIR/tests"
  7. TEST_ARCHIVE="gvisor-syscalls-tests.tar.xz"
  8. TEST_URL="https://cnb.cool/DragonOS-Community/test-suites/-/releases/download/release_20250626/$TEST_ARCHIVE"
  9. MD5SUM_URL="https://cnb.cool/DragonOS-Community/test-suites/-/releases/download/release_20250626/$TEST_ARCHIVE.md5sum"
  10. # 颜色定义
  11. GREEN='\033[0;32m'
  12. YELLOW='\033[1;33m'
  13. RED='\033[0;31m'
  14. NC='\033[0m'
  15. print_info() {
  16. echo -e "${GREEN}[INFO]${NC} $1"
  17. }
  18. print_warn() {
  19. echo -e "${YELLOW}[WARN]${NC} $1"
  20. }
  21. print_error() {
  22. echo -e "${RED}[ERROR]${NC} $1"
  23. }
  24. # 检查命令是否存在
  25. check_command() {
  26. if ! command -v "$1" &> /dev/null; then
  27. print_error "命令 '$1' 未找到,请安装相应软件包"
  28. exit 1
  29. fi
  30. }
  31. # 检查必要的命令
  32. check_dependencies() {
  33. print_info "检查依赖..."
  34. check_command wget
  35. check_command md5sum
  36. check_command tar
  37. }
  38. # 检查测试套件是否已存在且完整
  39. check_existing_tests() {
  40. if [ -d "$TESTS_DIR" ] && [ "$(find "$TESTS_DIR" -name "*_test" | wc -l)" -gt 0 ]; then
  41. print_info "发现已存在的测试套件"
  42. return 0
  43. else
  44. return 1
  45. fi
  46. }
  47. # 下载文件
  48. download_file() {
  49. local url="$1"
  50. local output="$2"
  51. local quiet_mode="${3:-false}"
  52. if [ "$quiet_mode" = "true" ]; then
  53. # 静默下载(用于小文件如MD5)
  54. if wget -q -O "$output" "$url" 2>/dev/null; then
  55. return 0
  56. else
  57. return 1
  58. fi
  59. else
  60. # 显示进度的下载(用于大文件)
  61. print_info "从 $url 下载文件..."
  62. if wget -q --show-progress -O "$output" "$url"; then
  63. print_info "下载完成: $output"
  64. return 0
  65. else
  66. print_error "下载失败: $url"
  67. return 1
  68. fi
  69. fi
  70. }
  71. # 获取期望的MD5值
  72. get_expected_md5() {
  73. # 将日志输出重定向到stderr,避免混入返回值
  74. print_info "获取期望的MD5校验和..." >&2
  75. local temp_md5_file=$(mktemp)
  76. # 确保在函数退出时清理临时文件
  77. trap "rm -f '$temp_md5_file'" RETURN
  78. if download_file "$MD5SUM_URL" "$temp_md5_file" "true"; then
  79. # 解析MD5文件,格式通常是: "md5hash filename"
  80. local expected_md5=$(head -1 "$temp_md5_file" | cut -d' ' -f1)
  81. if [ -n "$expected_md5" ] && [ ${#expected_md5} -eq 32 ]; then
  82. echo "$expected_md5"
  83. return 0
  84. else
  85. print_error "MD5文件格式无效或为空" >&2
  86. return 1
  87. fi
  88. else
  89. print_error "无法下载MD5校验和文件" >&2
  90. return 1
  91. fi
  92. }
  93. # 验证MD5校验和
  94. verify_md5() {
  95. local file="$1"
  96. local expected="$2"
  97. print_info "验证MD5校验和..."
  98. local actual_md5=$(md5sum "$file" | cut -d' ' -f1)
  99. if [ "$actual_md5" = "$expected" ]; then
  100. print_info "MD5校验和验证成功"
  101. return 0
  102. else
  103. print_error "MD5校验和验证失败"
  104. print_error "期望: $expected"
  105. print_error "实际: $actual_md5"
  106. return 1
  107. fi
  108. }
  109. # 解压测试套件
  110. extract_tests() {
  111. local archive="$1"
  112. print_info "解压测试套件..."
  113. mkdir -p "$TESTS_DIR"
  114. if tar -xf "$archive" -C "$TESTS_DIR" --strip-components=1; then
  115. print_info "解压完成"
  116. return 0
  117. else
  118. print_error "解压失败"
  119. return 1
  120. fi
  121. }
  122. # 清理临时文件
  123. cleanup_temp_files() {
  124. print_info "清理临时文件..."
  125. rm -f "$SCRIPT_DIR/$TEST_ARCHIVE"
  126. }
  127. # 主函数
  128. main() {
  129. local skip_if_exists=false
  130. local force_download=false
  131. # 检查参数
  132. for arg in "$@"; do
  133. case "$arg" in
  134. --skip-if-exists)
  135. skip_if_exists=true
  136. ;;
  137. --force-download)
  138. force_download=true
  139. ;;
  140. esac
  141. done
  142. print_info "开始检查和下载gvisor系统调用测试套件"
  143. # 检查依赖
  144. check_dependencies
  145. # 检查是否已存在测试套件
  146. if check_existing_tests; then
  147. if [ "$skip_if_exists" = true ]; then
  148. print_info "测试套件已存在,跳过下载"
  149. exit 0
  150. elif [ "$force_download" = true ]; then
  151. print_warn "强制重新下载,删除现有测试套件..."
  152. rm -rf "$TESTS_DIR"
  153. else
  154. read -p "测试套件已存在,是否重新下载?(y/N) " -n 1 -r
  155. echo
  156. if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  157. print_info "使用现有测试套件"
  158. exit 0
  159. fi
  160. print_warn "删除现有测试套件..."
  161. rm -rf "$TESTS_DIR"
  162. fi
  163. fi
  164. # 下载测试套件
  165. if ! download_file "$TEST_URL" "$SCRIPT_DIR/$TEST_ARCHIVE"; then
  166. exit 1
  167. fi
  168. # 获取期望的MD5值
  169. local expected_md5
  170. if ! expected_md5=$(get_expected_md5); then
  171. cleanup_temp_files
  172. exit 1
  173. fi
  174. print_info "期望的MD5校验和: $expected_md5"
  175. # 验证MD5
  176. if ! verify_md5 "$SCRIPT_DIR/$TEST_ARCHIVE" "$expected_md5"; then
  177. cleanup_temp_files
  178. exit 1
  179. fi
  180. # 解压测试套件
  181. if ! extract_tests "$SCRIPT_DIR/$TEST_ARCHIVE"; then
  182. cleanup_temp_files
  183. exit 1
  184. fi
  185. # 清理临时文件
  186. cleanup_temp_files
  187. # 统计测试数量
  188. local test_count=$(find "$TESTS_DIR" -name "*_test" | wc -l)
  189. print_info "测试套件安装完成,共包含 $test_count 个测试用例"
  190. # 设置执行权限
  191. find "$TESTS_DIR" -name "*_test" -exec chmod +x {} \;
  192. print_info "gvisor测试套件准备就绪"
  193. }
  194. # 运行主函数
  195. main "$@"