038d59f972
Centralize salmanoff snapcraft, dangerous-model image scripts, and QEMU workflow so UC26 can be reproduced from the SMO repo without ubuntu-core-practice. Co-authored-by: Cursor <cursoragent@cursor.com>
107 lines
3.1 KiB
Bash
Executable File
107 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Sign dangerous-grade model + system-user assertions for salmanoff-dev-amd64.
|
|
set -euo pipefail
|
|
|
|
UC_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ENV_FILE="${UC_ROOT}/config/dev-image.env"
|
|
MODEL_TEMPLATE="${UC_ROOT}/models/salmanoff-dev-amd64.model.json"
|
|
ASSERT_DIR="${UC_ROOT}/assertions"
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage: sign-dev-assertions.sh [OPTIONS]
|
|
|
|
Sign the dev model assertion and a system-user assertion (SSH key, no Ubuntu One).
|
|
|
|
Requires config/dev-image.env (see scripts/setup-dev-signing.sh).
|
|
|
|
Outputs:
|
|
models/salmanoff-dev-amd64.model
|
|
assertions/smo-system-user.assert (account + account-key + system-user chain)
|
|
EOF
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-h|--help) usage; exit 0 ;;
|
|
*) echo "Unknown option: $1" >&2; usage >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
echo "Missing $ENV_FILE — run scripts/setup-dev-signing.sh first" >&2
|
|
exit 1
|
|
fi
|
|
# shellcheck source=/dev/null
|
|
source "$ENV_FILE"
|
|
|
|
: "${ACCOUNT_ID:?ACCOUNT_ID not set in $ENV_FILE}"
|
|
: "${SIGN_KEY_NAME:?SIGN_KEY_NAME not set in $ENV_FILE}"
|
|
: "${SYSTEM_USER_NAME:=smo}"
|
|
: "${SYSTEM_USER_EMAIL:=smo-dev@salmanoff}"
|
|
: "${SSH_PUBKEY_FILE:=config/ssh/smo-dev.pub}"
|
|
: "${MODEL_NAME:=salmanoff-dev-amd64}"
|
|
|
|
SSH_PUBKEY_PATH="${UC_ROOT}/${SSH_PUBKEY_FILE}"
|
|
if [[ ! -f "$SSH_PUBKEY_PATH" ]]; then
|
|
echo "SSH public key not found: $SSH_PUBKEY_PATH" >&2
|
|
echo "Run scripts/setup-dev-signing.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
KEY_FP="$(snap keys 2>/dev/null | awk -v k="$SIGN_KEY_NAME" '$1 == k {print $2}')"
|
|
if [[ -z "$KEY_FP" ]]; then
|
|
echo "Signing key '$SIGN_KEY_NAME' not found. Run scripts/setup-dev-signing.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! snap known --remote account-key "public-key-sha3-384=${KEY_FP}" >/dev/null 2>&1; then
|
|
echo "Key '$SIGN_KEY_NAME' is not registered in the Snap Store." >&2
|
|
echo "Run: snapcraft register-key $SIGN_KEY_NAME" >&2
|
|
exit 1
|
|
fi
|
|
|
|
export GPG_TTY="${GPG_TTY:-$(tty)}"
|
|
|
|
mkdir -p "$ASSERT_DIR" "${UC_ROOT}/models"
|
|
|
|
TIMESTAMP="$(date -Iseconds --utc)"
|
|
MODEL_JSON="$(mktemp)"
|
|
MODEL_OUT="${UC_ROOT}/models/${MODEL_NAME}.model"
|
|
SYSTEM_USER_JSON="$(mktemp)"
|
|
SYSTEM_USER_OUT="${ASSERT_DIR}/smo-system-user.assert"
|
|
|
|
sed -e "s/@ACCOUNT_ID@/${ACCOUNT_ID}/g" \
|
|
-e "s/@TIMESTAMP@/${TIMESTAMP}/g" \
|
|
"$MODEL_TEMPLATE" > "$MODEL_JSON"
|
|
|
|
echo "Signing model → $MODEL_OUT"
|
|
snap sign -k "$SIGN_KEY_NAME" "$MODEL_JSON" > "$MODEL_OUT"
|
|
|
|
SSH_PUB="$(tr -d '\n' < "$SSH_PUBKEY_PATH")"
|
|
cat > "$SYSTEM_USER_JSON" <<EOF
|
|
{
|
|
"type": "system-user",
|
|
"authority-id": "${ACCOUNT_ID}",
|
|
"brand-id": "${ACCOUNT_ID}",
|
|
"series": ["16"],
|
|
"models": ["${MODEL_NAME}"],
|
|
"name": "Salmanoff Dev",
|
|
"username": "${SYSTEM_USER_NAME}",
|
|
"email": "${SYSTEM_USER_EMAIL}",
|
|
"ssh-keys": ["${SSH_PUB}"],
|
|
"since": "2026-06-21T00:00:00+00:00",
|
|
"until": "2064-06-21T00:00:00+00:00"
|
|
}
|
|
EOF
|
|
|
|
echo "Signing system-user chain → $SYSTEM_USER_OUT"
|
|
snap sign -k "$SIGN_KEY_NAME" "$SYSTEM_USER_JSON" --chain > "$SYSTEM_USER_OUT"
|
|
|
|
rm -f "$MODEL_JSON" "$SYSTEM_USER_JSON"
|
|
|
|
echo ""
|
|
echo "Model authority/brand: $ACCOUNT_ID"
|
|
echo "System user: ${SYSTEM_USER_NAME} (SSH pubkey from ${SSH_PUBKEY_FILE})"
|
|
echo "Signing key: ${SIGN_KEY_NAME} (${KEY_FP})"
|