Stop regenerating the dir2opds hash so Caddy isn't restarted every run

bcrypt uses a random salt, so hashing the basic auth password on every
run changed the Caddyfile each time and triggered the Caddy restart
handler. Reuse the deployed hash while it still matches the vault
password, and only make a new one when it doesn't (or on a fresh host).

The old awk also turned htpasswd's trailing blank line into a stray
line in the Caddyfile; the next deploy removes it once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Phil
2026-10-29 22:08:34 -06:00
co-authored by Claude Opus 5.5
parent e569a56417
commit 57c29f1a7f
+20 -2
View File
@@ -14,11 +14,29 @@
become: true
when: vault_dir2opds is defined
- name: Generate bcrypt hash for dir2opds basic auth
# bcrypt uses a random salt, so a fresh hash would change the Caddyfile (and
# restart Caddy) on every run. Reuse the deployed hash while it still matches
# the vault password; only make a new one when it doesn't.
- name: Get bcrypt hash for dir2opds basic auth
ansible.builtin.shell: |
htpasswd -bnB "{{ vault_dir2opds.basic_auth_user }}" "{{ vault_dir2opds.basic_auth_password }}" | awk -F: '{print $1, $2}'
set -eu
cur=$(awk -v u="$AUTH_USER" '/basic_?auth/ {b=1} b && $1 == u {print $2; exit}' \
/opt/stacks/caddy/Caddyfile 2>/dev/null || true)
if [ -n "$cur" ]; then
tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT
printf '%s:%s\n' "$AUTH_USER" "$cur" > "$tmp"
if htpasswd -vb "$tmp" "$AUTH_USER" "$AUTH_PASS" >/dev/null 2>&1; then
echo "$AUTH_USER $cur"
exit 0
fi
fi
htpasswd -bnB "$AUTH_USER" "$AUTH_PASS" | awk -F: 'NF {print $1, $2}'
environment:
AUTH_USER: "{{ vault_dir2opds.basic_auth_user }}"
AUTH_PASS: "{{ vault_dir2opds.basic_auth_password }}"
register: dir2opds_basic_auth_hash_result
changed_when: false
check_mode: false
no_log: true
when: vault_dir2opds is defined