aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-06-20 11:01:07 +0200
committerLudovic Courtès <ludo@gnu.org>2018-06-20 23:47:08 +0200
commit378daa8cb677121e1893f9173af1db060720d6e4 (patch)
tree5263997c3a917de0e736b95435a8d5520dded9e4
parent636bb2b5e350bb5eb1d934da690c85e52e352bc4 (diff)
downloadpatches-378daa8cb677121e1893f9173af1db060720d6e4.tar
patches-378daa8cb677121e1893f9173af1db060720d6e4.tar.gz
services: boot: Take gexps instead of monadic gexps.
* gnu/services.scm (compute-boot-script): Rename 'mexps' to 'gexps' and remove 'mlet' form. (boot-service-type): Update comment. (cleanup-gexp): Remove 'with-monad' and 'return'. (activation-script): Rewrite in non-monadic style: use 'scheme-file' instead of 'gexp->file'. (gexps->activation-gexp): Remove 'mlet', return a gexp. * gnu/services/shepherd.scm (shepherd-boot-gexp): Remove 'with-monad' and 'return'. * gnu/system.scm (operating-system-boot-script): Remove outdated comment. * gnu/tests/base.scm (%cleanup-os): For 'dirty-service', remove 'with-monad' and 'return'.
-rw-r--r--gnu/services.scm164
-rw-r--r--gnu/services/shepherd.scm40
-rw-r--r--gnu/system.scm1
-rw-r--r--gnu/tests/base.scm27
4 files changed, 110 insertions, 122 deletions
diff --git a/gnu/services.scm b/gnu/services.scm
index 51edb4868d..49cf01a4f8 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -337,15 +337,14 @@ containing the given entries."
turn refers to everything the operating system needs: its kernel, initrd,
system profile, boot script, and so on.")))
-(define (compute-boot-script _ mexps)
- ;; Reverse MEXPS so that extensions appear in the boot script in the right
+(define (compute-boot-script _ gexps)
+ ;; Reverse GEXPS so that extensions appear in the boot script in the right
;; order. That is, user extensions would come first, and extensions added
;; by 'essential-services' (e.g., running shepherd) are guaranteed to come
;; last.
- (mlet %store-monad ((gexps (sequence %store-monad (reverse mexps))))
- (gexp->file "boot"
- ;; Clean up and activate the system, then spawn shepherd.
- #~(begin #$@gexps))))
+ (gexp->file "boot"
+ ;; Clean up and activate the system, then spawn shepherd.
+ #~(begin #$@(reverse gexps))))
(define (boot-script-entry mboot)
"Return, as a monadic value, an entry for the boot script in the system
@@ -354,9 +353,9 @@ directory."
(return `(("boot" ,boot)))))
(define boot-service-type
- ;; The service of this type is extended by being passed gexps as monadic
- ;; values. It aggregates them in a single script, as a monadic value, which
- ;; becomes its 'parameters'. It is the only service that extends nothing.
+ ;; The service of this type is extended by being passed gexps. It
+ ;; aggregates them in a single script, as a monadic value, which becomes its
+ ;; value.
(service-type (name 'boot)
(extensions
(list (service-extension system-service-type
@@ -372,48 +371,46 @@ by the initrd once the root file system is mounted.")))
(service boot-service-type #t))
(define (cleanup-gexp _)
- "Return as a monadic value a gexp to clean up /tmp and similar places upon
-boot."
- (with-monad %store-monad
- (with-imported-modules '((guix build utils))
- (return #~(begin
- (use-modules (guix build utils))
-
- ;; Clean out /tmp and /var/run.
- ;;
- ;; XXX This needs to happen before service activations, so it
- ;; has to be here, but this also implicitly assumes that /tmp
- ;; and /var/run are on the root partition.
- (letrec-syntax ((fail-safe (syntax-rules ()
- ((_ exp rest ...)
- (begin
- (catch 'system-error
- (lambda () exp)
- (const #f))
- (fail-safe rest ...)))
- ((_)
- #t))))
- ;; Ignore I/O errors so the system can boot.
- (fail-safe
- ;; Remove stale Shadow lock files as they would lead to
- ;; failures of 'useradd' & co.
- (delete-file "/etc/group.lock")
- (delete-file "/etc/passwd.lock")
- (delete-file "/etc/.pwd.lock") ;from 'lckpwdf'
-
- ;; Force file names to be decoded as UTF-8. See
- ;; <https://bugs.gnu.org/26353>.
- (setenv "GUIX_LOCPATH"
- #+(file-append glibc-utf8-locales "/lib/locale"))
- (setlocale LC_CTYPE "en_US.utf8")
- (delete-file-recursively "/tmp")
- (delete-file-recursively "/var/run")
-
- (mkdir "/tmp")
- (chmod "/tmp" #o1777)
- (mkdir "/var/run")
- (chmod "/var/run" #o755)
- (delete-file-recursively "/run/udev/watch.old"))))))))
+ "Return a gexp to clean up /tmp and similar places upon boot."
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+
+ ;; Clean out /tmp and /var/run.
+ ;;
+ ;; XXX This needs to happen before service activations, so it
+ ;; has to be here, but this also implicitly assumes that /tmp
+ ;; and /var/run are on the root partition.
+ (letrec-syntax ((fail-safe (syntax-rules ()
+ ((_ exp rest ...)
+ (begin
+ (catch 'system-error
+ (lambda () exp)
+ (const #f))
+ (fail-safe rest ...)))
+ ((_)
+ #t))))
+ ;; Ignore I/O errors so the system can boot.
+ (fail-safe
+ ;; Remove stale Shadow lock files as they would lead to
+ ;; failures of 'useradd' & co.
+ (delete-file "/etc/group.lock")
+ (delete-file "/etc/passwd.lock")
+ (delete-file "/etc/.pwd.lock") ;from 'lckpwdf'
+
+ ;; Force file names to be decoded as UTF-8. See
+ ;; <https://bugs.gnu.org/26353>.
+ (setenv "GUIX_LOCPATH"
+ #+(file-append glibc-utf8-locales "/lib/locale"))
+ (setlocale LC_CTYPE "en_US.utf8")
+ (delete-file-recursively "/tmp")
+ (delete-file-recursively "/var/run")
+
+ (mkdir "/tmp")
+ (chmod "/tmp" #o1777)
+ (mkdir "/var/run")
+ (chmod "/var/run" #o755)
+ (delete-file-recursively "/run/udev/watch.old"))))))
(define cleanup-service-type
;; Service that cleans things up in /tmp and similar.
@@ -432,44 +429,39 @@ ACTIVATION-SCRIPT-TYPE."
(define (activation-script gexps)
"Return the system's activation script, which evaluates GEXPS."
- (define (service-activations)
- ;; Return the activation scripts for SERVICES.
- (mapm %store-monad
- (cut gexp->file "activate-service" <>)
- gexps))
-
- (mlet* %store-monad ((actions (service-activations)))
- (gexp->file "activate"
- (with-imported-modules (source-module-closure
- '((gnu build activation)
- (guix build utils)))
- #~(begin
- (use-modules (gnu build activation)
- (guix build utils))
-
- ;; Make sure the user accounting database exists. If it
- ;; does not exist, 'setutxent' does not create it and
- ;; thus there is no accounting at all.
- (close-port (open-file "/var/run/utmpx" "a0"))
-
- ;; Same for 'wtmp', which is populated by mingetty et
- ;; al.
- (mkdir-p "/var/log")
- (close-port (open-file "/var/log/wtmp" "a0"))
-
- ;; Set up /run/current-system. Among other things this
- ;; sets up locales, which the activation snippets
- ;; executed below may expect.
- (activate-current-system)
-
- ;; Run the services' activation snippets.
- ;; TODO: Use 'load-compiled'.
- (for-each primitive-load '#$actions))))))
+ (define actions
+ (map (cut scheme-file "activate-service" <>) gexps))
+
+ (scheme-file "activate"
+ (with-imported-modules (source-module-closure
+ '((gnu build activation)
+ (guix build utils)))
+ #~(begin
+ (use-modules (gnu build activation)
+ (guix build utils))
+
+ ;; Make sure the user accounting database exists. If it
+ ;; does not exist, 'setutxent' does not create it and
+ ;; thus there is no accounting at all.
+ (close-port (open-file "/var/run/utmpx" "a0"))
+
+ ;; Same for 'wtmp', which is populated by mingetty et
+ ;; al.
+ (mkdir-p "/var/log")
+ (close-port (open-file "/var/log/wtmp" "a0"))
+
+ ;; Set up /run/current-system. Among other things this
+ ;; sets up locales, which the activation snippets
+ ;; executed below may expect.
+ (activate-current-system)
+
+ ;; Run the services' activation snippets.
+ ;; TODO: Use 'load-compiled'.
+ (for-each primitive-load '#$actions)))))
(define (gexps->activation-gexp gexps)
"Return a gexp that runs the activation script containing GEXPS."
- (mlet %store-monad ((script (activation-script gexps)))
- (return #~(primitive-load #$script))))
+ #~(primitive-load #$(activation-script gexps)))
(define (second-argument a b) b)
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index 000e85eb86..6ca53faa3d 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -22,7 +22,6 @@
#:use-module (guix sets)
#:use-module (guix gexp)
#:use-module (guix store)
- #:use-module (guix monads)
#:use-module (guix records)
#:use-module (guix derivations) ;imported-modules, etc.
#:use-module (gnu services)
@@ -66,26 +65,25 @@
(define (shepherd-boot-gexp services)
- (with-monad %store-monad
- (return #~(begin
- ;; Keep track of the booted system.
- (false-if-exception (delete-file "/run/booted-system"))
- (symlink (readlink "/run/current-system")
- "/run/booted-system")
-
- ;; Close any remaining open file descriptors to be on the safe
- ;; side. This must be the very last thing we do, because
- ;; Guile has internal FDs such as 'sleep_pipe' that need to be
- ;; alive.
- (let loop ((fd 3))
- (when (< fd 1024)
- (false-if-exception (close-fdes fd))
- (loop (+ 1 fd))))
-
- ;; Start shepherd.
- (execl #$(file-append shepherd "/bin/shepherd")
- "shepherd" "--config"
- #$(shepherd-configuration-file services))))))
+ #~(begin
+ ;; Keep track of the booted system.
+ (false-if-exception (delete-file "/run/booted-system"))
+ (symlink (readlink "/run/current-system")
+ "/run/booted-system")
+
+ ;; Close any remaining open file descriptors to be on the safe
+ ;; side. This must be the very last thing we do, because
+ ;; Guile has internal FDs such as 'sleep_pipe' that need to be
+ ;; alive.
+ (let loop ((fd 3))
+ (when (< fd 1024)
+ (false-if-exception (close-fdes fd))
+ (loop (+ 1 fd))))
+
+ ;; Start shepherd.
+ (execl #$(file-append shepherd "/bin/shepherd")
+ "shepherd" "--config"
+ #$(shepherd-configuration-file services))))
(define shepherd-root-service-type
(service-type
diff --git a/gnu/system.scm b/gnu/system.scm
index 7c51c4da97..84eab5f84f 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -819,7 +819,6 @@ we're running in the final root. When CONTAINER? is true, skip all
hardware-related operations as necessary when booting a Linux container."
(let* ((services (operating-system-services os #:container? container?))
(boot (fold-services services #:target-type boot-service-type)))
- ;; BOOT is the script as a monadic value.
(service-value boot)))
(define (operating-system-user-accounts os)
diff --git a/gnu/tests/base.scm b/gnu/tests/base.scm
index d209066a74..4c24cf57f6 100644
--- a/gnu/tests/base.scm
+++ b/gnu/tests/base.scm
@@ -484,20 +484,19 @@ in a loop. See <http://bugs.gnu.org/26931>.")
(simple-operating-system
(simple-service 'dirty-things
boot-service-type
- (with-monad %store-monad
- (let ((script (plain-file
- "create-utf8-file.sh"
- (string-append
- "echo $0: dirtying /tmp...\n"
- "set -e; set -x\n"
- "touch /witness\n"
- "exec touch /tmp/λαμβδα"))))
- (with-imported-modules '((guix build utils))
- (return #~(begin
- (setenv "PATH"
- #$(file-append coreutils "/bin"))
- (invoke #$(file-append bash "/bin/sh")
- #$script)))))))))
+ (let ((script (plain-file
+ "create-utf8-file.sh"
+ (string-append
+ "echo $0: dirtying /tmp...\n"
+ "set -e; set -x\n"
+ "touch /witness\n"
+ "exec touch /tmp/λαμβδα"))))
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (setenv "PATH"
+ #$(file-append coreutils "/bin"))
+ (invoke #$(file-append bash "/bin/sh")
+ #$script)))))))
(define (run-cleanup-test name)
(define os