haproxy-acl.sh 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/env bash
  2. # Pull the IRDB blocklist and update an HAProxy ACL file in-place.
  3. #
  4. # Usage (cron):
  5. # IRDB_URL=http://localhost:8081 IRDB_TOKEN=irdb_con_... \
  6. # OUTPUT=/etc/haproxy/irdb-blocked.lst \
  7. # examples/consumers/haproxy-acl.sh
  8. #
  9. # In your haproxy.cfg:
  10. #
  11. # frontend http_front
  12. # bind *:80
  13. # acl irdb_blocked src -f /etc/haproxy/irdb-blocked.lst
  14. # http-request deny if irdb_blocked
  15. # default_backend app
  16. #
  17. # This script uses HAProxy's runtime API (`set acl`) when available
  18. # to update without a reload; otherwise it falls back to writing the
  19. # file and emitting a hint that the operator should reload.
  20. set -euo pipefail
  21. : "${IRDB_URL:?must be set}"
  22. : "${IRDB_TOKEN:?must be set}"
  23. OUTPUT="${OUTPUT:-/etc/haproxy/irdb-blocked.lst}"
  24. TIMEOUT="${IRDB_TIMEOUT:-30}"
  25. HAPROXY_SOCKET="${HAPROXY_SOCKET:-/run/haproxy/admin.sock}"
  26. TMP=$(mktemp)
  27. trap 'rm -f "$TMP"' EXIT
  28. curl -fsS --max-time "$TIMEOUT" \
  29. -H "Authorization: Bearer $IRDB_TOKEN" \
  30. -H "Accept: text/plain" \
  31. "$IRDB_URL/api/v1/blocklist" > "$TMP"
  32. if [ -f "$OUTPUT" ] && cmp -s "$OUTPUT" "$TMP"; then
  33. echo "irdb-blocklist unchanged"
  34. exit 0
  35. fi
  36. mv "$TMP" "$OUTPUT"
  37. trap - EXIT
  38. if [ -S "$HAPROXY_SOCKET" ] && command -v socat >/dev/null 2>&1; then
  39. # Replace the ACL contents at runtime, no reload required.
  40. {
  41. echo "clear acl irdb_blocked"
  42. while IFS= read -r entry; do
  43. [ -z "$entry" ] && continue
  44. echo "add acl irdb_blocked $entry"
  45. done < "$OUTPUT"
  46. echo "show acl irdb_blocked | head -1"
  47. } | socat - "UNIX-CONNECT:$HAPROXY_SOCKET" >/dev/null
  48. echo "irdb-blocklist updated via haproxy socket"
  49. else
  50. echo "irdb-blocklist written to $OUTPUT — reload haproxy to pick it up:"
  51. echo " systemctl reload haproxy"
  52. fi