03-migrate-casaos.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #!/bin/bash
  2. set -e
  3. # functions
  4. __info() {
  5. echo -e "🟩 ${1}"
  6. }
  7. __info_done() {
  8. echo -e "✅ ${1}"
  9. }
  10. __warning() {
  11. echo -e "🟨 ${1}"
  12. }
  13. __error() {
  14. echo "🟥 ${1}"
  15. exit 1
  16. }
  17. __is_version_gt() {
  18. test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"
  19. }
  20. __normalize_version() {
  21. local version
  22. if [ "${1::1}" = "v" ]; then
  23. version="${1:1}"
  24. else
  25. version="${1}"
  26. fi
  27. echo "$version"
  28. }
  29. __is_migration_needed() {
  30. local version1
  31. local version2
  32. version1=$(__normalize_version "${1}")
  33. version2=$(__normalize_version "${2}")
  34. if [ "${version1}" = "${version2}" ]; then
  35. return 1
  36. fi
  37. if [ "CURRENT_VERSION_NOT_FOUND" = "${version1}" ]; then
  38. return 1
  39. fi
  40. if [ "LEGACY_WITHOUT_VERSION" = "${version1}" ]; then
  41. return 0
  42. fi
  43. __is_version_gt "${version2}" "${version1}"
  44. }
  45. __get_download_domain(){
  46. local region
  47. # Use ipconfig.io/country and https://ifconfig.io/country_code to get the country code
  48. region=$(curl --connect-timeout 2 -s ipconfig.io/country || echo "")
  49. if [ "${region}" = "" ]; then
  50. region=$(curl --connect-timeout 2 -s https://ifconfig.io/country_code || echo "")
  51. fi
  52. if [[ "${region}" = "China" ]] || [[ "${region}" = "CN" ]]; then
  53. echo "https://casaos.oss-cn-shanghai.aliyuncs.com/"
  54. else
  55. echo "https://github.com/"
  56. fi
  57. }
  58. DOWNLOAD_DOMAIN=$(__get_download_domain)
  59. BUILD_PATH=$(dirname "${BASH_SOURCE[0]}")/../../..
  60. SOURCE_ROOT=${BUILD_PATH}/sysroot
  61. APP_NAME="casaos"
  62. # check if migration is needed
  63. SOURCE_BIN_PATH=${SOURCE_ROOT}/usr/bin
  64. SOURCE_BIN_FILE=${SOURCE_BIN_PATH}/${APP_NAME}
  65. CURRENT_BIN_PATH=/usr/bin
  66. CURRENT_BIN_PATH_LEGACY=/usr/local/bin
  67. CURRENT_BIN_FILE=${CURRENT_BIN_PATH}/${APP_NAME}
  68. CURRENT_BIN_FILE_LEGACY=$(realpath -e ${CURRENT_BIN_PATH_LEGACY}/${APP_NAME} || which ${APP_NAME} || echo CURRENT_BIN_FILE_LEGACY_NOT_FOUND)
  69. SOURCE_VERSION="$(${SOURCE_BIN_FILE} -v)"
  70. CURRENT_VERSION="$(${CURRENT_BIN_FILE} -v || ${CURRENT_BIN_FILE_LEGACY} -v || (stat "${CURRENT_BIN_FILE_LEGACY}" >/dev/null && echo LEGACY_WITHOUT_VERSION) || echo CURRENT_VERSION_NOT_FOUND)"
  71. __info_done "CURRENT_VERSION: ${CURRENT_VERSION}"
  72. __info_done "SOURCE_VERSION: ${SOURCE_VERSION}"
  73. NEED_MIGRATION=$(__is_migration_needed "${CURRENT_VERSION}" "${SOURCE_VERSION}" && echo "true" || echo "false")
  74. if [ "${NEED_MIGRATION}" = "false" ]; then
  75. __info_done "Migration is not needed."
  76. exit 0
  77. fi
  78. ARCH="unknown"
  79. case $(uname -m) in
  80. x86_64)
  81. ARCH="amd64"
  82. ;;
  83. aarch64)
  84. ARCH="arm64"
  85. ;;
  86. armv7l)
  87. ARCH="arm-7"
  88. ;;
  89. *)
  90. __error "Unsupported architecture"
  91. ;;
  92. esac
  93. __info "ARCH: ${ARCH}"
  94. MIGRATION_SERVICE_DIR=${1}
  95. if [ -z "${MIGRATION_SERVICE_DIR}" ]; then
  96. MIGRATION_SERVICE_DIR=${BUILD_PATH}/scripts/migration/service.d/${APP_NAME}
  97. fi
  98. MIGRATION_LIST_FILE=${MIGRATION_SERVICE_DIR}/migration.list
  99. MIGRATION_PATH=()
  100. CURRENT_VERSION_FOUND="false"
  101. # a VERSION_PAIR looks like "v0.3.5 <url>"
  102. #
  103. # - "v0.3.5" is the current version installed on this host
  104. # - "<url>" is the url of the migration tool
  105. while read -r VERSION_PAIR; do
  106. if [ -z "${VERSION_PAIR}" ]; then
  107. continue
  108. fi
  109. # obtain "v0.3.5" from "v0.3.5 v0.3.6-alpha2"
  110. VER1=$(echo "${VERSION_PAIR}" | cut -d' ' -f1)
  111. # obtain "<url>" from "v0.3.5 <url>"
  112. URL=$(eval echo "${VERSION_PAIR}" | cut -d' ' -f2)
  113. if [ "${CURRENT_VERSION}" = "${VER1// /}" ] || [ "${CURRENT_VERSION}" = "LEGACY_WITHOUT_VERSION" ]; then
  114. CURRENT_VERSION_FOUND="true"
  115. fi
  116. if [ "${CURRENT_VERSION_FOUND}" = "true" ]; then
  117. MIGRATION_PATH+=("${URL// /}")
  118. fi
  119. done <"${MIGRATION_LIST_FILE}"
  120. if [ ${#MIGRATION_PATH[@]} -eq 0 ]; then
  121. __warning "No migration path found from ${CURRENT_VERSION} to ${SOURCE_VERSION}"
  122. exit 0
  123. fi
  124. pushd "${MIGRATION_SERVICE_DIR}"
  125. {
  126. for URL in "${MIGRATION_PATH[@]}"; do
  127. MIGRATION_TOOL_FILE=$(basename "${URL}")
  128. if [ -f "${MIGRATION_TOOL_FILE}" ]; then
  129. __info "Migration tool ${MIGRATION_TOOL_FILE} exists. Skip downloading."
  130. continue
  131. fi
  132. __info "Dowloading ${URL}..."
  133. curl -fsSL -o "${MIGRATION_TOOL_FILE}" -O "${URL}"
  134. done
  135. } || {
  136. popd
  137. __error "Failed to download migration tools"
  138. }
  139. {
  140. for URL in "${MIGRATION_PATH[@]}"; do
  141. MIGRATION_TOOL_FILE=$(basename "${URL}")
  142. __info "Extracting ${MIGRATION_TOOL_FILE}..."
  143. tar zxvf "${MIGRATION_TOOL_FILE}" || __error "Failed to extract ${MIGRATION_TOOL_FILE}"
  144. MIGRATION_TOOL_PATH=build/sysroot/usr/bin/${APP_NAME}-migration-tool
  145. __info "Running ${MIGRATION_TOOL_PATH}..."
  146. ${MIGRATION_TOOL_PATH}
  147. done
  148. } || {
  149. popd
  150. __error "Failed to extract and run migration tools"
  151. }
  152. popd