2.7 KiB
2.7 KiB
contrib: getting the domains CDB onto the service host
migadu_counters reads limits from the rspamd domains CDB that the agent builds
(extract.sh → /usr/local/etc/agent/build/rspamd/rspamd_domains_db). The
files here fetch it the way rcptd fetches its maps (ansible-freebsd3
roles/rcptd/templates/{build.sh.j2,rcptd-maps.cron.j2}); the future Ansible
role templates them.
| File | Purpose |
|---|---|
pull-domains.sh |
rsync the CDB from the agent, cmp against the installed .orig, and only on change verify (cdb -s) and install it with an atomic mv; .pull-lock with a 120 s max age; log to /var/log/migadu_counters/pull.log via tee -a. |
migadu_counters-pull.cron |
FreeBSD @15 crontab fragment (15 s after the previous run completes) wrapped in timeout -k 30 300. |
pull-domains_test.sh |
Test against a local source directory (RSYNC_SRC override): unchanged → no mv, no reload; changed → atomic install, .orig updated, reload; corrupt or empty CDB → not installed, non-zero exit, old file untouched; lock handling. Run with make test-contrib (needs tinycdb's cdb and rsync). |
What the Ansible role must template
Environment of pull-domains.sh (every variable has the production default
shown in the script):
AGENT_HOST(agent@<agent host>) andAGENT_PATH; ssh is forced to IPv4 (RSYNC_RSH="ssh -4"), the agent's host key must be accepted beforehand (rcptd hasaccept-agent-hostkey.sh.j2for that).MAPS_DIR(pulled copy),DOMAINS_DIR/DOMAINS_CDB(whatdomains_cdbinconfig.tomlpoints at),LOG_FILE,LOCK_FILE.RELOAD_CMD(defaultservice migadu_counters reload, i.e. SIGHUP). The daemon's fsnotify watcher already reloads on themv; the reload is belt and braces.- The cron user (
migadu_counters) must ownMAPS_DIR,DOMAINS_DIRand the log directory, and have the ssh key for the agent host.timeout,rsyncandcdb(tinycdb) must be installed.
Rules the daemon relies on
- Never rewrite the CDB in place. The daemon keeps the file open; an
in-place rewrite truncates the inode under it and breaks every lookup until
the next reload. The script only ever
mvs a verified dotfile over the target, which is atomic on the same filesystem (DOMAINS_DIRmust hold both). - A file that does not open as a CDB or holds no records is refused and the installed file kept; the daemon applies the same rule on reload.
- Memory stays flat across the 15-second cycles: a reload replaces the whole
in-memory DB object (2 KB index plus a bounded parse cache,
max_cached_domains, default 20 000 records) and the old one is closed after a 30 s grace period. Unchanged pulls are acmpand nothing else.