~ruther/guix-local

3dc2658a577e5918ec3404f1aefb7be655e97233 — Bruno Victal 3 years ago 8a7d44b
services: mympd: Use records for user and group fields.

* gnu/services/audio.scm (%mympd-user, %mympd-group)
(mympd-user-sanitizer, mympd-group-sanitizer): New variables.
(mympd-configuration)[user]: Use user-account as value type.
Sanitize via mympd-user-sanitizer.
[group]: Use user-group as value type.
Sanitize via mympd-group-sanitizer.
(mympd-serialize-configuration): Adjust accordingly.
(mympd-accounts): Likewise.
* doc/guix.texi (Audio Services)[myMPD]: Likewise.

Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com>
2 files changed, 61 insertions(+), 16 deletions(-)

M doc/guix.texi
M gnu/services/audio.scm
M doc/guix.texi => doc/guix.texi +5 -2
@@ 33738,12 33738,15 @@ The package object of the myMPD server.
This is a list of symbols naming Shepherd services that this service
will depend on.

@item @code{user} (default: @code{"mympd"}) (type: string)
@item @code{user} (default: @code{%mympd-user}) (type: user-account)
Owner of the @command{mympd} process.

@item @code{group} (default: @code{"nogroup"}) (type: string)
The default @code{%mympd-user} is a system user with the name ``mympd'',
who is a part of the group @var{group} (see below).
@item @code{group} (default: @code{%mympd-group}) (type: user-group)
Owner group of the @command{mympd} process.

The default @code{%mympd-group} is a system group with name ``mympd''.
@item @code{work-directory} (default: @code{"/var/lib/mympd"}) (type: string)
Where myMPD will store its data.


M gnu/services/audio.scm => gnu/services/audio.scm +56 -14
@@ 658,6 658,48 @@ appended to the configuration.")
(define-maybe/no-serialization integer)
(define-maybe/no-serialization mympd-ip-acl)

(define %mympd-user
  (user-account
      (name "mympd")
      (group %lazy-group)
      (system? #t)
      (comment "myMPD user")
      (home-directory "/var/empty")
      (shell (file-append shadow "/sbin/nologin"))))

(define %mympd-group
  (user-group
   (name "mympd")
   (system? #t)))

;;; TODO: Procedures for unsupported value types, to be removed.
(define (mympd-user-sanitizer value)
  (cond ((user-account? value) value)
        ((string? value)
         (warning (G_ "string value for 'user' is not supported, use \
user-account instead~%"))
         (user-account
          (inherit %mympd-user)
          (name value)
          ;; XXX: this is to be lazily substituted in (…-accounts)
          ;; with the value from 'group'.
          (group %lazy-group)))
        (else
         (configuration-field-error #f 'user value))))

(define (mympd-group-sanitizer value)
  (cond ((user-group? value) value)
        ((string? value)
         (warning (G_ "string value for 'group' is not supported, use \
user-group instead~%"))
         (user-group
          (inherit %mympd-group)
          (name value)))
        (else
         (configuration-field-error #f 'group value))))
;;;


;; XXX: The serialization procedures are insufficient since we require
;; access to multiple fields at once.
;; Fields marked with empty-serializer are never serialized and are


@@ 675,13 717,15 @@ will depend on."
   empty-serializer)

  (user
   (string "mympd")
   (user-account %mympd-user)
   "Owner of the @command{mympd} process."
   (sanitizer mympd-user-sanitizer)
   empty-serializer)

  (group
   (string "nogroup")
   (user-group %mympd-group)
   "Owner group of the @command{mympd} process."
   (sanitizer mympd-group-sanitizer)
   empty-serializer)

  (work-directory


@@ 816,7 860,8 @@ prompting a pin from the user.")
  (match-record config <mympd-configuration> (package shepherd-requirement
                                              user work-directory
                                              cache-directory log-level log-to)
    (let ((log-level* (format #f "MYMPD_LOGLEVEL=~a" log-level)))
    (let ((log-level* (format #f "MYMPD_LOGLEVEL=~a" log-level))
          (username (user-account-name user)))
      (shepherd-service
       (documentation "Run the myMPD daemon.")
       (requirement `(loopback user-processes


@@ 826,7 871,7 @@ prompting a pin from the user.")
                               ,@shepherd-requirement))
       (provision '(mympd))
       (start #~(begin
                  (let* ((pw (getpwnam #$user))
                  (let* ((pw (getpwnam #$username))
                         (uid (passwd:uid pw))
                         (gid (passwd:gid pw)))
                    (for-each (lambda (dir)


@@ 836,8 881,8 @@ prompting a pin from the user.")

                  (make-forkexec-constructor
                   `(#$(file-append package "/bin/mympd")
                     "--user" #$user
                     #$@(if (eqv? log-to 'syslog) '("--syslog") '())
                     "--user" #$username
                     #$@(if (eq? log-to 'syslog) '("--syslog") '())
                     "--workdir" #$work-directory
                     "--cachedir" #$cache-directory)
                   #:environment-variables (list #$log-level*)


@@ 846,14 891,11 @@ prompting a pin from the user.")

(define (mympd-accounts config)
  (match-record config <mympd-configuration> (user group)
                (list (user-group (name group)
                                  (system? #t))
                      (user-account (name user)
                                    (group group)
                                    (system? #t)
                                    (comment "myMPD user")
                                    (home-directory "/var/empty")
                                    (shell (file-append shadow "/sbin/nologin"))))))
    ;; TODO: Deprecation code, to be removed.
    (let ((user (if (eq? (user-account-group user) %lazy-group)
                    (%set-user-group user group)
                    user)))
      (list user group))))

(define (mympd-log-rotation config)
  (match-record config <mympd-configuration> (log-to)