Reticulum-Go/microvm/fetch-kernel.sh

77 lines
1.9 KiB
Bash
Executable file

#!/usr/bin/env bash
# Download a Firecracker CI guest kernel into microvm/out/vmlinux.
#
# Usage:
# ./microvm/fetch-kernel.sh
# KERNEL_SERIES=6.1 ./microvm/fetch-kernel.sh
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUT="${ROOT}/out"
mkdir -p "${OUT}"
ARCH="$(uname -m)"
case "${ARCH}" in
x86_64 | aarch64) ;;
arm64) ARCH=aarch64 ;;
*)
echo "unsupported arch: ${ARCH}" >&2
exit 1
;;
esac
S3="https://s3.amazonaws.com/spec.ccfc.min"
KERNEL_SERIES="${KERNEL_SERIES:-6.1}"
echo "listing Firecracker CI artifact prefixes"
PREFIXES_XML="$(curl -fsSL "${S3}?list-type=2&prefix=firecracker-ci/&delimiter=/")"
# Prefer dated CI builds (YYYYMMDD-...), newest last.
CI_PREFIX="$(printf '%s\n' "${PREFIXES_XML}" \
| grep -oE 'firecracker-ci/[0-9]{8}-[^/<]+/' \
| sort \
| tail -n1 || true)"
if [[ -z "${CI_PREFIX}" ]]; then
echo "no dated firecracker-ci prefixes found" >&2
exit 1
fi
echo "using prefix ${CI_PREFIX}${ARCH}/"
KEYS_XML="$(curl -fsSL "${S3}?list-type=2&prefix=${CI_PREFIX}${ARCH}/vmlinux-")"
# Match bare object keys only (no trailing punctuation from XML tags).
mapfile -t ALL_KEYS < <(printf '%s\n' "${KEYS_XML}" \
| grep -oE "${CI_PREFIX}${ARCH}/vmlinux-[0-9]+\.[0-9]+\.[0-9]+" \
| sort -V \
| uniq)
if [[ "${#ALL_KEYS[@]}" -eq 0 ]]; then
echo "no vmlinux keys under ${CI_PREFIX}${ARCH}/" >&2
exit 1
fi
LATEST_KEY=""
for key in "${ALL_KEYS[@]}"; do
base="$(basename "${key}")"
case "${base}" in
vmlinux-${KERNEL_SERIES}.*)
LATEST_KEY="${key}"
;;
esac
done
if [[ -z "${LATEST_KEY}" ]]; then
LATEST_KEY="${ALL_KEYS[-1]}"
echo "no vmlinux-${KERNEL_SERIES}.* found, falling back to ${LATEST_KEY}"
fi
DEST="${OUT}/vmlinux"
TMP="${DEST}.partial"
echo "downloading ${S3}/${LATEST_KEY}"
curl -fL --progress-bar -o "${TMP}" "${S3}/${LATEST_KEY}"
mv -f "${TMP}" "${DEST}"
chmod a-w "${DEST}" || true
printf '%s\n' "${LATEST_KEY}" >"${OUT}/vmlinux.source"
echo "wrote ${DEST}"
ls -lh "${DEST}"