From f19ddd6dfe2afd312a19f12cf64a6bbb27a23d9d Mon Sep 17 00:00:00 2001 From: Sughosha Date: Fri, 4 Jul 2025 17:59:51 +0530 Subject: [PATCH] services: readymedia: Fix configurations. * gnu/services/upnp.scm (%readymedia-default-log-directory): Remove variable. (%readymedia-default-log-file): New procedure. (%readymedia-default-cache-directory): Turn it into a procedure. ()[log-directory]: Remove field. [log-file]: New field. [cache-directory]: Set to %readymedia-default-cache-directory. (readymedia-configuration->config-file): Remove "user" and "log_dir" fields. (readymedia-shepherd-service)[modules]: Add (shepherd support). [start]: Do not map the log-directory. For home services, do not wrap the program with least-authority-wrapper. (readymedia-activation): Do not create the log-directory. * gnu/home/services/upnp.scm (%readymedia-cache-file, %readymedia-cache-path, %readymedia-log-path): Remove variables. (run-readymedia-test): Use the procedures properly. Do not test the log directory. Test the log file. * doc/guix.texi (Miscellaneous Services)[DLNA/UPnP Services]: Update doc. Change-Id: I97d84b5287c374ddb26a495f20a36f986b0c142d Signed-off-by: Giacomo Leidi --- doc/guix.texi | 20 ++++--- gnu/services/upnp.scm | 136 ++++++++++++++++++++++-------------------- gnu/tests/upnp.scm | 43 ++----------- 3 files changed, 90 insertions(+), 109 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index a3b17578a8..78f9ffc312 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -46886,15 +46886,19 @@ A custom name that will be displayed on connected clients. The list of media folders to serve content from. Each item is a @code{readymedia-media-directory}. -@item @code{cache-directory} (default: @code{"/var/cache/readymedia"}) (type: string) -A folder for ReadyMedia's cache files. If not existing already, the -folder will be created as part of the service activation and the -ReadyMedia user will be assigned ownership. +@item @code{cache-directory} (type: gexp-or-string) +A folder for ReadyMedia's cache files, defaulting to +@file{"/var/cache/readymedia"}. If the path is relative, like +@file{".cache/readymedia"}, it will be looked up in the user's home +directory. If the directory does not exist already, the folder will be +created as part of the service activation and the "readymedia" user will +be assigned ownership. For Guix Home services, the value defaults to +@file{".cache/readymedia"}. -@item @code{log-directory} (default: @code{"/var/log/readymedia"}) (type: string) -A folder for ReadyMedia's log files. If not existing already, the -folder will be created as part of the service activation and the -ReadyMedia user will be assigned ownership. +@item @code{log-file} (type: gexp-or-string) +Where the service will write its logs, defaulting to +@file{"/var/log/readymedia.log"}. For Guix Home services, it defaults to +@file{@env{XDG_STATE_HOME}/shepherd/readymedia.log}. @item @code{port} (default: @code{#f}) (type: maybe-integer) A custom port that the service will be listening on. diff --git a/gnu/services/upnp.scm b/gnu/services/upnp.scm index 8267b1e53a..e0b9b974b9 100644 --- a/gnu/services/upnp.scm +++ b/gnu/services/upnp.scm @@ -32,8 +32,7 @@ #:use-module (guix records) #:use-module (ice-9 match) #:export (%readymedia-default-cache-directory - %readymedia-default-log-directory - %readymedia-log-file + %readymedia-default-log-file %readymedia-user-account %readymedia-user-group readymedia-configuration @@ -59,9 +58,16 @@ ;;; ;;; Code: -(define %readymedia-default-cache-directory "/var/cache/readymedia") -(define %readymedia-default-log-directory "/var/log/readymedia") -(define %readymedia-log-file "minidlna.log") +(define* (%readymedia-default-cache-directory #:key (home-service? #f)) + (if home-service? + ".cache/readymedia" + "/var/cache/readymedia")) +(define* (%readymedia-default-log-file #:key (home-service? #f)) + (if home-service? + #~(begin + (use-modules (shepherd support)) ;for %user-log-dir + (string-append %user-log-dir "/readymedia.log")) + "/var/log/readymedia.log")) (define %readymedia-user-group "readymedia") (define %readymedia-user-account "readymedia") @@ -73,20 +79,11 @@ (port readymedia-configuration-port (default #f)) (cache-directory readymedia-configuration-cache-directory - (default (if for-home? - (string-append (or (getenv "XDG_CACHE_HOME") - (string-append - (getenv "HOME") "/.cache")) - "/readymedia") - %readymedia-default-cache-directory))) - (log-directory readymedia-configuration-log-directory - (default (if for-home? - (string-append (or (getenv "XDG_STATE_HOME") - (string-append - (getenv "HOME") - "/.local/state")) - "/readymedia") - %readymedia-default-log-directory))) + (default (%readymedia-default-cache-directory + #:home-service? for-home?))) + (log-file readymedia-configuration-log-directory + (default (%readymedia-default-log-file + #:home-service? for-home?))) (friendly-name readymedia-configuration-friendly-name (default #f)) (media-directories readymedia-configuration-media-directories) @@ -110,15 +107,11 @@ (define (readymedia-configuration->config-file config) "Return the ReadyMedia/MiniDLNA configuration file corresponding to CONFIG." (match-record config - (port friendly-name cache-directory log-directory media-directories - extra-config home-service?) + (port friendly-name cache-directory media-directories extra-config + home-service?) (apply mixed-text-file "minidlna.conf" - (if home-service? - (string-append "user=" (number->string (getuid)) "\n") - "") "db_dir=" cache-directory "\n" - "log_dir=" log-directory "\n" (if friendly-name (string-append "friendly_name=" friendly-name "\n") "") @@ -143,42 +136,54 @@ (define (readymedia-shepherd-service config) "Return a least-authority ReadyMedia/MiniDLNA Shepherd service." (match-record config - (cache-directory log-directory media-directories home-service?) + (cache-directory log-file media-directories home-service?) (let ((minidlna-conf (readymedia-configuration->config-file config))) (shepherd-service (documentation "Run the ReadyMedia/MiniDLNA daemon.") (provision '(readymedia)) (requirement (if home-service? '() '(networking user-processes))) + (modules '((shepherd support))) ;for %user-log-dir (start - #~(make-forkexec-constructor - (list #$(least-authority-wrapper - (file-append (readymedia-configuration-readymedia config) - "/sbin/minidlnad") - #:name "minidlna" - #:mappings - (cons* (file-system-mapping - (source cache-directory) - (target source) - (writable? #t)) - (file-system-mapping - (source log-directory) - (target source) - (writable? #t)) - (file-system-mapping - (source minidlna-conf) - (target source)) - (map (lambda (directory) - (file-system-mapping - (source (readymedia-media-directory-path directory)) - (target source))) - media-directories)) - #:namespaces (delq 'net %namespaces)) - "-f" - #$minidlna-conf - "-S") - #:log-file #$(string-append log-directory "/" %readymedia-log-file) - #:user #$(if home-service? #f %readymedia-user-account) - #:group #$(if home-service? #f %readymedia-user-group))) + (if (not home-service?) + #~(make-forkexec-constructor + (list #$(least-authority-wrapper + (file-append (readymedia-configuration-readymedia + config) + "/sbin/minidlnad") + #:name "minidlna" + #:mappings + (cons* (file-system-mapping + (source cache-directory) + (target source) + (writable? #t)) + (file-system-mapping + (source minidlna-conf) + (target source)) + (map (lambda (directory) + (file-system-mapping + (source (readymedia-media-directory-path + directory)) + (target source))) + media-directories)) + #:namespaces (delq 'net %namespaces)) + "-f" + #$minidlna-conf + "-S") + #:log-file #$log-file + #:user #$(if home-service? #f %readymedia-user-account) + #:group #$(if home-service? #f %readymedia-user-group)) + + ;; Relative paths to home directories are not being able to be + ;; mapped within the least-authority-wrapper. So, for home we use + ;; the program without wrapping it. + #~(make-forkexec-constructor + (list #$(file-append (readymedia-configuration-readymedia + config) + "/sbin/minidlnad") + "-f" + #$minidlna-conf + "-S") + #:log-file #$log-file))) (stop #~(make-kill-destructor)))))) (define readymedia-accounts @@ -196,7 +201,7 @@ (define (readymedia-activation config) "Set up directories for ReadyMedia/MiniDLNA." (match-record config - (cache-directory log-directory media-directories home-service?) + (cache-directory media-directories home-service?) (with-imported-modules (source-module-closure '((gnu build activation))) #~(begin (use-modules (gnu build activation)) @@ -210,14 +215,17 @@ #$(if home-service? #o755 #o775)))) (list #$@(map readymedia-media-directory-path media-directories))) - (for-each (lambda (directory) - (unless (file-exists? directory) - (mkdir-p/perms directory - (getpw #$(if home-service? - #~(getuid) - %readymedia-user-account)) - #o755))) - (list #$cache-directory #$log-directory)))))) + (unless (file-exists? directory) + (mkdir-p/perms (if (absolute-file-name? #$cache-directory) + #$cache-directory + (string-append (or (getenv "HOME") + (passwd:dir + (getpwuid (getuid)))) + "/" #$cache-directory)) + (getpw #$(if home-service? + #~(getuid) + %readymedia-user-account)) + #o755)))))) (define readymedia-service-type (service-type diff --git a/gnu/tests/upnp.scm b/gnu/tests/upnp.scm index 079df6c777..547351b446 100644 --- a/gnu/tests/upnp.scm +++ b/gnu/tests/upnp.scm @@ -25,15 +25,6 @@ #:use-module (guix gexp) #:export (%test-readymedia)) -(define %readymedia-cache-file "files.db") -(define %readymedia-cache-path - (string-append %readymedia-default-cache-directory - "/" - %readymedia-cache-file)) -(define %readymedia-log-path - (string-append %readymedia-default-log-directory - "/" - %readymedia-log-file)) (define %readymedia-default-port 8200) (define %readymedia-media-directory "/media") (define %readymedia-configuration-test @@ -83,51 +74,29 @@ #t) marionette)) - ;; Cache directory and file + ;; Cache directory (test-assert "cache directory exists" (marionette-eval - '(eq? (stat:type (stat #$%readymedia-default-cache-directory)) + '(eq? (stat:type (stat #$(%readymedia-default-cache-directory))) 'directory) marionette)) (test-assert "cache directory has correct ownership" (marionette-eval - '(let ((cache-dir (stat #$%readymedia-default-cache-directory)) + '(let ((cache-dir (stat #$(%readymedia-default-cache-directory))) (user (getpwnam #$%readymedia-user-account))) (and (eqv? (stat:uid cache-dir) (passwd:uid user)) (eqv? (stat:gid cache-dir) (passwd:gid user)))) marionette)) (test-assert "cache directory has expected permissions" (marionette-eval - '(eqv? (stat:perms (stat #$%readymedia-default-cache-directory)) + '(eqv? (stat:perms (stat #$(%readymedia-default-cache-directory))) #o755) marionette)) - ;; Log directory and file - (test-assert "log directory exists" - (marionette-eval - '(eq? (stat:type (stat #$%readymedia-default-log-directory)) - 'directory) - marionette)) - (test-assert "log directory has correct ownership" - (marionette-eval - '(let ((log-dir (stat #$%readymedia-default-log-directory)) - (user (getpwnam #$%readymedia-user-account))) - (and (eqv? (stat:uid log-dir) (passwd:uid user)) - (eqv? (stat:gid log-dir) (passwd:gid user)))) - marionette)) - (test-assert "log directory has expected permissions" - (marionette-eval - '(eqv? (stat:perms (stat #$%readymedia-default-log-directory)) - #o755) - marionette)) + ;; Log file (test-assert "log file exists" (marionette-eval - '(file-exists? #$%readymedia-log-path) - marionette)) - (test-assert "log file has expected permissions" - (marionette-eval - '(eqv? (stat:perms (stat #$%readymedia-log-path)) - #o640) + '(file-exists? #$(%readymedia-default-log-file)) marionette)) ;; Service