guix_mirror_bot pushed a commit to branch master
in repository guix.
commit 4b8cfa7f6963441a77258494eee7a89371422d9e
Author: Sughosha <[email protected]>
AuthorDate: Fri Feb 20 00:36:49 2026 +0530
services: readymedia: Run with a pid file.
* gnu/services/upnp.scm (%readymedia-default-pid-directory): New variable.
(%readymedia-pid-file): New procedure.
(readymedia-shepherd-service)[start]: Start with the pid file.
(readymedia-activation): Create the pid directory.
* gnu/tests/upnp.scm (run-readymedia-test): Test the pid directory and file.
Merges: https://codeberg.org/guix/guix/pulls/1007
Change-Id: I454a89d25afe0e9bb0414645b1e4594afdf89058
Signed-off-by: Giacomo Leidi <[email protected]>
---
gnu/services/upnp.scm | 45 ++++++++++++++++++++++++++++++++++-----------
gnu/tests/upnp.scm | 21 +++++++++++++++++++++
2 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/gnu/services/upnp.scm b/gnu/services/upnp.scm
index e0b9b974b9..8ae6c2f928 100644
--- a/gnu/services/upnp.scm
+++ b/gnu/services/upnp.scm
@@ -33,6 +33,8 @@
#:use-module (ice-9 match)
#:export (%readymedia-default-cache-directory
%readymedia-default-log-file
+ %readymedia-default-pid-directory
+ %readymedia-pid-file
%readymedia-user-account
%readymedia-user-group
readymedia-configuration
@@ -68,6 +70,13 @@
(use-modules (shepherd support)) ;for %user-log-dir
(string-append %user-log-dir "/readymedia.log"))
"/var/log/readymedia.log"))
+(define %readymedia-default-pid-directory "/var/run/readymedia")
+(define* (%readymedia-pid-file #:key (home-service? #f) (name "minidlna.pid"))
+ (if home-service?
+ #~(begin
+ (use-modules (shepherd support)) ;for %user-runtime-dir
+ (string-append %user-runtime-dir "/readymedia/" #$name))
+ (string-append %readymedia-default-pid-directory "/" name)))
(define %readymedia-user-group "readymedia")
(define %readymedia-user-account "readymedia")
@@ -156,6 +165,10 @@
(source cache-directory)
(target source)
(writable? #t))
+ (file-system-mapping
+ (source %readymedia-default-pid-directory)
+ (target source)
+ (writable? #t))
(file-system-mapping
(source minidlna-conf)
(target source))
@@ -168,6 +181,8 @@
#:namespaces (delq 'net %namespaces))
"-f"
#$minidlna-conf
+ "-P"
+ #$(%readymedia-pid-file)
"-S")
#:log-file #$log-file
#:user #$(if home-service? #f %readymedia-user-account)
@@ -182,6 +197,8 @@
"/sbin/minidlnad")
"-f"
#$minidlna-conf
+ "-P"
+ #$(%readymedia-pid-file #:home-service? home-service?)
"-S")
#:log-file #$log-file)))
(stop #~(make-kill-destructor))))))
@@ -215,17 +232,23 @@
#$(if home-service? #o755 #o775))))
(list #$@(map readymedia-media-directory-path
media-directories)))
- (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))))))
+ (for-each (lambda (directory)
+ (unless (file-exists? directory)
+ (mkdir-p/perms directory
+ (getpw #$(if home-service?
+ #~(getuid)
+ %readymedia-user-account))
+ #o755)))
+ (list (if #$home-service?
+ (if (absolute-file-name? #$cache-directory)
+ #$cache-directory
+ (string-append (or (getenv "HOME")
+ (passwd:dir
+ (getpwuid (getuid))))
+ "/" #$cache-directory))
+ #$cache-directory)
+ (dirname #$(%readymedia-pid-file
+ #:home-service? home-service?))))))))
(define readymedia-service-type
(service-type
diff --git a/gnu/tests/upnp.scm b/gnu/tests/upnp.scm
index 547351b446..226aa2ae0e 100644
--- a/gnu/tests/upnp.scm
+++ b/gnu/tests/upnp.scm
@@ -99,6 +99,27 @@
'(file-exists? #$(%readymedia-default-log-file))
marionette))
+ ;; Pid directory and file
+ (test-assert "pid directory exists"
+ (marionette-eval
+ '(eq? (stat:type (stat #$%readymedia-default-pid-directory))
+ 'directory)
+ marionette))
+ (test-assert "pid directory has correct ownership"
+ (marionette-eval
+ '(let ((pid-dir (stat #$%readymedia-default-pid-directory))
+ (user (getpwnam #$%readymedia-user-account)))
+ (and (eqv? (stat:uid pid-dir) (passwd:uid user))
+ (eqv? (stat:gid pid-dir) (passwd:gid user))))
+ marionette))
+ (test-assert "pid directory has expected permissions"
+ (marionette-eval
+ '(eqv? (stat:perms (stat #$%readymedia-default-pid-directory))
+ #o755)
+ marionette))
+ (test-assert "containerd PID file present"
+ (wait-for-file #$(%readymedia-pid-file) marionette))
+
;; Service
(test-assert "ReadyMedia service is running"
(marionette-eval