#!/usr/bin/env bash set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" DEST="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}" ARCHIVE="${1:-$REPO_DIR/secrets/vault-pass.txt.zip}" VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}" usage() { cat </dev/null 2>&1; then echo "Missing dependency: $1" >&2 echo "Please install it first." >&2 exit 3 fi } create_new_password() { require_cmd ansible-vault require_cmd python3 ensure_dest_dir umask 077 python3 - <<'PY' > "$DEST" import secrets print(secrets.token_urlsafe(48)) PY secure_dest echo "Created new vault password file: $DEST" if [ -f "$VAULT_FILE" ]; then if ansible-vault view "$VAULT_FILE" --vault-password-file "$DEST" >/dev/null 2>&1; then echo "Existing vault is already readable with the new password. No re-encryption needed." else cat < "$tmp" <<'YAML' # Initial placeholder vault. Replace with real secrets using ./scripts/vault.sh edit. gitea: {} openclaw_alice: http_nodes: {} ssh_nodes: {} YAML cp "$tmp" "$VAULT_FILE" ansible-vault encrypt "$VAULT_FILE" --vault-password-file "$DEST" rm -f "$tmp" echo "Created encrypted placeholder vault: $VAULT_FILE" fi } manual_create() { ensure_dest_dir cat <&2 exit 4 fi umask 077 printf '%s\n' "$pass" > "$DEST" secure_dest echo "Installed manually provided vault password file: $DEST" } download_from_url() { ensure_dest_dir printf 'Enter vault-pass.txt URL: ' read -r url if [ -z "$url" ]; then echo "URL is required." >&2 exit 4 fi case "$url" in http://*|https://*) ;; *) echo "Only http:// or https:// URLs are supported." >&2; exit 4 ;; esac if command -v curl >/dev/null 2>&1; then umask 077 curl -fsSL "$url" -o "$DEST" elif command -v wget >/dev/null 2>&1; then umask 077 wget -qO "$DEST" "$url" else echo "Missing dependency: curl or wget" >&2 exit 3 fi if [ ! -s "$DEST" ]; then echo "Downloaded file is empty or missing." >&2 exit 4 fi secure_dest echo "Downloaded vault password file to: $DEST" } extract_from_archive() { require_cmd unzip ensure_dest_dir if [ ! -f "$ARCHIVE" ]; then cat >&2 <&2 exit 4 fi install -m 600 "$src" "$DEST" echo "Installed vault password file from archive: $DEST" } verify_vault_readable_if_possible() { if [ -f "$VAULT_FILE" ] && command -v ansible-vault >/dev/null 2>&1; then if ansible-vault view "$VAULT_FILE" --vault-password-file "$DEST" >/dev/null 2>&1; then echo "Verified: vault.yml is readable with $DEST" else echo "Warning: vault.yml is not readable with $DEST" >&2 return 5 fi fi } if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage exit 0 fi if verify_existing; then verify_vault_readable_if_possible || true exit 0 fi cat <&2; exit 4 ;; esac verify_vault_readable_if_possible || true