Parses dovecot configuration files.
Author: Serge Smetana serge.smetana@gmail.com Acunote http://www.acunote.com Pluron, Inc. http://pluron.com
| Dovecot | Parses dovecot configuration files. |
| License | This file is licensed under the LGPL v2+. |
| Configuration files | This lens applies to /etc/dovecot/dovecot.conf and files in /etc/dovecot/conf.d/. |
| Examples | The Test_Dovecot file contains various examples and tests. |
| TODO | Support for multiline values like queries in dict-sql.conf |
| USEFUL PRIMITIVES | |
| indent | |
| eol | |
| empty | Map empty lines. |
| comment | Map comments in “#comment” nodes. |
| eq | |
| any | |
| value | Match any value after “ =”. |
| command_start | |
| ENTRIES | |
| commands | |
| block_names | |
| keys | Match any possible key except commands and block names. |
| entry | Map simple “key = value” entries including “key =” entries with empty value. |
| command | Map commands started with “!” |
| dquote_spaces | Make double quotes mandatory if value contains spaces, and optional if value doesn’t contain spaces. |
| block | Map block enclosed in brackets recursively. |
| LENS AND FILTER | |
| lns | The Dovecot lens |
| filter |
This lens applies to /etc/dovecot/dovecot.conf and files in /etc/dovecot/conf.d/. See filter.
The Test_Dovecot file contains various examples and tests.
let rec block = [ indent . key block_names . (Sep.space . Quote.do_dquote_opt (store /[\/A-Za-z0-9_-]+/))? . block_newlines (entry|block|mailbox) comment . eol ]
Map block enclosed in brackets recursively. Block may be indented and have optional argument. Block body may have entries, comments, empty lines, and nested blocks recursively.
let indent = Util.indent
let eol = Util.eol
Map empty lines.
let empty = Util.empty
Map comments in “#comment” nodes.
let comment = Util.comment
let eq = del /[ \t]*=/ " ="
let any = Rx.no_spaces
Match any value after “ =”.
let value = any . (Rx.space . any)*
let command_start = Util.del_str "!"
let commands = /include|include_try/
let block_names = /dict|userdb|passdb|protocol|service|plugin|namespace|map|fields|unix_listener|fifo_listener|inet_listener/
Match any possible key except commands and block names.
let keys = Rx.word - (commands | block_names)
Map simple “key = value” entries including “key =” entries with empty value.
let entry = [ indent . key keys. eq . (Sep.opt_space . store value)? . eol ]
Map commands started with “!”
let command = [ command_start . key commands . Sep.space . store Rx.fspath . eol ]
Make double quotes mandatory if value contains spaces, and optional if value doesn’t contain spaces.
let dquote_spaces (lns1:lens) (lns2:lens) =
Map block enclosed in brackets recursively.
let rec block = [ indent . key block_names . (Sep.space . Quote.do_dquote_opt (store /[\/A-Za-z0-9_-]+/))? . block_newlines (entry|block|mailbox) comment . eol ]
The Dovecot lens
let lns = (comment|empty|entry|command|block)*