(define-module (gn services mailman-container)) (use-modules (gnu) (gn packages mailman) (guix records) (ice-9 match)) (use-service-modules base mcron networking shepherd) (define-record-type* mailman-configuration make-mailman-configuration mailman-configuration? (package mailman-configuration-package ; package (default mailman)) ) (define mailman-cronjobs (match-lambda (($ package) (list #~(job '(next-hour '(0)) (string-append #$package "/bin/mailman digests --periodic")) #~(job '(next-hour '(8)) (string-append #$package "/bin/mailman notify")))))) (define mailman-activation (match-lambda (($ package) #~(begin (use-modules (guix build utils)) (let ((%user (getpwnam "mailman"))) ;; Prepare the environment for mailman: ;; https://docs.mailman.io/en-us/install-from-binary/ (unless (directory-exists? #$work-dir) (mkdir-p #$work-dir) ;; These two are supposed to be recursive. (chown #$work-dir (passwd:uid %user) (passwd:gid %user)) (chmod #$work-dir #o750))))))) (define mailman-config-file (plain-file "mailman.cfg" "[mailman] layout: local \n")) (define mailman-shepherd-service (match-lambda (($ package) (list (shepherd-service (documentation "Run the Mailman server.") (requirement '(networking)) (provision '(mailman)) (start #~(make-forkexec-constructor (list #$(file-append package "/bin/mailman") "start") #:environment-variables (list (string-append "MAILMAN_CONFIG_FILE" mailman-config-file) ) )) (stop #~(make-kill-destructor (list #$(file-append package "/bin/mailman") "stop")))))))) (define mailman-service-type (service-type (name 'mailman) (extensions (list (service-extension shepherd-root-service-type mailman-shepherd-service) (service-extension activation-service-type mailman-activation) (service-extension mcron-service-type mailman-cronjobs))) (description "Run a Mailman server.") (default-value (mailman-configuration)))) (operating-system (host-name "mailman") (timezone "Etc/UTC") (locale "en_US.utf8") (bootloader (bootloader-configuration (bootloader grub-bootloader) (target "does-not-matter"))) (file-systems %base-file-systems) ;; No firmware for VMs or containers. (firmware '()) (services (list (service dhcp-client-service-type) (service mailman-service-type))))