#!/bin/sh set -eu VERSION="${SYSGEN_VERSION:-0.1.3}" BASE_URL="${SYSGEN_BASE_URL:-https://sysgen.sh}" case "$(uname -m 2>/dev/null || true)" in x86_64|amd64) TARGET="x86_64-linux-musl" ;; *) echo "sysgen: unsupported architecture (v${VERSION} ships x86_64 only)" >&2 exit 1 ;; esac command -v bash >/dev/null 2>&1 || { echo "sysgen: bash is required" >&2 exit 1 } command -v tar >/dev/null 2>&1 || { echo "sysgen: tar is required" >&2 exit 1 } TMP="$(mktemp -d "${TMPDIR:-/tmp}/sysgen-install.XXXXXX")" trap 'rm -rf "$TMP"' EXIT HUP INT TERM ARTIFACT="sysgen-v${VERSION}-${TARGET}.tar.gz" RELEASE_URL="${BASE_URL%/}/releases/v${VERSION}" download() { url="$1" output="$2" if command -v curl >/dev/null 2>&1; then case "$url" in https://*) curl --proto '=https' --tlsv1.2 -fsSL "$url" -o "$output" ;; *) curl -fsSL "$url" -o "$output" ;; esac elif command -v wget >/dev/null 2>&1; then wget -qO "$output" "$url" else echo "sysgen: curl or wget is required" >&2 exit 1 fi } download "$RELEASE_URL/$ARTIFACT" "$TMP/$ARTIFACT" download "$RELEASE_URL/SHA256SUMS" "$TMP/SHA256SUMS" EXPECTED="$(awk -v file="$ARTIFACT" '$2 == file || $2 == "*" file { print $1; exit }' "$TMP/SHA256SUMS")" [ -n "$EXPECTED" ] || { echo "sysgen: release checksum is missing" >&2 exit 1 } if command -v sha256sum >/dev/null 2>&1; then ACTUAL="$(sha256sum "$TMP/$ARTIFACT" | awk '{print $1}')" elif command -v shasum >/dev/null 2>&1; then ACTUAL="$(shasum -a 256 "$TMP/$ARTIFACT" | awk '{print $1}')" else echo "sysgen: sha256sum or shasum is required" >&2 exit 1 fi [ "$EXPECTED" = "$ACTUAL" ] || { echo "sysgen: release checksum mismatch" >&2 exit 1 } mkdir -p "$TMP/unpack" tar -xzf "$TMP/$ARTIFACT" -C "$TMP/unpack" PACKAGE="$TMP/unpack/sysgen-v${VERSION}-${TARGET}" [ -x "$PACKAGE/boot.sh" ] && [ -x "$PACKAGE/sysgend" ] || { echo "sysgen: release package is incomplete" >&2 exit 1 } exec bash "$PACKAGE/boot.sh" --service "$@"