| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #!/usr/bin/env bash
- # Pull the IRDB blocklist and update an HAProxy ACL file in-place.
- #
- # Usage (cron):
- # IRDB_URL=http://localhost:8081 IRDB_TOKEN=irdb_con_... \
- # OUTPUT=/etc/haproxy/irdb-blocked.lst \
- # examples/consumers/haproxy-acl.sh
- #
- # In your haproxy.cfg:
- #
- # frontend http_front
- # bind *:80
- # acl irdb_blocked src -f /etc/haproxy/irdb-blocked.lst
- # http-request deny if irdb_blocked
- # default_backend app
- #
- # This script uses HAProxy's runtime API (`set acl`) when available
- # to update without a reload; otherwise it falls back to writing the
- # file and emitting a hint that the operator should reload.
- set -euo pipefail
- : "${IRDB_URL:?must be set}"
- : "${IRDB_TOKEN:?must be set}"
- OUTPUT="${OUTPUT:-/etc/haproxy/irdb-blocked.lst}"
- TIMEOUT="${IRDB_TIMEOUT:-30}"
- HAPROXY_SOCKET="${HAPROXY_SOCKET:-/run/haproxy/admin.sock}"
- TMP=$(mktemp)
- trap 'rm -f "$TMP"' EXIT
- curl -fsS --max-time "$TIMEOUT" \
- -H "Authorization: Bearer $IRDB_TOKEN" \
- -H "Accept: text/plain" \
- "$IRDB_URL/api/v1/blocklist" > "$TMP"
- if [ -f "$OUTPUT" ] && cmp -s "$OUTPUT" "$TMP"; then
- echo "irdb-blocklist unchanged"
- exit 0
- fi
- mv "$TMP" "$OUTPUT"
- trap - EXIT
- if [ -S "$HAPROXY_SOCKET" ] && command -v socat >/dev/null 2>&1; then
- # Replace the ACL contents at runtime, no reload required.
- {
- echo "clear acl irdb_blocked"
- while IFS= read -r entry; do
- [ -z "$entry" ] && continue
- echo "add acl irdb_blocked $entry"
- done < "$OUTPUT"
- echo "show acl irdb_blocked | head -1"
- } | socat - "UNIX-CONNECT:$HAPROXY_SOCKET" >/dev/null
- echo "irdb-blocklist updated via haproxy socket"
- else
- echo "irdb-blocklist written to $OUTPUT — reload haproxy to pick it up:"
- echo " systemctl reload haproxy"
- fi
|