diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-12-08 21:22:22 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-12-08 22:43:56 +0100 |
commit | 9b0ac8025860ac426cb1bc7fd417a27fe2bed36a (patch) | |
tree | f2a703efdddbdf89b5cd79e83739bf7f743e3b26 /gnu/system/dmd.scm | |
parent | 677078b48f649588f588c6adef0bb0aba70f7c8c (diff) | |
download | patches-9b0ac8025860ac426cb1bc7fd417a27fe2bed36a.tar patches-9b0ac8025860ac426cb1bc7fd417a27fe2bed36a.tar.gz |
gnu: Populate /etc upon startup.
* gnu/packages/patches/dmd-getpw.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/system.scm (dmd): Use it.
* gnu/system/vm.scm (system-qemu-image): Don't explicitly populate /etc;
don't add ETC to the GC roots.
* gnu/system/dmd.scm (dmd-configuration-file): Add 'etc' parameter.
[config]: Populate /etc from there.
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))) |