From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id 5Q6MFV79jl9XHQAA0tVLHw (envelope-from ) for ; Tue, 20 Oct 2020 15:08:14 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id eElGEV79jl+xHgAA1q6Kng (envelope-from ) for ; Tue, 20 Oct 2020 15:08:14 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 938AD940366 for ; Tue, 20 Oct 2020 15:08:12 +0000 (UTC) Received: from localhost ([::1]:34296 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kUtFD-0002iV-Dk for larch@yhetil.org; Tue, 20 Oct 2020 11:08:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53632) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kUtF4-0002hl-TR for guix-patches@gnu.org; Tue, 20 Oct 2020 11:08:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:34826) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kUtF4-0005qs-Jx for guix-patches@gnu.org; Tue, 20 Oct 2020 11:08:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kUtF4-000297-Em for guix-patches@gnu.org; Tue, 20 Oct 2020 11:08:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#42899] [PATCH v5 2/6] services: dovecot: Provide plugins through a /gnu/store directory. Resent-From: Alexey Abramov Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Tue, 20 Oct 2020 15:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 42899 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 42899@debbugs.gnu.org Received: via spool by 42899-submit@debbugs.gnu.org id=B42899.16032064288145 (code B ref 42899); Tue, 20 Oct 2020 15:08:02 +0000 Received: (at 42899) by debbugs.gnu.org; 20 Oct 2020 15:07:08 +0000 Received: from localhost ([127.0.0.1]:46361 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kUtEC-00027H-9N for submit@debbugs.gnu.org; Tue, 20 Oct 2020 11:07:08 -0400 Received: from mx4.mail.mmer.org ([178.22.66.29]:45031) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kUtE3-000261-GK for 42899@debbugs.gnu.org; Tue, 20 Oct 2020 11:07:03 -0400 Received: from delta (unknown [10.147.19.213]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx4.mail.mmer.org (Postfix) with ESMTPSA id A305B9CE91 for <42899@debbugs.gnu.org>; Tue, 20 Oct 2020 14:36:13 +0000 (UTC) From: Alexey Abramov Date: Tue, 20 Oct 2020 17:06:51 +0200 Message-Id: <20201020150655.12690-3-levenson@mmer.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201020150655.12690-1-levenson@mmer.org> References: <20201020150655.12690-1-levenson@mmer.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -1.0 (-) X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Spam-Score: 3.99 X-TUID: GPG6yVqUSMqt * gnu/services/mail.scm (package-list?, serialize-package-list): * 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 (%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. --- doc/guix.texi | 8 +++++++ gnu/services/mail.scm | 55 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 51dc42e5a2..13cd86779e 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -18404,6 +18404,14 @@ Available @code{dovecot-configuration} fields are: The dovecot package. @end deftypevr +@deftypevr {@code{dovecot-configuration} parameter} package-list extensions +Plugins and extensions to the Dovecot package. Specify a list of +dovecot plugins that needs to be available for dovecot and its modules. + +Defaults to @samp{()}. + +@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 diff --git a/gnu/services/mail.scm b/gnu/services/mail.scm index 71fa975b5d..b49fc07916 100644 --- a/gnu/services/mail.scm +++ b/gnu/services/mail.scm @@ -468,11 +468,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 (package 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{*} @@ -1439,6 +1449,11 @@ greyed out, instead of only later giving \"not selectable\" popup error. (package 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)) @@ -1464,6 +1479,29 @@ greyed out, instead of only later giving \"not selectable\" popup error. (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin"))))) +(define (%dovecot-moduledir packages) + ;; Create a union of the set of modules and dovecot itself. + (computed-file + "dovecot-moduledir" + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + (mkdir #$output) + (for-each + (lambda (package) + (let ((path (string-append package "/lib/dovecot"))) + (for-each + (lambda (src) + (let* ((tail (substring src (string-length path))) + (dst (string-append #$output tail))) + (mkdir-p (dirname dst)) + (if (file-exists? dst) + (format (current-error-port) "warning: ~a exists\n" dst) + (symlink src dst)))) + (find-files path)))) + (list #$@packages)) + #t)))) + (define (%dovecot-activation config) ;; Activation gexp. (let ((config-str @@ -1474,7 +1512,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) + (%dovecot-moduledir (cons* (opaque-dovecot-configuration-dovecot config) + (opaque-dovecot-configuration-extensions config)))) + (else + (%dovecot-moduledir (cons* (dovecot-configuration-dovecot config) + (dovecot-configuration-extensions config))))))) #~(begin (use-modules (guix build utils)) (define (mkdir-p/perms directory owner perms) @@ -1521,13 +1567,18 @@ greyed out, instead of only later giving \"not selectable\" popup error. (else (format (current-error-port) "Failed to create public key at ~a.\n" public-key))))) - (let ((user (getpwnam "dovecot"))) + (let ((user (getpwnam "dovecot")) + (moduledir-symlink "/usr/lib/dovecot")) (mkdir-p/perms "/var/run/dovecot" user #o755) (mkdir-p/perms "/var/lib/dovecot" user #o755) (mkdir-p/perms "/etc/dovecot" user #o755) (copy-file #$(plain-file "dovecot.conf" config-str) "/etc/dovecot/dovecot.conf") (mkdir-p/perms "/etc/dovecot/private" user #o700) + (mkdir-p (dirname moduledir-symlink)) + (when (file-exists? moduledir-symlink) + (delete-file moduledir-symlink)) + (symlink #$moduledir-directory moduledir-symlink) (create-self-signed-certificate-if-absent #:private-key "/etc/dovecot/private/default.pem" #:public-key "/etc/dovecot/default.pem" -- 2.28.0