mirror of
https://https.git.savannah.gnu.org/git/guix.git/
synced 2025-07-15 19:40:46 +02:00
services: dovecot: Provide plugins through a /gnu/store directory.
* gnu/services/mail.scm (package-list?, serialize-package-list): New procedures. * gnu/services/mail.scm (dovecot-configuration)[extensions]: New field. The field lets you provide a list of dovecot plugins that need to be available during the runtime. A union of the set of modules will be created on the activation time. * gnu/services/mail.scm (opaque-dovecot-configuration)[extensions]: Likewise. * gnu/services/mail.scm (make-dovecot-moduledir): New function. * gnu/services/mail.scm (%dovecot-activation): Add step to compute a set of modules, and provide them over the shared link at /usr/lib/dovecot. * doc/guix.texi (Mail Services)[extension]: Add documentation. Clarify the purpose and usage of the extensions parameter. Add an example showing how to enable Sieve filtering using dovecot-pigeonhole. Better explain the module directory structure and requirements. Change-Id: I3c3955bb04b09d245242112f6810ecc0558109a1 Signed-off-by: Christopher Baines <mail@cbaines.net>
This commit is contained in:
parent
81e99a5caa
commit
f83b91a4ee
2 changed files with 61 additions and 2 deletions
|
@ -27484,6 +27484,25 @@ Available @code{dovecot-configuration} fields are:
|
|||
The dovecot package.
|
||||
@end deftypevr
|
||||
|
||||
@deftypevr {@code{dovecot-configuration} parameter} package-list extensions
|
||||
A list of additional Dovecot plugin packages to make available at runtime. During
|
||||
service activation, the @file{lib/dovecot} directory from each specified package
|
||||
is combined with Dovecot's core modules into a unified module directory.
|
||||
|
||||
For example, to enable Sieve filtering:
|
||||
|
||||
@lisp
|
||||
(extensions (list dovecot-pigeonhole))
|
||||
@end lisp
|
||||
|
||||
Each package in the list must provide its modules at @file{lib/dovecot},
|
||||
as this is where @code{make-dovecot-moduledir} expects to find its
|
||||
extensions. The service combines these directories to create a unified
|
||||
module structure.
|
||||
|
||||
The default value is an empty list, providing only core Dovecot functionality.
|
||||
@end deftypevr
|
||||
|
||||
@deftypevr {@code{dovecot-configuration} parameter} comma-separated-string-list listen
|
||||
A list of IPs or hosts where to listen for connections. @samp{*}
|
||||
listens on all IPv4 interfaces, @samp{::} listens on all IPv6
|
||||
|
|
|
@ -521,11 +521,21 @@ as @code{#t}.)")
|
|||
(serialize-namespace-configuration field-name val))
|
||||
val))
|
||||
|
||||
(define (package-list? val)
|
||||
(and (list? val) (and-map package? val)))
|
||||
(define (serialize-package-list field-name val)
|
||||
#f)
|
||||
|
||||
(define-configuration dovecot-configuration
|
||||
(dovecot
|
||||
(file-like dovecot)
|
||||
"The dovecot package.")
|
||||
|
||||
(extensions
|
||||
(package-list '())
|
||||
"Plugins and extensions to the Dovecot package. Specify a list of dovecot
|
||||
plugins that needs to be available for dovecot and its modules.")
|
||||
|
||||
(listen
|
||||
(comma-separated-string-list '("*" "::"))
|
||||
"A list of IPs or hosts where to listen in for connections. @samp{*}
|
||||
|
@ -1109,7 +1119,7 @@ isn't enough disk space, just skip it.
|
|||
@item fcntl
|
||||
Use this if possible. Works with NFS too if lockd is used.
|
||||
@item flock
|
||||
May not exist in all systems. Doesn't work with NFS.
|
||||
May not exist in all systems. Doesn't work with NFS.
|
||||
@item lockf
|
||||
May not exist in all systems. Doesn't work with NFS.
|
||||
@end table
|
||||
|
@ -1500,6 +1510,11 @@ greyed out, instead of only later giving \"not selectable\" popup error.
|
|||
(file-like dovecot)
|
||||
"The dovecot package.")
|
||||
|
||||
(extensions
|
||||
(package-list '())
|
||||
"Plugins and extensions to the Dovecot package. Specify a list of dovecot
|
||||
plugins that needs to be available for dovecot and its modules.")
|
||||
|
||||
(string
|
||||
(string (configuration-missing-field 'opaque-dovecot-configuration
|
||||
'string))
|
||||
|
@ -1525,6 +1540,21 @@ greyed out, instead of only later giving \"not selectable\" popup error.
|
|||
(home-directory "/var/empty")
|
||||
(shell (file-append shadow "/sbin/nologin")))))
|
||||
|
||||
(define (make-dovecot-moduledir packages)
|
||||
"Return a computed file containing a union of Dovecot module directories from PACKAGES.
|
||||
Each package's '/lib/dovecot' directory is combined into a single location."
|
||||
;; Create a union of the set of modules and dovecot itself.
|
||||
(with-imported-modules '((guix build union))
|
||||
(computed-file
|
||||
"dovecot-moduledir"
|
||||
#~(begin
|
||||
(use-modules (guix build union) (srfi srfi-26))
|
||||
|
||||
(union-build #$output
|
||||
(map (cut string-append <>
|
||||
"/lib/dovecot")
|
||||
(list #$@packages)))))))
|
||||
|
||||
(define (%dovecot-activation config)
|
||||
;; Activation gexp.
|
||||
(let ((config-str
|
||||
|
@ -1535,7 +1565,15 @@ greyed out, instead of only later giving \"not selectable\" popup error.
|
|||
(with-output-to-string
|
||||
(lambda ()
|
||||
(serialize-configuration config
|
||||
dovecot-configuration-fields)))))))
|
||||
dovecot-configuration-fields))))))
|
||||
(moduledir-directory
|
||||
(cond
|
||||
((opaque-dovecot-configuration? config)
|
||||
(make-dovecot-moduledir (cons* (opaque-dovecot-configuration-dovecot config)
|
||||
(opaque-dovecot-configuration-extensions config))))
|
||||
(else
|
||||
(make-dovecot-moduledir (cons* (dovecot-configuration-dovecot config)
|
||||
(dovecot-configuration-extensions config)))))))
|
||||
(with-imported-modules (source-module-closure '((gnu build activation)))
|
||||
#~(begin
|
||||
(use-modules (guix build utils) (gnu build activation))
|
||||
|
@ -1586,6 +1624,8 @@ greyed out, instead of only later giving \"not selectable\" popup error.
|
|||
(copy-file #$(plain-file "dovecot.conf" config-str)
|
||||
"/etc/dovecot/dovecot.conf")
|
||||
(mkdir-p/perms "/etc/dovecot/private" user #o700)
|
||||
(mkdir-p "/usr/lib")
|
||||
(switch-symlinks "/usr/lib/dovecot" #$moduledir-directory)
|
||||
(create-self-signed-certificate-if-absent
|
||||
#:private-key "/etc/dovecot/private/default.pem"
|
||||
#:public-key "/etc/dovecot/default.pem"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue