2
0

apt-download 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/bin/bash
  2. set -e
  3. LOADED_APT_DOWNLOAD="yes"
  4. function check-and-download() {
  5. remote_file=$1
  6. local_file=$2
  7. wget -q --spider ${remote_file}
  8. if [ $? -eq 0 ]; then
  9. echo "downloading ${remote_file}"
  10. wget -q -N -O ${local_file} ${remote_file}
  11. return
  12. fi
  13. return 0
  14. }
  15. function apt-download-binary() {
  16. base_url=$1
  17. dist=$2
  18. repo=$3
  19. arch=$4
  20. dest_base_dir=$5
  21. if [ -z $dest_base_dir ]; then
  22. echo "Destination directory is empty, cannot continue"
  23. return 1
  24. fi
  25. dest_dir="${dest_base_dir}/dists/${dist}"
  26. [ ! -d "$dest_dir" ] && mkdir -p "$dest_dir"
  27. check-and-download "${base_url}/dists/${dist}/Contents-${arch}.gz" "${dest_dir}/Contents-${arch}.gz" || true
  28. check-and-download "${base_url}/dists/${dist}/InRelease" "${dest_dir}/InRelease" || true
  29. check-and-download "${base_url}/dists/${dist}/Release" "${dest_dir}/Release"
  30. check-and-download "${base_url}/dists/${dist}/Release.gpg" "${dest_dir}/Release.gpg" || true
  31. # Load Package Index URLs from Release file
  32. release_file="${dest_dir}/Release"
  33. dest_dir="${dest_base_dir}/dists/${dist}/${repo}/binary-${arch}"
  34. [ ! -d "$dest_dir" ] && mkdir -p "$dest_dir"
  35. declare pkgidx_content=""
  36. declare cnt_start=false
  37. declare -i checksum_len
  38. if (grep -e '^SHA256:$' ${release_file} &>/dev/null); then
  39. checksum_cmd="sha256sum"; checksum_regex="^SHA256:$"; checksum_len=64
  40. elif (grep -e '^SHA1:$' ${release_file} &>/dev/null); then
  41. checksum_cmd="sha1sum"; checksum_regex="^SHA1:$"; checksum_len=40
  42. elif (grep -e '^MD5Sum:$' ${release_file} &>/dev/null); then
  43. checksum_cmd="md5sum"; checksum_regex="^MD5sum:$"; checksum_len=32
  44. fi
  45. while read line; do
  46. if [[ ${cnt_start} = true ]]; then
  47. read -a tokens <<< $line
  48. checksum=${tokens[0]}
  49. if [[ ${#checksum} != ${checksum_len} ]]; then
  50. break
  51. fi
  52. filesize=${tokens[1]}
  53. filename=${tokens[2]}
  54. if [[ "$filename" =~ ${repo}/binary-${arch} ]]; then
  55. # Load package list from Packages file
  56. pkgidx_file="${dest_base_dir}/dists/${dist}/${filename}"
  57. dest_dir=`dirname ${pkgidx_file}`
  58. [ ! -d "$dest_dir" ] && mkdir -p "$dest_dir"
  59. pkglist_url="${base_url}/dists/${dist}/${filename}"
  60. check-and-download "${pkglist_url}" ${pkgidx_file} || true
  61. echo "${checksum} ${pkgidx_file}" | ${checksum_cmd} -c -
  62. if [ -z "${pkgidx_content}" -a -f ${pkgidx_file} ]; then
  63. echo "getting packages index content"
  64. case $filename in
  65. "*.bz2")
  66. pkgidx_content=`bunzip2 -c ${pkgidx_file}`
  67. ;;
  68. "*.gz")
  69. pkgidx_content=`gunzip -c ${pkgidx_file}`
  70. ;;
  71. *)
  72. pkgidx_content=`cat ${pkgidx_file}`
  73. ;;
  74. esac
  75. fi
  76. fi
  77. else
  78. if [[ "$line" =~ ${checksum_regex} ]]; then
  79. cnt_start=true
  80. fi
  81. fi
  82. done < ${release_file}
  83. if [ -z "${pkgidx_content}" ]; then
  84. echo "index is empty, failed"
  85. return 1
  86. fi
  87. # Set checksum method
  88. if (echo -e "${pkgidx_content}" | grep -e '^SHA256' &>/dev/null); then
  89. checksum_cmd="sha256sum"; checksum_regex="^SHA256"
  90. elif (echo -e "${pkgidx_content}" | grep -e '^SHA1' &>/dev/null); then
  91. checksum_cmd="sha1sum"; checksum_regex="^SHA1"
  92. elif (echo -e "${pkgidx_content}" | grep -e '^MD5sum' &>/dev/null); then
  93. checksum_cmd="md5sum"; checksum_regex="^MD5sum"
  94. fi
  95. # Download packages
  96. (echo -e "${pkgidx_content}" | grep -e '^Filename' -e '^Size' -e ${checksum_regex} | cut -d' ' -f 2) | \
  97. while read pkg_filename; read pkg_size; read pkg_checksum; do
  98. dest_filename="${dest_base_dir}/${pkg_filename}"
  99. dest_dir=`dirname ${dest_filename}`
  100. [ ! -d "$dest_dir" ] && mkdir -p "$dest_dir"
  101. pkg_url="${base_url}/${pkg_filename}"
  102. declare downloaded=false
  103. if [ -f ${dest_filename} ]; then
  104. rsize=`stat -c "%s" ${dest_filename}`
  105. if [ ${rsize} -eq ${pkg_size} ]; then
  106. downloaded=true
  107. echo "Skipping ${pkg_filename}, size ${pkg_size}"
  108. fi
  109. fi
  110. while [ $downloaded != true ]; do
  111. echo "downloading ${pkg_url}"
  112. wget -q -O ${dest_filename} ${pkg_url} && {
  113. echo "${pkg_checksum} ${dest_filename}" | ${checksum_cmd} -c - && downloaded=true # two space for md5sum/sha1sum/sha256sum check format
  114. }
  115. done
  116. done
  117. echo "Mirroring ${base_url} ${dist}, ${repo}, ${arch} done!"
  118. }
  119. # vim: ts=4 sts=4 sw=4