;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Christopher Baines ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu services message-broker) #:use-module (gnu services) #:use-module (gnu services shepherd) #:use-module (gnu system shadow) #:use-module (gnu packages admin) #:use-module ((gnu packages base) #:select (glibc-utf8-locales)) #:use-module (gnu packages rabbitmq) #:use-module (guix modules) #:use-module (guix records) #:use-module (guix gexp) #:use-module (ice-9 match) #:export ( rabbitmq-configuration rabbitmq-configuration? rabbitmq-configuration-rabbitmq rabbitmq-configuration-locale rabbitmq-configuration-interfaces rabbitmq-configuration-tcp-port rabbitmq-configuration-udp-port rabbitmq-configuration-additional-options rabbitmq-service-type)) ;;; ;;; RabbitMQ ;;; (define-record-type* rabbitmq-configuration make-rabbitmq-configuration rabbitmq-configuration? (rabbitmq rabbitmq-configuration-rabbitmq ; (default rabbitmq)) (locale rabbitmq-configuration-rabbitmq (default "en_US.UTF-8")) (interfaces rabbitmq-configuration-interfaces (default '("0.0.0.0"))) (tcp-port rabbitmq-configuration-tcp-port (default 11211)) (udp-port rabbitmq-configuration-udp-port (default 11211)) (additional-options rabbitmq-configuration-additional-options (default '()))) (define %rabbitmq-accounts (list (user-group (name "rabbitmq") (system? #t)) (user-account (name "rabbitmq") (group "rabbitmq") (system? #t) (comment "Rabbitmq server user") (home-directory "/var/lib/rabbitmq") (shell (file-append shadow "/sbin/nologin"))))) (define rabbitmq-activation #~(begin (use-modules (guix build utils)) (let ((user (getpwnam "rabbitmq"))) (mkdir-p "/var/run/rabbitmq") (chown "/var/run/rabbitmq" (passwd:uid user) (passwd:gid user))))) (define rabbitmq-shepherd-service (match-lambda (($ rabbitmq locale interfaces tcp-port udp-port additional-options) (with-imported-modules (source-module-closure '((gnu build shepherd))) (list (shepherd-service (provision '(rabbitmq)) (documentation "Run the Rabbitmq daemon.") (requirement '(user-processes loopback)) (modules '((gnu build shepherd))) (start #~(make-forkexec-constructor '(#$(file-append rabbitmq "/sbin/rabbitmq-server")) #:pid-file "/var/run/rabbitmq/pid" #:environment-variables `("RABBITMQ_PID_FILE=/var/run/rabbitmq/pid" "HOME=/var/lib/rabbitmq" ;; Elixir, the language used by RabbitMQ requires a ;; UTF8 locale to function properly ,(string-append "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale") ,#$(string-append "LC_ALL=" locale)))) (stop #~(make-kill-destructor)))))))) (define rabbitmq-service-type (service-type (name 'rabbitmq) (extensions (list (service-extension shepherd-root-service-type rabbitmq-shepherd-service) (service-extension activation-service-type (const rabbitmq-activation)) (service-extension account-service-type (const %rabbitmq-accounts)))) (default-value (rabbitmq-configuration))))