summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorSughosha <sughosha@disroot.org>2025-07-04 17:59:51 +0530
committerGiacomo Leidi <therewasa@fishinthecalculator.me>2026-02-22 17:15:16 +0100
commitf19ddd6dfe2afd312a19f12cf64a6bbb27a23d9d (patch)
treea83e2e15ce58b9c6cfe766533f8354682b487729 /gnu
parent6cc0befc70e9dd1ca11a1210e507e4f6e705c3ed (diff)
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>
Diffstat (limited to 'gnu')
-rw-r--r--gnu/services/upnp.scm136
-rw-r--r--gnu/tests/upnp.scm43
2 files changed, 78 insertions, 101 deletions
diff --git a/gnu/services/upnp.scm b/gnu/services/upnp.scm
index 8267b1e53af..e0b9b974b93 100644
--- a/gnu/services/upnp.scm
+++ b/gnu/services/upnp.scm
@@ -32,8 +32,7 @@
32 #:use-module (guix records) 32 #:use-module (guix records)
33 #:use-module (ice-9 match) 33 #:use-module (ice-9 match)
34 #:export (%readymedia-default-cache-directory 34 #:export (%readymedia-default-cache-directory
35 %readymedia-default-log-directory 35 %readymedia-default-log-file
36 %readymedia-log-file
37 %readymedia-user-account 36 %readymedia-user-account
38 %readymedia-user-group 37 %readymedia-user-group
39 readymedia-configuration 38 readymedia-configuration
@@ -59,9 +58,16 @@
59;;; 58;;;
60;;; Code: 59;;; Code:
61 60
62(define %readymedia-default-cache-directory "/var/cache/readymedia") 61(define* (%readymedia-default-cache-directory #:key (home-service? #f))
63(define %readymedia-default-log-directory "/var/log/readymedia") 62 (if home-service?
64(define %readymedia-log-file "minidlna.log") 63 ".cache/readymedia"
64 "/var/cache/readymedia"))
65(define* (%readymedia-default-log-file #:key (home-service? #f))
66 (if home-service?
67 #~(begin
68 (use-modules (shepherd support)) ;for %user-log-dir
69 (string-append %user-log-dir "/readymedia.log"))
70 "/var/log/readymedia.log"))
65(define %readymedia-user-group "readymedia") 71(define %readymedia-user-group "readymedia")
66(define %readymedia-user-account "readymedia") 72(define %readymedia-user-account "readymedia")
67 73
@@ -73,20 +79,11 @@
73 (port readymedia-configuration-port 79 (port readymedia-configuration-port
74 (default #f)) 80 (default #f))
75 (cache-directory readymedia-configuration-cache-directory 81 (cache-directory readymedia-configuration-cache-directory
76 (default (if for-home? 82 (default (%readymedia-default-cache-directory
77 (string-append (or (getenv "XDG_CACHE_HOME") 83 #:home-service? for-home?)))
78 (string-append 84 (log-file readymedia-configuration-log-directory
79 (getenv "HOME") "/.cache")) 85 (default (%readymedia-default-log-file
80 "/readymedia") 86 #:home-service? for-home?)))
81 %readymedia-default-cache-directory)))
82 (log-directory readymedia-configuration-log-directory
83 (default (if for-home?
84 (string-append (or (getenv "XDG_STATE_HOME")
85 (string-append
86 (getenv "HOME")
87 "/.local/state"))
88 "/readymedia")
89 %readymedia-default-log-directory)))
90 (friendly-name readymedia-configuration-friendly-name 87 (friendly-name readymedia-configuration-friendly-name
91 (default #f)) 88 (default #f))
92 (media-directories readymedia-configuration-media-directories) 89 (media-directories readymedia-configuration-media-directories)
@@ -110,15 +107,11 @@
110(define (readymedia-configuration->config-file config) 107(define (readymedia-configuration->config-file config)
111 "Return the ReadyMedia/MiniDLNA configuration file corresponding to CONFIG." 108 "Return the ReadyMedia/MiniDLNA configuration file corresponding to CONFIG."
112 (match-record config <readymedia-configuration> 109 (match-record config <readymedia-configuration>
113 (port friendly-name cache-directory log-directory media-directories 110 (port friendly-name cache-directory media-directories extra-config
114 extra-config home-service?) 111 home-service?)
115 (apply mixed-text-file 112 (apply mixed-text-file
116 "minidlna.conf" 113 "minidlna.conf"
117 (if home-service?
118 (string-append "user=" (number->string (getuid)) "\n")
119 "")
120 "db_dir=" cache-directory "\n" 114 "db_dir=" cache-directory "\n"
121 "log_dir=" log-directory "\n"
122 (if friendly-name 115 (if friendly-name
123 (string-append "friendly_name=" friendly-name "\n") 116 (string-append "friendly_name=" friendly-name "\n")
124 "") 117 "")
@@ -143,42 +136,54 @@
143(define (readymedia-shepherd-service config) 136(define (readymedia-shepherd-service config)
144 "Return a least-authority ReadyMedia/MiniDLNA Shepherd service." 137 "Return a least-authority ReadyMedia/MiniDLNA Shepherd service."
145 (match-record config <readymedia-configuration> 138 (match-record config <readymedia-configuration>
146 (cache-directory log-directory media-directories home-service?) 139 (cache-directory log-file media-directories home-service?)
147 (let ((minidlna-conf (readymedia-configuration->config-file config))) 140 (let ((minidlna-conf (readymedia-configuration->config-file config)))
148 (shepherd-service 141 (shepherd-service
149 (documentation "Run the ReadyMedia/MiniDLNA daemon.") 142 (documentation "Run the ReadyMedia/MiniDLNA daemon.")
150 (provision '(readymedia)) 143 (provision '(readymedia))
151 (requirement (if home-service? '() '(networking user-processes))) 144 (requirement (if home-service? '() '(networking user-processes)))
145 (modules '((shepherd support))) ;for %user-log-dir
152 (start 146 (start
153 #~(make-forkexec-constructor 147 (if (not home-service?)
154 (list #$(least-authority-wrapper 148 #~(make-forkexec-constructor
155 (file-append (readymedia-configuration-readymedia config) 149 (list #$(least-authority-wrapper
156 "/sbin/minidlnad") 150 (file-append (readymedia-configuration-readymedia
157 #:name "minidlna" 151 config)
158 #:mappings 152 "/sbin/minidlnad")
159 (cons* (file-system-mapping 153 #:name "minidlna"
160 (source cache-directory) 154 #:mappings
161 (target source) 155 (cons* (file-system-mapping
162 (writable? #t)) 156 (source cache-directory)
163 (file-system-mapping 157 (target source)
164 (source log-directory) 158 (writable? #t))
165 (target source) 159 (file-system-mapping
166 (writable? #t)) 160 (source minidlna-conf)
167 (file-system-mapping 161 (target source))
168 (source minidlna-conf) 162 (map (lambda (directory)
169 (target source)) 163 (file-system-mapping
170 (map (lambda (directory) 164 (source (readymedia-media-directory-path
171 (file-system-mapping 165 directory))
172 (source (readymedia-media-directory-path directory)) 166 (target source)))
173 (target source))) 167 media-directories))
174 media-directories)) 168 #:namespaces (delq 'net %namespaces))
175 #:namespaces (delq 'net %namespaces)) 169 "-f"
176 "-f" 170 #$minidlna-conf
177 #$minidlna-conf 171 "-S")
178 "-S") 172 #:log-file #$log-file
179 #:log-file #$(string-append log-directory "/" %readymedia-log-file) 173 #:user #$(if home-service? #f %readymedia-user-account)
180 #:user #$(if home-service? #f %readymedia-user-account) 174 #:group #$(if home-service? #f %readymedia-user-group))
181 #:group #$(if home-service? #f %readymedia-user-group))) 175
176 ;; Relative paths to home directories are not being able to be
177 ;; mapped within the least-authority-wrapper. So, for home we use
178 ;; the program without wrapping it.
179 #~(make-forkexec-constructor
180 (list #$(file-append (readymedia-configuration-readymedia
181 config)
182 "/sbin/minidlnad")
183 "-f"
184 #$minidlna-conf
185 "-S")
186 #:log-file #$log-file)))
182 (stop #~(make-kill-destructor)))))) 187 (stop #~(make-kill-destructor))))))
183 188
184(define readymedia-accounts 189(define readymedia-accounts
@@ -196,7 +201,7 @@
196(define (readymedia-activation config) 201(define (readymedia-activation config)
197 "Set up directories for ReadyMedia/MiniDLNA." 202 "Set up directories for ReadyMedia/MiniDLNA."
198 (match-record config <readymedia-configuration> 203 (match-record config <readymedia-configuration>
199 (cache-directory log-directory media-directories home-service?) 204 (cache-directory media-directories home-service?)
200 (with-imported-modules (source-module-closure '((gnu build activation))) 205 (with-imported-modules (source-module-closure '((gnu build activation)))
201 #~(begin 206 #~(begin
202 (use-modules (gnu build activation)) 207 (use-modules (gnu build activation))
@@ -210,14 +215,17 @@
210 #$(if home-service? #o755 #o775)))) 215 #$(if home-service? #o755 #o775))))
211 (list #$@(map readymedia-media-directory-path 216 (list #$@(map readymedia-media-directory-path
212 media-directories))) 217 media-directories)))
213 (for-each (lambda (directory) 218 (unless (file-exists? directory)
214 (unless (file-exists? directory) 219 (mkdir-p/perms (if (absolute-file-name? #$cache-directory)
215 (mkdir-p/perms directory 220 #$cache-directory
216 (getpw #$(if home-service? 221 (string-append (or (getenv "HOME")
217 #~(getuid) 222 (passwd:dir
218 %readymedia-user-account)) 223 (getpwuid (getuid))))
219 #o755))) 224 "/" #$cache-directory))
220 (list #$cache-directory #$log-directory)))))) 225 (getpw #$(if home-service?
226 #~(getuid)
227 %readymedia-user-account))
228 #o755))))))
221 229
222(define readymedia-service-type 230(define readymedia-service-type
223 (service-type 231 (service-type
diff --git a/gnu/tests/upnp.scm b/gnu/tests/upnp.scm
index 079df6c7771..547351b4463 100644
--- a/gnu/tests/upnp.scm
+++ b/gnu/tests/upnp.scm
@@ -25,15 +25,6 @@
25 #:use-module (guix gexp) 25 #:use-module (guix gexp)
26 #:export (%test-readymedia)) 26 #:export (%test-readymedia))
27 27
28(define %readymedia-cache-file "files.db")
29(define %readymedia-cache-path
30 (string-append %readymedia-default-cache-directory
31 "/"
32 %readymedia-cache-file))
33(define %readymedia-log-path
34 (string-append %readymedia-default-log-directory
35 "/"
36 %readymedia-log-file))
37(define %readymedia-default-port 8200) 28(define %readymedia-default-port 8200)
38(define %readymedia-media-directory "/media") 29(define %readymedia-media-directory "/media")
39(define %readymedia-configuration-test 30(define %readymedia-configuration-test
@@ -83,51 +74,29 @@
83 #t) 74 #t)
84 marionette)) 75 marionette))
85 76
86 ;; Cache directory and file 77 ;; Cache directory
87 (test-assert "cache directory exists" 78 (test-assert "cache directory exists"
88 (marionette-eval 79 (marionette-eval
89 '(eq? (stat:type (stat #$%readymedia-default-cache-directory)) 80 '(eq? (stat:type (stat #$(%readymedia-default-cache-directory)))
90 'directory) 81 'directory)
91 marionette)) 82 marionette))
92 (test-assert "cache directory has correct ownership" 83 (test-assert "cache directory has correct ownership"
93 (marionette-eval 84 (marionette-eval
94 '(let ((cache-dir (stat #$%readymedia-default-cache-directory)) 85 '(let ((cache-dir (stat #$(%readymedia-default-cache-directory)))
95 (user (getpwnam #$%readymedia-user-account))) 86 (user (getpwnam #$%readymedia-user-account)))
96 (and (eqv? (stat:uid cache-dir) (passwd:uid user)) 87 (and (eqv? (stat:uid cache-dir) (passwd:uid user))
97 (eqv? (stat:gid cache-dir) (passwd:gid user)))) 88 (eqv? (stat:gid cache-dir) (passwd:gid user))))
98 marionette)) 89 marionette))
99 (test-assert "cache directory has expected permissions" 90 (test-assert "cache directory has expected permissions"
100 (marionette-eval 91 (marionette-eval
101 '(eqv? (stat:perms (stat #$%readymedia-default-cache-directory)) 92 '(eqv? (stat:perms (stat #$(%readymedia-default-cache-directory)))
102 #o755) 93 #o755)
103 marionette)) 94 marionette))
104 95
105 ;; Log directory and file 96 ;; Log file
106 (test-assert "log directory exists"
107 (marionette-eval
108 '(eq? (stat:type (stat #$%readymedia-default-log-directory))
109 'directory)
110 marionette))
111 (test-assert "log directory has correct ownership"
112 (marionette-eval
113 '(let ((log-dir (stat #$%readymedia-default-log-directory))
114 (user (getpwnam #$%readymedia-user-account)))
115 (and (eqv? (stat:uid log-dir) (passwd:uid user))
116 (eqv? (stat:gid log-dir) (passwd:gid user))))
117 marionette))
118 (test-assert "log directory has expected permissions"
119 (marionette-eval
120 '(eqv? (stat:perms (stat #$%readymedia-default-log-directory))
121 #o755)
122 marionette))
123 (test-assert "log file exists" 97 (test-assert "log file exists"
124 (marionette-eval 98 (marionette-eval
125 '(file-exists? #$%readymedia-log-path) 99 '(file-exists? #$(%readymedia-default-log-file))
126 marionette))
127 (test-assert "log file has expected permissions"
128 (marionette-eval
129 '(eqv? (stat:perms (stat #$%readymedia-log-path))
130 #o640)
131 marionette)) 100 marionette))
132 101
133 ;; Service 102 ;; Service