summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2020-01-03 18:13:38 +0100
committerRicardo Wurmus <rekado@elephly.net>2020-01-08 23:56:16 +0100
commitaf32ea35830383deb3b1540ca1b829eb53c6fe0d (patch)
tree7530b6bdd8ba474eda4a3f58323ba13b12703f05 /gnu
parent5d4ba49891996df93b4219c9dc9a438cac8f4a71 (diff)
downloadguix-af32ea35830383deb3b1540ca1b829eb53c6fe0d.tar.gz
services: nfs: Allow idmap-service-type to be extended.
* gnu/services/nfs.scm (idmap-service-type): Rewrite using SERVICE-TYPE to add
ability to extend the service.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/services/nfs.scm67
1 files changed, 39 insertions, 28 deletions
diff --git a/gnu/services/nfs.scm b/gnu/services/nfs.scm
index 451020be31..9fb95bde7e 100644
--- a/gnu/services/nfs.scm
+++ b/gnu/services/nfs.scm
@@ -170,37 +170,48 @@
                          (default nfs-utils)))
 
 (define idmap-service-type
-  (shepherd-service-type
-   'idmap
-   (lambda (config)
-
-     (define nfs-utils
-       (idmap-configuration-nfs-utils config))
+  (let ((proc
+         (lambda (config)
 
-     (define pipefs-directory
-       (idmap-configuration-pipefs-directory config))
+           (define nfs-utils
+             (idmap-configuration-nfs-utils config))
 
-     (define domain (idmap-configuration-domain config))
+           (define pipefs-directory
+             (idmap-configuration-pipefs-directory config))
 
-     (define (idmap-config-file config)
-       (plain-file "idmapd.conf"
-                   (string-append
-                    "\n[General]\n"
-                    (if domain
-                        (format #f "Domain = ~a\n" domain))
-                    "\n[Mapping]\n"
-                    "Nobody-User = nobody\n"
-                    "Nobody-Group = nogroup\n")))
+           (define domain (idmap-configuration-domain config))
 
-     (define idmap-command
-       #~(list (string-append #$nfs-utils "/sbin/rpc.idmapd") "-f"
-               "-p" #$pipefs-directory
-               "-c" #$(idmap-config-file config)))
+           (define (idmap-config-file config)
+             (plain-file "idmapd.conf"
+                         (string-append
+                          "\n[General]\n"
+                          (if domain
+                              (format #f "Domain = ~a\n" domain)
+                              "")
+                          "\n[Mapping]\n"
+                          "Nobody-User = nobody\n"
+                          "Nobody-Group = nogroup\n")))
 
-     (shepherd-service
-       (documentation "Start the RPC IDMAP daemon.")
-       (requirement '(rpcbind-daemon rpc-pipefs))
-       (provision '(idmap-daemon))
-       (start #~(make-forkexec-constructor #$idmap-command))
-       (stop #~(make-kill-destructor))))))
+           (define idmap-command
+             #~(list (string-append #$nfs-utils "/sbin/rpc.idmapd") "-f"
+                     "-p" #$pipefs-directory
+                     ;; TODO: this is deprecated
+                     "-c" #$(idmap-config-file config)))
 
+           (shepherd-service
+            (documentation "Start the RPC IDMAP daemon.")
+            (requirement '(rpcbind-daemon rpc-pipefs))
+            (provision '(idmap-daemon))
+            (start #~(make-forkexec-constructor #$idmap-command))
+            (stop #~(make-kill-destructor))))))
+    (service-type
+     (name 'idmap)
+     (extensions
+      (list (service-extension shepherd-root-service-type
+                               (compose list proc))))
+     ;; We use the extensions feature to allow other services to automatically
+     ;; configure and start this service.  Only one value can be provided.  We
+     ;; override it with the value returned by the extending service.
+     (compose identity)
+     (extend (lambda (config values) (first values)))
+     (default-value (idmap-configuration)))))