64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/usr/bin/env bash
 | |
| set -euo pipefail
 | |
| 
 | |
| usage() {
 | |
|   cat <<'EOF'
 | |
| Usage: rotate-policy-cli-secret.sh [--output <path>] [--dry-run]
 | |
| 
 | |
| Generates a new random shared secret suitable for the Authority
 | |
| `policy-cli` client and optionally writes it to the target file
 | |
| in `etc/secrets/` with the standard header comment.
 | |
| 
 | |
| Options:
 | |
|   --output <path>  Destination file (default: etc/secrets/policy-cli.secret)
 | |
|   --dry-run        Print the generated secret to stdout without writing.
 | |
|   -h, --help       Show this help.
 | |
| EOF
 | |
| }
 | |
| 
 | |
| OUTPUT="etc/secrets/policy-cli.secret"
 | |
| DRY_RUN=0
 | |
| 
 | |
| while [[ $# -gt 0 ]]; do
 | |
|   case "$1" in
 | |
|     --output)
 | |
|       OUTPUT="$2"
 | |
|       shift 2
 | |
|       ;;
 | |
|     --dry-run)
 | |
|       DRY_RUN=1
 | |
|       shift
 | |
|       ;;
 | |
|     -h|--help)
 | |
|       usage
 | |
|       exit 0
 | |
|       ;;
 | |
|     *)
 | |
|       echo "Unknown argument: $1" >&2
 | |
|       usage >&2
 | |
|       exit 1
 | |
|       ;;
 | |
|   esac
 | |
| done
 | |
| 
 | |
| if ! command -v openssl >/dev/null 2>&1; then
 | |
|   echo "openssl is required to generate secrets" >&2
 | |
|   exit 1
 | |
| fi
 | |
| 
 | |
| # Generate a 48-byte random secret, base64 encoded without padding.
 | |
| RAW_SECRET=$(openssl rand -base64 48 | tr -d '\n=')
 | |
| SECRET="policy-cli-${RAW_SECRET}"
 | |
| 
 | |
| if [[ "$DRY_RUN" -eq 1 ]]; then
 | |
|   echo "$SECRET"
 | |
|   exit 0
 | |
| fi
 | |
| 
 | |
| cat <<EOF > "$OUTPUT"
 | |
| # generated $(date -u +%Y-%m-%dT%H:%M:%SZ) via scripts/rotate-policy-cli-secret.sh
 | |
| $SECRET
 | |
| EOF
 | |
| 
 | |
| echo "Wrote new policy-cli secret to $OUTPUT"
 |