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

Reply via email to