From bc441dd10af3f0008dc120003c9d4a2377509b8e Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 6 Jan 2014 10:47:44 +0000 Subject: [PATCH] Add settings description. --- doc/markdown/configuration/index.md | 13 +++++ doc/markdown/configuration/settings.md | 63 ++++++++++++++++++++++++ doc/markdown/configuration/settings.png | Bin 0 -> 25106 bytes 3 files changed, 76 insertions(+) create mode 100644 doc/markdown/configuration/settings.md create mode 100644 doc/markdown/configuration/settings.png diff --git a/doc/markdown/configuration/index.md b/doc/markdown/configuration/index.md index ae9ce7496..bfb0012ea 100644 --- a/doc/markdown/configuration/index.md +++ b/doc/markdown/configuration/index.md @@ -4,6 +4,19 @@ Rspamd uses UCL for its configuration. UCL format is described in details in this [document](ucl.md). Rspamd defines several variables and macros to extend UCL functionality. +## Configuration subtopics +Here is the list of all subtopics. +- [UCL](ucl.md) +- [Options](options.md) +- [Logging](logging.md) +- [Metrics](metrics.md) +- [Workers](workers.md) +- [Composites](composites.md) +- [Statistic](statistic.md) +- [Modules](modules.md) +- [Dynamic configuration](dynamic_conf.md) +- [User settings](settings.md) + ## Rspamd variables - *CONFDIR*: configuration directory for rspamd, it is $PREFIX/etc/rspamd/ diff --git a/doc/markdown/configuration/settings.md b/doc/markdown/configuration/settings.md new file mode 100644 index 000000000..b7aea8055 --- /dev/null +++ b/doc/markdown/configuration/settings.md @@ -0,0 +1,63 @@ +# Rspamd user settings + +Rspamd allows to specify custom settings according to incoming messages. Each setting define some set +of custom metric weights, symbols or actions. An administrator can also skip spam checks for certain +messages completely. Unlike the most of configuration options, rspamd settings can be loaded dynamically +and thus they are updated automatically if a corresponding file or URL has changed since last update. + +To load rspamd settings one may specify `.include_map ""` or use the ordinary `.include` macro: + +~~~nginx +.include_map "$CONFDIR/settings.conf" +~~~ + +## Settings structure + +The settings file itself should contain a single section called "settings": + +~~~nginx +settings { + some_users { + priority = 0; + from = "@example.com"; + rcpt = "admin"; + rcpt = "/user.*/"; + ip = "172.16.0.0/16"; + apply "default" { + symbol1 = 10.0; + symbol2 = 0.0; + actions { + reject = 100.0 + greylist = 10.0 + } + } + } + whitelist { + priority = 1; + rcpt = "postmaster@example.com"; + want_spam = yes; + } +} +~~~ + +So each setting has the following attributes: + +- `name` - section name that identify this specific setting (e.g. `some_users`) +- `priority` - 0 or 1, 0 is higher priority than 1 and is matched first (default priority is 1) +- `match list` - list of rules when this rule matches: + + `from` - match SMTP from + + `rcpt` - match RCPT + + `ip` - match source IP address +- `apply` - list of applied rules, identified by metric name (e.g. `default`) + + `symbol` - modify weight of a symbol + + `actions` - section of modified actions + +Match section performs `AND` operation on different matches, for example, if you have +`from` and `rcpt` in the same rule, then rule matches only when `from` `AND` `rcpt` match. +For the same matches `OR` rule applies. Therefore, if you have multiple `rcpt` matches, then any of +these `rcpt` will trigger the rule. If a setting applies no more rules are matched. + +Regexp rules are slow and should not be used intensively. All other rules are matched very quickly. +The picture below describes the architecture of settings matching. + +[Settings match procedure](settings.png "Settings match procedure") \ No newline at end of file diff --git a/doc/markdown/configuration/settings.png b/doc/markdown/configuration/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b0677b81d0e4de888153fd19dc57f7076c35e8ee GIT binary patch literal 25106 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 KzD(aG^4|as3_Du@ literal 0 HcmV?d00001 -- 2.39.5