59 lines
1.2 KiB
Bash
Executable File
59 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
STACK_ENV="${1:-}"
|
|
if [[ -z "$STACK_ENV" ]]; then
|
|
echo "Usage: $0 /path/to/stack.env" >&2
|
|
exit 2
|
|
fi
|
|
|
|
mkdir -p "$(dirname "$STACK_ENV")"
|
|
touch "$STACK_ENV"
|
|
|
|
current_secret=""
|
|
if grep -q '^XMPP_SECRET=' "$STACK_ENV"; then
|
|
current_secret="$(grep '^XMPP_SECRET=' "$STACK_ENV" | head -n1 | cut -d= -f2- | tr -d '"' | tr -d "'" | tr -d '\r' | tr -d '\n')"
|
|
fi
|
|
|
|
if [[ -n "$current_secret" ]]; then
|
|
printf "%s" "$current_secret"
|
|
exit 0
|
|
fi
|
|
|
|
generate_secret() {
|
|
if command -v openssl >/dev/null 2>&1; then
|
|
openssl rand -base64 48 | tr -d '\n'
|
|
return 0
|
|
fi
|
|
if command -v python3 >/dev/null 2>&1; then
|
|
python3 -c 'import secrets; print(secrets.token_urlsafe(48))'
|
|
return 0
|
|
fi
|
|
head -c 48 /dev/urandom | base64 | tr -d '\n'
|
|
}
|
|
|
|
secret="$(generate_secret)"
|
|
if [[ -z "$secret" ]]; then
|
|
echo "Failed to generate XMPP_SECRET." >&2
|
|
exit 1
|
|
fi
|
|
|
|
tmp="$(mktemp)"
|
|
awk -v s="$secret" '
|
|
BEGIN { done = 0 }
|
|
/^XMPP_SECRET=/ {
|
|
if (!done) {
|
|
print "XMPP_SECRET=" s
|
|
done = 1
|
|
}
|
|
next
|
|
}
|
|
{ print }
|
|
END {
|
|
if (!done) print "XMPP_SECRET=" s
|
|
}
|
|
' "$STACK_ENV" > "$tmp"
|
|
mv "$tmp" "$STACK_ENV"
|
|
|
|
printf "%s" "$secret"
|