summary refs log tree commit diff
path: root/gnu/system/dmd.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/system/dmd.scm')
-rw-r--r--gnu/system/dmd.scm30
1 files changed, 28 insertions, 2 deletions
diff --git a/gnu/system/dmd.scm b/gnu/system/dmd.scm
index df38172def..aec7d03759 100644
--- a/gnu/system/dmd.scm
+++ b/gnu/system/dmd.scm
@@ -266,10 +266,13 @@ true, it must be a string specifying the default network gateway."
                       '())))))))
 
 
-(define (dmd-configuration-file services)
-  "Return the dmd configuration file for SERVICES."
+(define (dmd-configuration-file services etc)
+  "Return the dmd configuration file for SERVICES, that initializes /etc from
+ETC on startup."
   (define config
     `(begin
+       (use-modules (ice-9 ftw))
+
        (register-services
         ,@(map (match-lambda
                 (($ <service> documentation provision requirement
@@ -282,6 +285,29 @@ true, it must be a string specifying the default network gateway."
                     #:start ,start
                     #:stop ,stop)))
                services))
+
+       ;; /etc is a mixture of static and dynamic settings.  Here is where we
+       ;; initialize it from the static part.
+       (format #t "populating /etc from ~a...~%" ,etc)
+       (let ((rm-f (lambda (f)
+                     (false-if-exception (delete-file f)))))
+         (rm-f "/etc/static")
+         (symlink ,etc "/etc/static")
+         (for-each (lambda (file)
+                     ;; TODO: Handle 'shadow' specially so that changed
+                     ;; password aren't lost.
+                     (let ((target (string-append "/etc/" file))
+                           (source (string-append "/etc/static/" file)))
+                       (rm-f target)
+                       (symlink source target)))
+                   (scandir ,etc
+                            (lambda (file)
+                              (not (member file '("." ".."))))))
+
+         ;; Prevent ETC from being GC'd.
+         (symlink ,etc "/var/nix/gcroots/etc-directory"))
+
+       (format #t "starting services...~%")
        (for-each start ',(append-map service-provision services))))
 
   (text-file "dmd.conf" (object->string config)))