diff options
Diffstat (limited to 'gnu')
| -rw-r--r-- | gnu/services/upnp.scm | 136 | ||||
| -rw-r--r-- | gnu/tests/upnp.scm | 43 |
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 |
