Skip to content

Commit 5144f1d

Browse files
committed
Add hack/update-ubuntu-image.sh
```console $ hack/update-ubuntu-image.sh --help update-ubuntu-image.sh: Update the Ubuntu image location in the specified templates Usage: update-ubuntu-image.sh [--minimal|--server] [--version <version>] <template.yaml>... Description: This script updates the Ubuntu image location in the specified templates. If the image location in the template contains a release date in the URL, the script replaces it with the latest available date. If no flags are specified, the script uses the flavor and version from the image location basename in the template. Image location basename format: ubuntu-<version>-<flavor>-cloudimg-<arch>.img Released Ubuntu image information is fetched from the following URLs: Server: https://cloud-images.ubuntu.com/releases/stream/v1/com.ubuntu.cloud:released:download.json Minimal: https://cloud-images.ubuntu.com/minimal/releases/stream/v1/com.ubuntu.cloud:released:download.json The downloaded JSON file will be cached in the Lima cache directory. Examples: Update the Ubuntu image location in templates/**.yaml: $ update-ubuntu-image.sh templates/**.yaml Update the Ubuntu image location in ~/.lima/ubuntu/lima.yaml: $ update-ubuntu-image.sh ~/.lima/ubuntu/lima.yaml Update the Ubuntu image location to ubuntu-24.04-minimal-cloudimg-<arch>.img in ~/.lima/docker/lima.yaml: $ update-ubuntu-image.sh --minimal --version 24.04 ~/.lima/docker/lima.yaml Flags: --server Use the server flavor image --minimal Use the minimal flavor image --version <version> Use the specified version -h, --help Print this help message ``` Signed-off-by: Norio Nomura <[email protected]>
1 parent a26c031 commit 5144f1d

File tree

2 files changed

+390
-1
lines changed

2 files changed

+390
-1
lines changed

hack/cache-common-inc.sh

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,26 @@ function location_to_sha256() {
216216
)
217217
}
218218

219+
# e.g.
220+
# ```console
221+
# $ cache_download_dir
222+
# .download # on GitHub Actions
223+
# /home/user/.cache/lima/download # on Linux
224+
# /Users/user/Library/Caches/lima/download # on macOS
225+
# /home/user/.cache/lima/download # on others
226+
# ```
227+
function cache_download_dir() {
228+
if [[ ${GITHUB_ACTIONS:-false} == true ]]; then
229+
echo ".download"
230+
else
231+
case "$(uname -s)" in
232+
Linux) echo "${XDG_CACHE_HOME:-${HOME}/.cache}/lima/download" ;;
233+
Darwin) echo "${HOME}/Library/Caches/lima/download" ;;
234+
*) echo "${HOME}/.cache/lima/download" ;;
235+
esac
236+
fi
237+
}
238+
219239
# e.g.
220240
# ```console
221241
# $ location_to_cache_path "https://cloud-images.ubuntu.com/releases/24.04/release-20240809/ubuntu-24.04-server-cloudimg-arm64.img"
@@ -224,7 +244,7 @@ function location_to_sha256() {
224244
function location_to_cache_path() {
225245
local location=$1
226246
[[ ${location} != "null" ]] || return
227-
sha256=$(location_to_sha256 "${location}") && echo ".download/by-url-sha256/${sha256}"
247+
sha256=$(location_to_sha256 "${location}") && download_dir=$(cache_download_dir) && echo "${download_dir}/by-url-sha256/${sha256}"
228248
}
229249

230250
# e.g.
@@ -321,3 +341,48 @@ function hash_file() {
321341
echo "${hash}" | xxd -r -p | sha256sum | cut -d' ' -f1
322342
)
323343
}
344+
345+
# Download the file to the cache directory and print the path.
346+
# e.g.
347+
# ```console
348+
# $ download_to_cache "https://cloud-images.ubuntu.com/releases/24.04/release-20240821/ubuntu-24.04-server-cloudimg-arm64.img"
349+
# .download/by-url-sha256/346ee1ff9e381b78ba08e2a29445960b5cd31c51f896fc346b82e26e345a5b9a/data # on GitHub Actions
350+
# /home/user/.cache/lima/download/by-url-sha256/346ee1ff9e381b78ba08e2a29445960b5cd31c51f896fc346b82e26e345a5b9a/data # on Linux
351+
# /Users/user/Library/Caches/lima/download/by-url-sha256/346ee1ff9e381b78ba08e2a29445960b5cd31c51f896fc346b82e26e345a5b9a/data # on macOS
352+
# /home/user/.cache/lima/download/by-url-sha256/346ee1ff9e381b78ba08e2a29445960b5cd31c51f896fc346b82e26e345a5b9a/data # on others
353+
function download_to_cache() {
354+
local code_time_type_url
355+
code_time_type_url=$(
356+
curl -sSLI -w "%{http_code}\t%header{Last-Modified}\t%header{Content-Type}\t%{url_effective}" "$1" -o /dev/null
357+
)
358+
359+
local code time type url
360+
IFS=$'\t' read -r code time type url filename <<<"${code_time_type_url}"
361+
[[ ${code} == 200 ]] || exit 1
362+
363+
local cache_path
364+
cache_path=$(location_to_cache_path "${url}")
365+
[[ -d ${cache_path} ]] || mkdir -p "${cache_path}"
366+
367+
local needs_download=0
368+
[[ -f ${cache_path}/data ]] || needs_download=1
369+
[[ -f ${cache_path}/time && "$(<"${cache_path}/time")" == "${time}" ]] || needs_download=1
370+
[[ -f ${cache_path}/type && "$(<"${cache_path}/type")" == "${type}" ]] || needs_download=1
371+
if [[ ${needs_download} -eq 1 ]]; then
372+
local code_time_type_url_filename
373+
code_time_type_url_filename=$(
374+
echo "downloading ${url}" >&2
375+
curl -SL -w "%{http_code}\t%header{Last-Modified}\t%header{Content-Type}\t%{url_effective}\t%{filename_effective}" --no-clobber -o "${cache_path}/data" "${url}"
376+
)
377+
local filename
378+
IFS=$'\t' read -r code time type url filename <<<"${code_time_type_url_filename}"
379+
[[ ${code} == 200 ]] || exit 1
380+
[[ "${cache_path}/data" == "${filename}" ]] || mv "${filename}" "${cache_path}/data"
381+
# sha256.digest seems existing if expected digest is available. so, not creating it here.
382+
# sha256sum "${cache_path}/data" | awk '{print "sha256:"$1}' >"${cache_path}/sha256.digest"
383+
echo -n "${time}" >"${cache_path}/time"
384+
fi
385+
[[ -f ${cache_path}/type ]] || echo -n "${type}" >"${cache_path}/type"
386+
[[ -f ${cache_path}/url ]] || echo -n "${url}" >"${cache_path}/url"
387+
echo "${cache_path}/data"
388+
}

0 commit comments

Comments
 (0)