diff options
Diffstat (limited to 'gnu/system/dmd.scm')
-rw-r--r-- | gnu/system/dmd.scm | 30 |
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))) |