You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.4 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. #!/bin/bash
  2. set -e
  3. exec 3>&1 # make stdout available as fd 3 for the result
  4. exec 1>&2 # redirect all output to stderr for logging
  5. echo "BUILD_ID: $BUILD_ID"
  6. echo "BUILD_NAME: $BUILD_NAME"
  7. echo "BUILD_JOB_NAME: $BUILD_JOB_NAME"
  8. echo "BUILD_PIPELINE_NAME: $BUILD_PIPELINE_NAME"
  9. # shellcheck disable=1090
  10. source "$(dirname $0)/common.sh"
  11. source=$1
  12. if [[ -z "$source" ]]; then
  13. echo "usage: $0 <path/to/source>"
  14. exit 1
  15. fi
  16. # for jq
  17. PATH=/usr/local/bin:$PATH
  18. payload=$(mktemp "$TMPDIR/rclone-resource-request.XXXXXX")
  19. cat > "$payload" <&0
  20. load_config "$payload"
  21. load_files "$payload"
  22. rclone_source_directory=$(jq -r '.params.source // ""' < "$payload")
  23. rclone_destinations=$(jq -r '.params.destination[]? | .dir // ""' < "$payload")
  24. if [[ -z "$rclone_source_directory" ]]; then
  25. echo "invalid source directory (missing source)"
  26. exit 1
  27. fi
  28. if [[ -z "$rclone_destinations" ]]; then
  29. echo "invalid destination (missing destination)"
  30. exit 1
  31. fi
  32. echo "Source directory: $rclone_source_directory"
  33. echo "Destinations:"
  34. jq -c '.params.destination[] | .dir' < "$payload"
  35. local_source_dir="${source}/${rclone_source_directory}"
  36. ls -alh "${local_source_dir}"
  37. echo "Generating SHA256"
  38. sha256_file="${TMPDIR}/rclone_source.sha256"
  39. touch "${sha256_file}"
  40. (find "${local_source_dir}" -type f -exec sha256sum {} \;) | cut -d ' ' -f1 | xargs echo >> "${sha256_file}"
  41. sha256=$(sha256sum "${sha256_file}" | cut -d' ' -f1)
  42. echo "sha256:${sha256}"
  43. # Source is always the same for each destination
  44. rclone_source="${local_source_dir}"
  45. echo "Source: ${rclone_source}"
  46. rclone_sha1=$(rclone sha1sum "${rclone_source}" | cut -d' ' -f1)
  47. echo "rclone sha1:${rclone_sha1}"
  48. destinations=$(jq -r '.params.destination[] | @base64' < "$payload")
  49. echo "Using encoded destinations:"
  50. echo " ${destinations}"
  51. file_links=()
  52. for destination in $destinations; do
  53. _jq() {
  54. echo "${destination}" | base64 -d | jq -r "${1}"
  55. }
  56. rclone_destination=$(_jq '.dir')
  57. rclone_destination_subdir_file=$(_jq '.subdir // ""')
  58. rclone_dedupe=$(_jq '.dedupe // "false"')
  59. rclone_dedupe_mode=$(_jq '.dedupeMode // "newest"')
  60. rclone_args=$(_jq '.args // [] | join(" ")')
  61. rclone_link=$(_jq '.link // "false"')
  62. rclone_link_find_filter=$(_jq '.linkFilter // "-maxdepth 1 -type f"')
  63. echo "Destination: $rclone_destination"
  64. echo "Destination subdir file: ${rclone_destination_subdir_file}"
  65. echo "Run dedupe: ${rclone_dedupe}"
  66. echo "Dedupe mode: ${rclone_dedupe_mode}"
  67. echo "Additonal args: ${rclone_args}"
  68. echo "Generate link: ${rclone_link}"
  69. echo "Link find filter: ${rclone_link_find_filter}"
  70. rclone_destination_subdir=""
  71. if [ -n "$rclone_destination_subdir_file" ]; then
  72. echo "Looking in ${source}/${rclone_destination_subdir_file} for subdir to use"
  73. rclone_destination_subdir=$(head -n 1 < "${source}/${rclone_destination_subdir_file}")
  74. fi
  75. rclone_target="${rclone_destination}/${rclone_destination_subdir}"
  76. echo "Target: ${rclone_target}"
  77. # shellcheck disable=2086
  78. rclone copy "${rclone_source}" "${rclone_target}" --size-only --progress --stats=2s ${rclone_args}
  79. if [[ "$rclone_dedupe" == "true" ]]; then
  80. echo "Running Dedupe for: ${rclone_target}"
  81. # shellcheck disable=2086
  82. rclone dedupe --dedupe-mode "${rclone_dedupe_mode}" "${rclone_target}" --progress --stats=2s ${rclone_args}
  83. fi
  84. if [[ "${rclone_link}" == "true" ]]; then
  85. # shellcheck disable=2086
  86. filesToLink=$(find "${rclone_source}" ${rclone_link_find_filter})
  87. echo "Files to link:"
  88. echo "${filesToLink}"
  89. for file in ${filesToLink}; do
  90. rclone_target_file="${rclone_target}/${file}"
  91. echo "Generating Link for: ${rclone_target_file}"
  92. file_link=$(rclone link "${rclone_target_file}")
  93. file_links+=( "${rclone_target_file}" "${file_link}" )
  94. done
  95. fi
  96. echo "rclone job complete for ${rclone_source} -> ${rclone_target}"
  97. done
  98. if (( ${#file_links[@]} )); then
  99. echo "File Links:" "${file_links[@]}"
  100. # shellcheck disable=2068
  101. metadata=$(printf '{"name": "%s", "value": "%s"},' ${file_links[@]})
  102. metadata=${metadata::-1}
  103. links_json=$( echo -n "{\"links\":[${metadata}]}" | jq -r . )
  104. echo "Links: ${links_json}"
  105. echo "$links_json" > "${rclone_source_directory}/.rclone/links"
  106. jq -n "{
  107. version: {
  108. $( echo -n "build:${BUILD_ID}" | jq -R .),
  109. digest: $( echo -n "sha256:$sha256" | jq -R . ),
  110. metadata: ${links_json}
  111. }
  112. }" >&3
  113. else
  114. jq -n "{
  115. version: {
  116. $( echo -n "build:${BUILD_ID}" | jq -R .),
  117. digest: $( echo -n "sha256:$sha256" | jq -R . )
  118. }
  119. }" >&3
  120. fi