From 82ccc499f7262982beb2da9827d5706967a334f0 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Sun, 19 Feb 2017 10:32:58 +1100 Subject: services: Add exim-service-type. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/services/mail.scm (): New record type. (exim-computed-config-file, exim-shepherd-service, exim-activation, exim-etc, exim-profile): New procedures. (exim-service-type, %exim-accounts): New variables. * doc/guix.text (Mail Services): Document it. Signed-off-by: Ludovic Courtès --- gnu/services/mail.scm | 102 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) (limited to 'gnu/services/mail.scm') diff --git a/gnu/services/mail.scm b/gnu/services/mail.scm index 30b1672d33..b211ab61a5 100644 --- a/gnu/services/mail.scm +++ b/gnu/services/mail.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Andy Wingo ;;; Copyright © 2017 Clément Lassieur +;;; Copyright © 2017 Carlo Zancanaro ;;; ;;; This file is part of GNU Guix. ;;; @@ -33,6 +34,7 @@ #:use-module (guix packages) #:use-module (guix gexp) #:use-module (ice-9 match) + #:use-module (ice-9 format) #:export (dovecot-service dovecot-service-type dovecot-configuration @@ -53,7 +55,12 @@ opensmtpd-configuration opensmtpd-configuration? opensmtpd-service-type - %default-opensmtpd-config-file)) + %default-opensmtpd-config-file + + exim-configuration + exim-configuration? + exim-service-type + %default-exim-config-file)) ;;; Commentary: ;;; @@ -1620,3 +1627,96 @@ accept from local for any relay (compose list opensmtpd-configuration-package)) (service-extension shepherd-root-service-type opensmtpd-shepherd-service))))) + + +;;; +;;; Exim. +;;; + +(define-record-type* exim-configuration + make-exim-configuration + exim-configuration? + (package exim-configuration-package ; + (default exim)) + (config-file exim-configuration-config-file ;file-like + (default #f)) + (aliases exim-configuration-aliases ;; list of lists + (default '()))) + +(define %exim-accounts + (list (user-group + (name "exim") + (system? #t)) + (user-account + (name "exim") + (group "exim") + (system? #t) + (comment "Exim Daemon") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))))) + +(define (exim-computed-config-file package config-file) + (computed-file "exim.conf" + #~(call-with-output-file #$output + (lambda (port) + (format port " +exim_user = exim +exim_group = exim +.include ~a" + #$(or config-file + (file-append package "/etc/exim.conf"))))))) + +(define exim-shepherd-service + (match-lambda + (($ package config-file aliases) + (list (shepherd-service + (provision '(exim mta)) + (documentation "Run the exim daemon.") + (requirement '(networking)) + (start #~(make-forkexec-constructor + '(#$(file-append package "/bin/exim") + "-bd" "-v" "-C" + #$(exim-computed-config-file package config-file)))) + (stop #~(make-kill-destructor))))))) + +(define exim-activation + (match-lambda + (($ package config-file aliases) + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + + (let ((uid (passwd:uid (getpw "exim"))) + (gid (group:gid (getgr "exim")))) + (mkdir-p "/var/spool/exim") + (chown "/var/spool/exim" uid gid)) + + (zero? (system* #$(file-append package "/bin/exim") + "-bV" "-C" #$(exim-computed-config-file package config-file)))))))) + +(define exim-etc + (match-lambda + (($ package config-file aliases) + `(("aliases" ,(plain-file "aliases" + ;; Ideally we'd use a format string like + ;; "~:{~a: ~{~a~^,~}\n~}", but it gives a + ;; warning that I can't figure out how to fix, + ;; so we'll just use string-join below instead. + (format #f "~:{~a: ~a\n~}" + (map (lambda (entry) + (list (car entry) + (string-join (cdr entry) ","))) + aliases)))))))) + +(define exim-profile + (compose list exim-configuration-package)) + +(define exim-service-type + (service-type + (name 'exim) + (extensions + (list (service-extension shepherd-root-service-type exim-shepherd-service) + (service-extension account-service-type (const %exim-accounts)) + (service-extension activation-service-type exim-activation) + (service-extension profile-service-type exim-profile) + (service-extension etc-service-type exim-etc))))) -- cgit v1.2.3