#!/usr/bin/env bash set -euo pipefail script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" output="${1:-${script_dir}/seed.iso}" files=(user-data meta-data) # Public key injected into user-data: $SSH_PUBKEY_FILE, else the first # ~/.ssh/id_*.pub, else the first key offered by ssh-agent. pubkey="" if [[ -n "${SSH_PUBKEY_FILE:-}" ]]; then pubkey="$(head -n1 -- "${SSH_PUBKEY_FILE}")" else for f in "${HOME}"/.ssh/id_ed25519.pub "${HOME}"/.ssh/id_*.pub; do if [[ -f "$f" ]]; then pubkey="$(head -n1 -- "$f")"; break; fi done if [[ -z "$pubkey" ]] && command -v ssh-add >/dev/null 2>&1; then pubkey="$(ssh-add -L 2>/dev/null | head -n1 || true)" fi fi if [[ "$pubkey" != ssh-* && "$pubkey" != ecdsa-* && "$pubkey" != sk-* ]]; then printf 'Error: no SSH public key found; set SSH_PUBKEY_FILE.\n' >&2 exit 1 fi work="$(mktemp -d)" trap 'rm -rf -- "${work}"' EXIT template="$(<"${script_dir}/user-data")" printf '%s\n' "${template//@SSH_PUBKEY@/${pubkey}}" > "${work}/user-data" cp -- "${script_dir}/meta-data" "${work}/meta-data" if [[ -f "${script_dir}/network-config" ]]; then cp -- "${script_dir}/network-config" "${work}/network-config" fi mkdir -p "$(dirname -- "$output")" if [[ -f "${script_dir}/network-config" ]]; then files+=(network-config) fi if command -v cloud-localds >/dev/null 2>&1; then args=() if [[ -f "${script_dir}/network-config" ]]; then args+=(--network-config="${work}/network-config") fi cloud-localds "${args[@]}" "${output}" \ "${work}/user-data" "${work}/meta-data" elif command -v xorriso >/dev/null 2>&1; then xorriso -as mkisofs -quiet -volid cidata -joliet -rock \ -output "${output}" "${files[@]/#/${work}/}" elif command -v genisoimage >/dev/null 2>&1; then genisoimage -quiet -output "${output}" -volid cidata -joliet -rock \ "${files[@]/#/${work}/}" elif command -v mkisofs >/dev/null 2>&1; then mkisofs -quiet -output "${output}" -volid cidata -joliet -rock \ "${files[@]/#/${work}/}" else printf 'Error: install cloud-image-utils, xorriso, genisoimage, or mkisofs.\n' >&2 exit 1 fi printf 'Created %s\n' "${output}"