#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SKILL_ROOT="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/_common.sh" : "${VAULT_ROOT:=~/infrastructure/vault}" : "${AGE_KEY_DIR:=~/.config/sops/age}" : "${AGE_KEYS_FILE:=~/.config/sops/age/keys.txt}" : "${RECIPIENTS_FILE:=$SKILL_ROOT/outputs/recipients.txt}" : "${BACKUP_DIR:=$SKILL_ROOT/outputs/backups}" backup_file() { local f="$1" mkdir -p "$BACKUP_DIR" if [[ -f "$f" ]]; then ts="$(date -Iseconds | tr ':' '-')" cp -p "$f" "$BACKUP_DIR/$(basename "$f").${ts}.bak" fi } main() { confirm_gate mkdir -p "$SKILL_ROOT/outputs" "$BACKUP_DIR" vr="$(expand_path "$VAULT_ROOT")" kd="$(expand_path "$AGE_KEY_DIR")" kf="$(expand_path "$AGE_KEYS_FILE")" mkdir -p "$vr/secrets" mkdir -p "$kd" # 1) ensure age identity exists if [[ ! -f "$kf" ]]; then log_info "Generating age identity: $kf" age-keygen -o "$kf" >/dev/null chmod 600 "$kf" else log_info "Using existing age identity: $kf" chmod 600 "$kf" || true fi # extract recipient (public key) recipient="$(grep -E '^# public key: ' "$kf" | head -n1 | sed 's/^# public key: //')" [[ -n "$recipient" ]] || die "Could not parse public key from $kf" echo "$recipient" > "$RECIPIENTS_FILE" # 2) write .sops.yaml policy policy="$vr/.sops.yaml" backup_file "$policy" cat > "$policy" < "$tmpdir/cloudflare.yaml" < "$vr/secrets/cloudflare.enc.yaml" # gitea cat > "$tmpdir/gitea.yaml" < "$vr/secrets/gitea.enc.yaml" # registry cat > "$tmpdir/registry.yaml" < "$vr/secrets/registry.enc.yaml" # k8s cat > "$tmpdir/k8s.yaml" < "$vr/secrets/k8s.enc.yaml" # 4) vault README readme="$vr/README.md" backup_file "$readme" cat > "$readme" < "$SKILL_ROOT/outputs/vault_root.txt" log_info "Vault forged at: $vr" log_info "Recipient: $recipient" } main "$@"