diff options
Diffstat (limited to 'gn/services/mailman-container.scm')
-rw-r--r-- | gn/services/mailman-container.scm | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/gn/services/mailman-container.scm b/gn/services/mailman-container.scm new file mode 100644 index 0000000..1afa08a --- /dev/null +++ b/gn/services/mailman-container.scm @@ -0,0 +1,94 @@ +(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> + mailman-configuration + make-mailman-configuration + mailman-configuration? + (package mailman-configuration-package ; package + (default mailman)) + ) + +(define mailman-cronjobs + (match-lambda + (($ <mailman-configuration> 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 + (($ <mailman-configuration> 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 + (($ <mailman-configuration> 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)))) |