summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorAlexey Abramov via Guix-patches via <[email protected]>2024-11-21 12:25:57 +0000
committerChristopher Baines <[email protected]>2025-02-25 10:57:51 +0000
commitf83b91a4ee6fab2ac595bccdf3fb7151a8dcc69c (patch)
tree98b50c0c02a35d0c33d486152e45e9d8fd08fbb4 /gnu
parent81e99a5caae91dcedff182bad008a2c815924ae7 (diff)
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 <[email protected]>
Diffstat (limited to 'gnu')
-rw-r--r--gnu/services/mail.scm44
1 files changed, 42 insertions, 2 deletions
diff --git a/gnu/services/mail.scm b/gnu/services/mail.scm
index 4ab0d68134..b9a61163d5 100644
--- a/gnu/services/mail.scm
+++ b/gnu/services/mail.scm
@@ -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"