#!/bin/sh set -eu version="" source_dir="dist" usage() { cat <<'EOF' Usage: create-installer-release-manifest.sh --version VERSION [--source-dir DIR] Validates the three packaged installer files and writes the fourth durable asset, vastora-release-manifest.json, used by both GitHub Releases and R2. EOF } while [ "$#" -gt 0 ]; do case "$1" in --version) version="${2:-}"; shift 2 ;; --source-dir) source_dir="${2:-}"; shift 2 ;; -h|--help) usage; exit 0 ;; *) echo "Unknown argument: $1" >&2; usage >&2; exit 2 ;; esac done if ! printf '%s' "$version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then echo "Version must be valid Vastora SemVer." >&2 exit 2 fi for required in awk grep jq sh sha256sum tar; do if ! command -v "$required" >/dev/null 2>&1; then echo "Required command is not installed: $required" >&2 exit 1 fi done installer="$source_dir/install.sh" bundle="$source_dir/vastora-center-install.tar.gz" checksum="$source_dir/vastora-center-install.tar.gz.sha256" manifest="$source_dir/vastora-release-manifest.json" for required_file in "$installer" "$bundle" "$checksum"; do if [ ! -f "$required_file" ]; then echo "Release asset is missing: $required_file" >&2 exit 1 fi done if ! sh -n "$installer"; then echo "The Center installer script is invalid." >&2 exit 1 fi bundle_version="$(tar -xOzf "$bundle" ./release.env 2>/dev/null | awk -F= '$1 == "VASTORA_VERSION" {print $2; exit}')" if [ "$bundle_version" != "$version" ]; then echo "The Center bundle version does not match the release version." >&2 exit 1 fi center_image="$(tar -xOzf "$bundle" ./release.env 2>/dev/null | awk -F= '$1 == "VASTORA_CENTER_IMAGE" {sub(/^[^=]*=/, ""); print; exit}')" if ! printf '%s\n' "$center_image" | grep -Eq '^ghcr\.io/petauron/vastora-center@sha256:[0-9a-f]{64}$'; then echo "The Center bundle image is not pinned by a valid release digest." >&2 exit 1 fi expected_bundle_digest="$(awk 'NR == 1 {print tolower($1)}' "$checksum")" actual_bundle_digest="$(sha256sum "$bundle" | awk 'NR == 1 {print tolower($1)}')" if ! printf '%s\n' "$expected_bundle_digest" | grep -Eq '^[0-9a-f]{64}$' || [ "$actual_bundle_digest" != "$expected_bundle_digest" ]; then echo "The Center bundle checksum is invalid." >&2 exit 1 fi prefix="vastora/releases/v$version" installer_digest="$(sha256sum "$installer" | awk 'NR == 1 {print tolower($1)}')" checksum_digest="$(sha256sum "$checksum" | awk 'NR == 1 {print tolower($1)}')" jq -n -S \ --arg version "$version" \ --arg center_image "$center_image" \ --arg installer_key "$prefix/install.sh" \ --arg installer_digest "$installer_digest" \ --arg bundle_key "$prefix/vastora-center-install.tar.gz" \ --arg bundle_digest "$actual_bundle_digest" \ --arg checksum_key "$prefix/vastora-center-install.tar.gz.sha256" \ --arg checksum_digest "$checksum_digest" \ '{schema: 1, version: $version, centerImage: $center_image, assets: { "install.sh": {key: $installer_key, sha256: $installer_digest}, "vastora-center-install.tar.gz": {key: $bundle_key, sha256: $bundle_digest}, "vastora-center-install.tar.gz.sha256": {key: $checksum_key, sha256: $checksum_digest} }}' > "$manifest" echo "Created $manifest"