#!/usr/bin/env bash set -euo pipefail # === METADATA === SCRIPT_NAME="$(basename "$0")" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SKILL_ROOT="$(dirname "$SCRIPT_DIR")" # === CONFIGURATION === : "${OPERATOR_NAME:?OPERATOR_NAME required}" : "${OPERATOR_EMAIL:?OPERATOR_EMAIL required}" : "${NODE_NAME:=node-a}" : "${SSH_KEY_COMMENT:=$NODE_NAME-operator}" : "${GPG_KEY_SIZE:=4096}" : "${GPG_KEY_EXPIRE:=2y}" : "${OUTPUT_DIR:=$SKILL_ROOT/outputs}" # === FUNCTIONS === log_info() { echo "[INFO] $(date -Iseconds) $*"; } log_warn() { echo "[WARN] $(date -Iseconds) $*" >&2; } log_error() { echo "[ERROR] $(date -Iseconds) $*" >&2; } die() { log_error "$@"; exit 1; } preflight() { [[ -d "$OUTPUT_DIR" ]] || mkdir -p "$OUTPUT_DIR" [[ -d "$HOME/.ssh" ]] || { mkdir -p "$HOME/.ssh" && chmod 700 "$HOME/.ssh"; } } create_gpg_key() { if gpg --list-keys "$OPERATOR_EMAIL" &>/dev/null 2>&1; then log_info "GPG key for $OPERATOR_EMAIL already exists - skipping" return 0 fi log_info "Generating GPG key (you will be prompted for passphrase)..." # Create key generation parameters local params_file params_file=$(mktemp) cat > "$params_file" </dev/null; then log_info "SSH config entry for $NODE_NAME already exists - skipping" return 0 fi # Append new entry cat >> "$config" </dev/null | grep fpr | head -1 | cut -d: -f10 || echo "unknown") cat > "$manifest" <