1
Fork 0
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:
Alexey Abramov via Guix-patches via 2024-11-21 12:25:57 +00:00 committed by Christopher Baines
parent 81e99a5caa
commit f83b91a4ee
No known key found for this signature in database
GPG key ID: 5E28A33B0B84F577
2 changed files with 61 additions and 2 deletions

View file

@ -27484,6 +27484,25 @@ Available @code{dovecot-configuration} fields are:
The dovecot package. The dovecot package.
@end deftypevr @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 @deftypevr {@code{dovecot-configuration} parameter} comma-separated-string-list listen
A list of IPs or hosts where to listen for connections. @samp{*} A list of IPs or hosts where to listen for connections. @samp{*}
listens on all IPv4 interfaces, @samp{::} listens on all IPv6 listens on all IPv4 interfaces, @samp{::} listens on all IPv6

View file

@ -521,11 +521,21 @@ as @code{#t}.)")
(serialize-namespace-configuration field-name val)) (serialize-namespace-configuration field-name val))
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 (define-configuration dovecot-configuration
(dovecot (dovecot
(file-like dovecot) (file-like dovecot)
"The dovecot package.") "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 (listen
(comma-separated-string-list '("*" "::")) (comma-separated-string-list '("*" "::"))
"A list of IPs or hosts where to listen in for connections. @samp{*} "A list of IPs or hosts where to listen in for connections. @samp{*}
@ -1500,6 +1510,11 @@ greyed out, instead of only later giving \"not selectable\" popup error.
(file-like dovecot) (file-like dovecot)
"The dovecot package.") "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
(string (configuration-missing-field 'opaque-dovecot-configuration (string (configuration-missing-field 'opaque-dovecot-configuration
'string)) 'string))
@ -1525,6 +1540,21 @@ greyed out, instead of only later giving \"not selectable\" popup error.
(home-directory "/var/empty") (home-directory "/var/empty")
(shell (file-append shadow "/sbin/nologin"))))) (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) (define (%dovecot-activation config)
;; Activation gexp. ;; Activation gexp.
(let ((config-str (let ((config-str
@ -1535,7 +1565,15 @@ greyed out, instead of only later giving \"not selectable\" popup error.
(with-output-to-string (with-output-to-string
(lambda () (lambda ()
(serialize-configuration config (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))) (with-imported-modules (source-module-closure '((gnu build activation)))
#~(begin #~(begin
(use-modules (guix build utils) (gnu build activation)) (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) (copy-file #$(plain-file "dovecot.conf" config-str)
"/etc/dovecot/dovecot.conf") "/etc/dovecot/dovecot.conf")
(mkdir-p/perms "/etc/dovecot/private" user #o700) (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 (create-self-signed-certificate-if-absent
#:private-key "/etc/dovecot/private/default.pem" #:private-key "/etc/dovecot/private/default.pem"
#:public-key "/etc/dovecot/default.pem" #:public-key "/etc/dovecot/default.pem"