[PATCH] ssh: Use 'guix repl' instead of 'guile'.

DoneSubmitted by Ludovic Courtès.
Details
One participant
  • Ludovic Courtès
Owner
unassigned
Severity
normal
L
L
Ludovic Courtès wrote on 18 Dec 2020 11:51
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201218105101.27869-1-ludo@gnu.org
This simplifies setup of build machines: no need to install Guile inaddition to Guix, no need to set 'GUILE_LOAD_PATH' & co., leading tofewer failure modes.
* guix/ssh.scm (remote-run): New procedure.(remote-daemon-channel): Use it instead of 'open-remote-pipe*'.(store-import-channel)[import]: Remove check for module availability.Add call to 'primitive-exit'.Use 'remote-run' instead of 'open-remote-pipe'.(store-export-channel)[export]: Remove check for module availability.Add calls to 'primitive-exit'.Use 'remote-run' instead of 'open-remote-pipe'.(handle-import/export-channel-error): Remove 'module-error' clause.(report-module-error): Remove.* guix/scripts/offload.scm (assert-node-has-guix): Replace call to'report-module-error' by 'leave'.* doc/guix.texi (Daemon Offload Setup): Remove mention of Guile.--- doc/guix.texi | 2 +- guix/scripts/offload.scm | 3 +- guix/ssh.scm | 91 +++++++++++++++++++++------------------- 3 files changed, 51 insertions(+), 45 deletions(-)
Toggle diff (197 lines)diff --git a/doc/guix.texi b/doc/guix.texiindex 392baf5910..7ae05b47a9 100644--- a/doc/guix.texi+++ b/doc/guix.texi@@ -1296,7 +1296,7 @@ master node: @end example This will attempt to connect to each of the build machines specified in-@file{/etc/guix/machines.scm}, make sure Guile and the Guix modules are+@file{/etc/guix/machines.scm}, make sure Guix is available on each machine, attempt to export to the machine and import from it, and report any error in the process. diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scmindex 58ee53e85c..835078cb97 100644--- a/guix/scripts/offload.scm+++ b/guix/scripts/offload.scm@@ -634,7 +634,8 @@ daemon is not running." (and add-text-to-store 'alright)) node) ('alright #t)- (_ (report-module-error name)))+ (_ (leave (G_ "(guix) module not usable on remote host '~a'")+ name))) (match (inferior-eval '(begin (use-modules (guix))diff --git a/guix/ssh.scm b/guix/ssh.scmindex e41bffca65..457d1890f9 100644--- a/guix/ssh.scm+++ b/guix/ssh.scm@@ -54,8 +54,7 @@ retrieve-files* remote-store-host - report-guile-error- report-module-error))+ report-guile-error)) ;;; Commentary: ;;;@@ -206,6 +205,40 @@ REPL." ;; <https://bugs.gnu.org/26976>.) (close-inferior inferior))))) +(define (remote-run exp session)+ "Run EXP in a new process in SESSION and return a remote pipe.++Unlike 'inferior-remote-eval', this is used for side effects and may+communicate over stdout/stdin as it sees fit. EXP is typically a loop that+processes data from stdin and/or sends data to stdout. The assumption is that+EXP never returns or calls 'primitive-exit' when it's done."+ (define pipe+ (open-remote-pipe* session OPEN_BOTH+ "guix" "repl" "-t" "machine"))++ (match (read pipe)+ (('repl-version _ ...)+ #t)+ ((? eof-object?)+ (close-port pipe)+ (raise (formatted-message+ (G_ "failed to start 'guix repl' on '~a'")+ (session-get session 'host)))))++ ;; Disable buffering so 'guix repl' does not read more than what's really+ ;; sent to itself.+ (write '(setvbuf (current-input-port) 'none) pipe)+ (force-output pipe)++ ;; Read the reply and subsequent newline.+ (read pipe) (get-u8 pipe)++ (write exp pipe)+ (force-output pipe)++ ;; From now on, we stop following the inferior protocol.+ pipe)+ (define* (remote-daemon-channel session #:optional (socket-name@@ -261,11 +294,7 @@ REPL." (_ (primitive-exit 1))))))) - (open-remote-pipe* session OPEN_BOTH- ;; Sort-of shell-quote REDIRECT.- "guile" "-c"- (object->string- (object->string redirect))))+ (remote-run redirect session)) (define* (connect-to-remote-daemon session #:optional@@ -288,11 +317,6 @@ can be written." ;; consumed. (define import `(begin- (eval-when (load expand eval)- (unless (resolve-module '(guix) #:ensure #f)- (write `(module-error))- (exit 7)))- (use-modules (guix) (srfi srfi-34) (rnrs io ports) (rnrs bytevectors)) @@ -322,13 +346,10 @@ can be written." (import-paths store (current-input-port)) '(success)))) (lambda args- (cons 'error args))))))+ (cons 'error args))))+ (primitive-exit 0))) - (open-remote-pipe session- (string-join- `("guile" "-c"- ,(object->string (object->string import))))- OPEN_BOTH))+ (remote-run import session)) (define* (store-export-channel session files #:key recursive?)@@ -338,22 +359,20 @@ be read. When RECURSIVE? is true, the closure of FILES is exported." ;; remote store. (define export `(begin- (eval-when (load expand eval)- (unless (resolve-module '(guix) #:ensure #f)- (write `(module-error))- (exit 7)))- (use-modules (guix) (srfi srfi-1) (srfi srfi-26) (srfi srfi-34)) (guard (c ((nix-connection-error? c) (write `(connection-error ,(nix-connection-error-file c)- ,(nix-connection-error-code c))))+ ,(nix-connection-error-code c)))+ (primitive-exit 1)) ((nix-protocol-error? c) (write `(protocol-error ,(nix-protocol-error-status c)- ,(nix-protocol-error-message c))))+ ,(nix-protocol-error-message c)))+ (primitive-exit 2)) (else- (write `(exception))))+ (write `(exception))+ (primitive-exit 3))) (with-store store (let* ((files ',files) (invalid (remove (cut valid-path? store <>)@@ -371,13 +390,10 @@ be read. When RECURSIVE? is true, the closure of FILES is exported." (setvbuf (current-output-port) 'none) (export-paths store files (current-output-port)- #:recursive? ,recursive?))))))+ #:recursive? ,recursive?)+ (primitive-exit 0)))))) - (open-remote-input-pipe session- (string-join- `("guile" "-c"- ,(object->string- (object->string export))))))+ (remote-run export session)) (define (remote-system session) "Return the system type as expected by Nix, usually ARCHITECTURE-KERNEL, of@@ -563,8 +579,6 @@ REMOTE." (match sexp ((? eof-object?) (report-guile-error (remote-store-host remote)))- (('module-error . _)- (report-module-error (remote-store-host remote))) (('connection-error file code . _) (raise-error (G_ "failed to connect to '~A' on remote host '~A': ~a") file (remote-store-host remote) (strerror code)))@@ -626,15 +640,6 @@ LOCAL. When RECURSIVE? is true, retrieve the closure of FILES." check.") host))) -(define (report-module-error host)- "Report an error about missing Guix modules on HOST."- ;; TRANSLATORS: Leave "Guile" untranslated.- (raise-error (G_ "Guile modules not found on remote host '~A'") host- (=> (G_ "Make sure @code{GUILE_LOAD_PATH} includes Guix'-own module directory. Run @command{ssh ~A env | grep GUILE_LOAD_PATH} to-check.")- host)))- (define (report-inferior-exception exception host) "Report EXCEPTION, an &inferior-exception that occurred on HOST." (raise-error (G_ "exception occurred on remote host '~A': ~s")-- 2.29.2
L
L
Ludovic Courtès wrote on 23 Dec 2020 16:06
(address . 45312@debbugs.gnu.org)
87k0t8wohk.fsf@gnu.org
Ludovic Courtès <ludo@gnu.org> skribis:
Toggle quote (23 lines)> This simplifies setup of build machines: no need to install Guile in> addition to Guix, no need to set 'GUILE_LOAD_PATH' & co., leading to> fewer failure modes.>> * guix/ssh.scm (remote-run): New procedure.> (remote-daemon-channel): Use it instead of 'open-remote-pipe*'.> (store-import-channel)[import]: Remove check for module availability.> Add call to 'primitive-exit'.> Use 'remote-run' instead of 'open-remote-pipe'.> (store-export-channel)[export]: Remove check for module availability.> Add calls to 'primitive-exit'.> Use 'remote-run' instead of 'open-remote-pipe'.> (handle-import/export-channel-error): Remove 'module-error' clause.> (report-module-error): Remove.> * guix/scripts/offload.scm (assert-node-has-guix): Replace call to> 'report-module-error' by 'leave'.> * doc/guix.texi (Daemon Offload Setup): Remove mention of Guile.> ---> doc/guix.texi | 2 +-> guix/scripts/offload.scm | 3 +-> guix/ssh.scm | 91 +++++++++++++++++++++-------------------> 3 files changed, 51 insertions(+), 45 deletions(-)
Pushed as 7624ebbae33cf49dded5e9032ed426781c9554f6!
Ludo’.
L
L
Ludovic Courtès wrote on 23 Dec 2020 16:06
control message for bug #45312
(address . control@debbugs.gnu.org)
87im8swohb.fsf@gnu.org
tags 45312 fixedclose 45312 quit
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send email to 45312@debbugs.gnu.org