services: Add opensmtpd service.

* gnu/services/mail.scm (<opensmtpd-configuration>): New record type.
(%default-opensmtpd-config-file, %opensmtpd-accounts): New variables.
(opensmtpd-shepherd-service, opensmtpd-activation): New procedures.
(opensmtpd-service-type): New variable.
* doc/guix.texi (Mail Services): Document it.
This commit is contained in:
宋文武 2016-11-21 20:41:17 +08:00
parent 0959478c72
commit f88371e866
No known key found for this signature in database
GPG Key ID: 26525665AE727D37
2 changed files with 114 additions and 10 deletions

View File

@ -10075,16 +10075,11 @@ For MariaDB, the root password is empty.
@cindex mail @cindex mail
@cindex email @cindex email
The @code{(gnu services mail)} module provides Guix service definitions The @code{(gnu services mail)} module provides Guix service definitions
for mail services. Currently the only implemented service is Dovecot, for email services: IMAP, POP3, and LMTP servers, as well as mail
an IMAP, POP3, and LMTP server. transport agents (MTAs). Lots of acronyms! These services are detailed
in the subsections below.
Guix does not yet have a mail transfer agent (MTA), although for some @subsubheading Dovecot Service
lightweight purposes the @code{esmtp} relay-only MTA may suffice. Help
is needed to properly integrate a full MTA, such as Postfix. Patches
welcome!
To add an IMAP/POP3 server to a GuixSD system, add a
@code{dovecot-service} to the operating system definition:
@deffn {Scheme Procedure} dovecot-service [#:config (dovecot-configuration)] @deffn {Scheme Procedure} dovecot-service [#:config (dovecot-configuration)]
Return a service that runs the Dovecot IMAP/POP3/LMTP mail server. Return a service that runs the Dovecot IMAP/POP3/LMTP mail server.
@ -11440,6 +11435,35 @@ could instantiate a dovecot service like this:
(string ""))) (string "")))
@end example @end example
@subsubheading OpenSMTPD Service
@deffn {Scheme Variable} opensmtpd-service-type
This is the type of the @uref{https://www.opensmtpd.org, OpenSMTPD}
service, whose value should be an @code{opensmtpd-configuration} object
as in this example:
@example
(service opensmtpd-service-type
(opensmtpd-configuration
(config-file (local-file "./my-smtpd.conf"))))
@end example
@end deffn
@deftp {Data Type} opensmtpd-configuration
Data type regresenting the configuration of opensmtpd.
@table @asis
@item @code{package} (default: @var{opensmtpd})
Package object of the OpenSMTPD SMTP server.
@item @code{config-file} (default: @var{%default-opensmtpd-file})
File-like object of the OpenSMTPD configuration file to use. By default
it listens on the loopback network interface, and allows for mail from
users and daemons on the local machine, as well as permitting email to
remote servers. Run @command{man smtpd.conf} for more information.
@end table
@end deftp
@node Kerberos Services @node Kerberos Services
@subsubsection Kerberos Services @subsubsection Kerberos Services

View File

@ -51,7 +51,12 @@
protocol-configuration protocol-configuration
plugin-configuration plugin-configuration
mailbox-configuration mailbox-configuration
namespace-configuration)) namespace-configuration
opensmtpd-configuration
opensmtpd-configuration?
opensmtpd-service-type
%default-opensmtpd-config-file))
;;; Commentary: ;;; Commentary:
;;; ;;;
@ -1691,3 +1696,78 @@ by @code{dovecot-configuration}. @var{config} may also be created by
(format #t "@end deftypevr\n\n"))) (format #t "@end deftypevr\n\n")))
fields)))) fields))))
(generate 'dovecot-configuration)) (generate 'dovecot-configuration))
;;;
;;; OpenSMTPD.
;;;
(define-record-type* <opensmtpd-configuration>
opensmtpd-configuration make-opensmtpd-configuration
opensmtpd-configuration?
(package opensmtpd-configuration-package
(default opensmtpd))
(config-file opensmtpd-configuration-config-file
(default %default-opensmtpd-config-file)))
(define %default-opensmtpd-config-file
(plain-file "smtpd.conf" "
listen on lo
accept from any for local deliver to mbox
accept from local for any relay
"))
(define opensmtpd-shepherd-service
(match-lambda
(($ <opensmtpd-configuration> package config-file)
(list (shepherd-service
(provision '(smtpd))
(requirement '(loopback))
(documentation "Run the OpenSMTPD daemon.")
(start (let ((smtpd (file-append package "/sbin/smtpd")))
#~(make-forkexec-constructor
(list #$smtpd "-f" #$config-file)
#:pid-file "/var/run/smtpd.pid")))
(stop #~(make-kill-destructor)))))))
(define %opensmtpd-accounts
(list (user-group
(name "smtpq")
(system? #t))
(user-account
(name "smtpd")
(group "nogroup")
(system? #t)
(comment "SMTP Daemon")
(home-directory "/var/empty")
(shell (file-append shadow "/sbin/nologin")))
(user-account
(name "smtpq")
(group "smtpq")
(system? #t)
(comment "SMTPD Queue")
(home-directory "/var/empty")
(shell (file-append shadow "/sbin/nologin")))))
(define opensmtpd-activation
(match-lambda
(($ <opensmtpd-configuration> package config-file)
(let ((smtpd (file-append package "/sbin/smtpd")))
#~(begin
;; Create mbox and spool directories.
(mkdir-p "/var/mail")
(mkdir-p "/var/spool/smtpd")
(chmod "/var/spool/smtpd" #o711))))))
(define opensmtpd-service-type
(service-type
(name 'opensmtpd)
(extensions
(list (service-extension account-service-type
(const %opensmtpd-accounts))
(service-extension activation-service-type
opensmtpd-activation)
(service-extension profile-service-type
(compose list opensmtpd-configuration-package))
(service-extension shepherd-root-service-type
opensmtpd-shepherd-service)))))