#!/bin/sh
#
# Download a deb package from a NVIDIA Jetson Linux release APT archive
# Requires: devscripts (chdist), wget, apt
#
# SPDX-FileCopyrightText: 2024 Canonical Ltd.
# SPDX-License-Identifier: GPL-3.0-only

# deb package to dowload, e.g. "nvidia-l4t-firmware"
JETSON_PKG=""
# Jetpack release, e.g. "r36.4"
JETSON_REL=""
# Tegra hardware platform; e.g. "t234" for NVIDIA Jetson Orin, "t194" for
# NVIDIA Jetson Xavier
JETSON_PLAT=""
# APT architecture
ARCH="arm64"
# base APT URL and GPG key
JETSON_APT_URL="https://repo.download.nvidia.com/jetson"
JETSON_GPG_URL="${JETSON_APT_URL}/jetson-ota-public.asc"

set -e

log() {
    echo "$(basename "$0"): $*" >&2
}

usage() {
    echo "Usage: $(basename "$0") --platform t234 --release r36.4 --package nvidia-l4t-firmware"
}

if ! GETOPT_OUTPUT="$(/usr/bin/getopt -n "$(basename "$0")" -o "" \
                     --longoptions "help,platform:,release:,package:" \
                     -- "$@")"; then
    usage >&2
    exit 1
fi
eval set -- "$GETOPT_OUTPUT"

while [ $# -gt 0 ]; do
    case "$1" in
      --platform)
        JETSON_PLAT="$2"
        shift 2
      ;;
      --release)
        JETSON_REL="$2"
        shift 2
      ;;
      --package)
        JETSON_PKG="$2"
        shift 2
      ;;
      --help)
        usage
        exit 0
      ;;
      --)
        shift
        if [ $# -gt 0 ]; then
            echo "Too many arguments"
            usage >&2
            exit 1
        fi
        break
      ;;
      *)
        echo "Unknown argument $1"
        usage >&2
        exit 1
      ;;
    esac
done

if [ -z "${JETSON_PLAT}" ] || [ -z "${JETSON_REL}" ] ||
   [ -z "${JETSON_PKG}" ]; then
    echo "Need to set platform, release and package" >&2
    usage >&2
    exit 1
fi

CHDIST_TMPDIR="$(mktemp -d)"
cleanup() {
    log "Cleaning up tmpdir ${CHDIST_TMPDIR}..."
    rm -rf "${CHDIST_TMPDIR}"
}
trap cleanup EXIT

# chdist dist
DIST="${JETSON_REL}-${JETSON_PLAT}"

log "Setting up APT repository for ${DIST}..."

chdist -d "${CHDIST_TMPDIR}" -a "${ARCH}" create "${DIST}"

cat >"${CHDIST_TMPDIR}/${DIST}/etc/apt/sources.list" <<EOF
deb ${JETSON_APT_URL}/common ${JETSON_REL} main
deb ${JETSON_APT_URL}/${JETSON_PLAT} ${JETSON_REL} main
EOF

log "Getting public key from ${JETSON_GPG_URL}..."

wget -O "${CHDIST_TMPDIR}/${DIST}/etc/apt/trusted.gpg.d/jetson-linux.asc" \
     "${JETSON_GPG_URL}"

log "Updating APT repository for ${DIST}..."
chdist -d "${CHDIST_TMPDIR}" -a "${ARCH}" \
    apt "${DIST}" update

log "Downloading ${JETSON_PKG}..."
chdist -d "${CHDIST_TMPDIR}" -a "${ARCH}" \
    apt "${DIST}" download "${JETSON_PKG}"

