~ruther/guix-local

a91c3fc727ba90d8c9b91f67fb672da2e6b877ad — Ludovic Courtès 9 years ago fd12989
services: <shepherd-service> no longer has an 'imported-modules' field.

* gnu/services/shepherd.scm (<shepherd-service>)[imported-modules]:
Remove.
(%default-imported-modules): Make private.
(shepherd-service-file): Use 'with-imported-modules'.
(shepherd-configuration-file): Remove 'modules' and the calls to
'imported-modules' and 'compiled-modules'.  Use
'with-imported-modules' instead.
* doc/guix.texi (Shepherd Services): Adjust accordingly.
* gnu/services/base.scm (file-system-shepherd-service): Use
'with-imported-modules'.  Remove 'imported-modules' field.
* gnu/system/mapped-devices.scm (device-mapping-service-type): Remove
'imported-modules'.
(open-luks-device): Use 'with-imported-modules'.
* gnu/tests.scm (marionette-shepherd-service): Remove 'imported-modules'
field and use 'with-imported-modules'.
5 files changed, 144 insertions(+), 164 deletions(-)

M doc/guix.texi
M gnu/services/base.scm
M gnu/services/shepherd.scm
M gnu/system/mapped-devices.scm
M gnu/tests.scm
M doc/guix.texi => doc/guix.texi +0 -4
@@ 10848,10 10848,6 @@ where @var{service-name} is one of the symbols in @var{provision}
This is the list of modules that must be in scope when @code{start} and
@code{stop} are evaluated.

@item @code{imported-modules} (default: @var{%default-imported-modules})
This is the list of modules to import in the execution environment of
the Shepherd.

@end table
@end deftp


M gnu/services/base.scm => gnu/services/base.scm +52 -53
@@ 229,59 229,58 @@ FILE-SYSTEM."
        (create? (file-system-create-mount-point? file-system))
        (dependencies (file-system-dependencies file-system)))
    (if (file-system-mount? file-system)
        (list
         (shepherd-service
          (provision (list (file-system->shepherd-service-name file-system)))
          (requirement `(root-file-system
                         ,@(map dependency->shepherd-service-name dependencies)))
          (documentation "Check, mount, and unmount the given file system.")
          (start #~(lambda args
                     ;; FIXME: Use or factorize with 'mount-file-system'.
                     (let ((device (canonicalize-device-spec #$device '#$title))
                           (flags  #$(mount-flags->bit-mask
                                      (file-system-flags file-system))))
                       #$(if create?
                             #~(mkdir-p #$target)
                             #~#t)
                       #$(if check?
                             #~(begin
                                 ;; Make sure fsck.ext2 & co. can be found.
                                 (setenv "PATH"
                                         (string-append
                                          #$e2fsprogs "/sbin:"
                                          "/run/current-system/profile/sbin:"
                                          (getenv "PATH")))
                                 (check-file-system device #$type))
                             #~#t)

                       (mount device #$target #$type flags
                              #$(file-system-options file-system))

                       ;; For read-only bind mounts, an extra remount is
                       ;; needed, as per <http://lwn.net/Articles/281157/>,
                       ;; which still applies to Linux 4.0.
                       (when (and (= MS_BIND (logand flags MS_BIND))
                                  (= MS_RDONLY (logand flags MS_RDONLY)))
                         (mount device #$target #$type
                                (logior MS_BIND MS_REMOUNT MS_RDONLY))))
                     #t))
          (stop #~(lambda args
                    ;; Normally there are no processes left at this point, so
                    ;; TARGET can be safely unmounted.

                    ;; Make sure PID 1 doesn't keep TARGET busy.
                    (chdir "/")

                    (umount #$target)
                    #f))

          ;; We need an additional module.
          (modules `(((gnu build file-systems)
                      #:select (check-file-system canonicalize-device-spec))
                     ,@%default-modules))
          (imported-modules `((gnu build file-systems)
                              (guix build bournish)
                              ,@%default-imported-modules))))
        (with-imported-modules '((gnu build file-systems)
                                 (guix build bournish))
          (list
           (shepherd-service
            (provision (list (file-system->shepherd-service-name file-system)))
            (requirement `(root-file-system
                           ,@(map dependency->shepherd-service-name dependencies)))
            (documentation "Check, mount, and unmount the given file system.")
            (start #~(lambda args
                       ;; FIXME: Use or factorize with 'mount-file-system'.
                       (let ((device (canonicalize-device-spec #$device '#$title))
                             (flags  #$(mount-flags->bit-mask
                                        (file-system-flags file-system))))
                         #$(if create?
                               #~(mkdir-p #$target)
                               #~#t)
                         #$(if check?
                               #~(begin
                                   ;; Make sure fsck.ext2 & co. can be found.
                                   (setenv "PATH"
                                           (string-append
                                            #$e2fsprogs "/sbin:"
                                            "/run/current-system/profile/sbin:"
                                            (getenv "PATH")))
                                   (check-file-system device #$type))
                               #~#t)

                         (mount device #$target #$type flags
                                #$(file-system-options file-system))

                         ;; For read-only bind mounts, an extra remount is
                         ;; needed, as per <http://lwn.net/Articles/281157/>,
                         ;; which still applies to Linux 4.0.
                         (when (and (= MS_BIND (logand flags MS_BIND))
                                    (= MS_RDONLY (logand flags MS_RDONLY)))
                           (mount device #$target #$type
                                  (logior MS_BIND MS_REMOUNT MS_RDONLY))))
                       #t))
            (stop #~(lambda args
                      ;; Normally there are no processes left at this point, so
                      ;; TARGET can be safely unmounted.

                      ;; Make sure PID 1 doesn't keep TARGET busy.
                      (chdir "/")

                      (umount #$target)
                      #f))

            ;; We need an additional module.
            (modules `(((gnu build file-systems)
                        #:select (check-file-system canonicalize-device-spec))
                       ,@%default-modules)))))
        '())))

(define file-system-service-type

M gnu/services/shepherd.scm => gnu/services/shepherd.scm +14 -29
@@ 47,9 47,7 @@
            shepherd-service-stop
            shepherd-service-auto-start?
            shepherd-service-modules
            shepherd-service-imported-modules

            %default-imported-modules
            %default-modules

            shepherd-service-file


@@ 138,9 136,7 @@ for a service that extends SHEPHERD-ROOT-SERVICE-TYPE and nothing else."
  (auto-start?   shepherd-service-auto-start?          ;Boolean
                 (default #t))
  (modules       shepherd-service-modules              ;list of module names
                 (default %default-modules))
  (imported-modules shepherd-service-imported-modules  ;list of module names
                    (default %default-imported-modules)))
                 (default %default-modules)))

(define (shepherd-service-canonical-name service)
  "Return the 'canonical name' of SERVICE."


@@ 203,37 199,26 @@ stored."
(define (shepherd-service-file service)
  "Return a file defining SERVICE."
  (gexp->file (shepherd-service-file-name service)
              #~(begin
                  (use-modules #$@(shepherd-service-modules service))

                  (make <service>
                    #:docstring '#$(shepherd-service-documentation service)
                    #:provides '#$(shepherd-service-provision service)
                    #:requires '#$(shepherd-service-requirement service)
                    #:respawn? '#$(shepherd-service-respawn? service)
                    #:start #$(shepherd-service-start service)
                    #:stop #$(shepherd-service-stop service)))))
              (with-imported-modules %default-imported-modules
                #~(begin
                    (use-modules #$@(shepherd-service-modules service))

                    (make <service>
                      #:docstring '#$(shepherd-service-documentation service)
                      #:provides '#$(shepherd-service-provision service)
                      #:requires '#$(shepherd-service-requirement service)
                      #:respawn? '#$(shepherd-service-respawn? service)
                      #:start #$(shepherd-service-start service)
                      #:stop #$(shepherd-service-stop service))))))

(define (shepherd-configuration-file services)
  "Return the shepherd configuration file for SERVICES."
  (define modules
    (delete-duplicates
     (append-map shepherd-service-imported-modules services)))

  (assert-valid-graph services)

  (mlet %store-monad ((modules  (imported-modules modules))
                      (compiled (compiled-modules modules))
                      (files    (mapm %store-monad
                                      shepherd-service-file
                                      services)))
  (mlet %store-monad ((files (mapm %store-monad
                                   shepherd-service-file services)))
    (define config
      #~(begin
          (eval-when (expand load eval)
            (set! %load-path (cons #$modules %load-path))
            (set! %load-compiled-path
              (cons #$compiled %load-compiled-path)))

          (use-modules (srfi srfi-34)
                       (system repl error-handling))


M gnu/system/mapped-devices.scm => gnu/system/mapped-devices.scm +17 -17
@@ 85,9 85,7 @@
       (modules `((rnrs bytevectors)              ;bytevector?
                  ((gnu build file-systems)
                   #:select (find-partition-by-luks-uuid))
                  ,@%default-modules))
       (imported-modules `((gnu build file-systems)
                           ,@%default-imported-modules)))))))
                  ,@%default-modules)))))))

(define (device-mapping-service mapped-device)
  "Return a service that sets up @var{mapped-device}."


@@ 101,20 99,22 @@
(define (open-luks-device source target)
  "Return a gexp that maps SOURCE to TARGET as a LUKS device, using
'cryptsetup'."
  #~(let ((source #$source))
      (zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
                      "open" "--type" "luks"

                      ;; Note: We cannot use the "UUID=source" syntax here
                      ;; because 'cryptsetup' implements it by searching the
                      ;; udev-populated /dev/disk/by-id directory but udev may
                      ;; be unavailable at the time we run this.
                      (if (bytevector? source)
                          (or (find-partition-by-luks-uuid source)
                              (error "LUKS partition not found" source))
                          source)

                      #$target))))
  (with-imported-modules '((gnu build file-systems)
                           (guix build bournish))
    #~(let ((source #$source))
        (zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
                        "open" "--type" "luks"

                        ;; Note: We cannot use the "UUID=source" syntax here
                        ;; because 'cryptsetup' implements it by searching the
                        ;; udev-populated /dev/disk/by-id directory but udev may
                        ;; be unavailable at the time we run this.
                        (if (bytevector? source)
                            (or (find-partition-by-luks-uuid source)
                                (error "LUKS partition not found" source))
                            source)

                        #$target)))))

(define (close-luks-device source target)
  "Return a gexp that closes TARGET, a LUKS device."

M gnu/tests.scm => gnu/tests.scm +61 -61
@@ 80,68 80,68 @@
                       (srfi srfi-9 gnu)
                       (guix build syscalls)
                       (rnrs bytevectors)))
            (imported-modules `((guix build syscalls)
                                ,@imported-modules))
            (start
             #~(lambda ()
                 (define (clear-echo termios)
                   (set-field termios (termios-local-flags)
                              (logand (lognot (local-flags ECHO))
                                      (termios-local-flags termios))))

                 (define (self-quoting? x)
                   (letrec-syntax ((one-of (syntax-rules ()
                                             ((_) #f)
                                             ((_ pred rest ...)
                                              (or (pred x)
                                                  (one-of rest ...))))))
                     (one-of symbol? string? pair? null? vector?
                             bytevector? number? boolean?)))

                 (match (primitive-fork)
                   (0
                    (dynamic-wind
                      (const #t)
                      (lambda ()
                        (let* ((repl    (open-file #$device "r+0"))
                               (termios (tcgetattr (fileno repl)))
                               (console (open-file "/dev/console" "r+0")))
                          ;; Don't echo input back.
                          (tcsetattr (fileno repl) (tcsetattr-action TCSANOW)
                                     (clear-echo termios))

                          ;; Redirect output to the console.
                          (close-fdes 1)
                          (close-fdes 2)
                          (dup2 (fileno console) 1)
                          (dup2 (fileno console) 2)
                          (close-port console)

                          (display 'ready repl)
                          (let loop ()
                            (newline repl)

                            (match (read repl)
                              ((? eof-object?)
                               (primitive-exit 0))
                              (expr
                               (catch #t
                                 (lambda ()
                                   (let ((result (primitive-eval expr)))
                                     (write (if (self-quoting? result)
                                                result
                                                (object->string result))
                                            repl)))
                                 (lambda (key . args)
                                   (print-exception (current-error-port)
                                                    (stack-ref (make-stack #t) 1)
                                                    key args)
                                   (write #f repl)))))
                            (loop))))
                      (lambda ()
                        (primitive-exit 1))))
                   (pid
                    pid))))
             (with-imported-modules `((guix build syscalls)
                                      ,@imported-modules)
               #~(lambda ()
                   (define (clear-echo termios)
                     (set-field termios (termios-local-flags)
                                (logand (lognot (local-flags ECHO))
                                        (termios-local-flags termios))))

                   (define (self-quoting? x)
                     (letrec-syntax ((one-of (syntax-rules ()
                                               ((_) #f)
                                               ((_ pred rest ...)
                                                (or (pred x)
                                                    (one-of rest ...))))))
                       (one-of symbol? string? pair? null? vector?
                               bytevector? number? boolean?)))

                   (match (primitive-fork)
                     (0
                      (dynamic-wind
                        (const #t)
                        (lambda ()
                          (let* ((repl    (open-file #$device "r+0"))
                                 (termios (tcgetattr (fileno repl)))
                                 (console (open-file "/dev/console" "r+0")))
                            ;; Don't echo input back.
                            (tcsetattr (fileno repl) (tcsetattr-action TCSANOW)
                                       (clear-echo termios))

                            ;; Redirect output to the console.
                            (close-fdes 1)
                            (close-fdes 2)
                            (dup2 (fileno console) 1)
                            (dup2 (fileno console) 2)
                            (close-port console)

                            (display 'ready repl)
                            (let loop ()
                              (newline repl)

                              (match (read repl)
                                ((? eof-object?)
                                 (primitive-exit 0))
                                (expr
                                 (catch #t
                                   (lambda ()
                                     (let ((result (primitive-eval expr)))
                                       (write (if (self-quoting? result)
                                                  result
                                                  (object->string result))
                                              repl)))
                                   (lambda (key . args)
                                     (print-exception (current-error-port)
                                                      (stack-ref (make-stack #t) 1)
                                                      key args)
                                     (write #f repl)))))
                              (loop))))
                        (lambda ()
                          (primitive-exit 1))))
                     (pid
                      pid)))))
            (stop #~(make-kill-destructor)))))))

(define marionette-service-type