1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-04-06 21:20:33 +02:00

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.
(<readymedia-configuration>)[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 <therewasa@fishinthecalculator.me>
This commit is contained in:
Sughosha
2025-07-04 17:59:51 +05:30
committed by Giacomo Leidi
parent 6cc0befc70
commit f19ddd6dfe
3 changed files with 90 additions and 109 deletions

View File

@@ -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.

View File

@@ -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 <readymedia-configuration>
(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 <readymedia-configuration>
(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 <readymedia-configuration>
(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

View File

@@ -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