anaconda.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/bin/bash
  2. # requires: wget, lftp, jq
  3. #
  4. set -e
  5. set -o pipefail
  6. CONDA_REPO_BASE=${CONDA_REPO_BASE:-"http://repo.continuum.io"}
  7. LOCAL_DIR_BASE="${TUNASYNC_WORKING_DIR}/pkgs"
  8. TMP_DIR=$(mktemp -d)
  9. CONDA_REPOS=("free" "r" "mro" "pro")
  10. CONDA_ARCHES=("linux-64" "linux-32" "linux-armv6l" "linux-armv7l" "linux-ppc64le" "osx-64" "osx-32" "win-64" "win-32")
  11. function check-and-download() {
  12. remote_file=$1
  13. local_file=$2
  14. wget -q --spider ${remote_file}
  15. if [ $? -eq 0 ]; then
  16. echo "downloading ${remote_file}"
  17. wget -q -N -O ${local_file} ${remote_file}
  18. return
  19. fi
  20. return 1
  21. }
  22. function cleanup () {
  23. echo "cleaning up"
  24. [ -d ${TMP_DIR} ] && {
  25. [ -f ${TMP_DIR}/repodata.json ] && rm ${TMP_DIR}/repodata.json
  26. [ -f ${TMP_DIR}/repodata.json.bz2 ] && rm ${TMP_DIR}/repodata.json.bz2
  27. rmdir ${TMP_DIR}
  28. }
  29. }
  30. trap cleanup EXIT
  31. echo ${TMP_DIR}
  32. for repo in ${CONDA_REPOS[@]}; do
  33. for arch in ${CONDA_ARCHES[@]}; do
  34. PKG_REPO_BASE="${CONDA_REPO_BASE}/pkgs/$repo/$arch"
  35. repodata_url="${PKG_REPO_BASE}/repodata.json"
  36. bz2_repodata_url="${PKG_REPO_BASE}/repodata.json.bz2"
  37. LOCAL_DIR="${LOCAL_DIR_BASE}/$repo/$arch"
  38. [ ! -d ${LOCAL_DIR} ] && mkdir -p ${LOCAL_DIR}
  39. tmp_repodata="${TMP_DIR}/repodata.json"
  40. tmp_bz2_repodata="${TMP_DIR}/repodata.json.bz2"
  41. check-and-download ${repodata_url} ${tmp_repodata}
  42. check-and-download ${bz2_repodata_url} ${tmp_bz2_repodata}
  43. jq_cmd='.packages | to_entries[] | [.key, .value.size, .value.md5] | map(tostring) | join(" ")'
  44. bzip2 -c -d ${tmp_bz2_repodata} | jq -r "${jq_cmd}" | while read line;
  45. do
  46. read -a tokens <<< $line
  47. pkgfile=${tokens[0]}
  48. pkgsize=${tokens[1]}
  49. pkgmd5=${tokens[2]}
  50. pkg_url="${PKG_REPO_BASE}/${pkgfile}"
  51. dest_file="${LOCAL_DIR}/${pkgfile}"
  52. declare downloaded=false
  53. if [ -f ${dest_file} ]; then
  54. rsize=`stat -c "%s" ${dest_file}`
  55. if [ ${rsize} -eq ${pkgsize} ]; then
  56. downloaded=true
  57. echo "Skipping ${pkgfile}, size ${pkgsize}"
  58. fi
  59. fi
  60. while [ $downloaded != true ]; do
  61. echo "downloading ${pkg_url}"
  62. wget -q -O ${dest_file} ${pkg_url} && {
  63. # two space for md5sum check format
  64. echo "${pkgmd5} ${dest_file}" | md5sum -c - && downloaded=true
  65. }
  66. done
  67. done
  68. mv "${TMP_DIR}/repodata.json" "${LOCAL_DIR}/repodata.json"
  69. mv "${TMP_DIR}/repodata.json.bz2" "${LOCAL_DIR}/repodata.json.bz2"
  70. done
  71. done
  72. function sync_installer() {
  73. repo_url="$1"
  74. repo_dir="$2"
  75. [ ! -d "$repo_dir" ] && mkdir -p "$repo_dir"
  76. cd $repo_dir
  77. lftp "${repo_url}/" -e "mirror --verbose -P 5; bye"
  78. }
  79. sync_installer "${CONDA_REPO_BASE}/archive/" "${TUNASYNC_WORKING_DIR}/archive/"
  80. sync_installer "${CONDA_REPO_BASE}/miniconda/" "${TUNASYNC_WORKING_DIR}/miniconda/"